diff options
381 files changed, 5440 insertions, 1522 deletions
diff --git a/api/current.txt b/api/current.txt index 16c1880d9d22..e16294edb380 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3341,6 +3341,7 @@ package android.app { method public boolean isImmersive(); method public boolean isTaskRoot(); method public boolean isVoiceInteraction(); + method public boolean isVoiceInteractionRoot(); method public final deprecated android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); method public boolean moveTaskToBack(boolean); method public boolean navigateUpTo(android.content.Intent); @@ -5697,6 +5698,7 @@ package android.app.admin { method public void uninstallCaCert(android.content.ComponentName, byte[]); method public void wipeData(int); field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN"; + field public static final java.lang.String ACTION_DEVICE_OWNER_CHANGED = "android.app.action.DEVICE_OWNER_CHANGED"; field public static final java.lang.String ACTION_MANAGED_PROFILE_PROVISIONED = "android.app.action.MANAGED_PROFILE_PROVISIONED"; field public static final java.lang.String ACTION_PROVISION_MANAGED_DEVICE = "android.app.action.PROVISION_MANAGED_DEVICE"; field public static final java.lang.String ACTION_PROVISION_MANAGED_PROFILE = "android.app.action.PROVISION_MANAGED_PROFILE"; @@ -18147,8 +18149,11 @@ package android.net { method public boolean requestBandwidthUpdate(android.net.Network); method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback); method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent); + method public deprecated boolean requestRouteToHost(int, int); method public deprecated void setNetworkPreference(int); method public static deprecated boolean setProcessDefaultNetwork(android.net.Network); + method public deprecated int startUsingNetworkFeature(int, java.lang.String); + method public deprecated int stopUsingNetworkFeature(int, java.lang.String); method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback); method public void unregisterNetworkCallback(android.app.PendingIntent); field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; @@ -22700,7 +22705,7 @@ package android.os { field public static final int KITKAT_WATCH = 20; // 0x14 field public static final int LOLLIPOP = 21; // 0x15 field public static final int LOLLIPOP_MR1 = 22; // 0x16 - field public static final int MNC = 23; // 0x17 + field public static final int M = 23; // 0x17 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { @@ -26400,6 +26405,7 @@ package android.provider { public final class Settings { ctor public Settings(); + method public static boolean canDrawOverlays(android.content.Context); field public static final java.lang.String ACTION_ACCESSIBILITY_SETTINGS = "android.settings.ACCESSIBILITY_SETTINGS"; field public static final java.lang.String ACTION_ADD_ACCOUNT = "android.settings.ADD_ACCOUNT_SETTINGS"; field public static final java.lang.String ACTION_AIRPLANE_MODE_SETTINGS = "android.settings.AIRPLANE_MODE_SETTINGS"; @@ -26572,7 +26578,7 @@ package android.provider { field public static final deprecated java.lang.String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed"; field public static final deprecated java.lang.String LOCK_PATTERN_ENABLED = "lock_pattern_autolock"; field public static final deprecated java.lang.String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled"; - field public static final java.lang.String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern"; + field public static final deprecated java.lang.String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern"; field public static final deprecated java.lang.String LOGGING_ID = "logging_id"; field public static final deprecated java.lang.String NETWORK_PREFERENCE = "network_preference"; field public static final java.lang.String PARENTAL_CONTROL_ENABLED = "parental_control_enabled"; @@ -26619,6 +26625,7 @@ package android.provider { public static final class Settings.System extends android.provider.Settings.NameValueTable { ctor public Settings.System(); + method public static boolean canWrite(android.content.Context); method public static void getConfiguration(android.content.ContentResolver, android.content.res.Configuration); method public static float getFloat(android.content.ContentResolver, java.lang.String, float); method public static float getFloat(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException; @@ -28809,6 +28816,7 @@ package android.service.voice { ctor public VoiceInteractionSession(android.content.Context); ctor public VoiceInteractionSession(android.content.Context, android.os.Handler); method public void closeSystemDialogs(); + method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public void finish(); method public android.content.Context getContext(); method public int getDisabledShowContext(); @@ -30115,6 +30123,9 @@ package android.telecom { field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 2048; // 0x800 field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2 field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 + field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; + field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; + field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; field public static final int STATE_ACTIVE = 4; // 0x4 field public static final int STATE_DIALING = 3; // 0x3 field public static final int STATE_DISCONNECTED = 6; // 0x6 @@ -30284,6 +30295,7 @@ package android.telecom { method public android.telecom.PhoneAccount.Builder toBuilder(); method public void writeToParcel(android.os.Parcel, int); field public static final int CAPABILITY_CALL_PROVIDER = 2; // 0x2 + field public static final int CAPABILITY_CALL_SUBJECT = 64; // 0x40 field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1 field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10 field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4 @@ -30474,6 +30486,7 @@ package android.telecom { field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER"; field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE"; field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE"; + field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME = "android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME"; field public static final java.lang.String EXTRA_INCOMING_CALL_ADDRESS = "android.telecom.extra.INCOMING_CALL_ADDRESS"; field public static final java.lang.String EXTRA_INCOMING_CALL_EXTRAS = "android.telecom.extra.INCOMING_CALL_EXTRAS"; diff --git a/api/removed.txt b/api/removed.txt index 6d88cb654a89..642d2a8ac19c 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -34,13 +34,6 @@ package android.media { package android.net { - public class ConnectivityManager { - method public deprecated boolean requestRouteToHost(int, int); - method public deprecated boolean requestRouteToHostAddress(int, java.net.InetAddress); - method public deprecated int startUsingNetworkFeature(int, java.lang.String); - method public deprecated int stopUsingNetworkFeature(int, java.lang.String); - } - public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory { method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache); } diff --git a/api/system-current.txt b/api/system-current.txt index 7c473a98257c..a784378e5f5f 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -141,6 +141,7 @@ package android { field public static final java.lang.String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG"; field public static final java.lang.String PACKAGE_USAGE_STATS = "android.permission.PACKAGE_USAGE_STATS"; field public static final java.lang.String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT"; + field public static final java.lang.String PEERS_MAC_ADDRESS = "android.permission.PEERS_MAC_ADDRESS"; field public static final java.lang.String PERFORM_CDMA_PROVISIONING = "android.permission.PERFORM_CDMA_PROVISIONING"; field public static final java.lang.String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION"; field public static final deprecated java.lang.String PERSISTENT_ACTIVITY = "android.permission.PERSISTENT_ACTIVITY"; @@ -3443,6 +3444,7 @@ package android.app { method public boolean isImmersive(); method public boolean isTaskRoot(); method public boolean isVoiceInteraction(); + method public boolean isVoiceInteractionRoot(); method public final deprecated android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); method public boolean moveTaskToBack(boolean); method public boolean navigateUpTo(android.content.Intent); @@ -5829,6 +5831,7 @@ package android.app.admin { method public void uninstallCaCert(android.content.ComponentName, byte[]); method public void wipeData(int); field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN"; + field public static final java.lang.String ACTION_DEVICE_OWNER_CHANGED = "android.app.action.DEVICE_OWNER_CHANGED"; field public static final java.lang.String ACTION_MANAGED_PROFILE_PROVISIONED = "android.app.action.MANAGED_PROFILE_PROVISIONED"; field public static final java.lang.String ACTION_PROVISION_MANAGED_DEVICE = "android.app.action.PROVISION_MANAGED_DEVICE"; field public static final java.lang.String ACTION_PROVISION_MANAGED_PROFILE = "android.app.action.PROVISION_MANAGED_PROFILE"; @@ -19660,8 +19663,11 @@ package android.net { method public boolean requestBandwidthUpdate(android.net.Network); method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback); method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent); + method public deprecated boolean requestRouteToHost(int, int); method public deprecated void setNetworkPreference(int); method public static deprecated boolean setProcessDefaultNetwork(android.net.Network); + method public deprecated int startUsingNetworkFeature(int, java.lang.String); + method public deprecated int stopUsingNetworkFeature(int, java.lang.String); method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback); method public void unregisterNetworkCallback(android.app.PendingIntent); field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; @@ -24645,7 +24651,7 @@ package android.os { field public static final int KITKAT_WATCH = 20; // 0x14 field public static final int LOLLIPOP = 21; // 0x15 field public static final int LOLLIPOP_MR1 = 22; // 0x16 - field public static final int MNC = 23; // 0x17 + field public static final int M = 23; // 0x17 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { @@ -28459,6 +28465,7 @@ package android.provider { public final class Settings { ctor public Settings(); + method public static boolean canDrawOverlays(android.content.Context); field public static final java.lang.String ACTION_ACCESSIBILITY_SETTINGS = "android.settings.ACCESSIBILITY_SETTINGS"; field public static final java.lang.String ACTION_ADD_ACCOUNT = "android.settings.ADD_ACCOUNT_SETTINGS"; field public static final java.lang.String ACTION_AIRPLANE_MODE_SETTINGS = "android.settings.AIRPLANE_MODE_SETTINGS"; @@ -28632,7 +28639,7 @@ package android.provider { field public static final deprecated java.lang.String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed"; field public static final deprecated java.lang.String LOCK_PATTERN_ENABLED = "lock_pattern_autolock"; field public static final deprecated java.lang.String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled"; - field public static final java.lang.String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern"; + field public static final deprecated java.lang.String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern"; field public static final deprecated java.lang.String LOGGING_ID = "logging_id"; field public static final deprecated java.lang.String NETWORK_PREFERENCE = "network_preference"; field public static final java.lang.String PARENTAL_CONTROL_ENABLED = "parental_control_enabled"; @@ -28679,6 +28686,7 @@ package android.provider { public static final class Settings.System extends android.provider.Settings.NameValueTable { ctor public Settings.System(); + method public static boolean canWrite(android.content.Context); method public static void getConfiguration(android.content.ContentResolver, android.content.res.Configuration); method public static float getFloat(android.content.ContentResolver, java.lang.String, float); method public static float getFloat(android.content.ContentResolver, java.lang.String) throws android.provider.Settings.SettingNotFoundException; @@ -30961,6 +30969,7 @@ package android.service.voice { ctor public VoiceInteractionSession(android.content.Context); ctor public VoiceInteractionSession(android.content.Context, android.os.Handler); method public void closeSystemDialogs(); + method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public void finish(); method public android.content.Context getContext(); method public int getDisabledShowContext(); @@ -32299,6 +32308,9 @@ package android.telecom { field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 2048; // 0x800 field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2 field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 + field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; + field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; + field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; field public static final int STATE_ACTIVE = 4; // 0x4 field public static final int STATE_DIALING = 3; // 0x3 field public static final int STATE_DISCONNECTED = 6; // 0x6 @@ -32492,6 +32504,7 @@ package android.telecom { method public android.telecom.PhoneAccount.Builder toBuilder(); method public void writeToParcel(android.os.Parcel, int); field public static final int CAPABILITY_CALL_PROVIDER = 2; // 0x2 + field public static final int CAPABILITY_CALL_SUBJECT = 64; // 0x40 field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1 field public static final int CAPABILITY_MULTI_USER = 32; // 0x20 field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10 @@ -32706,6 +32719,7 @@ package android.telecom { field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER"; field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE"; field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE"; + field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME = "android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME"; field public static final java.lang.String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE"; field public static final java.lang.String EXTRA_INCOMING_CALL_ADDRESS = "android.telecom.extra.INCOMING_CALL_ADDRESS"; diff --git a/api/system-removed.txt b/api/system-removed.txt index 6d88cb654a89..642d2a8ac19c 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -34,13 +34,6 @@ package android.media { package android.net { - public class ConnectivityManager { - method public deprecated boolean requestRouteToHost(int, int); - method public deprecated boolean requestRouteToHostAddress(int, java.net.InetAddress); - method public deprecated int startUsingNetworkFeature(int, java.lang.String); - method public deprecated int stopUsingNetworkFeature(int, java.lang.String); - } - public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory { method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache); } diff --git a/cmds/telecom/src/com/android/commands/telecom/Telecom.java b/cmds/telecom/src/com/android/commands/telecom/Telecom.java index c7ab36cedfa8..b7c729b4834b 100644 --- a/cmds/telecom/src/com/android/commands/telecom/Telecom.java +++ b/cmds/telecom/src/com/android/commands/telecom/Telecom.java @@ -18,6 +18,7 @@ package com.android.commands.telecom; import android.content.ComponentName; import android.content.Context; +import android.net.Uri; import android.os.RemoteException; import android.os.ServiceManager; import android.telecom.PhoneAccount; @@ -43,6 +44,7 @@ public final class Telecom extends BaseCommand { private static final String COMMAND_SET_PHONE_ACCOUNT_ENABLED = "set-phone-account-enabled"; private static final String COMMAND_SET_PHONE_ACCOUNT_DISABLED = "set-phone-account-disabled"; private static final String COMMAND_REGISTER_PHONE_ACCOUNT = "register-phone-account"; + private static final String COMMAND_REGISTER_SIM_PHONE_ACCOUNT = "register-sim-phone-account"; private static final String COMMAND_UNREGISTER_PHONE_ACCOUNT = "unregister-phone-account"; private static final String COMMAND_SET_DEFAULT_DIALER = "set-default-dialer"; private static final String COMMAND_GET_DEFAULT_DIALER = "get-default-dialer"; @@ -59,6 +61,7 @@ public final class Telecom extends BaseCommand { "usage: telecom set-phone-account-enabled <COMPONENT> <ID>\n" + "usage: telecom set-phone-account-disabled <COMPONENT> <ID>\n" + "usage: telecom register-phone-account <COMPONENT> <ID> <LABEL>\n" + + "usage: telecom register-sim-phone-account <COMPONENT> <ID> <LABEL> <ADDRESS>\n" + "usage: telecom unregister-phone-account <COMPONENT> <ID>\n" + "usage: telecom set-default-dialer <PACKAGE>\n" + "usage: telecom get-default-dialer\n" + @@ -98,6 +101,9 @@ public final class Telecom extends BaseCommand { case COMMAND_REGISTER_PHONE_ACCOUNT: runRegisterPhoneAccount(); break; + case COMMAND_REGISTER_SIM_PHONE_ACCOUNT: + runRegisterSimPhoneAccount(); + break; case COMMAND_UNREGISTER_PHONE_ACCOUNT: runUnregisterPhoneAccount(); break; @@ -134,6 +140,24 @@ public final class Telecom extends BaseCommand { System.out.println("Success - " + handle + " registered."); } + private void runRegisterSimPhoneAccount() throws RemoteException { + final PhoneAccountHandle handle = getPhoneAccountHandleFromArgs(); + final String label = nextArgRequired(); + final String address = nextArgRequired(); + PhoneAccount account = PhoneAccount.builder( + handle, label) + .setAddress(Uri.parse(address)) + .setSubscriptionAddress(Uri.parse(address)) + .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER | + PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) + .setShortDescription(label) + .addSupportedUriScheme(PhoneAccount.SCHEME_TEL) + .addSupportedUriScheme(PhoneAccount.SCHEME_VOICEMAIL) + .build(); + mTelecomService.registerPhoneAccount(account); + System.out.println("Success - " + handle + " registered."); + } + private void runUnregisterPhoneAccount() throws RemoteException { final PhoneAccountHandle handle = getPhoneAccountHandleFromArgs(); mTelecomService.unregisterPhoneAccount(handle); diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index dd3d3a8307f2..9394d2c05a2e 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -321,6 +321,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that owns the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission is needed for those platforms. See docs for + * this function in API level 22. + * * @param account The account to query for a password. Must not be {@code null}. * @return The account's password, null if none or if the account doesn't exist */ @@ -345,6 +349,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that owns the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission is needed for those platforms. See docs + * for this function in API level 22. + * * @param account The account to query for user data * @return The user data, null if the account or key doesn't exist */ @@ -493,6 +501,10 @@ public class AccountManager { * {@link android.Manifest.permission#GET_ACCOUNTS} or share a uid with the * authenticator that owns the account type. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * GET_ACCOUNTS permission is needed for those platforms, irrespective of uid + * or signature match. See docs for this function in API level 22. + * * @param type The type of accounts to return, null to retrieve all accounts * @return An array of {@link Account}, one per matching account. Empty * (never null) if no accounts of the specified type have been added. @@ -623,6 +635,11 @@ public class AccountManager { * @param type The type of accounts to return, must not be null * @param features An array of the account features to require, * may be null or empty + * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * GET_ACCOUNTS permission is needed for those platforms, irrespective of uid + * or signature match. See docs for this function in API level 22. + * * @param callback Callback to invoke when the request completes, * null for no callback * @param handler {@link Handler} identifying the callback thread, @@ -668,6 +685,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that owns the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission is needed for those platforms. See docs + * for this function in API level 22. + * * @param account The {@link Account} to add * @param password The password to associate with the account, null for none * @param userdata String values to use for the account's userdata, null for @@ -720,6 +741,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that manages the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission and same UID as account's authenticator + * is needed for those platforms. See docs for this function in API level 22. + * * @param account The {@link Account} to rename * @param newName String name to be associated with the account. * @param callback Callback to invoke when the request completes, null for @@ -784,6 +809,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that manages the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS permission is needed for those platforms. See docs for + * this function in API level 22. + * * @param account The {@link Account} to remove * @param callback Callback to invoke when the request completes, * null for no callback @@ -826,6 +855,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that manages the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS permission is needed for those platforms. See docs for + * this function in API level 22. + * * @param account The {@link Account} to remove * @param activity The {@link Activity} context to use for launching a new * authenticator-defined sub-Activity to prompt the user to delete an @@ -919,6 +952,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that manages the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission and same UID as account's authenticator + * is needed for those platforms. See docs for this function in API level 22. + * * @param account The {@link Account} to delete. * @return True if the account was successfully deleted, false if the * account did not exist, the account is null, or another error @@ -943,6 +980,10 @@ public class AccountManager { * * <p>It is safe to call this method from the main thread. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS or USE_CREDENTIALS permission is needed for those + * platforms. See docs for this function in API level 22. + * * @param accountType The account type of the auth token to invalidate, must not be null * @param authToken The auth token to invalidate, may be null */ @@ -969,6 +1010,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that manages the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission and same UID as account's authenticator + * is needed for those platforms. See docs for this function in API level 22. + * * @param account The account for which an auth token is to be fetched. Cannot be {@code null}. * @param authTokenType The type of auth token to fetch. Cannot be {@code null}. * @return The cached auth token for this account and type, or null if @@ -998,6 +1043,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that manages the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission and same UID as account's authenticator + * is needed for those platforms. See docs for this function in API level 22. + * * @param account The account whose password is to be set. Cannot be * {@code null}. * @param password The password to set, null to clear the password @@ -1025,6 +1074,10 @@ public class AccountManager { * * <p>It is safe to call this method from the main thread. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS permission is needed for those platforms. See docs for + * this function in API level 22. + * * @param account The account whose password to clear */ public void clearPassword(final Account account) { @@ -1047,6 +1100,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that manages the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission and same UID as account's authenticator + * is needed for those platforms. See docs for this function in API level 22. + * * @param account Account whose user data is to be set. Must not be {@code null}. * @param key String user data key to set. Must not be null * @param value String value to set, {@code null} to clear this user data key @@ -1073,6 +1130,10 @@ public class AccountManager { * <p>This method requires the caller to have a signature match with the * authenticator that manages the specified account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * AUTHENTICATE_ACCOUNTS permission and same UID as account's authenticator + * is needed for those platforms. See docs for this function in API level 22. + * * @param account The account to set an auth token for * @param authTokenType The type of the auth token, see {#getAuthToken} * @param authToken The auth token to add to the cache @@ -1095,6 +1156,10 @@ public class AccountManager { * <p>This method may block while a network request completes, and must * never be made from the main thread. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * USE_CREDENTIALS permission is needed for those platforms. See docs for + * this function in API level 22. + * * @param account The account to fetch an auth token for * @param authTokenType The auth token type, see {@link #getAuthToken getAuthToken()} * @param notifyAuthFailure If true, display a notification and return null @@ -1143,6 +1208,10 @@ public class AccountManager { * access different functionality -- for example, Google uses different auth * tokens to access Gmail and Google Calendar for the same account. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * USE_CREDENTIALS permission is needed for those platforms. See docs for + * this function in API level 22. + * * <p>This method may be called from any thread, but the returned * {@link AccountManagerFuture} must not be used on the main thread. * @@ -1306,6 +1375,10 @@ public class AccountManager { * <p>This method may be called from any thread, but the returned * {@link AccountManagerFuture} must not be used on the main thread. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * USE_CREDENTIALS permission is needed for those platforms. See docs for + * this function in API level 22. + * * @param account The account to fetch an auth token for * @param authTokenType The auth token type, an authenticator-dependent * string token, must not be null @@ -1369,6 +1442,10 @@ public class AccountManager { * * <p>This method may be called from any thread, but the returned * {@link AccountManagerFuture} must not be used on the main thread. + * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS permission is needed for those platforms. See docs for + * this function in API level 22. * * @param accountType The type of account to add; must not be null * @param authTokenType The type of auth token (see {@link #getAuthToken}) @@ -1551,6 +1628,10 @@ public class AccountManager { * <p>This method may be called from any thread, but the returned * {@link AccountManagerFuture} must not be used on the main thread. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS permission is needed for those platforms. See docs + * for this function in API level 22. + * * @param account The account to confirm password knowledge for * @param options Authenticator-specific options for the request; * if the {@link #KEY_PASSWORD} string field is present, the @@ -1629,6 +1710,10 @@ public class AccountManager { * <p>This method may be called from any thread, but the returned * {@link AccountManagerFuture} must not be used on the main thread. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS permission is needed for those platforms. See docs for + * this function in API level 22. + * * @param account The account to update credentials for * @param authTokenType The credentials entered must allow an auth token * of this type to be created (but no actual auth token is returned); @@ -1689,6 +1774,10 @@ public class AccountManager { * <p>This method requires the caller to have the same signature as the * authenticator associated with the specified account type. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS permission is needed for those platforms. See docs + * for this function in API level 22. + * * @param accountType The account type associated with the authenticator * to adjust * @param activity The {@link Activity} context to use for launching a new @@ -2209,6 +2298,10 @@ public class AccountManager { * <p>This method may be called from any thread, but the returned * {@link AccountManagerFuture} must not be used on the main thread. * + * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, + * MANAGE_ACCOUNTS permission is needed for those platforms. See docs for + * this function in API level 22. + * * @param accountType The account type required * (see {@link #getAccountsByType}), must not be null * @param authTokenType The desired auth token type diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index e49acfae7bed..3c8af0d5444a 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -1229,6 +1229,22 @@ public class Activity extends ContextThemeWrapper } /** + * Like {@link #isVoiceInteraction}, but only returns true if this is also the root + * of a voice interaction. That is, returns true if this activity was directly + * started by the voice interaction service as the initiation of a voice interaction. + * Otherwise, for example if it was started by another activity while under voice + * interaction, returns false. + */ + public boolean isVoiceInteractionRoot() { + try { + return mVoiceInteractor != null + && ActivityManagerNative.getDefault().isRootVoiceInteraction(mToken); + } catch (RemoteException e) { + } + return false; + } + + /** * Retrieve the active {@link VoiceInteractor} that the user is going through to * interact with this activity. */ @@ -1864,7 +1880,10 @@ public class Activity extends ContextThemeWrapper nci.children = children; nci.fragments = fragments; nci.loaders = loaders; - nci.voiceInteractor = mVoiceInteractor; + if (mVoiceInteractor != null) { + mVoiceInteractor.retainInstance(); + nci.voiceInteractor = mVoiceInteractor; + } return nci; } @@ -5547,6 +5566,9 @@ public class Activity extends ContextThemeWrapper mFragments.dumpLoaders(innerPrefix, fd, writer, args); mFragments.getFragmentManager().dump(innerPrefix, fd, writer, args); + if (mVoiceInteractor != null) { + mVoiceInteractor.dump(innerPrefix, fd, writer, args); + } if (getWindow() != null && getWindow().peekDecorView() != null && diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index b758a7a5493d..e144c297f50e 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2582,6 +2582,15 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeInt(res ? 1 : 0); return true; } + + case IS_ROOT_VOICE_INTERACTION_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + IBinder token = data.readStrongBinder(); + boolean res = isRootVoiceInteraction(token); + reply.writeNoException(); + reply.writeInt(res ? 1 : 0); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -5962,5 +5971,19 @@ class ActivityManagerProxy implements IActivityManager return res != 0; } + @Override + public boolean isRootVoiceInteraction(IBinder token) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(token); + mRemote.transact(IS_ROOT_VOICE_INTERACTION_TRANSACTION, data, reply, 0); + reply.readException(); + int res = reply.readInt(); + data.recycle(); + reply.recycle(); + return res != 0; + } + private IBinder mRemote; } diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index dc83a011e596..330d730b89cb 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -720,7 +720,7 @@ public class AlarmManager { } // Reject this timezone if it isn't an Olson zone we recognize. - if (mTargetSdkVersion >= Build.VERSION_CODES.MNC) { + if (mTargetSdkVersion >= Build.VERSION_CODES.M) { boolean hasTimeZone = false; try { hasTimeZone = ZoneInfoDB.getInstance().hasTimeZone(timeZone); diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 976830fc6cdd..42ac67c7ae44 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -778,7 +778,7 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, AppOpsManager.MODE_ALLOWED, AppOpsManager.MODE_ALLOWED, - AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_DEFAULT, // OP_WRITE_SETTINGS AppOpsManager.MODE_DEFAULT, // OP_SYSTEM_ALERT_WINDOW AppOpsManager.MODE_ALLOWED, AppOpsManager.MODE_ALLOWED, @@ -1234,6 +1234,14 @@ public class AppOpsManager { } /** @hide */ + public void setUidMode(int code, int uid, int mode) { + try { + mService.setUidMode(code, uid, mode); + } catch (RemoteException e) { + } + } + + /** @hide */ public void setMode(int code, int uid, String packageName, int mode) { try { mService.setMode(code, uid, packageName, mode); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 1fb0b2af3366..0adce5dc193d 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -110,6 +110,9 @@ final class ApplicationPackageManager extends PackageManager { @GuardedBy("mDelegates") private final ArrayList<MoveCallbackDelegate> mDelegates = new ArrayList<>(); + @GuardedBy("mLock") + private String mPermissionsControllerPackageName; + UserManager getUserManager() { synchronized (mLock) { if (mUserManager == null) { @@ -429,6 +432,23 @@ final class ApplicationPackageManager extends PackageManager { } } + /** + * @hide + */ + @Override + public String getPermissionControllerPackageName() { + synchronized (mLock) { + if (mPermissionsControllerPackageName == null) { + try { + mPermissionsControllerPackageName = mPM.getPermissionControllerPackageName(); + } catch (RemoteException e) { + throw new RuntimeException("Package manager has died", e); + } + } + return mPermissionsControllerPackageName; + } + } + @Override public boolean addPermission(PermissionInfo info) { try { @@ -757,7 +777,9 @@ final class ApplicationPackageManager extends PackageManager { public List<ProviderInfo> queryContentProviders(String processName, int uid, int flags) { try { - return mPM.queryContentProviders(processName, uid, flags); + ParceledListSlice<ProviderInfo> slice + = mPM.queryContentProviders(processName, uid, flags); + return slice != null ? slice.getList() : null; } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index 532764682693..fb0e79b849b2 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -1013,14 +1013,10 @@ public class DownloadManager { /** * Returns the {@link Uri} of the given downloaded file id, if the file is * downloaded successfully. Otherwise, null is returned. - *<p> - * If the specified downloaded file is in external storage (for example, /sdcard dir), - * then it is assumed to be safe for anyone to read and the returned {@link Uri} corresponds - * to the filepath on sdcard. * * @param id the id of the downloaded file. - * @return the {@link Uri} of the given downloaded file id, if download was successful. null - * otherwise. + * @return the {@link Uri} of the given downloaded file id, if download was + * successful. null otherwise. */ public Uri getUriForDownloadedFile(long id) { // to check if the file is in cache, get its destination from the database @@ -1034,24 +1030,7 @@ public class DownloadManager { if (cursor.moveToFirst()) { int status = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_STATUS)); if (DownloadManager.STATUS_SUCCESSFUL == status) { - int indx = cursor.getColumnIndexOrThrow( - Downloads.Impl.COLUMN_DESTINATION); - int destination = cursor.getInt(indx); - // TODO: if we ever add API to DownloadManager to let the caller specify - // non-external storage for a downloaded file, then the following code - // should also check for that destination. - if (destination == Downloads.Impl.DESTINATION_CACHE_PARTITION || - destination == Downloads.Impl.DESTINATION_SYSTEMCACHE_PARTITION || - destination == Downloads.Impl.DESTINATION_CACHE_PARTITION_NOROAMING || - destination == Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE) { - // return private uri - return ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, id); - } else { - // return public uri - String path = cursor.getString( - cursor.getColumnIndexOrThrow(COLUMN_LOCAL_FILENAME)); - return Uri.fromFile(new File(path)); - } + return ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, id); } } } finally { diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java index 7fbb99acc0cf..4b670cd52f00 100644 --- a/core/java/android/app/ExitTransitionCoordinator.java +++ b/core/java/android/app/ExitTransitionCoordinator.java @@ -240,7 +240,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { getWindow().setBackgroundDrawable(new ColorDrawable(Color.BLACK)); } final boolean targetsM = decorView == null || decorView.getContext() - .getApplicationInfo().targetSdkVersion >= VERSION_CODES.MNC; + .getApplicationInfo().targetSdkVersion >= VERSION_CODES.M; ArrayList<String> sharedElementNames = targetsM ? mSharedElementNames : mAllSharedElementNames; ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(mActivity, this, diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 9ebbb9b9a671..90216af3745c 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -515,6 +515,8 @@ public interface IActivityManager extends IInterface { public boolean setProcessMemoryTrimLevel(String process, int uid, int level) throws RemoteException; + public boolean isRootVoiceInteraction(IBinder token) throws RemoteException; + /* * Private non-Binder interfaces */ @@ -861,4 +863,5 @@ public interface IActivityManager extends IInterface { int IS_SCREEN_CAPTURE_ALLOWED_ON_CURRENT_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+299; int SHOW_ASSIST_FROM_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+300; + int IS_ROOT_VOICE_INTERACTION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+301; } diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index c2d901dfa058..69b8b9510b3a 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -1810,9 +1810,14 @@ public class Instrumentation { throw new SecurityException( "Starting under voice control not allowed for: " + intent); case ActivityManager.START_NOT_CURRENT_USER_ACTIVITY: - throw new SecurityException( - "Not allowed to start background user activity that shouldn't be" - + " displayed for all users."); + // Fail silently for this case so we don't break current apps. + // TODO(b/22929608): Instead of failing silently or throwing an exception, + // we should properly position the activity in the stack (i.e. behind all current + // user activity/task) and not change the positioning of stacks. + Log.e(TAG, + "Not allowed to start background user activity that shouldn't be displayed" + + " for all users. Failing silently..."); + break; default: throw new AndroidRuntimeException("Unknown error code " + res + " when starting " + intent); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index fc71783a1b74..f3f24280d435 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -930,9 +930,9 @@ public class Notification implements Parcelable private Action(Parcel in) { if (in.readInt() != 0) { mIcon = Icon.CREATOR.createFromParcel(in); - } - if (mIcon.getType() == Icon.TYPE_RESOURCE) { - icon = mIcon.getResId(); + if (mIcon.getType() == Icon.TYPE_RESOURCE) { + icon = mIcon.getResId(); + } } title = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); if (in.readInt() == 1) { @@ -3174,7 +3174,8 @@ public class Notification implements Parcelable RemoteViews button = new BuilderRemoteViews(mContext.getApplicationInfo(), tombstone ? getActionTombstoneLayoutResource() : getActionLayoutResource()); - button.setTextViewCompoundDrawablesRelative(R.id.action0, action.icon, 0, 0, 0); + final Icon ai = action.getIcon(); + button.setTextViewCompoundDrawablesRelative(R.id.action0, ai, null, null, null); button.setTextViewText(R.id.action0, processLegacyText(action.title)); if (!tombstone) { button.setOnClickPendingIntent(R.id.action0, action.actionIntent); @@ -3193,7 +3194,7 @@ public class Notification implements Parcelable } private void processLegacyAction(Action action, RemoteViews button) { - if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, action.icon)) { + if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, action.getIcon())) { button.setTextViewCompoundDrawablesRelativeColorFilter(R.id.action0, 0, mContext.getColor(R.color.notification_action_color_filter), PorterDuff.Mode.MULTIPLY); @@ -3608,7 +3609,6 @@ public class Notification implements Parcelable mContentText = extras.getCharSequence(EXTRA_TEXT); mSubText = extras.getCharSequence(EXTRA_SUB_TEXT); mContentInfo = extras.getCharSequence(EXTRA_INFO_TEXT); - mSmallIcon = extras.getParcelable(EXTRA_SMALL_ICON); mProgress = extras.getInt(EXTRA_PROGRESS); mProgressMax = extras.getInt(EXTRA_PROGRESS_MAX); mProgressIndeterminate = extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE); @@ -4442,7 +4442,7 @@ public class Notification implements Parcelable final boolean tombstone = (action.actionIntent == null); RemoteViews button = new BuilderRemoteViews(mBuilder.mContext.getApplicationInfo(), R.layout.notification_material_media_action); - button.setImageViewResource(R.id.action0, action.icon); + button.setImageViewIcon(R.id.action0, action.getIcon()); button.setDrawableParameters(R.id.action0, false, -1, 0xFFFFFFFF, PorterDuff.Mode.SRC_ATOP, -1); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 01a1c18b99a2..3d264c6f2cba 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -220,11 +220,12 @@ final class SystemServiceRegistry { SYSTEM_SERVICE_NAMES.put(android.text.ClipboardManager.class, Context.CLIPBOARD_SERVICE); registerService(Context.CONNECTIVITY_SERVICE, ConnectivityManager.class, - new StaticServiceFetcher<ConnectivityManager>() { + new StaticOuterContextServiceFetcher<ConnectivityManager>() { @Override - public ConnectivityManager createService() { + public ConnectivityManager createService(Context context) { IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); - return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b)); + IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); + return new ConnectivityManager(context, service); }}); registerService(Context.COUNTRY_DETECTOR, CountryDetector.class, @@ -793,4 +794,30 @@ final class SystemServiceRegistry { public abstract T createService(); } + + /** + * Like StaticServiceFetcher, creates only one instance of the service per process, but when + * creating the service for the first time, passes it the outer context of the creating + * component. + * + * TODO: Is this safe in the case where multiple applications share the same process? + * TODO: Delete this once its only user (ConnectivityManager) is known to work well in the + * case where multiple application components each have their own ConnectivityManager object. + */ + static abstract class StaticOuterContextServiceFetcher<T> implements ServiceFetcher<T> { + private T mCachedInstance; + + @Override + public final T getService(ContextImpl ctx) { + synchronized (StaticOuterContextServiceFetcher.this) { + if (mCachedInstance == null) { + mCachedInstance = createService(ctx.getOuterContext()); + } + return mCachedInstance; + } + } + + public abstract T createService(Context applicationContext); + } + } diff --git a/core/java/android/app/VoiceInteractor.java b/core/java/android/app/VoiceInteractor.java index bf7458c0c245..823c4271adf2 100644 --- a/core/java/android/app/VoiceInteractor.java +++ b/core/java/android/app/VoiceInteractor.java @@ -27,6 +27,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.util.ArrayMap; +import android.util.DebugUtils; import android.util.Log; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.IVoiceInteractorCallback; @@ -34,6 +35,8 @@ import com.android.internal.app.IVoiceInteractorRequest; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; /** @@ -68,6 +71,7 @@ public final class VoiceInteractor { Context mContext; Activity mActivity; + boolean mRetaining; final HandlerCaller mHandlerCaller; final HandlerCaller.Callback mHandlerCallerCallback = new HandlerCaller.Callback() { @@ -272,6 +276,29 @@ public final class VoiceInteractor { public void onDetached() { } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + DebugUtils.buildShortClassTag(this, sb); + sb.append(" "); + sb.append(getRequestTypeName()); + sb.append(" name="); + sb.append(mName); + sb.append('}'); + return sb.toString(); + } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mRequestInterface="); + writer.println(mRequestInterface.asBinder()); + writer.print(prefix); writer.print("mActivity="); writer.println(mActivity); + writer.print(prefix); writer.print("mName="); writer.println(mName); + } + + String getRequestTypeName() { + return "Request"; + } + void clear() { mRequestInterface = null; mContext = null; @@ -333,6 +360,18 @@ public final class VoiceInteractor { public void onConfirmationResult(boolean confirmed, Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); writer.println(mPrompt); + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); writer.println(mExtras); + } + } + + String getRequestTypeName() { + return "Confirmation"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startConfirmation(packageName, callback, mPrompt, mExtras); @@ -515,6 +554,38 @@ public final class VoiceInteractor { public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); writer.println(mPrompt); + if (mOptions != null) { + writer.print(prefix); writer.println("Options:"); + for (int i=0; i<mOptions.length; i++) { + Option op = mOptions[i]; + writer.print(prefix); writer.print(" #"); writer.print(i); writer.println(":"); + writer.print(prefix); writer.print(" mLabel="); writer.println(op.mLabel); + writer.print(prefix); writer.print(" mIndex="); writer.println(op.mIndex); + if (op.mSynonyms != null && op.mSynonyms.size() > 0) { + writer.print(prefix); writer.println(" Synonyms:"); + for (int j=0; j<op.mSynonyms.size(); j++) { + writer.print(prefix); writer.print(" #"); writer.print(j); + writer.print(": "); writer.println(op.mSynonyms.get(j)); + } + } + if (op.mExtras != null) { + writer.print(prefix); writer.print(" mExtras="); + writer.println(op.mExtras); + } + } + } + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); writer.println(mExtras); + } + } + + String getRequestTypeName() { + return "PickOption"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startPickOption(packageName, callback, mPrompt, mOptions, mExtras); @@ -560,6 +631,18 @@ public final class VoiceInteractor { public void onCompleteResult(Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); writer.println(mPrompt); + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); writer.println(mExtras); + } + } + + String getRequestTypeName() { + return "CompleteVoice"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startCompleteVoice(packageName, callback, mPrompt, mExtras); @@ -607,6 +690,18 @@ public final class VoiceInteractor { public void onAbortResult(Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); writer.println(mPrompt); + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); writer.println(mExtras); + } + } + + String getRequestTypeName() { + return "AbortVoice"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startAbortVoice(packageName, callback, mPrompt, mExtras); @@ -650,6 +745,18 @@ public final class VoiceInteractor { public void onCommandResult(boolean isCompleted, Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mCommand="); writer.println(mCommand); + if (mArgs != null) { + writer.print(prefix); writer.print("mArgs="); writer.println(mArgs); + } + } + + String getRequestTypeName() { + return "Command"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startCommand(packageName, callback, mCommand, mArgs); @@ -721,6 +828,30 @@ public final class VoiceInteractor { return mVisualPrompt; } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + DebugUtils.buildShortClassTag(this, sb); + if (mVisualPrompt != null && mVoicePrompts != null && mVoicePrompts.length == 1 + && mVisualPrompt.equals(mVoicePrompts[0])) { + sb.append(" "); + sb.append(mVisualPrompt); + } else { + if (mVisualPrompt != null) { + sb.append(" visual="); sb.append(mVisualPrompt); + } + if (mVoicePrompts != null) { + sb.append(", voice="); + for (int i=0; i<mVoicePrompts.length; i++) { + if (i > 0) sb.append(" | "); + sb.append(mVoicePrompts[i]); + } + } + } + sb.append('}'); + return sb.toString(); + } + /** Constructor to support Parcelable behavior. */ Prompt(Parcel in) { mVoicePrompts = in.readCharSequenceArray(); @@ -773,7 +904,7 @@ public final class VoiceInteractor { if (N < 1) { return null; } - ArrayList<Request> list = new ArrayList<Request>(N); + ArrayList<Request> list = new ArrayList<>(N); for (int i=0; i<N; i++) { list.add(mActiveRequests.valueAt(i)); } @@ -781,6 +912,7 @@ public final class VoiceInteractor { } void attachActivity(Activity activity) { + mRetaining = false; if (mActivity == activity) { return; } @@ -797,6 +929,10 @@ public final class VoiceInteractor { } } + void retainInstance() { + mRetaining = true; + } + void detachActivity() { ArrayList<Request> reqs = makeRequestList(); if (reqs != null) { @@ -807,6 +943,16 @@ public final class VoiceInteractor { req.mContext = null; } } + if (!mRetaining) { + reqs = makeRequestList(); + if (reqs != null) { + for (int i=0; i<reqs.size(); i++) { + Request req = reqs.get(i); + req.cancel(); + } + } + mActiveRequests.clear(); + } mContext = null; mActivity = null; } @@ -902,4 +1048,22 @@ public final class VoiceInteractor { throw new RuntimeException("Voice interactor has died", e); } } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + String innerPrefix = prefix + " "; + if (mActiveRequests.size() > 0) { + writer.print(prefix); writer.println("Active voice requests:"); + for (int i=0; i<mActiveRequests.size(); i++) { + Request req = mActiveRequests.valueAt(i); + writer.print(prefix); writer.print(" #"); writer.print(i); + writer.print(": "); + writer.println(req); + req.dump(innerPrefix, fd, writer, args); + } + } + writer.print(prefix); writer.println("VoiceInteractor misc state:"); + writer.print(prefix); writer.print(" mInteractor="); + writer.println(mInteractor.asBinder()); + writer.print(prefix); writer.print(" mActivity="); writer.println(mActivity); + } } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 33cbc9d8c737..f21422e0d7cb 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -112,7 +112,7 @@ public class DevicePolicyManager { * * In version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this intent must contain the * extra {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}. - * As of {@link android.os.Build.VERSION_CODES#MNC}, it should contain the extra + * As of {@link android.os.Build.VERSION_CODES#M}, it should contain the extra * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} instead, although specifying only * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} is still supported. * @@ -417,7 +417,7 @@ public class DevicePolicyManager { * * <p><strong>Note:</strong> for devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP} * and {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1} only SHA-1 hash is supported. - * Starting from {@link android.os.Build.VERSION_CODES#MNC}, this parameter accepts SHA-256 in + * Starting from {@link android.os.Build.VERSION_CODES#M}, this parameter accepts SHA-256 in * addition to SHA-1. Support for SHA-1 is likely to be removed in future OS releases. */ public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM @@ -590,7 +590,7 @@ public class DevicePolicyManager { * <li>{@link #EXTRA_PROVISIONING_WIFI_PAC_URL}, optional</li></ul> * * <p> - * As of {@link android.os.Build.VERSION_CODES#MNC}, the properties should contain + * As of {@link android.os.Build.VERSION_CODES#M}, the properties should contain * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} instead of * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}, (although specifying only * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} is still supported). @@ -603,7 +603,7 @@ public class DevicePolicyManager { * @hide * This MIME type is used for starting the Device Owner provisioning that requires * new provisioning features introduced in API version - * {@link android.os.Build.VERSION_CODES#MNC} in addition to those supported in earlier + * {@link android.os.Build.VERSION_CODES#M} in addition to those supported in earlier * versions. * * <p>During device owner provisioning a device admin app is set as the owner of the device. @@ -690,7 +690,7 @@ public class DevicePolicyManager { = "android.app.extra.PROFILE_OWNER_NAME"; /** - * Activity action: send when any policy admin changes a policy. + * Broadcast action: send when any policy admin changes a policy. * This is generally used to find out when a new policy is in effect. * * @hide @@ -699,6 +699,16 @@ public class DevicePolicyManager { = "android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED"; /** + * Broadcast action: sent when the device owner is set or changed. + * + * This broadcast is sent only to the primary user. + * @see #ACTION_PROVISION_MANAGED_DEVICE + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_DEVICE_OWNER_CHANGED + = "android.app.action.DEVICE_OWNER_CHANGED"; + + /** * The ComponentName of the administrator component. * * @see #ACTION_ADD_DEVICE_ADMIN @@ -2405,7 +2415,7 @@ public class DevicePolicyManager { * <p>The calling device admin must be a device or profile owner. If it is not, a * security exception will be thrown. * - * <p>From version {@link android.os.Build.VERSION_CODES#MNC} disabling screen capture also + * <p>From version {@link android.os.Build.VERSION_CODES#M} disabling screen capture also * blocks assist requests for all activities of the relevant user. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. @@ -2489,9 +2499,9 @@ public class DevicePolicyManager { * this method; if it has not, a security exception will be thrown. * * <p>Calling this from a managed profile before version - * {@link android.os.Build.VERSION_CODES#MNC} will throw a security exception. + * {@link android.os.Build.VERSION_CODES#M} will throw a security exception. * - * <p>From version {@link android.os.Build.VERSION_CODES#MNC} a profile owner can set: + * <p>From version {@link android.os.Build.VERSION_CODES#M} a profile owner can set: * <ul> * <li>{@link #KEYGUARD_DISABLE_TRUST_AGENTS}, {@link #KEYGUARD_DISABLE_FINGERPRINT} * these will affect the profile's parent user. @@ -3613,7 +3623,7 @@ public class DevicePolicyManager { * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the * user could not be created. * - * @deprecated From {@link android.os.Build.VERSION_CODES#MNC} + * @deprecated From {@link android.os.Build.VERSION_CODES#M} */ @Deprecated public UserHandle createUser(@NonNull ComponentName admin, String name) { @@ -3650,7 +3660,7 @@ public class DevicePolicyManager { * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the * user could not be created. * - * @deprecated From {@link android.os.Build.VERSION_CODES#MNC} + * @deprecated From {@link android.os.Build.VERSION_CODES#M} */ @Deprecated public UserHandle createAndInitializeUser(@NonNull ComponentName admin, String name, @@ -3904,7 +3914,7 @@ public class DevicePolicyManager { * <p>Any packages that shares uid with an allowed package will also be allowed * to activate lock task. * - * From {@link android.os.Build.VERSION_CODES#MNC} removing packages from the lock task + * From {@link android.os.Build.VERSION_CODES#M} removing packages from the lock task * package list results in locked tasks belonging to those packages to be finished. * * This function can only be called by the device owner. @@ -3972,14 +3982,14 @@ public class DevicePolicyManager { * <li>{@link Settings.Global#USB_MASS_STORAGE_ENABLED}</li> * <li>{@link Settings.Global#WIFI_SLEEP_POLICY}</li> * <li>{@link Settings.Global#STAY_ON_WHILE_PLUGGED_IN} - * This setting is only available from {@link android.os.Build.VERSION_CODES#MNC} onwards + * This setting is only available from {@link android.os.Build.VERSION_CODES#M} onwards * and can only be set if {@link #setMaximumTimeToLock} is not used to set a timeout.</li> * <li>{@link Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> - * This setting is only available from {@link android.os.Build.VERSION_CODES#MNC} onwards. + * This setting is only available from {@link android.os.Build.VERSION_CODES#M} onwards. * </li> * </ul> * <p>Changing the following settings has no effect as of - * {@link android.os.Build.VERSION_CODES#MNC}: + * {@link android.os.Build.VERSION_CODES#M}: * <ul> * <li>{@link Settings.Global#BLUETOOTH_ON}. * Use {@link android.bluetooth.BluetoothAdapter#enable()} and @@ -4334,7 +4344,7 @@ public class DevicePolicyManager { * the permission grant state via {@link #setPermissionGrantState}. * * <p/>As this policy only acts on runtime permission requests, it only applies to applications - * built with a {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#MNC} or later. + * built with a {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later. * * @param admin Which profile or device owner this request is associated with. * @param policy One of the policy constants {@link #PERMISSION_POLICY_PROMPT}, @@ -4378,7 +4388,7 @@ public class DevicePolicyManager { * revoke the permission. It retains the previous grant, if any. * * <p/>Permissions can be granted or revoked only for applications built with a - * {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#MNC} or later. + * {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later. * * @param admin Which profile or device owner this request is associated with. * @param packageName The application to grant or revoke a permission to. diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index ee0fc9110689..6b720c0a22f6 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -141,10 +141,10 @@ public class AssistStructure implements Parcelable { if (DEBUG_PARCEL) Log.d(TAG, "Creating PooledStringWriter @ " + out.dataPosition()); PooledStringWriter pwriter = new PooledStringWriter(out); while (writeNextEntryToParcel(as, out, pwriter)) { - // If the parcel contains more than 100K of data, then we are getting too + // If the parcel is above the IPC limit, then we are getting too // large for a single IPC so stop here and let the caller come back when it // is ready for more. - if (out.dataSize() > 1024*1024) { + if (out.dataSize() > IBinder.MAX_IPC_SIZE) { if (DEBUG_PARCEL) Log.d(TAG, "Assist data size is " + out.dataSize() + " @ pos " + out.dataPosition() + "; returning partial result"); out.writeInt(0); @@ -1106,7 +1106,7 @@ public class AssistStructure implements Parcelable { @Override public void setAssistBlocked(boolean state) { mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_ASSIST_BLOCKED) - | (state ? 0 : ViewNode.FLAGS_ASSIST_BLOCKED); + | (state ? ViewNode.FLAGS_ASSIST_BLOCKED : 0); } @Override @@ -1412,6 +1412,9 @@ public class AssistStructure implements Parcelable { if (extras != null) { Log.i(TAG, prefix + " Extras: " + extras); } + if (node.isAssistBlocked()) { + Log.i(TAG, prefix + " BLOCKED"); + } final int NCHILDREN = node.getChildCount(); if (NCHILDREN > 0) { Log.i(TAG, prefix + " Children:"); diff --git a/core/java/android/app/backup/BackupTransport.java b/core/java/android/app/backup/BackupTransport.java index 4d2158ffb457..954ccef93b44 100644 --- a/core/java/android/app/backup/BackupTransport.java +++ b/core/java/android/app/backup/BackupTransport.java @@ -415,7 +415,7 @@ public class BackupTransport { * if this method returns TRANSPORT_OK. To avoid storing such payloads the transport * must recognize this case and return TRANSPORT_PACKAGE_REJECTED. * - * Added in MNC (API 23). + * Added in {@link android.os.Build.VERSION_CODES#M}. * * @param size The estimated size of the full-data payload for this app. This includes * manifest and archive format overhead, but is not guaranteed to be precise. diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index f786d2fd52c2..ec443cddf99b 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1021,7 +1021,7 @@ public class Intent implements Parcelable, Cloneable { * numbers. Applications can <strong>dial</strong> emergency numbers using * {@link #ACTION_DIAL}, however. * - * <p>Note: if you app targets {@link android.os.Build.VERSION_CODES#MNC MNC} + * <p>Note: if you app targets {@link android.os.Build.VERSION_CODES#M M} * and above and declares as using the {@link android.Manifest.permission#CALL_PHONE} * permission which is not granted, then attempting to use this action will * result in a {@link java.lang.SecurityException}. @@ -1782,14 +1782,6 @@ public class Intent implements Parcelable, Cloneable { @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_ALARM_CHANGED = "android.intent.action.ALARM_CHANGED"; /** - * Sync State Changed Action: This is broadcast when the sync starts or stops or when one has - * been failing for a long time. It is used by the SyncManager and the StatusBar service. - * @hide - */ - @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - public static final String ACTION_SYNC_STATE_CHANGED - = "android.intent.action.SYNC_STATE_CHANGED"; - /** * Broadcast Action: This is broadcast once, after the system has finished * booting. It can be used to perform application-specific initialization, * such as installing alarms. You must hold the diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 19329ceaefec..3a17e23b0547 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -1206,7 +1206,7 @@ public class IntentFilter implements Parcelable { * {@link #MATCH_CATEGORY_PORT}, {@link #NO_MATCH_DATA}. */ public final int matchDataAuthority(Uri data) { - if (mDataAuthorities == null) { + if (mDataAuthorities == null || data == null) { return NO_MATCH_DATA; } final int numDataAuthorities = mDataAuthorities.size(); @@ -1277,7 +1277,7 @@ public class IntentFilter implements Parcelable { } final ArrayList<PatternMatcher> schemeSpecificParts = mDataSchemeSpecificParts; - if (schemeSpecificParts != null) { + if (schemeSpecificParts != null && data != null) { match = hasDataSchemeSpecificPart(data.getSchemeSpecificPart()) ? MATCH_CATEGORY_SCHEME_SPECIFIC_PART : NO_MATCH_DATA; } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index bc24d675e777..a5e9faf7b1b9 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -203,7 +203,7 @@ interface IPackageManager { void querySyncProviders(inout List<String> outNames, inout List<ProviderInfo> outInfo); - List<ProviderInfo> queryContentProviders( + ParceledListSlice queryContentProviders( String processName, int uid, int flags); InstrumentationInfo getInstrumentationInfo( @@ -505,4 +505,6 @@ interface IPackageManager { void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId); boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId); + + String getPermissionControllerPackageName(); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index cda581612282..0f936fd693ed 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1876,14 +1876,6 @@ public abstract class PackageManager { "android.content.pm.action.REQUEST_PERMISSIONS"; /** - * The component name handling runtime permission grants. - * - * @hide - */ - public static final String GRANT_PERMISSIONS_PACKAGE_NAME = - "com.android.packageinstaller"; - - /** * The names of the requested permissions. * <p> * <strong>Type:</strong> String[] @@ -2431,7 +2423,17 @@ public abstract class PackageManager { * @return Whether the permission is restricted by policy. */ @CheckResult - public abstract boolean isPermissionRevokedByPolicy(String permName, String pkgName); + public abstract boolean isPermissionRevokedByPolicy(@NonNull String permName, + @NonNull String pkgName); + + /** + * Gets the package name of the component controlling runtime permissions. + * + * @return The package name. + * + * @hide + */ + public abstract String getPermissionControllerPackageName(); /** * Add a new dynamic permission to the system. For this to work, your @@ -2615,7 +2617,7 @@ public abstract class PackageManager { } Intent intent = new Intent(ACTION_REQUEST_PERMISSIONS); intent.putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES, permissions); - intent.setPackage(GRANT_PERMISSIONS_PACKAGE_NAME); + intent.setPackage(getPermissionControllerPackageName()); return intent; } diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index ea089562243f..bf70d6ca9dfe 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -83,6 +83,12 @@ public abstract class PackageManagerInternal { public abstract void setDialerAppPackagesProvider(PackagesProvider provider); /** + * Sets the sim call manager packages provider. + * @param provider The packages provider. + */ + public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider); + + /** * Sets the sync adapter packages provider. * @param provider The provider. */ @@ -101,4 +107,12 @@ public abstract class PackageManagerInternal { * @param userId The user for which to grant the permissions. */ public abstract void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId); + + /** + * Requests granting of the default permissions to the current default sim call manager. + * @param packageName The default sim call manager package name. + * @param userId The user for which to grant the permissions. + */ + public abstract void grantDefaultPermissionsToDefaultSimCallManager(String packageName, + int userId); } diff --git a/core/java/android/content/pm/ParceledListSlice.java b/core/java/android/content/pm/ParceledListSlice.java index e5c2203a2d20..cfb447334406 100644 --- a/core/java/android/content/pm/ParceledListSlice.java +++ b/core/java/android/content/pm/ParceledListSlice.java @@ -46,8 +46,7 @@ public class ParceledListSlice<T extends Parcelable> implements Parcelable { * TODO get this number from somewhere else. For now set it to a quarter of * the 1MB limit. */ - private static final int MAX_IPC_SIZE = 256 * 1024; - private static final int MAX_FIRST_IPC_SIZE = MAX_IPC_SIZE / 2; + private static final int MAX_IPC_SIZE = IBinder.MAX_IPC_SIZE; private final List<T> mList; @@ -150,7 +149,7 @@ public class ParceledListSlice<T extends Parcelable> implements Parcelable { final Class<?> listElementClass = mList.get(0).getClass(); dest.writeParcelableCreator(mList.get(0)); int i = 0; - while (i < N && dest.dataSize() < MAX_FIRST_IPC_SIZE) { + while (i < N && dest.dataSize() < MAX_IPC_SIZE) { dest.writeInt(1); final T parcelable = mList.get(i); diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index d456b5eeaefb..5d405f92e380 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -19,7 +19,6 @@ package android.hardware; import android.annotation.SystemApi; import android.os.Build; import android.os.Handler; -import android.os.SystemClock; import android.util.Log; import android.util.SparseArray; @@ -1632,7 +1631,7 @@ public abstract class SensorManager { if (values == null) { throw new IllegalArgumentException("sensor data cannot be null"); } - int expectedNumValues = Sensor.getMaxLengthValuesArray(sensor, Build.VERSION_CODES.MNC); + int expectedNumValues = Sensor.getMaxLengthValuesArray(sensor, Build.VERSION_CODES.M); if (values.length != expectedNumValues) { throw new IllegalArgumentException ("Wrong number of values for sensor " + sensor.getName() + " actual=" + values.length + " expected=" + diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index af1367cd2dc2..c580083b94d9 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -173,6 +173,28 @@ public abstract class CameraMetadata<TKey> { } } + ArrayList<TKey> vendorKeys = CameraMetadataNative.getAllVendorKeys(keyClass); + + if (vendorKeys != null) { + for (TKey k : vendorKeys) { + String keyName; + if (k instanceof CaptureRequest.Key<?>) { + keyName = ((CaptureRequest.Key<?>) k).getName(); + } else if (k instanceof CaptureResult.Key<?>) { + keyName = ((CaptureResult.Key<?>) k).getName(); + } else if (k instanceof CameraCharacteristics.Key<?>) { + keyName = ((CameraCharacteristics.Key<?>) k).getName(); + } else { + continue; + } + + if (filterTags == null || Arrays.binarySearch(filterTags, + CameraMetadataNative.getTag(keyName)) >= 0) { + keyList.add(k); + } + } + } + return keyList; } diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index 7e50fd9f623a..12a2910b2055 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -1078,6 +1078,7 @@ public class CameraMetadataNative implements Parcelable { private native synchronized void nativeWriteValues(int tag, byte[] src); private native synchronized void nativeDump() throws IOException; // dump to ALOGD + private static native ArrayList nativeGetAllVendorKeys(Class keyClass); private static native int nativeGetTagFromKey(String keyName) throws IllegalArgumentException; private static native int nativeGetTypeFromTag(int tag) @@ -1113,6 +1114,19 @@ public class CameraMetadataNative implements Parcelable { return nativeIsEmpty(); } + + /** + * Return a list containing keys of the given key class for all defined vendor tags. + * + * @hide + */ + public static <K> ArrayList<K> getAllVendorKeys(Class<K> keyClass) { + if (keyClass == null) { + throw new NullPointerException(); + } + return (ArrayList<K>) nativeGetAllVendorKeys(keyClass); + } + /** * Convert a key string into the equivalent native tag. * diff --git a/core/java/android/hardware/usb/IUsbManager.aidl b/core/java/android/hardware/usb/IUsbManager.aidl index 80c7b1a220f4..6e4c9de1c8ef 100644 --- a/core/java/android/hardware/usb/IUsbManager.aidl +++ b/core/java/android/hardware/usb/IUsbManager.aidl @@ -97,9 +97,6 @@ interface IUsbManager */ void setUsbDataUnlocked(boolean unlock); - /* Returns true iff sensitive user data is exposed on the USB connection. */ - boolean isUsbDataUnlocked(); - /* Allow USB debugging from the attached host. If alwaysAllow is true, add the * the public key to list of host keys that the user has approved. */ diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index c88f2133155e..3b3ee52929e5 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -520,21 +520,6 @@ public class UsbManager { } /** - * Returns {@code true} iff access to sensitive USB data is currently allowed when - * in device mode. - * - * {@hide} - */ - public boolean isUsbDataUnlocked() { - try { - return mService.isUsbDataUnlocked(); - } catch (RemoteException e) { - Log.e(TAG, "RemoteException in isUsbDataUnlocked", e); - } - return false; - } - - /** * Returns a list of physical USB ports on the device. * <p> * This list is guaranteed to contain all dual-role USB Type C ports but it might diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index dc8ff8fb1f88..abed1f04da83 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -22,6 +22,7 @@ import android.annotation.SdkConstant.SdkConstantType; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.NetworkUtils; import android.os.Binder; import android.os.Build.VERSION_CODES; @@ -33,6 +34,7 @@ import android.os.INetworkManagementService; import android.os.Looper; import android.os.Message; import android.os.Messenger; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.provider.Settings; @@ -490,6 +492,8 @@ public class ConnectivityManager { */ private static ConnectivityManager sInstance; + private final Context mContext; + private INetworkManagementService mNMService; /** @@ -892,9 +896,11 @@ public class ConnectivityManager { * * @deprecated Deprecated in favor of the cleaner * {@link #requestNetwork(NetworkRequest, NetworkCallback)} API. - * @removed + * In {@link VERSION_CODES#M}, and above, this method is unsupported and will + * throw {@code UnsupportedOperationException} if called. */ public int startUsingNetworkFeature(int networkType, String feature) { + checkLegacyRoutingApiAccess(); NetworkCapabilities netCap = networkCapabilitiesForFeature(networkType, feature); if (netCap == null) { Log.d(TAG, "Can't satisfy startUsingNetworkFeature for " + networkType + ", " + @@ -939,10 +945,12 @@ public class ConnectivityManager { * implementation+feature combination, except that the value {@code -1} * always indicates failure. * - * @deprecated Deprecated in favor of the cleaner {@link unregisterNetworkCallback} API. - * @removed + * @deprecated Deprecated in favor of the cleaner {@link #unregisterNetworkCallback} API. + * In {@link VERSION_CODES#M}, and above, this method is unsupported and will + * throw {@code UnsupportedOperationException} if called. */ public int stopUsingNetworkFeature(int networkType, String feature) { + checkLegacyRoutingApiAccess(); NetworkCapabilities netCap = networkCapabilitiesForFeature(networkType, feature); if (netCap == null) { Log.d(TAG, "Can't satisfy stopUsingNetworkFeature for " + networkType + ", " + @@ -1220,7 +1228,8 @@ public class ConnectivityManager { * @deprecated Deprecated in favor of the * {@link #requestNetwork(NetworkRequest, NetworkCallback)}, * {@link #bindProcessToNetwork} and {@link Network#getSocketFactory} API. - * @removed + * In {@link VERSION_CODES#M}, and above, this method is unsupported and will + * throw {@code UnsupportedOperationException} if called. */ public boolean requestRouteToHost(int networkType, int hostAddress) { return requestRouteToHostAddress(networkType, NetworkUtils.intToInetAddress(hostAddress)); @@ -1239,9 +1248,9 @@ public class ConnectivityManager { * @hide * @deprecated Deprecated in favor of the {@link #requestNetwork} and * {@link #bindProcessToNetwork} API. - * @removed */ public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) { + checkLegacyRoutingApiAccess(); try { return mService.requestRouteToHostAddress(networkType, hostAddress.getAddress()); } catch (RemoteException e) { @@ -1420,7 +1429,8 @@ public class ConnectivityManager { /** * {@hide} */ - public ConnectivityManager(IConnectivityManager service) { + public ConnectivityManager(Context context, IConnectivityManager service) { + mContext = checkNotNull(context, "missing context"); mService = checkNotNull(service, "missing IConnectivityManager"); sInstance = this; } @@ -2707,6 +2717,34 @@ public class ConnectivityManager { return new Network(netId); } + private void unsupportedStartingFrom(int version) { + if (Process.myUid() == Process.SYSTEM_UID) { + // The getApplicationInfo() call we make below is not supported in system context, and + // we want to allow the system to use these APIs anyway. + return; + } + + if (mContext.getApplicationInfo().targetSdkVersion >= version) { + throw new UnsupportedOperationException( + "This method is not supported in target SDK version " + version + " and above"); + } + } + + // Checks whether the calling app can use the legacy routing API (startUsingNetworkFeature, + // stopUsingNetworkFeature, requestRouteToHost), and if not throw UnsupportedOperationException. + // TODO: convert the existing system users (Tethering, GpsLocationProvider) to the new APIs and + // remove these exemptions. Note that this check is not secure, and apps can still access these + // functions by accessing ConnectivityService directly. However, it should be clear that doing + // so is unsupported and may break in the future. http://b/22728205 + private void checkLegacyRoutingApiAccess() { + if (mContext.checkCallingOrSelfPermission("com.android.permission.INJECT_OMADM_SETTINGS") + == PackageManager.PERMISSION_GRANTED) { + return; + } + + unsupportedStartingFrom(VERSION_CODES.M); + } + /** * Binds host resolutions performed by this process to {@code network}. * {@link #bindProcessToNetwork} takes precedence over this setting. diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index e6fc1ea293a0..808a8827a076 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -148,6 +148,13 @@ public abstract class NetworkAgent extends Handler { */ public static final int CMD_REQUEST_BANDWIDTH_UPDATE = BASE + 10; + /** + * Sent by ConnectivityService to the NeworkAgent to inform the agent to avoid + * automatically reconnecting to this network (e.g. via autojoin). Happens + * when user selects "No" option on the "Stay connected?" dialog box. + */ + public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 11; + public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score) { this(looper, context, logTag, ni, nc, lp, score, null); @@ -240,6 +247,11 @@ public abstract class NetworkAgent extends Handler { } case CMD_SAVE_ACCEPT_UNVALIDATED: { saveAcceptUnvalidated(msg.arg1 != 0); + break; + } + case CMD_PREVENT_AUTOMATIC_RECONNECT: { + preventAutomaticReconnect(); + break; } } } @@ -365,6 +377,15 @@ public abstract class NetworkAgent extends Handler { protected void saveAcceptUnvalidated(boolean accept) { } + /** + * Called when the user asks to not stay connected to this network because it was found to not + * provide Internet access. Usually followed by call to {@code unwanted}. The transport is + * responsible for making sure the device does not automatically reconnect to the same network + * after the {@code unwanted} call. + */ + protected void preventAutomaticReconnect() { + } + protected void log(String s) { Log.d(LOG_TAG, "NetworkAgent: " + s); } diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 514d24abc52f..651fb355b6b0 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -626,6 +626,7 @@ public final class NetworkCapabilities implements Parcelable { case NET_CAPABILITY_TRUSTED: capabilities += "TRUSTED"; break; case NET_CAPABILITY_NOT_VPN: capabilities += "NOT_VPN"; break; case NET_CAPABILITY_VALIDATED: capabilities += "VALIDATED"; break; + case NET_CAPABILITY_CAPTIVE_PORTAL: capabilities += "CAPTIVE_PORTAL"; break; } if (++i < types.length) capabilities += "&"; } diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java index 243ddf787727..521df280c2c4 100644 --- a/core/java/android/os/AsyncTask.java +++ b/core/java/android/os/AsyncTask.java @@ -292,7 +292,9 @@ public abstract class AsyncTask<Params, Progress, Result> { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked - return postResult(doInBackground(mParams)); + Result result = doInBackground(mParams); + Binder.flushPendingCommands(); + return postResult(result); } }; diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index ecb7f5a200f2..80169a956f41 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -2615,7 +2615,9 @@ public abstract class BatteryStats implements Parcelable { getMobileRadioActiveAdjustedTime(which) / 1000, interactiveTime / 1000, powerSaveModeEnabledTime / 1000, connChanges, deviceIdleModeEnabledTime / 1000, getDeviceIdleModeEnabledCount(which), deviceIdlingTime / 1000, - getDeviceIdlingCount(which)); + getDeviceIdlingCount(which), + getMobileRadioActiveCount(which), + getMobileRadioActiveUnknownTime(which) / 1000); // Dump screen brightness stats Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS]; diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index b2ced7fbca61..a0162f7f6cef 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -622,7 +622,7 @@ public class Build { /** * M comes after L. */ - public static final int MNC = 23; + public static final int M = 23; } /** The type of build, like "user" or "eng". */ diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 208085624e3b..64d6da57718f 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -80,7 +80,8 @@ public class Environment { } public File[] getExternalDirs() { - final StorageVolume[] volumes = StorageManager.getVolumeList(mUserId); + final StorageVolume[] volumes = StorageManager.getVolumeList(mUserId, + StorageManager.FLAG_FOR_WRITE); final File[] files = new File[volumes.length]; for (int i = 0; i < volumes.length; i++) { files[i] = volumes[i].getPathFile(); diff --git a/core/java/android/os/IBinder.java b/core/java/android/os/IBinder.java index 73a0f658f5f0..2c21d135e2b8 100644 --- a/core/java/android/os/IBinder.java +++ b/core/java/android/os/IBinder.java @@ -149,7 +149,14 @@ public interface IBinder { * processes. */ int FLAG_ONEWAY = 0x00000001; - + + /** + * Limit that should be placed on IPC sizes to keep them safely under the + * transaction buffer limit. + * @hide + */ + public static final int MAX_IPC_SIZE = 64 * 1024; + /** * Get the canonical name of the interface supported by this binder. */ diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 79fb805d2d59..83a1993775de 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -180,7 +180,7 @@ public class UserManager { * Specifies if a user is disallowed from configuring VPN. * The default value is <code>false</code>. * This restriction has an effect in a managed profile only from - * {@link android.os.Build.VERSION_CODES#MNC} + * {@link android.os.Build.VERSION_CODES#M} * * <p/>Key for user restrictions. * <p/>Type: Boolean diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index c3b098beb422..fce09dd4c80c 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -758,7 +758,7 @@ public interface IMountService extends IInterface { return _result; } - public StorageVolume[] getVolumeList(int uid, String packageName) + public StorageVolume[] getVolumeList(int uid, String packageName, int flags) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); @@ -767,6 +767,7 @@ public interface IMountService extends IInterface { _data.writeInterfaceToken(DESCRIPTOR); _data.writeInt(uid); _data.writeString(packageName); + _data.writeInt(flags); mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0); _reply.readException(); _result = _reply.createTypedArray(StorageVolume.CREATOR); @@ -1609,7 +1610,8 @@ public interface IMountService extends IInterface { data.enforceInterface(DESCRIPTOR); int uid = data.readInt(); String packageName = data.readString(); - StorageVolume[] result = getVolumeList(uid, packageName); + int _flags = data.readInt(); + StorageVolume[] result = getVolumeList(uid, packageName, _flags); reply.writeNoException(); reply.writeTypedArray(result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); return true; @@ -2059,7 +2061,7 @@ public interface IMountService extends IInterface { /** * Returns list of all mountable volumes. */ - public StorageVolume[] getVolumeList(int uid, String packageName) throws RemoteException; + public StorageVolume[] getVolumeList(int uid, String packageName, int flags) throws RemoteException; /** * Gets the path on the filesystem for the ASEC container itself. diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index b2cec60c0412..d1f37436e4ba 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -86,6 +86,9 @@ public class StorageManager { /** {@hide} */ public static final int DEBUG_FORCE_ADOPTABLE = 1 << 0; + /** {@hide} */ + public static final int FLAG_FOR_WRITE = 1 << 0; + private final Context mContext; private final ContentResolver mResolver; @@ -812,7 +815,7 @@ public class StorageManager { /** {@hide} */ public static @Nullable StorageVolume getStorageVolume(File file, int userId) { - return getStorageVolume(getVolumeList(userId), file); + return getStorageVolume(getVolumeList(userId, 0), file); } /** {@hide} */ @@ -852,11 +855,11 @@ public class StorageManager { /** {@hide} */ public @NonNull StorageVolume[] getVolumeList() { - return getVolumeList(mContext.getUserId()); + return getVolumeList(mContext.getUserId(), 0); } /** {@hide} */ - public static @NonNull StorageVolume[] getVolumeList(int userId) { + public static @NonNull StorageVolume[] getVolumeList(int userId, int flags) { final IMountService mountService = IMountService.Stub.asInterface( ServiceManager.getService("mount")); try { @@ -877,7 +880,7 @@ public class StorageManager { if (uid <= 0) { return new StorageVolume[0]; } - return mountService.getVolumeList(uid, packageName); + return mountService.getVolumeList(uid, packageName, flags); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index 8d603a17f186..ef54d84fdebf 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -46,6 +46,19 @@ import java.util.Objects; * Information about a storage volume that may be mounted. A volume may be a * partition on a physical {@link DiskInfo}, an emulated volume above some other * storage medium, or a standalone container like an ASEC or OBB. + * <p> + * Volumes may be mounted with various flags: + * <ul> + * <li>{@link #MOUNT_FLAG_PRIMARY} means the volume provides primary external + * storage, historically found at {@code /sdcard}. + * <li>{@link #MOUNT_FLAG_VISIBLE} means the volume is visible to third-party + * apps for direct filesystem access. The system should send out relevant + * storage broadcasts and index any media on visible volumes. Visible volumes + * are considered a more stable part of the device, which is why we take the + * time to index them. In particular, transient volumes like USB OTG devices + * <em>should not</em> be marked as visible; their contents should be surfaced + * to apps through the Storage Access Framework. + * </ul> * * @hide */ @@ -255,8 +268,23 @@ public class VolumeInfo implements Parcelable { return (mountFlags & MOUNT_FLAG_VISIBLE) != 0; } - public boolean isVisibleToUser(int userId) { - if (type == TYPE_PUBLIC && userId == this.mountUserId) { + public boolean isVisibleForRead(int userId) { + if (type == TYPE_PUBLIC) { + if (isPrimary() && mountUserId != userId) { + // Primary physical is only visible to single user + return false; + } else { + return isVisible(); + } + } else if (type == TYPE_EMULATED) { + return isVisible(); + } else { + return false; + } + } + + public boolean isVisibleForWrite(int userId) { + if (type == TYPE_PUBLIC && mountUserId == userId) { return isVisible(); } else if (type == TYPE_EMULATED) { return isVisible(); @@ -276,7 +304,7 @@ public class VolumeInfo implements Parcelable { public File getPathForUser(int userId) { if (path == null) { return null; - } else if (type == TYPE_PUBLIC && userId == this.mountUserId) { + } else if (type == TYPE_PUBLIC) { return new File(path); } else if (type == TYPE_EMULATED) { return new File(path, Integer.toString(userId)); @@ -306,6 +334,7 @@ public class VolumeInfo implements Parcelable { final boolean allowMassStorage = false; final String envState = reportUnmounted ? Environment.MEDIA_UNMOUNTED : getEnvironmentForState(state); + File userPath = getPathForUser(userId); if (userPath == null) { userPath = new File("/dev/null"); diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index e63fb0464890..9babf4309fab 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -284,7 +284,7 @@ public final class MediaStore { * If you don't set a ClipData, it will be copied there for you when calling * {@link Context#startActivity(Intent)}. * - * <p>Note: if you app targets {@link android.os.Build.VERSION_CODES#MNC MNC} and above + * <p>Note: if you app targets {@link android.os.Build.VERSION_CODES#M M} and above * and declares as using the {@link android.Manifest.permission#CAMERA} permission which * is not granted, then atempting to use this action will result in a {@link * java.lang.SecurityException}. @@ -338,7 +338,7 @@ public final class MediaStore { * If you don't set a ClipData, it will be copied there for you when calling * {@link Context#startActivity(Intent)}. * - * <p>Note: if you app targets {@link android.os.Build.VERSION_CODES#MNC MNC} and above + * <p>Note: if you app targets {@link android.os.Build.VERSION_CODES#M M} and above * and declares as using the {@link android.Manifest.permission#CAMERA} permission which * is not granted, then atempting to use this action will result in a {@link * java.lang.SecurityException}. diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index a79970c0e9c4..6f98788976bf 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -19,6 +19,9 @@ package android.provider; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; +import android.app.ActivityThread; +import android.app.AppOpsManager; +import android.app.Application; import android.app.SearchManager; import android.app.WallpaperManager; import android.content.ComponentName; @@ -39,6 +42,7 @@ import android.net.ConnectivityManager; import android.net.Uri; import android.net.wifi.WifiManager; import android.os.BatteryManager; +import android.os.Binder; import android.os.Bundle; import android.os.DropBoxManager; import android.os.IBinder; @@ -562,13 +566,14 @@ public final class Settings { "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS"; /** - * Activity Action: Show settings to toggle permission to draw on top of - * other apps. + * Activity Action: Show screen for controlling which apps can draw on top of other apps. * <p> * In some cases, a matching Activity may not exist, so ensure you * safeguard against this. * <p> - * Input: Nothing. + * Input: Optionally, the Intent's data URI can specify the application package name to + * directly invoke the management GUI specific to the package name. For example + * "package:com.my.app". * <p> * Output: Nothing. */ @@ -577,13 +582,15 @@ public final class Settings { "android.settings.action.MANAGE_OVERLAY_PERMISSION"; /** - * Activity Action: Show settings to toggle apps' capablity to - * to read/write system settings. + * Activity Action: Show screen for controlling which apps are allowed to write/modify + * system settings. * <p> * In some cases, a matching Activity may not exist, so ensure you * safeguard against this. * <p> - * Input: Nothing. + * Input: Optionally, the Intent's data URI can specify the application package name to + * directly invoke the management GUI specific to the package name. For example + * "package:com.my.app". * <p> * Output: Nothing. */ @@ -1384,6 +1391,23 @@ public final class Settings { } /** + * An app can use this method to check if it is currently allowed to draw on top of other + * apps. In order to be allowed to do so, an app must first declare the + * {@link android.Manifest.permission#SYSTEM_ALERT_WINDOW} permission in its manifest. If it + * is currently disallowed, it can prompt the user to grant it this capability through a + * management UI by sending an Intent with action + * {@link android.provider.Settings#ACTION_MANAGE_OVERLAY_PERMISSION}. + * + * @param context A context + * @return true if the calling app can draw on top of other apps, false otherwise. + */ + public static boolean canDrawOverlays(Context context) { + int uid = Binder.getCallingUid(); + return Settings.isCallingPackageAllowedToDrawOverlays(context, uid, Settings + .getPackageNameForUid(context, uid), false); + } + + /** * System settings, containing miscellaneous system preferences. This * table holds simple name/value pairs. There are convenience * functions for accessing individual settings entries. @@ -3656,6 +3680,23 @@ public final class Settings { @Deprecated public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS; + + /** + * An app can use this method to check if it is currently allowed to write or modify system + * settings. In order to gain write access to the system settings, an app must declare the + * {@link android.Manifest.permission#WRITE_SETTINGS} permission in its manifest. If it is + * currently disallowed, it can prompt the user to grant it this capability through a + * management UI by sending an Intent with action + * {@link android.provider.Settings#ACTION_MANAGE_WRITE_SETTINGS}. + * + * @param context A context + * @return true if the calling app can write to system settings, false otherwise + */ + public static boolean canWrite(Context context) { + int uid = Binder.getCallingUid(); + return isCallingPackageAllowedToWriteSettings(context, uid, getPackageNameForUid( + context, uid), false); + } } /** @@ -3839,10 +3880,24 @@ public final class Settings { } } if (sLockSettings != null && !sIsSystemProcess) { - try { - return sLockSettings.getString(name, "0", userHandle); - } catch (RemoteException re) { - // Fall through + // No context; use the ActivityThread's context as an approximation for + // determining the target API level. + Application application = ActivityThread.currentApplication(); + + boolean isPreMnc = application != null + && application.getApplicationInfo() != null + && application.getApplicationInfo().targetSdkVersion + <= VERSION_CODES.LOLLIPOP_MR1; + if (isPreMnc) { + try { + return sLockSettings.getString(name, "0", userHandle); + } catch (RemoteException re) { + // Fall through + } + } else { + throw new SecurityException("Settings.Secure." + name + + " is deprecated and no longer accessible." + + " See API documentation for potential replacements."); } } } @@ -4378,14 +4433,19 @@ public final class Settings { * Whether autolock is enabled (0 = false, 1 = true) * * @deprecated Use {@link android.app.KeyguardManager} to determine the state and security - * level of the keyguard. + * level of the keyguard. Accessing this setting from an app that is targeting + * {@link VERSION_CODES#M} or later throws a {@code SecurityException}. */ @Deprecated public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock"; /** * Whether lock pattern is visible as user enters (0 = false, 1 = true) + * + * @deprecated Accessing this setting from an app that is targeting + * {@link VERSION_CODES#M} or later throws a {@code SecurityException}. */ + @Deprecated public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern"; /** @@ -4395,6 +4455,8 @@ public final class Settings { * @deprecated Starting in {@link VERSION_CODES#JELLY_BEAN_MR1} the * lockscreen uses * {@link Settings.System#HAPTIC_FEEDBACK_ENABLED}. + * Accessing this setting from an app that is targeting + * {@link VERSION_CODES#M} or later throws a {@code SecurityException}. */ @Deprecated public static final String @@ -5658,7 +5720,6 @@ public final class Settings { MOUNT_UMS_AUTOSTART, MOUNT_UMS_PROMPT, MOUNT_UMS_NOTIFY_ENABLED, - UI_NIGHT_MODE, SLEEP_TIMEOUT, DOUBLE_TAP_TO_WAKE, }; @@ -8183,4 +8244,121 @@ public final class Settings { public static String getGTalkDeviceId(long androidId) { return "android-" + Long.toHexString(androidId); } + + /** + * Performs a strict and comprehensive check of whether a calling package is allowed to + * write/modify system settings, as the condition differs for pre-M, M+, and + * privileged/preinstalled apps. If the provided uid does not match the + * callingPackage, a negative result will be returned. + * @hide + */ + public static boolean isCallingPackageAllowedToWriteSettings(Context context, int uid, + String callingPackage, boolean throwException) { + return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid, + callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS, + android.Manifest.permission.WRITE_SETTINGS, false); + } + + /** + * Performs a strict and comprehensive check of whether a calling package is allowed to + * write/modify system settings, as the condition differs for pre-M, M+, and + * privileged/preinstalled apps. If the provided uid does not match the + * callingPackage, a negative result will be returned. + * + * Note: if the check is successful, the operation of this app will be updated to the + * current time. + * @hide + */ + public static boolean checkAndNoteWriteSettingsOperation(Context context, int uid, + String callingPackage, boolean throwException) { + return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid, + callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS, + android.Manifest.permission.WRITE_SETTINGS, true); + } + + /** + * Performs a strict and comprehensive check of whether a calling package is allowed to + * draw on top of other apps, as the conditions differs for pre-M, M+, and + * privileged/preinstalled apps. If the provided uid does not match the callingPackage, + * a negative result will be returned. + * @hide + */ + public static boolean isCallingPackageAllowedToDrawOverlays(Context context, int uid, + String callingPackage, boolean throwException) { + return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid, + callingPackage, throwException, AppOpsManager.OP_SYSTEM_ALERT_WINDOW, + android.Manifest.permission.SYSTEM_ALERT_WINDOW, false); + } + + /** + * Performs a strict and comprehensive check of whether a calling package is allowed to + * draw on top of other apps, as the conditions differs for pre-M, M+, and + * privileged/preinstalled apps. If the provided uid does not match the callingPackage, + * a negative result will be returned. + * + * Note: if the check is successful, the operation of this app will be updated to the + * current time. + * @hide + */ + public static boolean checkAndNoteDrawOverlaysOperation(Context context, int uid, String + callingPackage, boolean throwException) { + return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid, + callingPackage, throwException, AppOpsManager.OP_SYSTEM_ALERT_WINDOW, + android.Manifest.permission.SYSTEM_ALERT_WINDOW, true); + } + + /** + * Helper method to perform a general and comprehensive check of whether an operation that is + * protected by appops can be performed by a caller or not. e.g. OP_SYSTEM_ALERT_WINDOW and + * OP_WRITE_SETTINGS + * @hide + */ + public static boolean isCallingPackageAllowedToPerformAppOpsProtectedOperation(Context context, + int uid, String callingPackage, boolean throwException, int appOpsOpCode, String + permissionName, boolean makeNote) { + if (callingPackage == null) { + return false; + } + + AppOpsManager appOpsMgr = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE); + int mode = AppOpsManager.MODE_DEFAULT; + if (makeNote) { + mode = appOpsMgr.noteOpNoThrow(appOpsOpCode, uid, callingPackage); + } else { + mode = appOpsMgr.checkOpNoThrow(appOpsOpCode, uid, callingPackage); + } + + switch (mode) { + case AppOpsManager.MODE_ALLOWED: + return true; + case AppOpsManager.MODE_DEFAULT: + // this is the default operating mode after an app's installation + if(context.checkCallingOrSelfPermission(permissionName) == PackageManager + .PERMISSION_GRANTED) { + return true; + } + default: + // this is for all other cases trickled down here... + if (!throwException) { + return false; + } + } + throw new SecurityException(callingPackage + " was not granted " + + permissionName + " permission"); + } + + /** + * Retrieves a correponding package name for a given uid. It will query all + * packages that are associated with the given uid, but it will return only + * the zeroth result. + * Note: If package could not be found, a null is returned. + * @hide + */ + public static String getPackageNameForUid(Context context, int uid) { + String[] packages = context.getPackageManager().getPackagesForUid(uid); + if (packages == null) { + return null; + } + return packages[0]; + } } diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java index 0eda69238aa7..2cab914bed62 100644 --- a/core/java/android/service/notification/StatusBarNotification.java +++ b/core/java/android/service/notification/StatusBarNotification.java @@ -17,6 +17,9 @@ package android.service.notification; import android.app.Notification; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; @@ -40,6 +43,7 @@ public class StatusBarNotification implements Parcelable { private final long postTime; private final int score; + private Context mContext; // used for inflation & icon expansion /** @hide */ public StatusBarNotification(String pkg, String opPkg, int id, String tag, int uid, @@ -261,4 +265,24 @@ public class StatusBarNotification implements Parcelable { public String getGroupKey() { return groupKey; } + + /** + * @hide + */ + public Context getPackageContext(Context context) { + if (mContext == null) { + try { + ApplicationInfo ai = context.getPackageManager() + .getApplicationInfo(pkg, PackageManager.GET_UNINSTALLED_PACKAGES); + mContext = context.createApplicationContext(ai, + Context.CONTEXT_RESTRICTED); + } catch (PackageManager.NameNotFoundException e) { + mContext = null; + } + } + if (mContext == null) { + mContext = context; + } + return mContext; + } } diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java index f647aa6bfbe9..ec14740bd815 100644 --- a/core/java/android/service/voice/VoiceInteractionSession.java +++ b/core/java/android/service/voice/VoiceInteractionSession.java @@ -37,7 +37,9 @@ import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.RemoteException; +import android.os.UserHandle; import android.util.ArrayMap; +import android.util.DebugUtils; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; @@ -55,6 +57,8 @@ import com.android.internal.app.IVoiceInteractorRequest; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.lang.ref.WeakReference; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; @@ -369,6 +373,34 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } catch (RemoteException e) { } } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + DebugUtils.buildShortClassTag(this, sb); + sb.append(" "); + sb.append(mInterface.asBinder()); + sb.append(" pkg="); + sb.append(mCallingPackage); + sb.append(" uid="); + UserHandle.formatUid(sb, mCallingUid); + sb.append('}'); + return sb.toString(); + } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mInterface="); + writer.println(mInterface.asBinder()); + writer.print(prefix); writer.print("mCallingPackage="); writer.print(mCallingPackage); + writer.print(" mCallingUid="); UserHandle.formatUid(writer, mCallingUid); + writer.println(); + writer.print(prefix); writer.print("mCallback="); + writer.println(mCallback.asBinder()); + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); + writer.println(mExtras); + } + } } /** @@ -422,6 +454,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } catch (RemoteException e) { } } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); + writer.println(mPrompt); + } } /** @@ -504,6 +542,34 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { sendPickOptionResult(true, selections, result); } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); + writer.println(mPrompt); + if (mOptions != null) { + writer.print(prefix); writer.println("Options:"); + for (int i=0; i<mOptions.length; i++) { + VoiceInteractor.PickOptionRequest.Option op = mOptions[i]; + writer.print(prefix); writer.print(" #"); writer.print(i); writer.println(":"); + writer.print(prefix); writer.print(" mLabel="); + writer.println(op.getLabel()); + writer.print(prefix); writer.print(" mIndex="); + writer.println(op.getIndex()); + if (op.countSynonyms() > 0) { + writer.print(prefix); writer.println(" Synonyms:"); + for (int j=0; j<op.countSynonyms(); j++) { + writer.print(prefix); writer.print(" #"); writer.print(j); + writer.print(": "); writer.println(op.getSynonymAt(j)); + } + } + if (op.getExtras() != null) { + writer.print(prefix); writer.print(" mExtras="); + writer.println(op.getExtras()); + } + } + } + } } /** @@ -557,6 +623,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } catch (RemoteException e) { } } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); + writer.println(mPrompt); + } } /** @@ -607,6 +679,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } catch (RemoteException e) { } } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); + writer.println(mPrompt); + } } /** @@ -661,6 +739,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall public void sendResult(Bundle result) { sendCommandResult(true, result); } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mCommand="); + writer.println(mCommand); + } } static final int MSG_START_CONFIRMATION = 1; @@ -1446,4 +1530,37 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall */ public void onCancelRequest(Request request) { } + + /** + * Print the Service's state into the given stream. This gets invoked by + * {@link VoiceInteractionSessionService} when its Service + * {@link android.app.Service#dump} method is called. + * + * @param prefix Text to print at the front of each line. + * @param fd The raw file descriptor that the dump is being sent to. + * @param writer The PrintWriter to which you should dump your state. This will be + * closed for you after you return. + * @param args additional arguments to the dump request. + */ + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mToken="); writer.println(mToken); + writer.print(prefix); writer.print("mTheme=#"); writer.println(Integer.toHexString(mTheme)); + writer.print(prefix); writer.print("mInitialized="); writer.println(mInitialized); + writer.print(prefix); writer.print("mWindowAdded="); writer.print(mWindowAdded); + writer.print(" mWindowVisible="); writer.println(mWindowVisible); + writer.print(prefix); writer.print("mWindowWasVisible="); writer.print(mWindowWasVisible); + writer.print(" mInShowWindow="); writer.println(mInShowWindow); + if (mActiveRequests.size() > 0) { + writer.print(prefix); writer.println("Active requests:"); + String innerPrefix = prefix + " "; + for (int i=0; i<mActiveRequests.size(); i++) { + Request req = mActiveRequests.valueAt(i); + writer.print(prefix); writer.print(" #"); writer.print(i); + writer.print(": "); + writer.println(req); + req.dump(innerPrefix, fd, writer, args); + + } + } + } } diff --git a/core/java/android/service/voice/VoiceInteractionSessionService.java b/core/java/android/service/voice/VoiceInteractionSessionService.java index fb9f973ec8d7..424ff9def41c 100644 --- a/core/java/android/service/voice/VoiceInteractionSessionService.java +++ b/core/java/android/service/voice/VoiceInteractionSessionService.java @@ -30,6 +30,9 @@ import com.android.internal.app.IVoiceInteractionManagerService; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; +import java.io.FileDescriptor; +import java.io.PrintWriter; + /** * An active voice interaction session, initiated by a {@link VoiceInteractionService}. */ @@ -101,6 +104,16 @@ public abstract class VoiceInteractionSessionService extends Service { } } + @Override + protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + if (mSession == null) { + writer.println("(no active session)"); + } else { + writer.println("VoiceInteractionSession:"); + mSession.dump(" ", fd, writer, args); + } + } + void doNewSession(IBinder token, Bundle args, int startFlags) { if (mSession != null) { mSession.doDestroy(); diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index efc9e1ae4aa6..3b0def29f006 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -112,6 +112,10 @@ public class StaticLayout extends Layout { // release any expensive state /* package */ void finish() { nFinishBuilder(mNativePtr); + mText = null; + mPaint = null; + mLeftIndents = null; + mRightIndents = null; mMeasuredText.finish(); } diff --git a/core/java/android/util/LocalLog.java b/core/java/android/util/LocalLog.java index a405dab76656..39f66a5f18fc 100644 --- a/core/java/android/util/LocalLog.java +++ b/core/java/android/util/LocalLog.java @@ -30,32 +30,20 @@ public final class LocalLog { private LinkedList<String> mLog; private int mMaxLines; private long mNow; - private final boolean mKeepFirst; public LocalLog(int maxLines) { mLog = new LinkedList<String>(); mMaxLines = maxLines; - mKeepFirst = false; - } - - public LocalLog(int maxLines, boolean keepFirst) { - mLog = new LinkedList<String>(); - mMaxLines = maxLines; - mKeepFirst = keepFirst; } public synchronized void log(String msg) { - mNow = System.currentTimeMillis(); - StringBuilder sb = new StringBuilder(); - Calendar c = Calendar.getInstance(); - c.setTimeInMillis(mNow); - sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); - logStraight(sb.toString() + " - " + msg); - } - - private synchronized void logStraight(String msg) { - if (mKeepFirst == false || mLog.size() < mMaxLines) mLog.add(msg); if (mMaxLines > 0) { + mNow = System.currentTimeMillis(); + StringBuilder sb = new StringBuilder(); + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(mNow); + sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); + mLog.add(sb.toString() + " - " + msg); while (mLog.size() > mMaxLines) mLog.remove(); } } @@ -86,13 +74,4 @@ public final class LocalLog { public ReadOnlyLocalLog readOnlyLocalLog() { return new ReadOnlyLocalLog(this); } - - public synchronized void copyTo(LocalLog other, int lines) { - int end = mLog.size()-1; - int begin = end - lines; - if (begin < 0) begin = 0; - for (; begin < end; begin++) { - other.logStraight(mLog.get(begin)); - } - } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index de61c3153914..43c578fe7faf 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -56,7 +56,6 @@ import android.graphics.Shader; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.hardware.display.DisplayManagerGlobal; -import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Handler; @@ -3802,14 +3801,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // of whether a layout was requested on that View. sIgnoreMeasureCache = targetSdkVersion < KITKAT; - Canvas.sCompatibilityRestore = targetSdkVersion < MNC; + Canvas.sCompatibilityRestore = targetSdkVersion < M; - // In MNC and newer, our widgets can pass a "hint" value in the size + // In M and newer, our widgets can pass a "hint" value in the size // for UNSPECIFIED MeasureSpecs. This lets child views of scrolling containers // know what the expected parent size is going to be, so e.g. list items can size // themselves at 1/3 the size of their container. It breaks older apps though, // specifically apps that use some popular open source libraries. - sUseZeroUnspecifiedMeasureSpec = targetSdkVersion < MNC; + sUseZeroUnspecifiedMeasureSpec = targetSdkVersion < M; sCompatibilityDone = true; } @@ -4277,27 +4276,27 @@ public class View implements Drawable.Callback, KeyEvent.Callback, PROVIDER_BACKGROUND)); break; case R.styleable.View_foreground: - if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + if (targetSdkVersion >= VERSION_CODES.M || this instanceof FrameLayout) { setForeground(a.getDrawable(attr)); } break; case R.styleable.View_foregroundGravity: - if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + if (targetSdkVersion >= VERSION_CODES.M || this instanceof FrameLayout) { setForegroundGravity(a.getInt(attr, Gravity.NO_GRAVITY)); } break; case R.styleable.View_foregroundTintMode: - if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + if (targetSdkVersion >= VERSION_CODES.M || this instanceof FrameLayout) { setForegroundTintMode(Drawable.parseTintMode(a.getInt(attr, -1), null)); } break; case R.styleable.View_foregroundTint: - if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + if (targetSdkVersion >= VERSION_CODES.M || this instanceof FrameLayout) { setForegroundTintList(a.getColorStateList(attr)); } break; case R.styleable.View_foregroundInsidePadding: - if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + if (targetSdkVersion >= VERSION_CODES.M || this instanceof FrameLayout) { if (mForegroundInfo == null) { mForegroundInfo = new ForegroundInfo(); } @@ -11417,10 +11416,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * strongly recommended for performance reasons to either override * {@link #hasOverlappingRendering()} to return <code>false</code> if appropriate, or setting a * {@link #setLayerType(int, android.graphics.Paint) layer type} on the view for the duration - * of the animation. On versions {@link android.os.Build.VERSION_CODES#MNC} and below, + * of the animation. On versions {@link android.os.Build.VERSION_CODES#M} and below, * the default path for rendering an unlayered View with alpha could add multiple milliseconds * of rendering cost, even for simple or small views. Starting with - * {@link android.os.Build.VERSION_CODES#MNC}, {@link #LAYER_TYPE_HARDWARE} is automatically + * {@link android.os.Build.VERSION_CODES#M}, {@link #LAYER_TYPE_HARDWARE} is automatically * applied to the view at the rendering level.</p> * * <p>If this view overrides {@link #onSetAlpha(int)} to return true, then this view is @@ -11431,7 +11430,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * associated with a {@link #setLayerPaint(android.graphics.Paint) layer paint}, setting an * alpha value less than 1.0 will supersede the alpha of the layer paint.</p> * - * <p>Starting with {@link android.os.Build.VERSION_CODES#MNC}, setting a translucent alpha + * <p>Starting with {@link android.os.Build.VERSION_CODES#M}, setting a translucent alpha * value will clip a View to its bounds, unless the View returns <code>false</code> from * {@link #hasOverlappingRendering}.</p> * @@ -18773,22 +18772,17 @@ public class View implements Drawable.Callback, KeyEvent.Callback, long key = (long) widthMeasureSpec << 32 | (long) heightMeasureSpec & 0xffffffffL; if (mMeasureCache == null) mMeasureCache = new LongSparseLongArray(2); - final boolean forceLayout = (mPrivateFlags & PFLAG_FORCE_LAYOUT) == PFLAG_FORCE_LAYOUT; - final boolean isExactly = MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY && - MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY; - final boolean matchingSize = isExactly && - getMeasuredWidth() == MeasureSpec.getSize(widthMeasureSpec) && - getMeasuredHeight() == MeasureSpec.getSize(heightMeasureSpec); - if (forceLayout || !matchingSize && - (widthMeasureSpec != mOldWidthMeasureSpec || - heightMeasureSpec != mOldHeightMeasureSpec)) { + if ((mPrivateFlags & PFLAG_FORCE_LAYOUT) == PFLAG_FORCE_LAYOUT || + widthMeasureSpec != mOldWidthMeasureSpec || + heightMeasureSpec != mOldHeightMeasureSpec) { // first clears the measured dimension flag mPrivateFlags &= ~PFLAG_MEASURED_DIMENSION_SET; resolveRtlPropertiesIfNeeded(); - int cacheIndex = forceLayout ? -1 : mMeasureCache.indexOfKey(key); + int cacheIndex = (mPrivateFlags & PFLAG_FORCE_LAYOUT) == PFLAG_FORCE_LAYOUT ? -1 : + mMeasureCache.indexOfKey(key); if (cacheIndex < 0 || sIgnoreMeasureCache) { // measure ourselves, this should set the measured dimension flag back onMeasure(widthMeasureSpec, heightMeasureSpec); diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 6dca26b18f26..fab81a424f76 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -5467,7 +5467,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @see #setAnimationCacheEnabled(boolean) * @see View#setDrawingCacheEnabled(boolean) * - * @deprecated As of {@link android.os.Build.VERSION_CODES#MNC}, this property is ignored. + * @deprecated As of {@link android.os.Build.VERSION_CODES#M}, this property is ignored. * Caching behavior of children may be controlled through {@link View#setLayerType(int, Paint)}. */ public boolean isAnimationCacheEnabled() { @@ -5485,7 +5485,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @see #isAnimationCacheEnabled() * @see View#setDrawingCacheEnabled(boolean) * - * @deprecated As of {@link android.os.Build.VERSION_CODES#MNC}, this property is ignored. + * @deprecated As of {@link android.os.Build.VERSION_CODES#M}, this property is ignored. * Caching behavior of children may be controlled through {@link View#setLayerType(int, Paint)}. */ public void setAnimationCacheEnabled(boolean enabled) { @@ -5502,7 +5502,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @see #setChildrenDrawnWithCacheEnabled(boolean) * @see View#setDrawingCacheEnabled(boolean) * - * @deprecated As of {@link android.os.Build.VERSION_CODES#MNC}, this property is ignored. + * @deprecated As of {@link android.os.Build.VERSION_CODES#M}, this property is ignored. * Child views may no longer have their caching behavior disabled by parents. */ public boolean isAlwaysDrawnWithCacheEnabled() { @@ -5526,7 +5526,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @see View#setDrawingCacheEnabled(boolean) * @see View#setDrawingCacheQuality(int) * - * @deprecated As of {@link android.os.Build.VERSION_CODES#MNC}, this property is ignored. + * @deprecated As of {@link android.os.Build.VERSION_CODES#M}, this property is ignored. * Child views may no longer have their caching behavior disabled by parents. */ public void setAlwaysDrawnWithCacheEnabled(boolean always) { @@ -5542,7 +5542,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @see #setAlwaysDrawnWithCacheEnabled(boolean) * @see #setChildrenDrawnWithCacheEnabled(boolean) * - * @deprecated As of {@link android.os.Build.VERSION_CODES#MNC}, this property is ignored. + * @deprecated As of {@link android.os.Build.VERSION_CODES#M}, this property is ignored. * Child views may no longer be forced to cache their rendering state by their parents. * Use {@link View#setLayerType(int, Paint)} on individual Views instead. */ @@ -5563,7 +5563,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @see #setAlwaysDrawnWithCacheEnabled(boolean) * @see #isChildrenDrawnWithCacheEnabled() * - * @deprecated As of {@link android.os.Build.VERSION_CODES#MNC}, this property is ignored. + * @deprecated As of {@link android.os.Build.VERSION_CODES#M}, this property is ignored. * Child views may no longer be forced to cache their rendering state by their parents. * Use {@link View#setLayerType(int, Paint)} on individual Views instead. */ diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 5afe60894f9b..6e93a3031de5 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -79,7 +79,6 @@ import android.widget.Scroller; import com.android.internal.R; import com.android.internal.os.SomeArgs; import com.android.internal.policy.PhoneFallbackEventHandler; -import com.android.internal.util.ScreenShapeHelper; import com.android.internal.view.BaseSurfaceHolder; import com.android.internal.view.RootViewSurfaceTaker; @@ -5941,7 +5940,7 @@ public final class ViewRootImpl implements ViewParent, } private void adjustInputEventForCompatibility(InputEvent e) { - if (mTargetSdkVersion < Build.VERSION_CODES.MNC && e instanceof MotionEvent) { + if (mTargetSdkVersion < Build.VERSION_CODES.M && e instanceof MotionEvent) { MotionEvent motion = (MotionEvent) e; final int mask = MotionEvent.BUTTON_STYLUS_PRIMARY | MotionEvent.BUTTON_STYLUS_SECONDARY; diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index be564f84d221..aaf605274a9a 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -995,6 +995,12 @@ public interface WindowManagerPolicy { public void screenTurningOn(ScreenOnListener screenOnListener); /** + * Called when the device has actually turned on the screen, i.e. the display power state has + * been set to ON and the screen is unblocked. + */ + public void screenTurnedOn(); + + /** * Called when the device has turned the screen off. */ public void screenTurnedOff(); diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java index 76c8fbd4b295..6130fd58ac9a 100644 --- a/core/java/android/view/inputmethod/EditorInfo.java +++ b/core/java/android/view/inputmethod/EditorInfo.java @@ -303,10 +303,12 @@ public class EditorInfo implements InputType, Parcelable { * {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1} and prior, do not trust this package * name. The system had not verified the consistency between the package name here and * application's uid. Consider to use {@link InputBinding#getUid()}, which is trustworthy. - * Starting from Android MNC, the system verifies the consistency between this package name - * and application uid before {@link EditorInfo} is passed to the input method.</p> + * Starting from {@link android.os.Build.VERSION_CODES#M}, the system verifies the consistency + * between this package name and application uid before {@link EditorInfo} is passed to the + * input method.</p> * - * <p><strong>Editor authors:</strong> Starting from Android MNC, the application is no longer + * <p><strong>Editor authors:</strong> Starting from {@link android.os.Build.VERSION_CODES#M}, + * the application is no longer * able to establish input connections if the package name provided here is inconsistent with * application's uid.</p> */ diff --git a/core/java/android/widget/DateTimeView.java b/core/java/android/widget/DateTimeView.java index 0b5824ae56a7..d20b9244a4b2 100644 --- a/core/java/android/widget/DateTimeView.java +++ b/core/java/android/widget/DateTimeView.java @@ -16,6 +16,7 @@ package android.widget; +import android.app.ActivityThread; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -25,7 +26,6 @@ import android.os.Handler; import android.text.format.Time; import android.util.AttributeSet; import android.util.Log; -import android.widget.TextView; import android.widget.RemoteViews.RemoteView; import java.text.DateFormat; @@ -228,14 +228,14 @@ public class DateTimeView extends TextView { final boolean register = mAttachedViews.isEmpty(); mAttachedViews.add(v); if (register) { - register(v.getContext().getApplicationContext()); + register(getApplicationContextIfAvailable(v.getContext())); } } public void removeView(DateTimeView v) { mAttachedViews.remove(v); if (mAttachedViews.isEmpty()) { - unregister(v.getContext().getApplicationContext()); + unregister(getApplicationContextIfAvailable(v.getContext())); } } @@ -258,6 +258,11 @@ public class DateTimeView extends TextView { return result; } + static final Context getApplicationContextIfAvailable(Context context) { + final Context ac = context.getApplicationContext(); + return ac != null ? ac : ActivityThread.currentApplication().getApplicationContext(); + } + void register(Context context) { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_TICK); diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 6a561e61057d..4dfa7db793b2 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -676,33 +676,42 @@ public class RelativeLayout extends ViewGroup { child.measure(childWidthMeasureSpec, childHeightMeasureSpec); } - private void measureChildHorizontal(View child, LayoutParams params, int myWidth, int myHeight) { - int childWidthMeasureSpec = getChildMeasureSpec(params.mLeft, - params.mRight, params.width, - params.leftMargin, params.rightMargin, - mPaddingLeft, mPaddingRight, + private void measureChildHorizontal( + View child, LayoutParams params, int myWidth, int myHeight) { + final int childWidthMeasureSpec = getChildMeasureSpec(params.mLeft, params.mRight, + params.width, params.leftMargin, params.rightMargin, mPaddingLeft, mPaddingRight, myWidth); - int maxHeight = myHeight; - if (mMeasureVerticalWithPaddingMargin) { - maxHeight = Math.max(0, myHeight - mPaddingTop - mPaddingBottom - - params.topMargin - params.bottomMargin); - } - int childHeightMeasureSpec; + + final int childHeightMeasureSpec; if (myHeight < 0 && !mAllowBrokenMeasureSpecs) { if (params.height >= 0) { childHeightMeasureSpec = MeasureSpec.makeMeasureSpec( params.height, MeasureSpec.EXACTLY); } else { - // Negative values in a mySize/myWidth/myWidth value in RelativeLayout measurement - // is code for, "we got an unspecified mode in the RelativeLayout's measurespec." + // Negative values in a mySize/myWidth/myWidth value in + // RelativeLayout measurement is code for, "we got an + // unspecified mode in the RelativeLayout's measure spec." // Carry it forward. childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } - } else if (params.width == LayoutParams.MATCH_PARENT) { - childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.EXACTLY); } else { - childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); + final int maxHeight; + if (mMeasureVerticalWithPaddingMargin) { + maxHeight = Math.max(0, myHeight - mPaddingTop - mPaddingBottom + - params.topMargin - params.bottomMargin); + } else { + maxHeight = Math.max(0, myHeight); + } + + final int heightMode; + if (params.width == LayoutParams.MATCH_PARENT) { + heightMode = MeasureSpec.EXACTLY; + } else { + heightMode = MeasureSpec.AT_MOST; + } + childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, heightMode); } + child.measure(childWidthMeasureSpec, childHeightMeasureSpec); } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 74843ee0f06b..7ca333947918 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -1412,39 +1412,108 @@ public class RemoteViews implements Parcelable, Filter { public TextViewDrawableAction(int viewId, boolean isRelative, int d1, int d2, int d3, int d4) { this.viewId = viewId; this.isRelative = isRelative; + this.useIcons = false; this.d1 = d1; this.d2 = d2; this.d3 = d3; this.d4 = d4; } + public TextViewDrawableAction(int viewId, boolean isRelative, + Icon i1, Icon i2, Icon i3, Icon i4) { + this.viewId = viewId; + this.isRelative = isRelative; + this.useIcons = true; + this.i1 = i1; + this.i2 = i2; + this.i3 = i3; + this.i4 = i4; + } + public TextViewDrawableAction(Parcel parcel) { viewId = parcel.readInt(); isRelative = (parcel.readInt() != 0); - d1 = parcel.readInt(); - d2 = parcel.readInt(); - d3 = parcel.readInt(); - d4 = parcel.readInt(); + useIcons = (parcel.readInt() != 0); + if (useIcons) { + if (parcel.readInt() != 0) { + i1 = Icon.CREATOR.createFromParcel(parcel); + } + if (parcel.readInt() != 0) { + i2 = Icon.CREATOR.createFromParcel(parcel); + } + if (parcel.readInt() != 0) { + i3 = Icon.CREATOR.createFromParcel(parcel); + } + if (parcel.readInt() != 0) { + i4 = Icon.CREATOR.createFromParcel(parcel); + } + } else { + d1 = parcel.readInt(); + d2 = parcel.readInt(); + d3 = parcel.readInt(); + d4 = parcel.readInt(); + } } public void writeToParcel(Parcel dest, int flags) { dest.writeInt(TAG); dest.writeInt(viewId); dest.writeInt(isRelative ? 1 : 0); - dest.writeInt(d1); - dest.writeInt(d2); - dest.writeInt(d3); - dest.writeInt(d4); + dest.writeInt(useIcons ? 1 : 0); + if (useIcons) { + if (i1 != null) { + dest.writeInt(1); + i1.writeToParcel(dest, 0); + } else { + dest.writeInt(0); + } + if (i2 != null) { + dest.writeInt(1); + i2.writeToParcel(dest, 0); + } else { + dest.writeInt(0); + } + if (i3 != null) { + dest.writeInt(1); + i3.writeToParcel(dest, 0); + } else { + dest.writeInt(0); + } + if (i4 != null) { + dest.writeInt(1); + i4.writeToParcel(dest, 0); + } else { + dest.writeInt(0); + } + } else { + dest.writeInt(d1); + dest.writeInt(d2); + dest.writeInt(d3); + dest.writeInt(d4); + } } @Override public void apply(View root, ViewGroup rootParent, OnClickHandler handler) { final TextView target = (TextView) root.findViewById(viewId); if (target == null) return; - if (isRelative) { - target.setCompoundDrawablesRelativeWithIntrinsicBounds(d1, d2, d3, d4); + if (useIcons) { + final Context ctx = target.getContext(); + final Drawable id1 = i1 == null ? null : i1.loadDrawable(ctx); + final Drawable id2 = i2 == null ? null : i2.loadDrawable(ctx); + final Drawable id3 = i3 == null ? null : i3.loadDrawable(ctx); + final Drawable id4 = i4 == null ? null : i4.loadDrawable(ctx); + if (isRelative) { + target.setCompoundDrawablesRelativeWithIntrinsicBounds(id1, id2, id3, id4); + } else { + target.setCompoundDrawablesWithIntrinsicBounds(id1, id2, id3, id4); + } } else { - target.setCompoundDrawablesWithIntrinsicBounds(d1, d2, d3, d4); + if (isRelative) { + target.setCompoundDrawablesRelativeWithIntrinsicBounds(d1, d2, d3, d4); + } else { + target.setCompoundDrawablesWithIntrinsicBounds(d1, d2, d3, d4); + } } } @@ -1453,7 +1522,9 @@ public class RemoteViews implements Parcelable, Filter { } boolean isRelative = false; + boolean useIcons = false; int d1, d2, d3, d4; + Icon i1, i2, i3, i4; public final static int TAG = 11; } @@ -2067,6 +2138,41 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Equivalent to calling {@link + * TextView#setCompoundDrawablesWithIntrinsicBounds(Drawable, Drawable, Drawable, Drawable)} + * using the drawables yielded by {@link Icon#loadDrawable(Context)}. + * + * @param viewId The id of the view whose text should change + * @param left an Icon to place to the left of the text, or 0 + * @param top an Icon to place above the text, or 0 + * @param right an Icon to place to the right of the text, or 0 + * @param bottom an Icon to place below the text, or 0 + * + * @hide + */ + public void setTextViewCompoundDrawables(int viewId, Icon left, Icon top, Icon right, Icon bottom) { + addAction(new TextViewDrawableAction(viewId, false, left, top, right, bottom)); + } + + /** + * Equivalent to calling {@link + * TextView#setCompoundDrawablesRelativeWithIntrinsicBounds(Drawable, Drawable, Drawable, Drawable)} + * using the drawables yielded by {@link Icon#loadDrawable(Context)}. + * + * @param viewId The id of the view whose text should change + * @param start an Icon to place before the text (relative to the + * layout direction), or 0 + * @param top an Icon to place above the text, or 0 + * @param end an Icon to place after the text, or 0 + * @param bottom an Icon to place below the text, or 0 + * + * @hide + */ + public void setTextViewCompoundDrawablesRelative(int viewId, Icon start, Icon top, Icon end, Icon bottom) { + addAction(new TextViewDrawableAction(viewId, true, start, top, end, bottom)); + } + + /** * Equivalent to calling ImageView.setImageResource * * @param viewId The id of the view whose drawable should change @@ -2640,6 +2746,10 @@ public class RemoteViews implements Parcelable, Filter { public Resources.Theme getTheme() { return contextForResources.getTheme(); } + @Override + public String getPackageName() { + return contextForResources.getPackageName(); + } }; LayoutInflater inflater = (LayoutInflater) diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 58a94b96a7f2..529d29530a61 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -356,7 +356,7 @@ public class ScrollView extends FrameLayout { final int heightPadding; final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams(); final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion; - if (targetSdkVersion >= VERSION_CODES.MNC) { + if (targetSdkVersion >= VERSION_CODES.M) { widthPadding = mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin; heightPadding = mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin; } else { diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java index 5d7b56979218..bcde3158866a 100644 --- a/core/java/android/widget/TextClock.java +++ b/core/java/android/widget/TextClock.java @@ -120,12 +120,16 @@ public class TextClock extends TextView { private CharSequence mFormat12; private CharSequence mFormat24; + private CharSequence mDescFormat12; + private CharSequence mDescFormat24; @ExportedProperty private CharSequence mFormat; @ExportedProperty private boolean mHasSeconds; + private CharSequence mDescFormat; + private boolean mAttached; private Calendar mTime; @@ -301,6 +305,17 @@ public class TextClock extends TextView { } /** + * Like setFormat12Hour, but for the content description. + * @hide + */ + public void setContentDescriptionFormat12Hour(CharSequence format) { + mDescFormat12 = format; + + chooseFormat(); + onTimeChanged(); + } + + /** * Returns the formatting pattern used to display the date and/or time * in 24-hour mode. The formatting pattern syntax is described in * {@link DateFormat}. @@ -348,6 +363,17 @@ public class TextClock extends TextView { } /** + * Like setFormat24Hour, but for the content description. + * @hide + */ + public void setContentDescriptionFormat24Hour(CharSequence format) { + mDescFormat24 = format; + + chooseFormat(); + onTimeChanged(); + } + + /** * Sets whether this clock should always track the current user and not the user of the * current process. This is used for single instance processes like the systemUI who need * to display time for different users. @@ -460,8 +486,10 @@ public class TextClock extends TextView { if (format24Requested) { mFormat = abc(mFormat24, mFormat12, ld.timeFormat_Hm); + mDescFormat = abc(mDescFormat24, mDescFormat12, mFormat); } else { mFormat = abc(mFormat12, mFormat24, ld.timeFormat_hm); + mDescFormat = abc(mDescFormat12, mDescFormat24, mFormat); } boolean hadSeconds = mHasSeconds; @@ -547,6 +575,7 @@ public class TextClock extends TextView { private void onTimeChanged() { mTime.setTimeInMillis(System.currentTimeMillis()); setText(DateFormat.format(mFormat, mTime)); + setContentDescription(DateFormat.format(mDescFormat, mTime)); } /** @hide */ diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 131ba4674755..a1462c4886a0 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -2270,6 +2270,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @attr ref android.R.styleable#TextView_drawableRight * @attr ref android.R.styleable#TextView_drawableBottom */ + @android.view.RemotableViewMethod public void setCompoundDrawablesWithIntrinsicBounds(@Nullable Drawable left, @Nullable Drawable top, @Nullable Drawable right, @Nullable Drawable bottom) { @@ -2302,6 +2303,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @attr ref android.R.styleable#TextView_drawableEnd * @attr ref android.R.styleable#TextView_drawableBottom */ + @android.view.RemotableViewMethod public void setCompoundDrawablesRelative(@Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end, @Nullable Drawable bottom) { Drawables dr = mDrawables; @@ -2472,6 +2474,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @attr ref android.R.styleable#TextView_drawableEnd * @attr ref android.R.styleable#TextView_drawableBottom */ + @android.view.RemotableViewMethod public void setCompoundDrawablesRelativeWithIntrinsicBounds(@Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end, @Nullable Drawable bottom) { diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 6af2e8bf5765..d9faece9485f 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -517,6 +517,7 @@ public class ChooserActivity extends ResolverActivity { private final ResolveInfo mBackupResolveInfo; private final ChooserTarget mChooserTarget; private Drawable mBadgeIcon = null; + private CharSequence mBadgeContentDescription; private Drawable mDisplayIcon; private final Intent mFillInIntent; private final int mFillInFlags; @@ -532,7 +533,9 @@ public class ChooserActivity extends ResolverActivity { if (ri != null) { final ActivityInfo ai = ri.activityInfo; if (ai != null && ai.applicationInfo != null) { - mBadgeIcon = getPackageManager().getApplicationIcon(ai.applicationInfo); + final PackageManager pm = getPackageManager(); + mBadgeIcon = pm.getApplicationIcon(ai.applicationInfo); + mBadgeContentDescription = pm.getApplicationLabel(ai.applicationInfo); } } } @@ -555,6 +558,7 @@ public class ChooserActivity extends ResolverActivity { mBackupResolveInfo = other.mBackupResolveInfo; mChooserTarget = other.mChooserTarget; mBadgeIcon = other.mBadgeIcon; + mBadgeContentDescription = other.mBadgeContentDescription; mDisplayIcon = other.mDisplayIcon; mFillInIntent = fillInIntent; mFillInFlags = flags; @@ -647,6 +651,11 @@ public class ChooserActivity extends ResolverActivity { } @Override + public CharSequence getBadgeContentDescription() { + return mBadgeContentDescription; + } + + @Override public TargetInfo cloneFilledIn(Intent fillInIntent, int flags) { return new ChooserTargetInfo(this, fillInIntent, flags); } diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index 73c48334b1d1..9fa2c23dc953 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -38,6 +38,7 @@ interface IAppOpsService { int checkPackage(int uid, String packageName); List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops); List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops); + void setUidMode(int code, int uid, int mode); void setMode(int code, int uid, String packageName, int mode); void resetAllModes(int reqUserId, String reqPackageName); int checkAudioOperation(int code, int usage, int uid, String packageName); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 1bf17e6843ba..7dd3bed079fc 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -500,7 +500,7 @@ public class ResolverActivity extends Activity { mPackageMonitor.unregister(); mRegistered = false; } - if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { + if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && !isVoiceInteraction()) { // This resolver is in the unusual situation where it has been // launched at the top of a new task. We don't let it be added // to the recent tasks shown to the user, and we need to make sure @@ -810,8 +810,13 @@ public class ResolverActivity extends Activity { void configureContentView(List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, boolean alwaysUseOption) { + // The last argument of createAdapter is whether to do special handling + // of the last used choice to highlight it in the list. We need to always + // turn this off when running under voice interaction, since it results in + // a more complicated UI that the current voice interaction flow is not able + // to handle. mAdapter = createAdapter(this, payloadIntents, initialIntents, rList, - mLaunchedFromUid, alwaysUseOption); + mLaunchedFromUid, alwaysUseOption && !isVoiceInteraction()); final int layoutId; if (mAdapter.hasFilteredItem()) { @@ -927,6 +932,11 @@ public class ResolverActivity extends Activity { } @Override + public CharSequence getBadgeContentDescription() { + return null; + } + + @Override public TargetInfo cloneFilledIn(Intent fillInIntent, int flags) { return new DisplayResolveInfo(this, fillInIntent, flags); } @@ -1067,6 +1077,11 @@ public class ResolverActivity extends Activity { public Drawable getBadgeIcon(); /** + * @return The content description for the badge icon + */ + public CharSequence getBadgeContentDescription(); + + /** * Clone this target with the given fill-in information. */ public TargetInfo cloneFilledIn(Intent fillInIntent, int flags); @@ -1537,6 +1552,7 @@ public class ResolverActivity extends Activity { final Drawable badge = info.getBadgeIcon(); if (badge != null) { holder.badge.setImageDrawable(badge); + holder.badge.setContentDescription(info.getBadgeContentDescription()); holder.badge.setVisibility(View.VISIBLE); } else { holder.badge.setVisibility(View.GONE); diff --git a/core/java/com/android/internal/logging/MetricsConstants.java b/core/java/com/android/internal/logging/MetricsConstants.java index 7278d5c07f00..b90cb364defa 100644 --- a/core/java/com/android/internal/logging/MetricsConstants.java +++ b/core/java/com/android/internal/logging/MetricsConstants.java @@ -250,6 +250,18 @@ public interface MetricsConstants { public static final int OVERVIEW_ACTIVITY = 224; public static final int ABOUT_LEGAL_SETTINGS = 225; public static final int ACTION_SEARCH_RESULTS = 226; + public static final int TUNER = 227; + public static final int TUNER_QS = 228; + public static final int TUNER_DEMO_MODE = 229; + public static final int TUNER_QS_REORDER = 230; + public static final int TUNER_QS_ADD = 231; + public static final int TUNER_QS_REMOVE = 232; + public static final int TUNER_STATUS_BAR_ENABLE = 233; + public static final int TUNER_STATUS_BAR_DISABLE = 234; + public static final int TUNER_DEMO_MODE_ENABLED = 235; + public static final int TUNER_DEMO_MODE_ON = 236; + public static final int TUNER_BATTERY_PERCENTAGE = 237; + public static final int FUELGAUGE_INACTIVE_APPS = 238; // These constants must match those in the analytic pipeline, do not edit. // Add temporary values to the top of MetricsLogger instead. diff --git a/core/java/com/android/internal/logging/MetricsLogger.java b/core/java/com/android/internal/logging/MetricsLogger.java index 91ae27b89a07..d954b7161513 100644 --- a/core/java/com/android/internal/logging/MetricsLogger.java +++ b/core/java/com/android/internal/logging/MetricsLogger.java @@ -27,20 +27,7 @@ import android.view.View; */ public class MetricsLogger implements MetricsConstants { // Temporary constants go here, to await migration to MetricsConstants. - // next value is 238; - - public static final int TUNER = 227; - public static final int TUNER_QS = 228; - public static final int TUNER_DEMO_MODE = 229; - - public static final int TUNER_QS_REORDER = 230; - public static final int TUNER_QS_ADD = 231; - public static final int TUNER_QS_REMOVE = 232; - public static final int TUNER_STATUS_BAR_ENABLE = 233; - public static final int TUNER_STATUS_BAR_DISABLE = 234; - public static final int TUNER_DEMO_MODE_ENABLED = 235; - public static final int TUNER_DEMO_MODE_ON = 236; - public static final int TUNER_BATTERY_PERCENTAGE = 237; + // next value is 239; public static void visible(Context context, int category) throws IllegalArgumentException { if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) { diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index 9caf78a6b3a3..f178c8cf7ece 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -126,6 +126,9 @@ public final class BatteryStatsHelper { PowerCalculator mCameraPowerCalculator; PowerCalculator mFlashlightPowerCalculator; + boolean mHasWifiPowerReporting = false; + boolean mHasBluetoothPowerReporting = false; + public static boolean checkWifiOnly(Context context) { ConnectivityManager cm = (ConnectivityManager)context.getSystemService( Context.CONNECTIVITY_SERVICE); @@ -349,21 +352,23 @@ public final class BatteryStatsHelper { } mMobileRadioPowerCalculator.reset(mStats); - if (mWifiPowerCalculator == null) { - if (checkHasWifiPowerReporting(mStats, mPowerProfile)) { - mWifiPowerCalculator = new WifiPowerCalculator(mPowerProfile); - } else { - mWifiPowerCalculator = new WifiPowerEstimator(mPowerProfile); - } + // checkHasWifiPowerReporting can change if we get energy data at a later point, so + // always check this field. + final boolean hasWifiPowerReporting = checkHasWifiPowerReporting(mStats, mPowerProfile); + if (mWifiPowerCalculator == null || hasWifiPowerReporting != mHasWifiPowerReporting) { + mWifiPowerCalculator = hasWifiPowerReporting ? + new WifiPowerCalculator(mPowerProfile) : + new WifiPowerEstimator(mPowerProfile); + mHasWifiPowerReporting = hasWifiPowerReporting; } mWifiPowerCalculator.reset(); - if (mBluetoothPowerCalculator == null) { - if (checkHasBluetoothPowerReporting(mStats, mPowerProfile)) { - mBluetoothPowerCalculator = new BluetoothPowerCalculator(mPowerProfile); - } else { - mBluetoothPowerCalculator = new BluetoothPowerCalculator(mPowerProfile); - } + final boolean hasBluetoothPowerReporting = checkHasBluetoothPowerReporting(mStats, + mPowerProfile); + if (mBluetoothPowerCalculator == null || + hasBluetoothPowerReporting != mHasBluetoothPowerReporting) { + mBluetoothPowerCalculator = new BluetoothPowerCalculator(mPowerProfile); + mHasBluetoothPowerReporting = hasBluetoothPowerReporting; } mBluetoothPowerCalculator.reset(); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index e7c58f45c18c..4f42ed994f32 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -7915,6 +7915,8 @@ public final class BatteryStatsImpl extends BatteryStats { return; } + // Record whether we've seen a non-zero time (for debugging b/22716723). + boolean seenNonZeroTime = false; for (Map.Entry<String, KernelWakelockStats.Entry> ent : wakelockStats.entrySet()) { String name = ent.getKey(); KernelWakelockStats.Entry kws = ent.getValue(); @@ -7928,17 +7930,31 @@ public final class BatteryStatsImpl extends BatteryStats { kwlt.updateCurrentReportedCount(kws.mCount); kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); kwlt.setUpdateVersion(kws.mVersion); + + if (kws.mVersion != wakelockStats.kernelWakelockVersion) + seenNonZeroTime |= kws.mTotalTime > 0; } + int numWakelocksSetStale = 0; if (wakelockStats.size() != mKernelWakelockStats.size()) { // Set timers to stale if they didn't appear in /proc/wakelocks this time. for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { SamplingTimer st = ent.getValue(); if (st.getUpdateVersion() != wakelockStats.kernelWakelockVersion) { st.setStale(); + numWakelocksSetStale++; } } } + + if (!seenNonZeroTime) { + Slog.wtf(TAG, "All kernel wakelocks had time of zero"); + } + + if (numWakelocksSetStale == mKernelWakelockStats.size()) { + Slog.wtf(TAG, "All kernel wakelocks were set stale. new version=" + + wakelockStats.kernelWakelockVersion); + } } // We use an anonymous class to access these variables, diff --git a/core/java/com/android/internal/os/KernelWakelockReader.java b/core/java/com/android/internal/os/KernelWakelockReader.java index 0369c3ff248d..6654ea5683e3 100644 --- a/core/java/com/android/internal/os/KernelWakelockReader.java +++ b/core/java/com/android/internal/os/KernelWakelockReader.java @@ -75,6 +75,8 @@ public class KernelWakelockReader { is = new FileInputStream(sWakeupSourceFile); wakeup_sources = true; } catch (java.io.FileNotFoundException e2) { + Slog.wtf(TAG, "neither " + sWakelockFile + " nor " + + sWakeupSourceFile + " exists"); return null; } } @@ -82,6 +84,7 @@ public class KernelWakelockReader { len = is.read(buffer); is.close(); } catch (java.io.IOException e) { + Slog.wtf(TAG, "failed to read kernel wakelocks", e); return null; } @@ -171,6 +174,13 @@ public class KernelWakelockReader { numUpdatedWlNames++; } } + } else if (!parsed) { + try { + Slog.wtf(TAG, "Failed to parse proc line: " + + new String(wlBuffer, startIndex, endIndex - startIndex)); + } catch (Exception e) { + Slog.wtf(TAG, "Failed to parse proc line!"); + } } startIndex = endIndex; } diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index 79af4522b425..e330de24f6d6 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -64,6 +64,16 @@ oneway interface IKeyguardService { */ void onScreenTurningOn(IKeyguardDrawnCallback callback); + /** + * Called when the screen has actually turned on. + */ + void onScreenTurnedOn(); + + /** + * Called when the screen has turned off. + */ + void onScreenTurnedOff(); + void setKeyguardEnabled(boolean enabled); void onSystemReady(); void doKeyguardTimeout(in Bundle options); diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 9bd2eec96233..dd7ea4506432 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -32,7 +32,6 @@ import android.os.UserHandle; import android.view.ActionMode; import android.view.ContextThemeWrapper; -import android.view.Display; import android.view.Gravity; import android.view.IRotationWatcher.Stub; import android.view.IWindowManager; @@ -3533,7 +3532,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { public void onDestroyActionMode(ActionMode mode) { mWrapped.onDestroyActionMode(mode); final boolean isMncApp = mContext.getApplicationInfo().targetSdkVersion - >= Build.VERSION_CODES.MNC; + >= Build.VERSION_CODES.M; final boolean isPrimary; final boolean isFloating; if (isMncApp) { diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java index a709bb8e1b07..9211eaaf4592 100644 --- a/core/java/com/android/internal/widget/LockPatternView.java +++ b/core/java/com/android/internal/widget/LockPatternView.java @@ -94,7 +94,7 @@ public class LockPatternView extends View { */ private static final float DRAG_THRESHHOLD = 0.0f; public static final int VIRTUAL_BASE_VIEW_ID = 1; - public static final boolean DEBUG_A11Y = true; + public static final boolean DEBUG_A11Y = false; private static final String TAG = "LockPatternView"; private OnPatternListener mOnPatternListener; @@ -568,9 +568,11 @@ public class LockPatternView extends View { @Override protected boolean dispatchHoverEvent(MotionEvent event) { - // Give TouchHelper first right of refusal - boolean handled = mExploreByTouchHelper.dispatchHoverEvent(event); - return super.dispatchHoverEvent(event) || handled; + // Dispatch to onHoverEvent first so mPatternInProgress is up to date when the + // helper gets the event. + boolean handled = super.dispatchHoverEvent(event); + handled |= mExploreByTouchHelper.dispatchHoverEvent(event); + return handled; } /** @@ -877,7 +879,7 @@ public class LockPatternView extends View { return true; case MotionEvent.ACTION_CANCEL: if (mPatternInProgress) { - mPatternInProgress = false; + setPatternInProgress(false); resetPattern(); notifyPatternCleared(); } @@ -892,6 +894,11 @@ public class LockPatternView extends View { return false; } + private void setPatternInProgress(boolean progress) { + mPatternInProgress = progress; + mExploreByTouchHelper.invalidateRoot(); + } + private void handleActionMove(MotionEvent event) { // Handle all recent motion events so we don't skip any cells even when the device // is busy... @@ -905,7 +912,7 @@ public class LockPatternView extends View { Cell hitCell = detectAndAddHit(x, y); final int patternSize = mPattern.size(); if (hitCell != null && patternSize == 1) { - mPatternInProgress = true; + setPatternInProgress(true); notifyPatternStarted(); } // note current x and y for rubber banding of in progress patterns @@ -963,7 +970,7 @@ public class LockPatternView extends View { private void handleActionUp() { // report pattern detected if (!mPattern.isEmpty()) { - mPatternInProgress = false; + setPatternInProgress(false); cancelLineAnimations(); notifyPatternDetected(); invalidate(); @@ -994,11 +1001,11 @@ public class LockPatternView extends View { final float y = event.getY(); final Cell hitCell = detectAndAddHit(x, y); if (hitCell != null) { - mPatternInProgress = true; + setPatternInProgress(true); mPatternDisplayMode = DisplayMode.Correct; notifyPatternStarted(); } else if (mPatternInProgress) { - mPatternInProgress = false; + setPatternInProgress(false); notifyPatternCleared(); } if (hitCell != null) { @@ -1315,6 +1322,9 @@ public class LockPatternView extends View { @Override protected void getVisibleVirtualViews(IntArray virtualViewIds) { if (DEBUG_A11Y) Log.v(TAG, "getVisibleVirtualViews(len=" + virtualViewIds.size() + ")"); + if (!mPatternInProgress) { + return; + } for (int i = VIRTUAL_BASE_VIEW_ID; i < VIRTUAL_BASE_VIEW_ID + 9; i++) { if (!mItems.containsKey(i)) { VirtualViewContainer item = new VirtualViewContainer(getTextForVirtualView(i)); @@ -1337,6 +1347,16 @@ public class LockPatternView extends View { } @Override + public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(host, event); + if (!mPatternInProgress) { + CharSequence contentDescription = getContext().getText( + com.android.internal.R.string.lockscreen_access_pattern_area); + event.setContentDescription(contentDescription); + } + } + + @Override protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfo node) { if (DEBUG_A11Y) Log.v(TAG, "onPopulateNodeForVirtualView(view=" + virtualViewId + ")"); @@ -1345,10 +1365,14 @@ public class LockPatternView extends View { node.setText(getTextForVirtualView(virtualViewId)); node.setContentDescription(getTextForVirtualView(virtualViewId)); - if (isClickable(virtualViewId)) { - // Mark this node of interest by making it clickable. - node.addAction(AccessibilityAction.ACTION_CLICK); - node.setClickable(isClickable(virtualViewId)); + if (mPatternInProgress) { + node.setFocusable(true); + + if (isClickable(virtualViewId)) { + // Mark this node of interest by making it clickable. + node.addAction(AccessibilityAction.ACTION_CLICK); + node.setClickable(isClickable(virtualViewId)); + } } // Compute bounds for this object diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java index fc9a1a50801e..76796243f3f5 100644 --- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java +++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java @@ -34,6 +34,7 @@ import android.view.ViewParent; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.animation.AnimationUtils; import android.widget.AbsListView; import android.widget.OverScroller; @@ -609,19 +610,37 @@ public class ResolverDrawerLayout extends ViewGroup { } @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); + public CharSequence getAccessibilityClassName() { + // Since we support scrolling, make this ViewGroup look like a + // ScrollView. This is kind of a hack until we have support for + // specifying auto-scroll behavior. + return android.widget.ScrollView.class.getName(); + } + + @Override + public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfoInternal(info); + if (isEnabled()) { if (mCollapseOffset != 0) { info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); info.setScrollable(true); } } + + // This view should never get accessibility focus, but it's interactive + // via nested scrolling, so we can't hide it completely. + info.removeAction(AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS); } @Override - public boolean performAccessibilityAction(int action, Bundle arguments) { - if (super.performAccessibilityAction(action, arguments)) { + public boolean performAccessibilityActionInternal(int action, Bundle arguments) { + if (action == AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS.getId()) { + // This view should never get accessibility focus. + return false; + } + + if (super.performAccessibilityActionInternal(action, arguments)) { return true; } @@ -629,6 +648,7 @@ public class ResolverDrawerLayout extends ViewGroup { smoothScrollTo(0, 0); return true; } + return false; } diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 670d3c01e030..fbe3ececc348 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -218,7 +218,6 @@ int Bitmap::getAshmemFd() const { } const SkImageInfo& Bitmap::info() const { - assertValid(); return mPixelRef->info(); } diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index 7c8769d0e93f..fb2268911be3 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -23,7 +23,9 @@ #include <utils/Vector.h> #include <utils/SortedVector.h> #include <utils/KeyedVector.h> +#include <stdio.h> #include <string.h> +#include <vector> #include "jni.h" #include "JNIHelp.h" @@ -45,9 +47,30 @@ static const bool kIsDebug = false; // fully-qualified class name #define CAMERA_METADATA_CLASS_NAME "android/hardware/camera2/impl/CameraMetadataNative" +#define CHARACTERISTICS_KEY_CLASS_NAME "android/hardware/camera2/CameraCharacteristics$Key" +#define REQUEST_KEY_CLASS_NAME "android/hardware/camera2/CaptureRequest$Key" +#define RESULT_KEY_CLASS_NAME "android/hardware/camera2/CaptureResult$Key" using namespace android; +static struct metadata_java_key_offsets_t { + jclass mCharacteristicsKey; + jclass mResultKey; + jclass mRequestKey; + jmethodID mCharacteristicsConstr; + jmethodID mResultConstr; + jmethodID mRequestConstr; + jclass mByteArray; + jclass mInt32Array; + jclass mFloatArray; + jclass mInt64Array; + jclass mDoubleArray; + jclass mRationalArray; + jclass mArrayList; + jmethodID mArrayListConstr; + jmethodID mArrayListAdd; +} gMetadataOffsets; + struct fields_t { jfieldID metadata_ptr; }; @@ -141,6 +164,7 @@ struct Helpers { extern "C" { static void CameraMetadata_classInit(JNIEnv *env, jobject thiz); +static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType); static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName); static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag); static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz); @@ -510,6 +534,9 @@ static JNINativeMethod gCameraMetadataMethods[] = { { "nativeClassInit", "()V", (void *)CameraMetadata_classInit }, + { "nativeGetAllVendorKeys", + "(Ljava/lang/Class;)Ljava/util/ArrayList;", + (void *)CameraMetadata_getAllVendorKeys}, { "nativeGetTagFromKey", "(Ljava/lang/String;)I", (void *)CameraMetadata_getTagFromKey }, @@ -588,6 +615,44 @@ static int find_fields(JNIEnv *env, field *fields, int count) // Get all the required offsets in java class and register native functions int register_android_hardware_camera2_CameraMetadata(JNIEnv *env) { + + // Store global references to Key-related classes and methods used natively + jclass characteristicsKeyClazz = FindClassOrDie(env, CHARACTERISTICS_KEY_CLASS_NAME); + jclass requestKeyClazz = FindClassOrDie(env, REQUEST_KEY_CLASS_NAME); + jclass resultKeyClazz = FindClassOrDie(env, RESULT_KEY_CLASS_NAME); + gMetadataOffsets.mCharacteristicsKey = MakeGlobalRefOrDie(env, characteristicsKeyClazz); + gMetadataOffsets.mRequestKey = MakeGlobalRefOrDie(env, requestKeyClazz); + gMetadataOffsets.mResultKey = MakeGlobalRefOrDie(env, resultKeyClazz); + gMetadataOffsets.mCharacteristicsConstr = GetMethodIDOrDie(env, + gMetadataOffsets.mCharacteristicsKey, "<init>", + "(Ljava/lang/String;Ljava/lang/Class;)V"); + gMetadataOffsets.mRequestConstr = GetMethodIDOrDie(env, + gMetadataOffsets.mRequestKey, "<init>", "(Ljava/lang/String;Ljava/lang/Class;)V"); + gMetadataOffsets.mResultConstr = GetMethodIDOrDie(env, + gMetadataOffsets.mResultKey, "<init>", "(Ljava/lang/String;Ljava/lang/Class;)V"); + + // Store global references for primitive array types used by Keys + jclass byteClazz = FindClassOrDie(env, "[B"); + jclass int32Clazz = FindClassOrDie(env, "[I"); + jclass floatClazz = FindClassOrDie(env, "[F"); + jclass int64Clazz = FindClassOrDie(env, "[J"); + jclass doubleClazz = FindClassOrDie(env, "[D"); + jclass rationalClazz = FindClassOrDie(env, "[Landroid/util/Rational;"); + gMetadataOffsets.mByteArray = MakeGlobalRefOrDie(env, byteClazz); + gMetadataOffsets.mInt32Array = MakeGlobalRefOrDie(env, int32Clazz); + gMetadataOffsets.mFloatArray = MakeGlobalRefOrDie(env, floatClazz); + gMetadataOffsets.mInt64Array = MakeGlobalRefOrDie(env, int64Clazz); + gMetadataOffsets.mDoubleArray = MakeGlobalRefOrDie(env, doubleClazz); + gMetadataOffsets.mRationalArray = MakeGlobalRefOrDie(env, rationalClazz); + + // Store global references for ArrayList methods used + jclass arrayListClazz = FindClassOrDie(env, "java/util/ArrayList"); + gMetadataOffsets.mArrayList = MakeGlobalRefOrDie(env, arrayListClazz); + gMetadataOffsets.mArrayListConstr = GetMethodIDOrDie(env, gMetadataOffsets.mArrayList, + "<init>", "(I)V"); + gMetadataOffsets.mArrayListAdd = GetMethodIDOrDie(env, gMetadataOffsets.mArrayList, + "add", "(Ljava/lang/Object;)Z"); + // Register native functions return RegisterMethodsOrDie(env, CAMERA_METADATA_CLASS_NAME, @@ -596,6 +661,7 @@ int register_android_hardware_camera2_CameraMetadata(JNIEnv *env) } extern "C" { + static void CameraMetadata_classInit(JNIEnv *env, jobject thiz) { // XX: Why do this separately instead of doing it in the register function? ALOGV("%s", __FUNCTION__); @@ -612,6 +678,107 @@ static void CameraMetadata_classInit(JNIEnv *env, jobject thiz) { env->FindClass(CAMERA_METADATA_CLASS_NAME); } +static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType) { + + // Get all vendor tags + sp<VendorTagDescriptor> vTags = VendorTagDescriptor::getGlobalVendorTagDescriptor(); + if (vTags.get() == nullptr) { + // No vendor tags. + return NULL; + } + + int count = vTags->getTagCount(); + if (count <= 0) { + // No vendor tags. + return NULL; + } + + std::vector<uint32_t> tagIds(count, /*initializer value*/0); + vTags->getTagArray(&tagIds[0]); + + // Which key class/constructor should we use? + jclass keyClazz; + jmethodID keyConstr; + if (env->IsSameObject(keyType, gMetadataOffsets.mCharacteristicsKey)) { + keyClazz = gMetadataOffsets.mCharacteristicsKey; + keyConstr = gMetadataOffsets.mCharacteristicsConstr; + } else if (env->IsSameObject(keyType, gMetadataOffsets.mResultKey)) { + keyClazz = gMetadataOffsets.mResultKey; + keyConstr = gMetadataOffsets.mResultConstr; + } else if (env->IsSameObject(keyType, gMetadataOffsets.mRequestKey)) { + keyClazz = gMetadataOffsets.mRequestKey; + keyConstr = gMetadataOffsets.mRequestConstr; + } else { + jniThrowException(env, "java/lang/IllegalArgumentException", + "Invalid key class given as argument."); + return NULL; + } + + // Allocate arrayList to return + jobject arrayList = env->NewObject(gMetadataOffsets.mArrayList, + gMetadataOffsets.mArrayListConstr, static_cast<jint>(count)); + if (env->ExceptionCheck()) { + return NULL; + } + + for (uint32_t id : tagIds) { + const char* section = vTags->getSectionName(id); + const char* tag = vTags->getTagName(id); + int type = vTags->getTagType(id); + + size_t totalLen = strlen(section) + strlen(tag) + 2; + std::vector<char> fullName(totalLen, 0); + snprintf(&fullName[0], totalLen, "%s.%s", section, tag); + + jstring name = env->NewStringUTF(&fullName[0]); + + if (env->ExceptionCheck()) { + return NULL; + } + + jclass valueClazz; + switch (type) { + case TYPE_BYTE: + valueClazz = gMetadataOffsets.mByteArray; + break; + case TYPE_INT32: + valueClazz = gMetadataOffsets.mInt32Array; + break; + case TYPE_FLOAT: + valueClazz = gMetadataOffsets.mFloatArray; + break; + case TYPE_INT64: + valueClazz = gMetadataOffsets.mInt64Array; + break; + case TYPE_DOUBLE: + valueClazz = gMetadataOffsets.mDoubleArray; + break; + case TYPE_RATIONAL: + valueClazz = gMetadataOffsets.mRationalArray; + break; + default: + jniThrowExceptionFmt(env, "java/lang/IllegalStateException", + "Invalid type %d given for key %s", type, &fullName[0]); + return NULL; + } + + jobject key = env->NewObject(keyClazz, keyConstr, name, valueClazz); + if (env->ExceptionCheck()) { + return NULL; + } + + env->CallBooleanMethod(arrayList, gMetadataOffsets.mArrayListAdd, key); + if (env->ExceptionCheck()) { + return NULL; + } + + env->DeleteLocalRef(name); + env->DeleteLocalRef(key); + } + + return arrayList; +} + static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName) { ScopedUtfChars keyScoped(env, keyName); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 3e22e0925021..1f47ce37e2ba 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -319,6 +319,7 @@ <protected-broadcast android:name="android.internal.policy.action.BURN_IN_PROTECTION" /> <protected-broadcast android:name="android.app.action.SYSTEM_UPDATE_POLICY_CHANGED" /> + <protected-broadcast android:name="android.app.action.DEVICE_OWNER_CHANGED" /> <!-- ====================================================================== --> <!-- RUNTIME PERMISSIONS --> <!-- ====================================================================== --> @@ -960,9 +961,7 @@ android:label="@string/permlab_changeWimaxState" android:protectionLevel="normal" /> - <!--@SystemApi Allows applications to the the local WiFi and Bluetooth MAC address. - @hide - --> + <!-- Allows applications to act as network scorers. @hide @SystemApi--> <permission android:name="android.permission.SCORE_NETWORKS" android:protectionLevel="signature|privileged" /> @@ -2582,10 +2581,16 @@ <permission android:name="android.permission.KILL_UID" android:protectionLevel="signature|installer" /> - <!-- Allows applications to act as network scorers. @hide @SystemApi--> + <!-- @SystemApi Allows applications to read the local WiFi and Bluetooth MAC address. + @hide --> <permission android:name="android.permission.LOCAL_MAC_ADDRESS" android:protectionLevel="signature|privileged" /> + <!-- @SystemApi Allows access to MAC addresses of WiFi and Bluetooth peer devices. + @hide --> + <permission android:name="android.permission.PEERS_MAC_ADDRESS" + android:protectionLevel="signature" /> + <!-- Allows the Nfc stack to dispatch Nfc messages to applications. Applications can use this permission to ensure incoming Nfc messages are from the Nfc stack and not simulated by another application. diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index ae948abf7e0f..f784ce543199 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Vingerafdrukikoon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lees sinkroniseer-instellings"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Laat die program toe om die sinkroniseringinstellings van \'n rekening te lees. Byvoorbeeld, dit kan bepaal of die People-program met \'n rekening gesinkroniseer is."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"wissel tussen sinkronisasie aan en af"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel bygevoeg"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Sel <xliff:g id="CELL_INDEX">%1$s</xliff:g> is bygevoeg"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patroon klaar"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Patroonarea."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Legstuk %2$d van %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Voeg legstuk by."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leeg"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 00c3ee5c4cb3..49fe30ddff69 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ጣት <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"የጣት አሻራ አዶ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"የሥምሪያ ቅንብሮች አንብብ"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"መተግበሪያው የአንድ መለያ የማመሳሰል ቅንብሮችን እንዲያነብ ይፈቅድለታል። ለምሳሌ ይህ የሰዎች መተግበሪያ ከመለያ ጋር መመሳሰሉን አለመመሳሰሉን ሊወስን ይችላል።"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ማመሳሰያ በማብራትና በማጥፋት መካከል ቀያይር"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ሕዋስ ታክሏል"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"ሕዋስ <xliff:g id="CELL_INDEX">%1$s</xliff:g> ታክሏል"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ንድፍ ተጠናቋል"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"የስርዓተ-ጥለት አካባቢ።"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s። ምግብር %2$d ከ%3$d።"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ንዑስ ፕሮግራም አክል"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ባዶ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index a6d81fc35090..169a2296508c 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -438,6 +438,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"الإصبع <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"رمز بصمة الإصبع"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"قراءة إعدادات المزامنة"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"للسماح للتطبيق بقراءة الإعدادات المتزامنة لحساب ما. على سبيل المثال، يمكن أن يؤدي هذا إلى تحديد ما إذا تمت مزامنة تطبيق \"الأشخاص\" مع حساب ما."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"التبديل بين تشغيل المزامنة وإيقافها"</string> @@ -716,6 +717,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"تمت إضافة الخلية"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"تمت إضافة الخلية <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"اكتمل النمط"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"منطقة النقش."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. الأداة %2$d من %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"إضافة أداة."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"فارغة"</string> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index fa6ea9f14b37..275d4b9450ff 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Barmaq <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Barmaq izi ikonası"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx ayarlarını oxu"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tətbiqə hesablar üçün sinxronizasiya nizamlarını oxuma icazəsi verir. Məsələn, bu Şəxslər tətbiqinin sinxronizə olunub-olunmadığını təyin edə bilər."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinxronizasiyaya davam edir və onu söndürür"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Xana əlavə edildi"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Xana <xliff:g id="CELL_INDEX">%1$s</xliff:g> əlavə edildi"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Model tamamlandı"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Model sahəsi."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget əlavə edin."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Boş"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 199c13c25760..455f4cf475a1 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Пръст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона за отпечатък"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"четене на настройките за синхронизиране"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Разрешава на приложението да чете настройките за синхронизиране на профил. Например това може да определи дали приложението Хора е синхронизирано с даден профил."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"включване и изключване на синхронизирането"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Клетката е добавена"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Добавихте точка <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Фигурата е завършена"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Област на фигурата."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Приспособление %2$d от %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Добавяне на приспособление."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Празно"</string> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index f249fe98cd5f..c5e2275b14fe 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"আঙ্গুল <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"আঙ্গুলের ছাপ আইকন"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"সিঙ্ক সেটিংস পড়ে"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"অ্যাপ্লিকেশানটিকে একটি অ্যাকাউন্টের জন্য সিঙ্ক সেটিংস পড়ার অনুমতি দেয়৷ উদাহরণস্বরূপ, \'পিপল\' অ্যাপ্লিকেশানটি কোনো অ্যাকাউন্টের সাথে সিঙ্ক করা আছে কিনা তা নির্ধারণ করতে পারে৷"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"সমন্বয় চালু এবং বন্ধ করা টগল করুন"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"কক্ষ যোগ করা হযেছে"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> কক্ষ যোগ করা হয়েছে"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"প্যাটার্ন সম্পন্ন হয়েছে"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"প্যাটার্ন এলাকা৷"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s৷ %3$d এর %2$d উইজেট৷"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"উইজেট যোগ করুন"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"খালি"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 789b13cf189a..82d255c9831e 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dit <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona d\'empremta digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"llegir la configuració de sincronització"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Persones estigui sincronitzada amb un compte."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar o desactivar la sincronització"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"S\'ha afegit una cel·la"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"S\'ha afegit la cel·la <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patró completat"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Àrea de patró"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Afegeix un widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Buit"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 9952cdb16193..44b813f9e998 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona otisku prstů"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čtení nastavení synchronizace"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Umožňuje aplikaci číst nastavení synchronizace v účtu. Může například určit, zda je s účtem synchronizována aplikace Lidé."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"vypnutí nebo zapnutí synchronizace"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Buňka přidána"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Byla přidána buňka <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Bezpečnostní gesto dokončeno"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Oblast pro zadání bezpečnostního gesta."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d z %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Přidat widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prázdné"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index b5a01ed366c9..28d699fcd327 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Fingeraftryk <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon for fingeraftryk"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"læse indstillinger for synkronisering"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tillader, at appen kan læse synkroniseringsindstillingerne for en konto. Denne tilladelse kan f.eks. fastslå, om appen Personer er synkroniseret med en konto."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"slå synkronisering til og fra"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celle er tilføjet"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Celle <xliff:g id="CELL_INDEX">%1$s</xliff:g> blev tilføjet"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Mønster er fuldført"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Mønsterområde."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d af %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tilføj widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 9e191fe961a6..e460a5d80536 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerabdruck-Symbol"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Synchronisierungseinstellungen lesen"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ermöglicht der App, die Synchronisierungseinstellungen eines Kontos zu lesen. Beispielsweise kann damit festgestellt werden, ob Kontakte mit einem Konto synchronisiert werden."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Synchronisierung aktivieren oder deaktivieren"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Zelle hinzugefügt"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Punkt <xliff:g id="CELL_INDEX">%1$s</xliff:g> hinzugefügt"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Muster abgeschlossen"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Bereich für Muster"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d von %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget hinzufügen"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leer"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 89c758d3e8ad..748b22f3cf1b 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Δάχτυλο <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ανάγνωση ρυθμίσεων συγχρονισμού"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Επιτρέπει στην εφαρμογή την ανάγνωση των ρυθμίσεων συγχρονισμού για έναν λογαριασμό. Για παράδειγμα, αυτό μπορεί να καθορίσει εάν η εφαρμογή \"Άτομα\" είναι συγχρονισμένη με έναν λογαριασμό."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"εναλλαγή ενεργοποίησης και απενεργοποίησης συγχρονισμού"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Προστέθηκε κελί"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Προστέθηκε το κελί <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Το μοτίβο ολοκληρώθηκε"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Περιοχή μοτίβου."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Γραφικό στοιχείο %2$d από %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Προσθήκη γραφικού στοιχείου"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Κενή"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 5e551a97ed8a..8ab48590a05a 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cell added"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cell <xliff:g id="CELL_INDEX">%1$s</xliff:g> added"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pattern completed"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Pattern area."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Empty"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 5e551a97ed8a..8ab48590a05a 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cell added"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cell <xliff:g id="CELL_INDEX">%1$s</xliff:g> added"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pattern completed"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Pattern area."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Empty"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 5e551a97ed8a..8ab48590a05a 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cell added"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cell <xliff:g id="CELL_INDEX">%1$s</xliff:g> added"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pattern completed"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Pattern area."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Empty"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 15cfa6e1ac79..647b3012060d 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícono de huella digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Este permiso permite que la aplicación consulte la configuración de sincronización de una cuenta. Esto permite, por ejemplo, determinar si la aplicación Personas está sincronizada con una cuenta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar y desactivar la sincronización"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Se agregó una celda."</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Se agregó la celda <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Se completó el patrón"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Área de patrón"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Agregar widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vacío"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 0533317c50be..49d296c650e2 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icono de huella digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que la aplicación consulte la configuración de sincronización de una cuenta. La aplicación puede utilizar este permiso, por ejemplo, para determinar si la aplicación Contactos está sincronizada con una cuenta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar y desactivar la sincronización"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Se ha añadido una celda."</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Se ha añadido la celda <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patrón completado"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Área de patrón"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Añadir widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vacío"</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index faeb76378d3e..2822119be560 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Sõrm <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Sõrmejälje ikoon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"loe sünkroonimisseadeid"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Võimaldab rakendusel lugeda konto sünkroonimisseadeid. Näiteks võib see määrata, kas rakendus Inimesed on kontoga sünkroonitud."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"lülitage sünkroonimine sisse ja välja"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Lahter on lisatud"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Lisati lahter <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Muster on valmis"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Mustri ala."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidin %2$d/%3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidina lisamine."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tühi"</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 93f7523fbefd..4d8e62123a36 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> hatza"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Hatz-markaren ikonoa"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Irakurri sinkronizazio-ezarpenak"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Kontu baten sinkronizazio-ezarpenak irakurtzeko baimena ematen die aplikazioei. Adibidez, Jendea aplikazioa konturen batekin sinkronizatuta dagoen zehatz dezake."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinkronizazioa aktibatzea eta desaktibatzea"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Gelaxka gehitu da"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Gehitu da <xliff:g id="CELL_INDEX">%1$s</xliff:g> puntua"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Eredua osatu da"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Eredua marrazteko eremua."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d/%3$d widgeta."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Gehitu widgeta."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Hutsik"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 48ab9bfa178a..d9e2656d0eba 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"انگشت <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"نماد اثر انگشت"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"خواندن تنظیمات همگامسازی"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"به برنامه اجازه میدهد تنظیمات را برای یک حساب بخواند. بهعنوان مثال، این ویژگی میتواند تعیین کند آیا حساب «افراد» شما با یک حساب همگامسازی شده است."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"تغییر وضعیت همگامسازی بین فعال و غیرفعال"</string> @@ -464,8 +465,8 @@ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"به برنامه امکان میدهد تجربه کاربر در حال تماس را ارائه دهد."</string> <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"خواندن سابقه استفاده از شبکه"</string> <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"به برنامه اجازه میدهد تا کاربرد شبکه را در طول زمان برای برنامهها و شبکههای خاص بخواند."</string> - <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"مدیریت خط مشی شبکه"</string> - <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"به برنامه اجازه میدهد تا خط مشیهای شبکه را مدیریت کند و قوانین خاص برنامه را تعیین کند."</string> + <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"مدیریت خطمشی شبکه"</string> + <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"به برنامه اجازه میدهد تا خطمشیهای شبکه را مدیریت کند و قوانین خاص برنامه را تعیین کند."</string> <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"اصلاح محاسبه استفاده از شبکه"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"به برنامه اجازه میدهد تا نحوه محاسبه کاربرد شبکه در برنامه را تغییر دهد. برای استفاده برنامههای عادی نیست."</string> <string name="permlab_accessNotifications" msgid="7673416487873432268">"اعلانهای دسترسی"</string> @@ -667,7 +668,7 @@ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"سیم کارت را وارد کنید."</string> <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"سیم کارت موجود نیست یا قابل خواندن نیست. یک سیم کارت وارد کنید."</string> <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"سیم کارت غیرقابل استفاده است."</string> - <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"سیم کارت شما به طور دائم غیر فعال شده است. \nبرای داشتن سیم کارت دیگر با ارائهدهنده سرویس بیسیم خود تماس بگیرید."</string> + <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"سیم کارت شما بهطور دائم غیر فعال شده است. \nبرای داشتن سیم کارت دیگر با ارائهدهنده سرویس بیسیم خود تماس بگیرید."</string> <string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"آهنگ قبلی"</string> <string name="lockscreen_transport_next_description" msgid="573285210424377338">"آهنگ بعدی"</string> <string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"توقف موقت"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"سلول اضافه شد"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"سلول <xliff:g id="CELL_INDEX">%1$s</xliff:g> اضافه شد"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"الگو تکمیل شد"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ناحیه الگو."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ابزارک %2$d از %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ابزارک اضافه کنید."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"خالی"</string> @@ -911,8 +913,8 @@ <string name="screen_compat_mode_scale" msgid="3202955667675944499">"مقیاس"</string> <string name="screen_compat_mode_show" msgid="4013878876486655892">"همیشه نشان داده شود"</string> <string name="screen_compat_mode_hint" msgid="1064524084543304459">"در تنظیمات سیستم >برنامهها > مورد دانلود شده آن را دوباره فعال کنید."</string> - <string name="smv_application" msgid="3307209192155442829">"برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> (پردازش <xliff:g id="PROCESS">%2$s</xliff:g>) خط مشی StrictMode اجرایی خود را نقض کرده است."</string> - <string name="smv_process" msgid="5120397012047462446">"فرآیند <xliff:g id="PROCESS">%1$s</xliff:g> خط مشی StrictMode اجرای خودکار خود را نقض کرده است."</string> + <string name="smv_application" msgid="3307209192155442829">"برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> (پردازش <xliff:g id="PROCESS">%2$s</xliff:g>) خطمشی StrictMode اجرایی خود را نقض کرده است."</string> + <string name="smv_process" msgid="5120397012047462446">"فرآیند <xliff:g id="PROCESS">%1$s</xliff:g> خطمشی StrictMode اجرای خودکار خود را نقض کرده است."</string> <string name="android_upgrading_title" msgid="1584192285441405746">"Android در حال ارتقا است..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android در حال راهاندازی است..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"بهینهسازی فضای ذخیرهسازی."</string> @@ -1060,7 +1062,7 @@ <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> خراب است. برای اصلاح لمس کنید."</string> <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> پشتیبانی نشده"</string> <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"این دستگاه از این <xliff:g id="NAME">%s</xliff:g> پشتیبانی نمیکند. برای نصب آن در یک قالب پشتیبانی شده، لمس کنید."</string> - <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> به طور غیرمنتظره جدا شد"</string> + <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> بهطور غیرمنتظره جدا شد"</string> <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"قبل از جدا کردن، برای جلوگیری از از دست رفتن اطلاعات، ارتباط <xliff:g id="NAME">%s</xliff:g> را قطع کنید."</string> <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> جدا شده است"</string> <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> جدا شد؛ رسانه جدیدی وارد کنید"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index b4963629e41d..6e6c3dd46cc1 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Sormi <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Sormenjälkikuvake"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lue synkronointiasetuksia"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Antaa sovelluksen lukea tilien synkronointiasetuksia. Sovellus voi esimerkiksi määrittää, onko Henkilöt-sovellus synkronoitu tilin kanssa."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ota synkronointi käyttöön tai poista se käytöstä"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Solu lisätty"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Solu <xliff:g id="CELL_INDEX">%1$s</xliff:g> lisätty"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Kuvio valmis"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Kuvioalue."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d/%3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Lisää widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tyhjä"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index b74b055fa38a..b75ea48391b8 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icône d\'empreinte digitale"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activer ou désactiver la synchronisation"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cellule ajoutée."</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cellule <xliff:g id="CELL_INDEX">%1$s</xliff:g> ajoutée"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Schéma terminé."</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Zone du schéma"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vide"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 6ed07a9652eb..085e23c1b88e 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icône d\'empreinte digitale"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activer/désactiver la synchronisation"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cellule ajoutée."</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Le point <xliff:g id="CELL_INDEX">%1$s</xliff:g> a bien été ajouté."</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Schéma terminé."</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Zone du schéma"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vide"</string> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index ee2a0359f20b..4838fee6d827 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona de impresión dixital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler a configuración de sincronización"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite á aplicación ler a configuración de sincronización dunha conta. Por exemplo, esta acción pode determinar se a aplicación Contactos se sincroniza cunha conta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar e desactivar a sincronización"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Engadiuse un móbil"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Engadiuse a cela <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Completouse o padrón"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Zona do padrón"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Engadir widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Baleiro"</string> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index f5f51269baab..1e5d07650cb5 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"આંગળી <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ફિંગરપ્રિન્ટ આયકન"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"સમન્વયન સેટિંગ્સ વાંચો"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"એપ્લિકેશનને એકાઉન્ટ માટે સમન્વયન સેટિંગ્સને વાંચવાની મંજૂરી આપે છે. ઉદાહરણ તરીકે, આ એકાઉન્ટ સાથે લોકો એપ્લિકેશન સમન્વયિત થઈ છે કે કેમ તે નિર્ધારિત કરી શકે છે."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"સમન્વયન ચાલુ અને બંધ ટોગલ કરો"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"કોષ ઉમેર્યો"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> કોષ ઉમેર્યો"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"પેટર્ન પૂર્ણ કરી"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"પેટર્ન ક્ષેત્ર."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d માંથી %2$d વિજેટ."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"વિજેટ ઉમેરો."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ખાલી"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 38b7456a136a..522c2a0f8783 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"अंगुली <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फ़िंगरप्रिंट आइकन"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"समन्वयन सेटिंग पढ़ें"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ऐप्स को किसी खाते की समन्वयन सेटिंग पढ़ने देता है. उदाहरण के लिए, इससे यह निर्धारित किया जा सकता है कि लोग ऐप्स किसी खाते के साथ समन्वयित है या नहीं."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"समन्वयन बंद या चालू टॉगल करें"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"कक्ष जोड़ा गया"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"सेल <xliff:g id="CELL_INDEX">%1$s</xliff:g> जोड़ा गया"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"आकार पूरा किया गया"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"आकार क्षेत्र."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d विजेट में से %2$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट जोड़ें"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"खाली"</string> @@ -875,7 +877,7 @@ <string name="no" msgid="5141531044935541497">"अभी नहीं"</string> <string name="dialog_alert_title" msgid="2049658708609043103">"ध्यान दें"</string> <string name="loading" msgid="7933681260296021180">"लोड हो रहे हैं..."</string> - <string name="capital_on" msgid="1544682755514494298">"चालू"</string> + <string name="capital_on" msgid="1544682755514494298">"ऑन"</string> <string name="capital_off" msgid="6815870386972805832">"बंद"</string> <string name="whichApplication" msgid="4533185947064773386">"इसका उपयोग करके क्रिया पूर्ण करें"</string> <string name="whichApplicationNamed" msgid="8260158865936942783">"%1$s का उपयोग करके कार्रवाई पूर्ण करें"</string> @@ -1043,7 +1045,7 @@ <string name="usb_notification_message" msgid="7347368030849048437">"और विकल्पों के लिए स्पर्श करें."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग कनेक्ट किया गया"</string> <string name="adb_active_notification_message" msgid="1016654627626476142">"USB डीबग करना अक्षम करने के लिए स्पर्श करें."</string> - <string name="select_input_method" msgid="8547250819326693584">"कीबोर्ड बदल सकता है"</string> + <string name="select_input_method" msgid="8547250819326693584">"कीबोर्ड बदलें"</string> <string name="configure_input_methods" msgid="4769971288371946846">"कीबोर्ड चुनें"</string> <string name="show_ime" msgid="9157568568695230830">"इनपुट विधि दिखाएं"</string> <string name="hardware" msgid="7517821086888990278">"हार्डवेयर"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 5277ec27ad1a..69b8577f9375 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -435,6 +435,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona otiska prsta"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čitanje postavki sinkronizacije"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Aplikaciji omogućuje čitanje postavki sinkronizacije za račun. Time se, primjerice, može utvrditi je li aplikacija Osobe sinkronizirana s računom."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"uključivanje/isključivanje sinkronizacije"</string> @@ -713,6 +714,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Dodan je mobitel"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Dodana je ćelija <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Uzorak je dovršen"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Područje uzorka."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d od %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodavanje widgeta."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prazno"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 2388a8c719e3..1b45d1ce019c 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. ujj"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ujjlenyomat ikon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"szinkronizálási beállítások olvasása"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lehetővé teszi az alkalmazás számára egy fiók szinkronizálási beállításainak beolvasását. Például ellenőrizheti, hogy a Személyek alkalmazás szinkronizálva van-e egy fiókkal."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"szinkronizálás be-és kikapcsolása"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cella hozzáadva"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g>. pont hozzáadva"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Minta befejezve"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Mintaterület"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Modul %3$d/%2$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Modul hozzáadása."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Üres"</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 725b0080909a..92842b4c303d 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Մատնահետք <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Մատնահետքի պատկերակ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամեցման կարգավորումները"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Թույլ է տալիս հավելվածին կարդալ համաժամեցման կարգավորումները հաշվի համար: Օրինակ` այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամեցված է հաշվի հետ:"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"համաժամեցումը փոխարկել միացվածի և անջատվածի"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ավելացվել է վանդակ"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> դասիչով բջիջը ավելացված է"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Սխեմայի հավաքումն ավարտված է"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Սխեմայի տարածք:"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Վիջեթ %2$d of %3$d:"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ավելացնել վիջեթ:"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Դատարկ"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 8a4e58013e3e..02299b011bc6 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon sidik jari"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"baca setelan sinkron"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Memungkinkan aplikasi membaca setelan sinkronisasi untuk sebuah akun. Misalnya, izin ini dapat menentukan apakah aplikasi Orang disinkronkan dengan sebuah akun."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"nyalakan dan matikan sinkronisasi"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel ditambahkan"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Sel <xliff:g id="CELL_INDEX">%1$s</xliff:g> ditambahkan"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pola selesai"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Area pola."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambahkan widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Kosong"</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index e17805f9b5e9..e57400a2b765 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Fingur <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingrafaratákn"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lesa samstillingar"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Leyfir forriti að lesa kosti samstillingar fyrir reikning. Þetta er til dæmis hægt að nota til að komast að því hvort forritið Fólk er samstillt við reikning."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"kveikja og slökkva á samstillingu"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Hólfi bætt við"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Hólfi <xliff:g id="CELL_INDEX">%1$s</xliff:g> bætt við"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Mynstur teiknað"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Svæði mynsturs."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Græja %2$d af %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Bæta græju við."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Autt"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 216a68edc1d0..5722c6aa7122 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dito <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona dell\'impronta digitale"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lettura impostazioni di sincronizz."</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Consente all\'applicazione di leggere le impostazioni di sincronizzazione per un account. Ad esempio, questa autorizzazione può determinare se l\'applicazione Persone è sincronizzata con un account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"attivazione e disattivazione della sincronizzazione"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cella aggiunta"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"È stata aggiunta la cella <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Sequenza completata"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Area sequenza."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d di %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Aggiungi widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vuoto"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index fa7388b8b562..7f67caf6c2b7 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"אצבע <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"סמל טביעת אצבע"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"קרא את הגדרות הסינכרון"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"מאפשר לאפליקציה לקרוא את הגדרות הסנכרון של חשבון. לדוגמה, ניתן לגלות כך האם האפליקציה \'אנשים\' מסונכרן עם חשבון כלשהו."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"הפעלת וכיבוי סנכרון"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"התא נוסף"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"תא <xliff:g id="CELL_INDEX">%1$s</xliff:g> נוסף"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"התבנית הושלמה"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"אזור ציור קו."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d מתוך %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"הוסף Widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ריק"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 56b4662c1e55..2ce3bad4a3e4 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"指紋<xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋アイコン"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"同期設定の読み取り"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"アカウントの同期設定の読み取りをアプリに許可します。たとえば、連絡帳アプリがアカウントと同期しているかどうかをアプリから特定できるようになります。"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"同期のON/OFFの切り替え"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"セルを追加しました"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"セル<xliff:g id="CELL_INDEX">%1$s</xliff:g>を追加しました"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"パターンの描画が完了しました"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"パターンエリアです。"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。ウィジェット%2$d/%3$d。"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ウィジェットを追加します。"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"なし"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 0d94ad5b83a5..f77167903ece 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"თითი <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"თითის ანაბეჭდის ხატულა"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"სინქრონიზაციის პარამეტრების წაკითხვა"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"აპს შეეძლება, წაიკითხოს ანგარიშის სინქრონიზაციის პარამეტრები. მაგალითად, მას შეეძლება განსაზღვროს, არის თუ არა People აპი სინქრონიზებული ანგარიშთან."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"სინქრონიზაციის ჩართვა და გამორთვა"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"უჯრედი დაემატა."</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"უჯრედი <xliff:g id="CELL_INDEX">%1$s</xliff:g> დამატებულია"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ნიმუშის შექმნა დასრულებულია"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ნიმუშების სივრცე."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ვიჯეტი %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ვიჯეტის დამატება"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ცარიელი"</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index d121a8d060b9..7165254bd81f 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> саусағы"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Саусақ ізі белгішесі"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"синх параметрлерін оқу"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Қолданбаға есептік жазба синхрондау параметрлерін оқу мүмкіндігін береді. Мысалы, бұл арқылы People қолданбасының есептік жазбамен сихрондалғаны анықталуы мүмкін."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"синх қосу және өшіру арасында ауысу"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Тор қосылды"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> ұяшығы қосылды"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Кескін аяқталды"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Кескін арқылы ашу аймағы."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d виджет, барлығы %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет қосу."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Бос"</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 96c22fb0c79d..b74484ee903a 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ម្រាមដៃ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"រូបតំណាងស្នាមម្រាមដៃ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"អានការកំណត់ធ្វើសមកាលកម្ម"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ឲ្យកម្មវិធីអានការកំណត់ធ្វើសមកាលកម្មសម្រាប់គណនី។ ឧទាហរណ៍ វាអាចកំណត់ថាតើកម្មវិធីត្រូវបានបើកជាមួយគណនីដែរឬទេ។"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"បិទ/បើកការធ្វើសមកាលកម្ម"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"បានបន្ថែមក្រឡា"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"បានបន្ថែមក្រឡាទី <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"បានបញ្ចប់លំនាំ"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ផ្ទៃលំនាំ។"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ធាតុក្រាហ្វិក %2$d នៃ %3$d ។"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"បន្ថែមធាតុក្រាហ្វិក។"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ទទេ"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index e22532408075..e4807606cffe 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ಫಿಂಗರ್ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ರೀಡ್ ಮಾಡು"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ಒಂದು ಖಾತೆಯ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯೊಂದಿಗೆ ಜನರ ಅಪ್ಲಿಕೇಶನ್ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಇದು ನಿರ್ಧರಿಸಬಹುದು."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ಸಿಂಕ್ ಆನ್ ಮತ್ತು ಸಿಂಕ್ ಆಫ್ ಟಾಗಲ್ ಮಾಡಿ"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ಸೆಲ್ ಸೇರಿಸಲಾಗಿದೆ"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> ಸೆಲ್ ಸೇರಿಸಲಾಗಿದೆ"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ಪ್ಯಾಟರ್ನ್ ಪೂರ್ಣಗೊಂಡಿದೆ"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ಪ್ಯಾಟರ್ನ್ ಪ್ರದೇಶ."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s.%3$d ರಲ್ಲಿ %2$d ವಿಜೆಟ್."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ವಿಜೆಟ್ ಸೇರಿಸು."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ಖಾಲಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index bc0dd4781ca8..360d7231cb9b 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>번째 손가락"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"지문 아이콘"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"동기화 설정 읽기"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"앱이 계정의 동기화 설정을 읽을 수 있도록 허용합니다. 예를 들어, 계정에서 주소록 앱을 동기화할지 여부를 확인할 수 있습니다."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"동기화 사용 및 사용 중지 전환"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"셀 추가됨"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"셀 <xliff:g id="CELL_INDEX">%1$s</xliff:g> 추가됨"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"패턴 완료"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"패턴을 그리는 부분입니다."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d의 위젯 %2$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"위젯 추가"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"비어 있음"</string> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 05c401ccd640..91de30a75c6e 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -562,6 +562,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> манжасы"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Манжа изинин сөлөкөтү"</string> <!-- no translation found for permlab_readSyncSettings (6201810008230503052) --> <skip /> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Колдонмого эсеп менен синхрондошуу тууралоолорун окуганга уруксат берет. Мисалы, Кишилер колдонмосу эсеп менен синхрондошкондугун аныктай алат."</string> @@ -936,6 +937,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Уяча кошулду"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> уячасы кошулду"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Үлгү аягына чыкты"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Үлгү аймагы."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d ичинен %2$d виджет."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет кошуу."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Бош"</string> diff --git a/core/res/res/values-land/dimens_material.xml b/core/res/res/values-land/dimens_material.xml index 202f4a4b73b6..660210af5367 100644 --- a/core/res/res/values-land/dimens_material.xml +++ b/core/res/res/values-land/dimens_material.xml @@ -17,8 +17,6 @@ <!-- Default height of an action bar. --> <dimen name="action_bar_default_height_material">48dp</dimen> - <!-- Default padding of an action bar. --> - <dimen name="action_bar_default_padding_material">0dp</dimen> <!-- Default text size for action bar title.--> <dimen name="text_size_title_material_toolbar">14dp</dimen> <!-- Default text size for action bar subtitle.--> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index 6bfcafff1414..dada9ce75c6e 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ນີ້ວມື <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ໄອຄອນລາຍນິ້ວມື"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ອ່ານການຕັ້ງຄ່າຊິ້ງຂໍ້ມູນ"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນຂອງບັນຊີໄດ້. ຕົວຢ່າງເຊັ່ນ: ມັນຈະສາມາດກວດສອບໄດ້ແອັບຯ People ຖືກຊິ້ງຂໍ້ມູນກັບບັນຊີໃດນຶ່ງແລ້ວຫຼືຍັງ."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ສະລັບການເປີດ ແລະປິດການຊິ້ງຂໍ້ມູນ"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ຕາລາງຖືກເພີ່ມແລ້ວ"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"ເພີ່ມ <xliff:g id="CELL_INDEX">%1$s</xliff:g> ເຊລເຂົ້າແລ້ວ"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ຮູບແບບສຳເລັດແລ້ວ"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ພື້ນທີ່ຮູບແບບ."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ວິດເຈັດ %2$d ຈາກທັງໝົດ %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ເພີ່ມວິດເຈັດ"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ຫວ່າງເປົ່າ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 4b7309fcd5a3..bdf0f3fa784e 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> pirštas"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Kontrolinio kodo piktograma"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"skaityti sinchronizavimo nustatymus"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Leidžiama programai skaityti ir sinchronizuoti paskyros nustatymus. Pvz., taip gali būti nustatoma, ar su paskyra sinchronizuota Žmonių programa."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"įjungti arba išjungti sinchronizavimą"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Pridėtas langelis"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Pridėtas <xliff:g id="CELL_INDEX">%1$s</xliff:g> taškas"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Šablonas užbaigtas"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Atrakinimo pagal piešinį sritis."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d valdiklis iš %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pridėti valdiklį."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tuščia"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index c017f31323e8..4939eb31593b 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -435,6 +435,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. pirksts"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Pirksta nospieduma ikona"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lasīt sinhronizācijas iestatījumus"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ļauj lietotnei lasīt konta sinhronizācijas iestatījumus. Piemēram, šādi var noteikt, vai lietotne Personas ir sinhronizēta ar kontu."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ieslēgt un izslēgt sinhronizāciju"</string> @@ -713,6 +714,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Šūna pievienota"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Pievienota <xliff:g id="CELL_INDEX">%1$s</xliff:g>. šūna"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Kombinācija pabeigta"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Kombinācijas ievades apgabals."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d. logrīks no %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pievienot logrīku."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tukšs"</string> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index 447831001591..19d03a8df2f3 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона за отпечатоци"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"прочитај синхронизирани подесувања"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Овозможува апликацијата да ги чита подесувањата за синхронизирање на сметка. На пример, така може да се утврди дали апликацијата „Луѓе“ е синхронизирана со сметка."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"вклучи и исклучи синхронизација"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Додадена е ќелија"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Додадена е ќелија <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Шемата е целосна"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Област за шема."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виџет %2$d од %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додај виџет."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Празно"</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index a4c23ee70c77..edb470bc26d9 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"കൈവിരൽ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"വിരലടയാള ഐക്കൺ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യുക"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ഒരു അക്കൗണ്ടിനായി സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉദാഹരണത്തിന്, ആളുകൾ അപ്ലിക്കേഷൻ ഒരു അക്കൗണ്ടിൽ സമന്വയിപ്പിച്ചിട്ടുണ്ടോയെന്നത് നിർണ്ണയിക്കാൻ ഇതിനാകും."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"സമന്വയം ഓണാക്കുക, ഓഫാക്കുക ടോഗിൾചെയ്യുക"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"സെൽ ചേർത്തു"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"കളം <xliff:g id="CELL_INDEX">%1$s</xliff:g> ചേർത്തു"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"പാറ്റേൺ പൂർത്തിയാക്കി"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"പാറ്റേൺ ഏരിയ."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. വിജറ്റ് %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"വിജറ്റ് ചേർക്കുക."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ശൂന്യം"</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index df9f2805233d..ff4cfb2fa176 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Хурууны хээ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Хурууны хээний дүрс"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"синк тохиргоог унших"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Апп нь акаунтын синк тохиргоог унших боломжтой. Жишээ нь энэ нь Хүмүүс апп акаунттай синк хийгдсэн эсэхийг тодорхойлох боломжтой."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"синкийг унтрааж асаах тохиргоо"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Нүд нэмэгдсэн"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> нүд нэмсэн"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Хээ дуусав"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Хээний хэсэг."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d. -н %2$d виджет"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет нэмэх."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Хоосон"</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index 484de1d10af5..99262b0083fe 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> बोट"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फिंगरप्रिंट चिन्ह"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"संकालन सेटिंग्ज वाचा"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"खात्याच्या संकालन सेटिंग्ज वाचण्यासाठी अॅप ला अनुमती देते. उदाहरणार्थ, हे खात्यासह लोकांचा अॅप संकालित केला आहे किंवा नाही हे निर्धारित करू शकते."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"संकालन चालू आणि बंद करा टॉगल करा"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"सेल जोडला"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> सेल जोडला"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"नमुना पूर्ण केला"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"नमुना क्षेत्र."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d पैकी %2$d विजेट."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट जोडा."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"रिक्त"</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 1ac30363ebc5..01f5c468dbc7 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon cap jari"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"membaca tetapan penyegerakan"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Membenarkan apl membaca tetapan segerak untuk akaun. Sebagai contoh, ini boleh menentukan sama ada apl Orang disegerakkan dengan akaun."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"togol segerak hidup dan mati"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel ditambahkan"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Sel <xliff:g id="CELL_INDEX">%1$s</xliff:g> ditambahkan"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Corak siap"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Kawasan corak."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambah widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Kosong"</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index b304def34224..690a0ef59b05 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"လက်ချောင်း <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"လက်ဗွေ အိုင်ကွန်"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ထပ်တူပြုအဆင်အပြင်အားဖတ်ခြင်း"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"အပလီကေးရှင်းအား အကောင့်တစ်ခုအတွက် ထပ်တူညီအောင် လုပ်ဆောင်မှု ဆက်တင်အား ကြည့်ခွင့် ပြုပါ။ ဥပမာ People app က အကောင့်တစ်ခုနဲ့ ထပ်တူညီအောင် လုပ်ရန် ဆက်သွယ်ထားမှု ရှိမရှိ သိရှိနိုင်ခြင်း"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ထပ်တူညီအောင် လုပ်ခြင်းအား ပြုနိုင်၊ မပြုနိုင် အပြောင်းအလဲလုပ်ခြင်း"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"အကွက်တိုးခြင်း"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"ဆဲလ် <xliff:g id="CELL_INDEX">%1$s</xliff:g> ပေါင်းထည့်ပြီးပါပြီ"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ပုံစံပြီးဆုံးခြင်း"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ပုံစံနေရာ"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d ရဲ့ဝဒ်ဂျက် %2$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ဝဒ်ဂျက်ထည့်ရန်"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"အလွတ်"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 649e68084768..5df9a82bbea0 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon for fingeravtrykk"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lese synkroniseringsinnstillinger"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lar appen lese synkroniseringsinnstillingene for en konto. For eksempel kan den finne ut om Personer-appen er synkronisert med en konto."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"slå synkronisering av og på"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celle er lagt til"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Celle <xliff:g id="CELL_INDEX">%1$s</xliff:g> er lagt til"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Mønsteret er fullført"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Mønsterområde."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Modul %2$d av %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Legg til modul."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string> @@ -746,7 +748,7 @@ <string name="factorytest_not_system" msgid="4435201656767276723">"The FACTORY_TEST action is only supported for packages installed in /system/app."</string> <string name="factorytest_no_action" msgid="872991874799998561">"No package was found that provides the FACTORY_TEST action."</string> <string name="factorytest_reboot" msgid="6320168203050791643">"Omstart"</string> - <string name="js_dialog_title" msgid="1987483977834603872">"Siden på «<xliff:g id="TITLE">%s</xliff:g>» sier:"</string> + <string name="js_dialog_title" msgid="1987483977834603872">"Varsel fra «<xliff:g id="TITLE">%s</xliff:g>»:"</string> <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string> <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Bekreft navigasjon"</string> <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Forlat denne siden"</string> @@ -950,7 +952,7 @@ <string name="ringtone_default" msgid="3789758980357696936">"Standard ringetone"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standard ringetone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> <string name="ringtone_silent" msgid="7937634392408977062">"Ingen"</string> - <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringetoner"</string> + <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringelyder"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Ukjent ringetone"</string> <plurals name="wifi_available" formatted="false" msgid="7900333017752027322"> <item quantity="other">Wi-Fi-nettverk er tilgjengelig</item> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 19b9ec601af7..3e8e5b66d151 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"औंला <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फिंगरप्रिन्ट आइकन"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"समीकरण सेटिङहरू पढ्नुहोस्"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"अनुप्रयोगलाई खाताको लागि सिङ्क सेटिङहरू पढ्न अनुमति दिन्छ। उदाहरणको लागि यसले व्यक्तिहरको अनुप्रयोग खातासँग सिङ्क भएको नभएको निर्धारण गर्न सक्दछ।"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"टगल सिङ्क खुला र बन्द"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"सेल थप गरियो"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"कक्ष <xliff:g id="CELL_INDEX">%1$s</xliff:g> थपियो"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ढाँचा पुरा भयो"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ढाँचा क्षेत्र।"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. विजेट %2$d of %3$d।"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट थप गर्नुहोस्।"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"खाली"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 485c1391ebdc..27dd5dd7ef7c 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Vingerafdruk-pictogram"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"synchronisatie-instellingen lezen"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Hiermee kan de app de synchronisatie-instellingen voor een account lezen. Dit kan bijvoorbeeld bepalen of de app Personen wordt gesynchroniseerd met een account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"synchronisatie in- en uitschakelen"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cel toegevoegd"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cel <xliff:g id="CELL_INDEX">%1$s</xliff:g> toegevoegd"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patroon voltooid"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Tekengebied voor patroon."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d van %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget toevoegen."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leeg"</string> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index 59dece740286..5a9d2c1db727 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ਉਂਗਲ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਆਈਕਨ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹੋ"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਲਈ ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਹ ਨਿਰਧਾਰਿਤ ਕਰ ਸਕਦਾ ਹੈ ਕਿ People ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਨਾਲ ਸਿੰਕ ਕੀਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਹੀਂ।"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ਸਿੰਕ ਟੌਗਲ ਚਾਲੂ ਅਤੇ ਬੰਦ"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ਸੈਲ ਜੋੜਿਆ ਗਿਆ"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"ਸੈਲ <xliff:g id="CELL_INDEX">%1$s</xliff:g> ਜੋੜਿਆ ਗਿਆ"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ਪੈਟਰਨ ਪੂਰਾ ਕੀਤਾ"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"ਪੈਟਰਨ ਖੇਤਰ।"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s। %3$d ਦਾ ਵਿਜੇਟ %2$d।"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ਵਿਜੇਟ ਜੋੜੋ।"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ਖਾਲੀ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 466e69d18fa2..488ee3072d4a 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Palec <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odcisku palca"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"czytanie ustawień synchronizacji"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Zezwala aplikacji na odczyt ustawień synchronizacji konta. Pozwala to na przykład określić, czy aplikacja Ludzie jest zsynchronizowana z kontem."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"włączanie i wyłączanie synchronizacji"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Dodano komórkę."</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Dodano komórkę <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Wzór ukończony"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Obszar wzoru."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widżet %2$d z %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodaj widżet."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Puste"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index ffbe8d6a599d..4972ce97e8f8 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar sincronização"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Célula adicionada"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Célula <xliff:g id="CELL_INDEX">%1$s</xliff:g> adicionada"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Padrão concluído"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Área do padrão."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adicionar widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vazio"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 659d31d6cc3b..ff41c14be627 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler definições de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que a aplicação leia as definições de sincronização de uma conta. Por exemplo, pode determinar se a aplicação Pessoas está sincronizada com uma conta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar a sincronização"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Célula adicionada"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Célula <xliff:g id="CELL_INDEX">%1$s</xliff:g> adicionada"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Sequência concluída"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Área da sequência."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adicionar widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vazio"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index ffbe8d6a599d..4972ce97e8f8 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar sincronização"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Célula adicionada"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Célula <xliff:g id="CELL_INDEX">%1$s</xliff:g> adicionada"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Padrão concluído"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Área do padrão."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adicionar widget"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vazio"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 7ea0e531e635..9eaf6d6400a1 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -181,10 +181,10 @@ <string name="power_dialog" product="tv" msgid="6153888706430556356">"Opțiuni TV"</string> <string name="power_dialog" product="default" msgid="1319919075463988638">"Opţiuni telefon"</string> <string name="silent_mode" msgid="7167703389802618663">"Mod Silenţios"</string> - <string name="turn_on_radio" msgid="3912793092339962371">"Activaţi funcţia wireless"</string> + <string name="turn_on_radio" msgid="3912793092339962371">"Activați funcţia wireless"</string> <string name="turn_off_radio" msgid="8198784949987062346">"Dezactivaţi funcţia wireless"</string> - <string name="screen_lock" msgid="799094655496098153">"Blocaţi ecranul"</string> - <string name="power_off" msgid="4266614107412865048">"Opriţi alimentarea"</string> + <string name="screen_lock" msgid="799094655496098153">"Blocați ecranul"</string> + <string name="power_off" msgid="4266614107412865048">"Opriți alimentarea"</string> <string name="silent_mode_silent" msgid="319298163018473078">"Sonerie dezactivată"</string> <string name="silent_mode_vibrate" msgid="7072043388581551395">"Vibrare sonerie"</string> <string name="silent_mode_ring" msgid="8592241816194074353">"Sonerie activată"</string> @@ -207,8 +207,8 @@ <string name="global_actions" product="tablet" msgid="408477140088053665">"Opţiuni tablet PC"</string> <string name="global_actions" product="tv" msgid="7240386462508182976">"Opțiuni TV"</string> <string name="global_actions" product="default" msgid="2406416831541615258">"Opţiuni telefon"</string> - <string name="global_action_lock" msgid="2844945191792119712">"Blocaţi ecranul"</string> - <string name="global_action_power_off" msgid="4471879440839879722">"Opriţi alimentarea"</string> + <string name="global_action_lock" msgid="2844945191792119712">"Blocați ecranul"</string> + <string name="global_action_power_off" msgid="4471879440839879722">"Opriți alimentarea"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Raport despre erori"</string> <string name="bugreport_title" msgid="2667494803742548533">"Executaţi un raport despre erori"</string> <string name="bugreport_message" msgid="398447048750350456">"Acest raport va colecta informaţii despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis."</string> @@ -228,21 +228,21 @@ <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Serviciu"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Persoane de contact"</string> - <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accesează persoanele de contact"</string> + <string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceseze persoanele de contact"</string> <string name="permgrouplab_location" msgid="7275582855722310164">"Locație"</string> - <string name="permgroupdesc_location" msgid="1346617465127855033">"accesează locația acestui dispozitiv"</string> + <string name="permgroupdesc_location" msgid="1346617465127855033">"acceseze locația acestui dispozitiv"</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="3889615280211184106">"accesează calendarul"</string> <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string> <string name="permgroupdesc_sms" msgid="4656988620100940350">"trimite și vede mesajele SMS"</string> <string name="permgrouplab_storage" msgid="1971118770546336966">"Stocare"</string> - <string name="permgroupdesc_storage" msgid="637758554581589203">"accesează fotografiile, conținutul media și fișierele de pe dispozitiv"</string> + <string name="permgroupdesc_storage" msgid="637758554581589203">"acceseze fotografiile, conținutul media și fișierele de pe dispozitiv"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Microfonul"</string> - <string name="permgroupdesc_microphone" msgid="4988812113943554584">"înregistrează conținut audio"</string> + <string name="permgroupdesc_microphone" msgid="4988812113943554584">"înregistreze conținut audio"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Camera foto"</string> - <string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografiază și înregistrează videoclipuri"</string> + <string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografieze și să înregistreze videoclipuri"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string> - <string name="permgroupdesc_phone" msgid="6234224354060641055">"inițiază și gestionează apeluri telefonice"</string> + <string name="permgroupdesc_phone" msgid="6234224354060641055">"inițieze și să gestioneze apeluri telefonice"</string> <string name="permgrouplab_sensors" msgid="416037179223226722">"Senzori corporali"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"accesează datele înregistrate de senzori despre semnele vitale"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperează conținutul ferestrei"</string> @@ -435,6 +435,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Degetul <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Pictograma amprentă"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"citire setări sincronizare"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite aplicației să citească setările de sincronizare ale unui cont. De exemplu, cu această permisiune aplicația poate determina dacă aplicația Persoane este sincronizată cu un anumit cont."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activează/dezactivează sincronizarea"</string> @@ -495,19 +496,19 @@ <string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"Permite aplicației să se conecteze la serviciile operatorului. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite."</string> <string name="permlab_access_notification_policy" msgid="4247510821662059671">"accesează Nu deranja"</string> <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"Permite aplicației să citească și să scrie configurația Nu deranja."</string> - <string name="policylab_limitPassword" msgid="4497420728857585791">"Setaţi reguli pentru parolă"</string> + <string name="policylab_limitPassword" msgid="4497420728857585791">"Setați reguli pentru parolă"</string> <string name="policydesc_limitPassword" msgid="2502021457917874968">"Stabiliți lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului."</string> - <string name="policylab_watchLogin" msgid="914130646942199503">"Monitorizaţi încercările de deblocare a ecranului"</string> + <string name="policylab_watchLogin" msgid="914130646942199503">"Monitorizați încercările de deblocare a ecranului"</string> <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Monitorizaţi numărul de parole incorecte introduse la deblocarea ecranului și blocaţi tableta sau ştergeţi datele acesteia dacă sunt introduse prea multe parole incorecte."</string> <string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați televizorul sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte."</string> - <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Monitorizaţi numărul de parole incorecte introduse la deblocarea ecranului și blocaţi telefonul sau ştergeţi toate datele acestuia dacă sunt introduse prea multe parole incorecte."</string> + <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte."</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte."</string> <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați televizorul sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte."</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte."</string> <string name="policylab_resetPassword" msgid="4934707632423915395">"Schimbarea setărilor de blocare a ecranului"</string> <string name="policydesc_resetPassword" msgid="1278323891710619128">"Modificați blocarea ecranului."</string> - <string name="policylab_forceLock" msgid="2274085384704248431">"Blocaţi ecranul"</string> - <string name="policydesc_forceLock" msgid="1141797588403827138">"Stabiliţi modul și timpul în care se blochează ecranul."</string> + <string name="policylab_forceLock" msgid="2274085384704248431">"Blocați ecranul"</string> + <string name="policydesc_forceLock" msgid="1141797588403827138">"Stabiliți modul și timpul în care se blochează ecranul."</string> <string name="policylab_wipeData" msgid="3910545446758639713">"Ștergere integrală date"</string> <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Ștergeţi datele de pe tabletă fără avertisment, efectuând resetarea configurării din fabrică."</string> <string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Ștergeți datele de pe televizor fără avertisment, prin revenirea la setările din fabrică."</string> @@ -516,14 +517,14 @@ <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="6336255514635308054">"Ștergeți datele acestui utilizator de pe această tabletă fără avertisment."</string> <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"Ștergeți datele acestui utilizator de pe acest televizor fără avertisment."</string> <string name="policydesc_wipeData_secondaryUser" product="default" msgid="6787904546711590238">"Ștergeți datele acestui utilizator de pe acest telefon fără avertisment."</string> - <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Setaţi serverul proxy global pentru dispozitiv"</string> + <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Setați serverul proxy global pentru dispozitiv"</string> <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"Setați serverul proxy global pentru dispozitiv, care să fie utilizat cât timp politica este activă. Numai proprietarul dispozitivului poate seta serverul proxy global."</string> <string name="policylab_expirePassword" msgid="5610055012328825874">"Setați expirarea parolei pentru blocarea ecranului"</string> <string name="policydesc_expirePassword" msgid="5367525762204416046">"Modificați frecvența cu care trebuie să se schimbe parola, codul PIN sau modelul pentru blocarea ecranului."</string> - <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Setaţi criptarea stocării"</string> + <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Setați criptarea stocării"</string> <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Necesită ca datele aplicației stocate să fie criptate."</string> - <string name="policylab_disableCamera" msgid="6395301023152297826">"Dezactivaţi camerele foto"</string> - <string name="policydesc_disableCamera" msgid="2306349042834754597">"Împiedicaţi utilizarea camerelor foto de pe dispozitiv."</string> + <string name="policylab_disableCamera" msgid="6395301023152297826">"Dezactivați camerele foto"</string> + <string name="policydesc_disableCamera" msgid="2306349042834754597">"Împiedicați utilizarea camerelor foto de pe dispozitiv."</string> <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Opriți funcții de blocare ecran"</string> <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Împiedicați folosirea unor funcții de blocare a ecranului."</string> <string-array name="phoneTypes"> @@ -713,6 +714,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celulă adăugată"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Celula <xliff:g id="CELL_INDEX">%1$s</xliff:g> a fost adăugată"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Modelul a fost desenat"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Zonă model."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d din %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adăugaţi un widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Gol"</string> @@ -932,7 +934,7 @@ <string name="old_app_action" msgid="493129172238566282">"Reveniţi la <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> <string name="old_app_description" msgid="2082094275580358049">"Nu porniţi aplicația nouă."</string> <string name="new_app_action" msgid="5472756926945440706">"Porniţi <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Opriţi vechea aplicație fără să salvaţi."</string> + <string name="new_app_description" msgid="1932143598371537340">"Opriți vechea aplicație fără să salvaţi."</string> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a depășit limita de memorie"</string> <string name="dump_heap_notification_detail" msgid="2075673362317481664">"Datele privind memoria au fost culese; atingeți pentru a trimite"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Trimiteți datele privind memoria?"</string> @@ -1026,19 +1028,19 @@ <string name="usb_storage_title" msgid="5901459041398751495">"USB conectat"</string> <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"V-aţi conectat la computer prin USB. Atingeţi butonul de mai jos dacă doriţi să copiaţi fişiere de pe computer pe stocarea USB Android sau invers."</string> <string name="usb_storage_message" product="default" msgid="805351000446037811">"V-aţi conectat la computer prin USB. Atingeţi butonul de mai jos dacă doriţi să copiaţi fişiere de pe computer pe cardul SD Android sau invers."</string> - <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activaţi stocarea USB"</string> + <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activați stocarea USB"</string> <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"A apărut o problemă la utilizarea stocării USB pentru stocarea masivă USB."</string> <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"A apărut o problemă la utilizarea cardului SD pentru stocarea masivă USB."</string> <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB conectat"</string> <string name="usb_storage_notification_message" msgid="939822783828183763">"Atingeţi pentru a copia fişiere în/din computerul dvs."</string> - <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Dezactivaţi stocarea USB"</string> + <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Dezactivați stocarea USB"</string> <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"Atingeţi pentru a dezactiva stocarea USB."</string> <string name="usb_storage_stop_title" msgid="660129851708775853">"Stocarea USB este în curs de utilizare"</string> <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"Înainte de a dezactiva stocarea USB, demontaţi („extrageţi”) din computer stocarea USB Android."</string> <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"Înainte de a dezactiva stocarea USB, demontaţi („extrageţi”) din computer cardul SD Android."</string> <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Dezactivaţi stocarea USB"</string> <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"Problemă la dezactivarea stocării USB. Verificaţi dacă aţi demontat dispozitivul gazdă USB, apoi încercaţi din nou."</string> - <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Activaţi stocarea USB"</string> + <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Activați stocarea USB"</string> <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"Dacă activaţi stocarea USB, unele aplicații pe care le utilizaţi în prezent se vor opri și pot să nu fie disponibile până când dezactivaţi stocarea USB."</string> <string name="dlg_error_title" msgid="7323658469626514207">"Operaţie USB nereuşită"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> @@ -1238,7 +1240,7 @@ <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Certificatul este valid."</string> <string name="issued_to" msgid="454239480274921032">"Emis către:"</string> <string name="common_name" msgid="2233209299434172646">"Nume comun:"</string> - <string name="org_name" msgid="6973561190762085236">"Organizaţie:"</string> + <string name="org_name" msgid="6973561190762085236">"Organizație:"</string> <string name="org_unit" msgid="7265981890422070383">"Unitate organizatorică:"</string> <string name="issued_by" msgid="2647584988057481566">"Emis de:"</string> <string name="validity_period" msgid="8818886137545983110">"Validitate:"</string> @@ -1254,7 +1256,7 @@ <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Se trimite..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Lansaţi browserul?"</string> - <string name="SetupCallDefault" msgid="5834948469253758575">"Acceptaţi apelul?"</string> + <string name="SetupCallDefault" msgid="5834948469253758575">"Acceptați apelul?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Întotdeauna"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Numai o dată"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nu acceptă profilul de serviciu"</string> @@ -1294,7 +1296,7 @@ <string name="kg_password_instructions" msgid="5753646556186936819">"Introduceţi parola"</string> <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"Cardul SIM este acum dezactivat. Introduceţi codul PUK pentru a continua. Contactaţi operatorul pentru mai multe detalii."</string> <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Introduceţi codul PIN dorit"</string> - <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmaţi codul PIN dorit"</string> + <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmați codul PIN dorit"</string> <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Se deblochează cardul SIM..."</string> <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Cod PIN incorect."</string> <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Introduceţi un cod PIN format din 4 până la 8 cifre."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index fc67b8c2887d..73e10334445a 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Палец <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок отпечатка пальца"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Просмотр настроек синхронизации"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Приложение сможет просматривать настройки синхронизации аккаунта, например определять, включена ли синхронизация для приложения \"Контакты\"."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Включение/выключение синхронизации"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ячейка добавлена"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Ячейка <xliff:g id="CELL_INDEX">%1$s</xliff:g> добавлена"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Графический ключ введен"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Область ввода графического ключа"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виджет %2$d из %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Добавить виджет"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Пусто"</string> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index f0186dfed71f..81e90d252d41 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ඇඟිලි <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ඇඟිලි සලකුණු නිරූපකය"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"සමමුහුර්ත සැකසීම් කියවන්න"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ගිණුම සඳහා සමමුහුර්ත සැකසීම් කියවීමට යෙදුමට අවසර දෙන්න. උදාහරණයක් ලෙස, ගිණුමක් සමඟ පුද්ගල යෙදුම සමමුහුර්ත දැයි මෙයට හඳුනා ගත හැක."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"සමමුහුර්ත කිරීම සක්රිය කරන්න සහ අක්රිය කරන්න"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"කොටුවක් එකතු කරන ලදි"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> කොටුව එකතු කරන ලදි"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"රටාව සම්පූර්ණයි"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"රටා ප්රදේශය."</string> <!-- String.format failed for translation --> <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) --> <skip /> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 5aa214d4ca57..cbff7d5d6b6a 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst: <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odtlačku prsta"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čítať nastavenia synchronizácie"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Umožňuje aplikácii čítať nastavenia synchronizácie v účte. Môže napríklad určiť, či je s účtom synchronizovaná aplikácia Ľudia."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"zapnúť alebo vypnúť synchronizáciu"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Bunka bola pridaná"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Bola pridaná bunka <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Bezpečnostný vzor bol dokončený"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Oblasť na zadanie bezpečnostného vzoru."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Miniaplikácia %2$d z %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pridať miniaplikáciu."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prázdne"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 0c003ff42942..ddeff80a238e 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona prstnih odtisov"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"branje nastavitev sinhronizacije"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Aplikaciji omogoča branje nastavitev sinhronizacije za račun. S tem lahko aplikacija na primer ugotovi, ali je aplikacija Ljudje sinhronizirana z računom."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"vklop in izklop sinhronizacije"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celica je dodana"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Dodana <xliff:g id="CELL_INDEX">%1$s</xliff:g>. celica"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Vzorec je končan"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Območje vzorca."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Pripomoček %2$d za %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodajanje pripomočka."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prazno"</string> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 2bde6265691d..508e88e02b8c 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Gishti <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona e gjurmës së gishtit"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lexo cilësimet e sinkronizimit"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lejon aplikacionin të lexojë cilësimet e sinkronizimit për një llogari. Për shembull, kjo mund të përcaktojë nëse aplikacioni \"Kontaktet\" është i sinkronizuar me një llogari."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ndiz ose fik sinkronizimin"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Qeliza u shtua"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Qeliza <xliff:g id="CELL_INDEX">%1$s</xliff:g> u shtua"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Modeli përfundoi"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Zona e motivit."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Miniaplikacioni %2$d nga %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Shto miniaplikacion."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Bosh"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index d46b007044e7..b283250985c4 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -435,6 +435,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона отиска прста"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"читање подешавања синхронизације"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Дозвољава апликацији да чита подешавања синхронизације за налог. На пример, овако може да се утврди да ли је апликација Људи синхронизована са налогом."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"укључивање и искључивање синхронизације"</string> @@ -713,6 +714,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ћелија је додата"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Ћелија <xliff:g id="CELL_INDEX">%1$s</xliff:g> је додата"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Образац је довршен"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Област шаблона."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виџет %2$d од %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додај виџет."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Празно"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 4c2f319c7d38..b293655998f6 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon för fingeravtryck"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"läsa synkroniseringsinställningar"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tillåter att appen läser synkroniseringsinställningarna för ett konto. Detta kan användas till exempel för att avgöra om appen Personer är synkroniserad med ett konto."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"aktivera/inaktivera synkronisering"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"En cell har lagts till"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cell <xliff:g id="CELL_INDEX">%1$s</xliff:g> har lagts till"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Grafiskt lösenord har slutförts"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Fält för grafiskt lösenord."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d av %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Lägg till en widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 6e98a29eb926..3800c92dbd9c 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Kitambulisho <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Aikoni ya kitambulisho"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"kusoma mipangilio ya usawazishaji"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Inaruhusu programu kusoma mipangilio ya upatanishi wa akaunti. Kwa mfano, huku kunaweza kuamua kama programu ya Watu imepatanishwa na akaunti."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"kuwasha na kuzima usawazishaji"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Kiini kimeongezwa"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Kisanduku <xliff:g id="CELL_INDEX">%1$s</xliff:g> kimeongezwa"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Ruwaza imekamilika"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Eneo la ruwaza."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Wijeti %2$d ya %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ongeza wijeti."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tupu"</string> diff --git a/core/res/res/values-sw600dp/dimens_material.xml b/core/res/res/values-sw600dp/dimens_material.xml index dffe8e7e88bd..3bbb352bca8e 100644 --- a/core/res/res/values-sw600dp/dimens_material.xml +++ b/core/res/res/values-sw600dp/dimens_material.xml @@ -21,13 +21,11 @@ <dimen name="text_size_subtitle_material_toolbar">16dp</dimen> <!-- Default height of an action bar. --> <dimen name="action_bar_default_height_material">64dp</dimen> - <!-- Default padding of an action bar. --> - <dimen name="action_bar_default_padding_material">4dp</dimen> <!-- Default content inset of an action bar. --> <dimen name="action_bar_content_inset_material">24dp</dimen> - <!-- Padding to add to the start of the overflow action button. --> - <dimen name="action_bar_navigation_padding_start_material">8dp</dimen> - <!-- Padding to add to the end of the overflow action button. --> - <dimen name="action_bar_overflow_padding_end_material">18dp</dimen> + <!-- Default start padding of an action bar. --> + <dimen name="action_bar_default_padding_start_material">8dp</dimen> + <!-- Default end padding of an action bar. --> + <dimen name="action_bar_default_padding_end_material">8dp</dimen> </resources> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index 7cde55ebc4c8..ae9be638c0a7 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"கைரேகை <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"கைரேகை ஐகான்"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ஒத்திசைவு அமைப்புகளைப் படித்தல்"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"கணக்கிற்கான ஒத்திசைவு அமைப்புகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது. எடுத்துக்காட்டாக, பீப்பிள் பயன்பாடு கணக்குடன் ஒத்திசைக்கப்பட்டுள்ளதா என்பதை இது தீர்மானிக்கலாம்."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ஒத்திசைவை இயக்குவதையும், முடக்குவதையும் மாற்றுதல்"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"கலம் சேர்க்கப்பட்டது"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"கலம் <xliff:g id="CELL_INDEX">%1$s</xliff:g> சேர்க்கப்பட்டது"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"வடிவம் நிறைவடைந்தது"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"வடிவப் பகுதி."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. விட்ஜெட் %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"விட்ஜெட்டைச் சேர்க்கவும்."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"காலியானது"</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index c26397125c3d..7eca8eee401d 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"వేలు <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"వేలిముద్ర చిహ్నం"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"సమకాలీకరణ సెట్టింగ్లను చదవడం"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ఖాతా యొక్క సమకాలీకరణ సెట్టింగ్లను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఉదాహరణకు, వ్యక్తుల అనువర్తనం ఖాతాతో సమకాలీకరించబడాలా లేదా అనే విషయాన్ని ఇది నిశ్చయించవచ్చు."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"సమకాలీకరణను ఆన్ మరియు ఆఫ్కు టోగుల్ చేయడం"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"గడి జోడించబడింది"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g>వ సెల్ను జోడించారు"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"నమూనా పూర్తయింది"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"నమూనా ప్రాంతం."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$dలో విడ్జెట్ %2$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"విడ్జెట్ను జోడించండి."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ఖాళీ"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index d1983ed560ee..549e75588d3f 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"นิ้ว <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ไอคอนลายนิ้วมือ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"อ่านการตั้งค่าการซิงค์แล้ว"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"อนุญาตให้แอปพลิเคชันอ่านการตั้งค่าการซิงค์ของบัญชี ตัวอย่างเช่น การอนุญาตนี้สามารถระบุได้ว่าแอปพลิเคชัน People ซิงค์กับบัญชีหรือไม่"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"สลับระหว่างเปิดและปิดการซิงค์"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"เพิ่มเซลแล้ว"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"เพิ่มแล้ว <xliff:g id="CELL_INDEX">%1$s</xliff:g> เซลล์"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"วาดรูปแบบเสร็จสิ้น"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"พื้นที่สำหรับรูปแบบ"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s วิดเจ็ต %2$d ของ %3$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"เพิ่มวิดเจ็ต"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ว่าง"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 2625a4103698..004b3f807ad3 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Daliri <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icon ng fingerprint"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"basahin ang mga setting ng sync"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Pinapayagan ang app na basahin ang mga setting ng pag-sync para sa isang account. Halimbawa, matutukoy nito kung naka-sync ang app na Mga Tao sa isang account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"I-toggle on at off ang pag-sync"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Idinagdag ang cell"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Idinagdag ang cell <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Nakumpleto ang pattern"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Bahagi ng pattern."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d ng %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Magdagdag ng widget."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Walang laman"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index a5b2ab24f285..72cbf87c2bc6 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. parmak"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Parmak izi simgesi"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"senk. ayarlarını okuma"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Uygulamaya bir hesaba ait senkronizasyon ayarlarını okuma izni verir. Örneğin, bu izne sahip bir uygulama Kişiler uygulamasının bir hesapla senkronize olup olmadığını belirleyebilir."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"senkronizasyonu açma/kapatma"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Hücre eklendi"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g>. hücre eklendi"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Desen tamamlandı"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Desen alanı."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget ekleyin."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Boş"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 5ebd0bf0d830..ea3c94171600 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Відбиток пальця <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок відбитка пальця"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"читати налаштування синхронізації"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Дозволяє програмі читати налаштування синхронізації для облікового запису, наприклад, визначати, чи програма Люди синхронізується з обліковим записом."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"вмикати й вимикати синхронізацію"</string> @@ -714,6 +715,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Телефон додано"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Додано крапку <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Малювання ключа закінчено"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Область ключа."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Віджет %2$d з %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додати віджет."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Порожня область"</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index a1b614e188ff..76495e1ed8d8 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"انگلی <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"فنگر پرنٹ آئیکن"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"مطابقت پذیری کی ترتیبات پڑھیں"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ایپ کو کسی اکاؤنٹ کیلئے مطابقت پذیری کی ترتیبات پڑھنے کی اجازت دیتا ہے۔ مثلا، یہ تعین کرسکتا ہے کہ آیا People ایپ کسی اکاؤنٹ کے ساتھ مطابقت پذیر ہے۔"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"مطابقت پذیری آن اور آف ٹوگل کریں"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"سیل شامل کر دیا گیا"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"سیل <xliff:g id="CELL_INDEX">%1$s</xliff:g> شامل ہو گيا"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"پیٹرن مکمل ہو گیا"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"پیٹرن کا علاقہ۔"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s۔ ویجیٹ %2$d از %3$d۔"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ویجیٹ شامل کریں"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"خالی"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 0404e98ea07c..cb1fc6fdf54f 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -130,7 +130,7 @@ </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> - <string name="wifi_calling_off_summary" msgid="8720659586041656098">"O‘chirilgan"</string> + <string name="wifi_calling_off_summary" msgid="8720659586041656098">"O‘chiq"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi afzal ko‘rilsin"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobil tarmoq afzal ko‘rilsin"</string> <string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Faqat Wi-Fi"</string> @@ -434,6 +434,7 @@ <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> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Barmoq izi belgisi"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx-sh sozlamalarini o‘qish"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ilovaga hisobning sinxronlash sozlamalarini o‘qish uchun ruxsat beradi. Masalan, bu \"Odamlar\" ilovasi hisob bilan sinxronlangan yoki aksini aniqlay oladi."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinx.ni yoqish/o‘chirish"</string> @@ -673,8 +674,8 @@ <string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"To‘xtatib turish"</string> <string name="lockscreen_transport_play_description" msgid="1901258823643886401">"Ijro qilish"</string> <string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"To‘xtatish"</string> - <string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"Tezkor orqaga qaytarish"</string> - <string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"Tezkor oldinga o‘tkazish"</string> + <string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"Orqaga o‘tkazish"</string> + <string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"Oldinga o‘tkazish"</string> <string name="emergency_calls_only" msgid="6733978304386365407">"Faqat favqulodda chaqiruvlar"</string> <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Tarmoq qulflangan"</string> <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-karta PUK kod bilan qulflangan."</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Katak qo‘shildi"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> katak qo‘shildi"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Chizma namunasi tugatildi"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Chizmali qulf maydoni."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidjet %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidjet qo‘shish."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Bo‘sh"</string> @@ -813,7 +815,7 @@ </plurals> <string name="last_month" msgid="3959346739979055432">"O‘tgan oy"</string> <string name="older" msgid="5211975022815554840">"Eskiroq"</string> - <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>da"</string> + <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>"</string> <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>da"</string> <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g>da"</string> <string name="day" msgid="8144195776058119424">"kun"</string> @@ -875,8 +877,8 @@ <string name="no" msgid="5141531044935541497">"Bekor qilish"</string> <string name="dialog_alert_title" msgid="2049658708609043103">"Diqqat"</string> <string name="loading" msgid="7933681260296021180">"Yuklanmoqda…"</string> - <string name="capital_on" msgid="1544682755514494298">"YONIQ"</string> - <string name="capital_off" msgid="6815870386972805832">"O‘CHIQ"</string> + <string name="capital_on" msgid="1544682755514494298">"I"</string> + <string name="capital_off" msgid="6815870386972805832">"O"</string> <string name="whichApplication" msgid="4533185947064773386">"Ushbudan foydalanib amalni tugatish:"</string> <string name="whichApplicationNamed" msgid="8260158865936942783">"“%1$s” ilovasi yordamida bajarish"</string> <string name="whichViewApplication" msgid="3272778576700572102">"Ochish…"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 5f477d5f6306..45a147e44eed 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Ngón tay <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Biểu tượng vân tay"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"đọc cài đặt đồng bộ hóa"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Cho phép ứng dụng đọc cài đặt đồng bộ hóa cho tài khoản. Ví dụ: việc này có thể xác định liệu ứng dụng Mọi người đã được đồng bộ hóa với tài khoản chưa."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"chuyển đổi bật và tắt đồng bộ hóa"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Đã thêm ô"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Đã thêm ô <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Đã vẽ xong hình"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Khu vực hình."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Tiện ích %2$d trong số %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Thêm tiện ích."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Trống"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index e61ee70fa5c9..3ffb555c0e99 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指纹图标"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"读取同步设置"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允许该应用读取某个帐户的同步设置。例如,此权限可确定“联系人”应用是否与某个帐户同步。"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"启用和停用同步"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已添加单元格"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"已添加圆点 <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"图案绘制完成"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"图案区域。"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。%3$d的小部件%2$d。"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"添加小部件。"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 05073a316fda..ffa6fb19a1d5 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋圖示"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允許應用程式讀取帳戶的同步設定,例如確定「通訊錄」應用程式是否和某個帳戶保持同步。"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"開啟和關閉同步功能"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已加入一格"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"已加入 <xliff:g id="CELL_INDEX">%1$s</xliff:g> 點"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"已畫出解鎖圖案"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"圖案區域。"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。第 %2$d 個小工具,共 %3$d 個。"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"新增小工具。"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 58902d768dad..fb139cd4c6f7 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋圖示"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允許應用程式讀取帳戶的同步處理設定,例如判斷「使用者」應用程式是否和某個帳戶進行同步處理。"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"開啟及關閉同步功能"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已加入 1 格"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"已加入圓點 <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"已畫出解鎖圖形"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"圖形區域。"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。第 %2$d 個小工具,共 %3$d 個。"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"新增小工具。"</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 2003d17c9bcc..f29e9f90e0ef 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -434,6 +434,7 @@ <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> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Isithonjana sezigxivizo zeminwe"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"funda izilungiselelo zokuvumelanisa"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ivumela uhlelo lokusebenza ukufunda izilungiselelo zokuvumelanisa ze-akhawunti. Isibonelo, lokhu kungacacisa ukuthi noma ngabe uhlelo lokusebenza le-People livumelanisiwe ne-akhawunti."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"shintsha phakathi kokuvula kanye nokucisha ukuvumelanisa"</string> @@ -712,6 +713,7 @@ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Kwengezwe"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Iseli <xliff:g id="CELL_INDEX">%1$s</xliff:g> lingeziwe"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Iphethini isiphelile"</string> + <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Indawo yephethini."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. iwijethi %2$d ye-%3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Engeza iwijethi."</string> <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Akunalutho"</string> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 1515703ec08b..de16f203da4c 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -219,7 +219,7 @@ <flag name="appop" value="0x40" /> <!-- Additional flag from base permission type: this permission can be automatically granted to apps that target API levels below - {@link android.os.Build.VERSION_CODES#MNC} (before runtime permissions + {@link android.os.Build.VERSION_CODES#M} (before runtime permissions were introduced). --> <flag name="pre23" value="0x80" /> <!-- Additional flag from base permission type: this permission can be automatically @@ -1059,7 +1059,7 @@ at the same time. <p>The default value is <code>false</code> for applications with - <code>targetSdkVersion</code> lesser than {@link android.os.Build.VERSION_CODES#MNC} and + <code>targetSdkVersion</code> lesser than {@link android.os.Build.VERSION_CODES#M} and <code>true</code> otherwise. <p>NOTE: A task's root activity value is applied to all additional activities launched in diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml index 1cb39f0de592..7399fa9d58ce 100644 --- a/core/res/res/values/colors_material.xml +++ b/core/res/res/values/colors_material.xml @@ -41,9 +41,6 @@ <color name="switch_thumb_disabled_material_dark">#ff616161</color> <color name="switch_thumb_disabled_material_light">#ffbdbdbd</color> - <color name="link_text_material_light">@color/material_deep_teal_500</color> - <color name="link_text_material_dark">@color/material_deep_teal_200</color> - <!-- Text & foreground colors --> <eat-comment /> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 54848e9c79b1..b1bde0e8009e 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1475,7 +1475,7 @@ <!-- Remote server that can provide NTP responses. --> <string translatable="false" name="config_ntpServer">2.android.pool.ntp.org</string> <!-- Normal polling frequency in milliseconds --> - <integer name="config_ntpPollingInterval">864000000</integer> + <integer name="config_ntpPollingInterval">86400000</integer> <!-- Try-again polling interval in milliseconds, in case the network request failed --> <integer name="config_ntpPollingIntervalShorter">60000</integer> <!-- Number of times to try again with the shorter interval, before backing diff --git a/core/res/res/values/dimens_material.xml b/core/res/res/values/dimens_material.xml index 558afa71cabd..55bea9e38291 100644 --- a/core/res/res/values/dimens_material.xml +++ b/core/res/res/values/dimens_material.xml @@ -35,8 +35,10 @@ <!-- Default height of an action bar. --> <dimen name="action_bar_default_height_material">56dp</dimen> - <!-- Default padding of an action bar. --> - <dimen name="action_bar_default_padding_material">4dp</dimen> + <!-- Default start padding of an action bar. --> + <dimen name="action_bar_default_padding_start_material">0dp</dimen> + <!-- Default end padding of an action bar. --> + <dimen name="action_bar_default_padding_end_material">0dp</dimen> <!-- Default content inset of an action bar. --> <dimen name="action_bar_content_inset_material">16dp</dimen> <!-- Vertical padding around action bar icons. --> @@ -51,8 +53,6 @@ <dimen name="list_item_padding_horizontal_material">@dimen/action_bar_content_inset_material</dimen> <!-- Padding to add to the start of the overflow action button. --> - <dimen name="action_bar_navigation_padding_start_material">0dp</dimen> - <!-- Padding to add to the start of the overflow action button. --> <dimen name="action_bar_overflow_padding_start_material">6dp</dimen> <!-- Padding to add to the end of the overflow action button. --> <dimen name="action_bar_overflow_padding_end_material">10dp</dimen> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 85b6c12eceb5..bc831da096f2 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2604,7 +2604,7 @@ <public type="style" name="Theme.DeviceDefault.Light.Dialog.Alert" /> <!-- =============================================================== - Resources added in version MNC of the platform + Resources added in version M of the platform =============================================================== --> <eat-comment /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a45a0faff24e..d9fa287361c0 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1919,6 +1919,8 @@ Cell <xliff:g id="cell_index" example="3">%1$s</xliff:g> added</string> <!-- Accessibility description sent when user completes drawing a pattern. [CHAR LIMIT=NONE] --> <string name="lockscreen_access_pattern_detected">Pattern completed</string> + <!-- Accessibility description of the unlock pattern area. [CHAR_LIMIT=none] --> + <string name="lockscreen_access_pattern_area" msgid="">Pattern area.</string> <!-- Accessibility description sent when user changes the current lock screen widget. [CHAR_LIMIT=none] --> <string name="keyguard_accessibility_widget_changed">%1$s. Widget %2$d of %3$d.</string> diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml index 1b9c4091af35..1e202e4c132a 100644 --- a/core/res/res/values/styles_material.xml +++ b/core/res/res/values/styles_material.xml @@ -809,13 +809,14 @@ please see styles_device_defaults.xml. <item name="navigationButtonStyle">@style/Widget.Material.Toolbar.Button.Navigation</item> <item name="titleTextAppearance">@style/TextAppearance.Material.Widget.Toolbar.Title</item> <item name="subtitleTextAppearance">@style/TextAppearance.Material.Widget.Toolbar.Subtitle</item> + <item name="paddingStart">@dimen/action_bar_default_padding_start_material</item> + <item name="paddingEnd">@dimen/action_bar_default_padding_end_material</item> </style> <style name="Widget.Material.Toolbar.Button.Navigation" parent="Widget.Material"> <item name="background">@drawable/control_background_40dp_material</item> <item name="minWidth">56dp</item> <item name="scaleType">center</item> - <item name="paddingStart">@dimen/action_bar_navigation_padding_start_material</item> </style> <style name="Widget.Material.WebTextView" parent="Widget.WebTextView"/> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 807098650354..ee61944e75bb 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2310,6 +2310,8 @@ <java-symbol type="plurals" name="selected_count" /> <java-symbol type="drawable" name="ic_dialog_alert_material" /> + <java-symbol type="string" name="lockscreen_access_pattern_area" /> + <java-symbol type="bool" name="allow_stacked_button_bar" /> <java-symbol type="bool" name="config_eap_sim_based_auth_supported" /> diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml index 9d3a7ef3e9fd..e88a4fba5c9a 100644 --- a/core/res/res/values/themes_material.xml +++ b/core/res/res/values/themes_material.xml @@ -67,8 +67,8 @@ please see themes_device_defaults.xml. <item name="textColorHintInverse">@color/hint_foreground_material_light</item> <item name="textColorHighlight">@color/highlighted_text_material</item> <item name="textColorHighlightInverse">@color/highlighted_text_material</item> - <item name="textColorLink">@color/link_text_material_dark</item> - <item name="textColorLinkInverse">@color/link_text_material_light</item> + <item name="textColorLink">?attr/colorAccent</item> + <item name="textColorLinkInverse">?attr/colorAccent</item> <item name="textColorSearchUrl">@color/search_url_text_material_dark</item> <item name="textColorAlertDialogListItem">@color/primary_text_material_dark</item> @@ -422,8 +422,8 @@ please see themes_device_defaults.xml. <item name="textColorHintInverse">@color/hint_foreground_material_dark</item> <item name="textColorHighlight">@color/highlighted_text_material</item> <item name="textColorHighlightInverse">@color/highlighted_text_material</item> - <item name="textColorLink">@color/link_text_material_light</item> - <item name="textColorLinkInverse">@color/link_text_material_dark</item> + <item name="textColorLink">?attr/colorAccent</item> + <item name="textColorLinkInverse">?attr/colorAccent</item> <item name="textColorSearchUrl">@color/search_url_text_material_light</item> <item name="textColorAlertDialogListItem">@color/primary_text_material_light</item> @@ -793,8 +793,6 @@ please see themes_device_defaults.xml. <item name="textColorHintInverse">@color/hint_foreground_material_dark</item> <item name="textColorHighlight">@color/highlighted_text_material</item> <item name="textColorHighlightInverse">@color/highlighted_text_material</item> - <item name="textColorLink">@color/link_text_material_light</item> - <item name="textColorLinkInverse">@color/link_text_material_dark</item> <item name="textColorSearchUrl">@color/search_url_text_material_light</item> <item name="textColorAlertDialogListItem">@color/primary_text_material_light</item> @@ -827,8 +825,6 @@ please see themes_device_defaults.xml. <item name="textColorHintInverse">@color/hint_foreground_material_light</item> <item name="textColorHighlight">@color/highlighted_text_material</item> <item name="textColorHighlightInverse">@color/highlighted_text_material</item> - <item name="textColorLink">@color/link_text_material_dark</item> - <item name="textColorLinkInverse">@color/link_text_material_light</item> <item name="textColorSearchUrl">@color/search_url_text_material_dark</item> <item name="textColorAlertDialogListItem">@color/primary_text_material_dark</item> diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 8ad7c12c342e..3e4d93bb3df9 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -23,6 +23,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.Trace; import android.util.DisplayMetrics; +import android.util.Log; import dalvik.system.VMRuntime; @@ -33,6 +34,8 @@ import java.nio.IntBuffer; import java.nio.ShortBuffer; public final class Bitmap implements Parcelable { + private static final String TAG = "Bitmap"; + /** * Indicates that the bitmap was created for an unknown pixel density. * @@ -159,6 +162,9 @@ public final class Bitmap implements Parcelable { * @see #DENSITY_NONE */ public int getDensity() { + if (mRecycled) { + Log.w(TAG, "Called getDensity() on a recycle()'d bitmap! This is undefined behavior!"); + } return mDensity; } @@ -330,7 +336,9 @@ public final class Bitmap implements Parcelable { * @return The current generation ID for this bitmap. */ public int getGenerationId() { - if (mRecycled) return 0; + if (mRecycled) { + Log.w(TAG, "Called getGenerationId() on a recycle()'d bitmap! This is undefined behavior!"); + } return nativeGenerationId(mFinalizer.mNativeBitmap); } @@ -1057,7 +1065,9 @@ public final class Bitmap implements Parcelable { * @see BitmapFactory.Options#inPremultiplied */ public final boolean isPremultiplied() { - if (mRecycled) return false; + if (mRecycled) { + Log.w(TAG, "Called isPremultiplied() on a recycle()'d bitmap! This is undefined behavior!"); + } return nativeIsPremultiplied(mFinalizer.mNativeBitmap); } @@ -1089,11 +1099,17 @@ public final class Bitmap implements Parcelable { /** Returns the bitmap's width */ public final int getWidth() { + if (mRecycled) { + Log.w(TAG, "Called getWidth() on a recycle()'d bitmap! This is undefined behavior!"); + } return mWidth; } /** Returns the bitmap's height */ public final int getHeight() { + if (mRecycled) { + Log.w(TAG, "Called getHeight() on a recycle()'d bitmap! This is undefined behavior!"); + } return mHeight; } @@ -1176,7 +1192,9 @@ public final class Bitmap implements Parcelable { * @return number of bytes between rows of the native bitmap pixels. */ public final int getRowBytes() { - if (mRecycled) return 0; + if (mRecycled) { + Log.w(TAG, "Called getRowBytes() on a recycle()'d bitmap! This is undefined behavior!"); + } return nativeRowBytes(mFinalizer.mNativeBitmap); } @@ -1220,7 +1238,9 @@ public final class Bitmap implements Parcelable { * that config, otherwise return null. */ public final Config getConfig() { - if (mRecycled) return Config.ARGB_8888; + if (mRecycled) { + Log.w(TAG, "Called getConfig() on a recycle()'d bitmap! This is undefined behavior!"); + } return Config.nativeToConfig(nativeConfig(mFinalizer.mNativeBitmap)); } @@ -1233,7 +1253,9 @@ public final class Bitmap implements Parcelable { * it will return true by default. */ public final boolean hasAlpha() { - if (mRecycled) return false; + if (mRecycled) { + Log.w(TAG, "Called hasAlpha() on a recycle()'d bitmap! This is undefined behavior!"); + } return nativeHasAlpha(mFinalizer.mNativeBitmap); } @@ -1270,7 +1292,9 @@ public final class Bitmap implements Parcelable { * @see #setHasMipMap(boolean) */ public final boolean hasMipMap() { - if (mRecycled) return false; + if (mRecycled) { + Log.w(TAG, "Called hasMipMap() on a recycle()'d bitmap! This is undefined behavior!"); + } return nativeHasMipMap(mFinalizer.mNativeBitmap); } diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java index 6b36a5846d95..79095f42cd06 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java @@ -63,7 +63,6 @@ import java.security.spec.ECGenParameterSpec; import java.security.spec.RSAKeyGenParameterSpec; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -215,7 +214,14 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY); // Authorized to be used with any digest (including no digest). - specBuilder.setDigests(KeyProperties.DIGEST_NONE); + // MD5 was never offered for Android Keystore for ECDSA. + specBuilder.setDigests( + KeyProperties.DIGEST_NONE, + KeyProperties.DIGEST_SHA1, + KeyProperties.DIGEST_SHA224, + KeyProperties.DIGEST_SHA256, + KeyProperties.DIGEST_SHA384, + KeyProperties.DIGEST_SHA512); break; case KeymasterDefs.KM_ALGORITHM_RSA: specBuilder = new KeyGenParameterSpec.Builder( @@ -225,11 +231,23 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato | KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY); // Authorized to be used with any digest (including no digest). - specBuilder.setDigests(KeyProperties.DIGEST_NONE); + specBuilder.setDigests( + KeyProperties.DIGEST_NONE, + KeyProperties.DIGEST_MD5, + KeyProperties.DIGEST_SHA1, + KeyProperties.DIGEST_SHA224, + KeyProperties.DIGEST_SHA256, + KeyProperties.DIGEST_SHA384, + KeyProperties.DIGEST_SHA512); // Authorized to be used with any encryption and signature padding - // scheme (including no padding). + // schemes (including no padding). specBuilder.setEncryptionPaddings( - KeyProperties.ENCRYPTION_PADDING_NONE); + KeyProperties.ENCRYPTION_PADDING_NONE, + KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1, + KeyProperties.ENCRYPTION_PADDING_RSA_OAEP); + specBuilder.setSignaturePaddings( + KeyProperties.SIGNATURE_PADDING_RSA_PKCS1, + KeyProperties.SIGNATURE_PADDING_RSA_PSS); // Disable randomized encryption requirement to support encryption // padding NONE above. specBuilder.setRandomizedEncryptionRequired(false); @@ -724,27 +742,11 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato // We use Bouncy Castle to generate self-signed RSA certificates. Bouncy Castle // only supports RSA certificates signed using PKCS#1 padding scheme. The key needs // to be authorized for PKCS#1 padding or padding NONE which means any padding. - boolean pkcs1SignaturePaddingSupported = false; - for (int keymasterPadding : KeyProperties.SignaturePadding.allToKeymaster( - spec.getSignaturePaddings())) { - if ((keymasterPadding == KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN) - || (keymasterPadding == KeymasterDefs.KM_PAD_NONE)) { - pkcs1SignaturePaddingSupported = true; - break; - } - } - if (!pkcs1SignaturePaddingSupported) { - // Keymaster doesn't distinguish between encryption padding NONE and signature - // padding NONE. In the Android Keystore API only encryption padding NONE is - // exposed. - for (int keymasterPadding : KeyProperties.EncryptionPadding.allToKeymaster( - spec.getEncryptionPaddings())) { - if (keymasterPadding == KeymasterDefs.KM_PAD_NONE) { - pkcs1SignaturePaddingSupported = true; - break; - } - } - } + boolean pkcs1SignaturePaddingSupported = + com.android.internal.util.ArrayUtils.contains( + KeyProperties.SignaturePadding.allToKeymaster( + spec.getSignaturePaddings()), + KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN); if (!pkcs1SignaturePaddingSupported) { // Key not authorized for PKCS#1 signature padding -- can't sign return null; @@ -803,14 +805,8 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato : KeyProperties.Digest.allToKeymaster(supportedSignatureDigests)) { supportedKeymasterSignatureDigests.add(keymasterDigest); } - if (authorizedKeymasterKeyDigests.contains(KeymasterDefs.KM_DIGEST_NONE)) { - // Key is authorized to be used with any digest - return supportedKeymasterSignatureDigests; - } else { - // Key is authorized to be used only with specific digests. - Set<Integer> result = new HashSet<Integer>(supportedKeymasterSignatureDigests); - result.retainAll(authorizedKeymasterKeyDigests); - return result; - } + Set<Integer> result = new HashSet<Integer>(supportedKeymasterSignatureDigests); + result.retainAll(authorizedKeymasterKeyDigests); + return result; } } diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreRSACipherSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreRSACipherSpi.java index 94ed8b45d20a..56cc44cc7cc1 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreRSACipherSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreRSACipherSpi.java @@ -18,16 +18,11 @@ package android.security.keystore; import android.annotation.NonNull; import android.annotation.Nullable; -import android.os.IBinder; import android.security.KeyStore; -import android.security.KeyStoreException; import android.security.keymaster.KeyCharacteristics; import android.security.keymaster.KeymasterArguments; import android.security.keymaster.KeymasterDefs; -import libcore.util.EmptyArray; - -import java.io.ByteArrayOutputStream; import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; @@ -103,91 +98,6 @@ abstract class AndroidKeyStoreRSACipherSpi extends AndroidKeyStoreCipherSpiBase protected final int getAdditionalEntropyAmountForFinish() { return 0; } - - @Override - @NonNull - protected KeyStoreCryptoOperationStreamer createMainDataStreamer( - KeyStore keyStore, IBinder operationToken) { - if (isEncrypting()) { - // KeyStore's RSA encryption without padding expects the input to be of the same - // length as the modulus. We thus have to buffer all input to pad it with leading - // zeros. - return new ZeroPaddingEncryptionStreamer( - super.createMainDataStreamer(keyStore, operationToken), - getModulusSizeBytes()); - } else { - return super.createMainDataStreamer(keyStore, operationToken); - } - } - - /** - * Streamer which buffers all plaintext input, then pads it with leading zeros to match - * modulus size, and then sends it into KeyStore to obtain ciphertext. - */ - private static class ZeroPaddingEncryptionStreamer - implements KeyStoreCryptoOperationStreamer { - - private final KeyStoreCryptoOperationStreamer mDelegate; - private final int mModulusSizeBytes; - private final ByteArrayOutputStream mInputBuffer = new ByteArrayOutputStream(); - private long mConsumedInputSizeBytes; - - private ZeroPaddingEncryptionStreamer( - KeyStoreCryptoOperationStreamer delegate, - int modulusSizeBytes) { - mDelegate = delegate; - mModulusSizeBytes = modulusSizeBytes; - } - - @Override - public byte[] update(byte[] input, int inputOffset, int inputLength) - throws KeyStoreException { - if (inputLength > 0) { - mInputBuffer.write(input, inputOffset, inputLength); - mConsumedInputSizeBytes += inputLength; - } - return EmptyArray.BYTE; - } - - @Override - public byte[] doFinal(byte[] input, int inputOffset, int inputLength, - byte[] signature, byte[] additionalEntropy) throws KeyStoreException { - if (inputLength > 0) { - mConsumedInputSizeBytes += inputLength; - mInputBuffer.write(input, inputOffset, inputLength); - } - byte[] bufferedInput = mInputBuffer.toByteArray(); - mInputBuffer.reset(); - byte[] paddedInput; - if (bufferedInput.length < mModulusSizeBytes) { - // Pad input with leading zeros - paddedInput = new byte[mModulusSizeBytes]; - System.arraycopy( - bufferedInput, 0, - paddedInput, - paddedInput.length - bufferedInput.length, - bufferedInput.length); - } else { - // RI throws BadPaddingException in this scenario. INVALID_ARGUMENT below will - // be translated into BadPaddingException. - throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_ARGUMENT, - "Message size (" + bufferedInput.length + " bytes) must be smaller than" - + " modulus (" + mModulusSizeBytes + " bytes)"); - } - return mDelegate.doFinal(paddedInput, 0, paddedInput.length, signature, - additionalEntropy); - } - - @Override - public long getConsumedInputSizeBytes() { - return mConsumedInputSizeBytes; - } - - @Override - public long getProducedOutputSizeBytes() { - return mDelegate.getProducedOutputSizeBytes(); - } - } } /** diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java index 915d86fc2e84..d300a9297054 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java @@ -292,7 +292,14 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { new KeyProtection.Builder( KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY); // Authorized to be used with any digest (including no digest). - specBuilder.setDigests(KeyProperties.DIGEST_NONE); + // MD5 was never offered for Android Keystore for ECDSA. + specBuilder.setDigests( + KeyProperties.DIGEST_NONE, + KeyProperties.DIGEST_SHA1, + KeyProperties.DIGEST_SHA224, + KeyProperties.DIGEST_SHA256, + KeyProperties.DIGEST_SHA384, + KeyProperties.DIGEST_SHA512); } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) { specBuilder = new KeyProtection.Builder( @@ -301,13 +308,25 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { | KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY); // Authorized to be used with any digest (including no digest). - specBuilder.setDigests(KeyProperties.DIGEST_NONE); - // Authorized to be used with any encryption and signature padding scheme (including no - // padding). + specBuilder.setDigests( + KeyProperties.DIGEST_NONE, + KeyProperties.DIGEST_MD5, + KeyProperties.DIGEST_SHA1, + KeyProperties.DIGEST_SHA224, + KeyProperties.DIGEST_SHA256, + KeyProperties.DIGEST_SHA384, + KeyProperties.DIGEST_SHA512); + // Authorized to be used with any encryption and signature padding + // schemes (including no padding). specBuilder.setEncryptionPaddings( - KeyProperties.ENCRYPTION_PADDING_NONE); - // Disable randomized encryption requirement to support encryption padding NONE - // above. + KeyProperties.ENCRYPTION_PADDING_NONE, + KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1, + KeyProperties.ENCRYPTION_PADDING_RSA_OAEP); + specBuilder.setSignaturePaddings( + KeyProperties.SIGNATURE_PADDING_RSA_PKCS1, + KeyProperties.SIGNATURE_PADDING_RSA_PSS); + // Disable randomized encryption requirement to support encryption + // padding NONE above. specBuilder.setRandomizedEncryptionRequired(false); } else { throw new KeyStoreException("Unsupported key algorithm: " + keyAlgorithm); diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java index faaa1a618c37..7605231fa991 100644 --- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java +++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java @@ -65,17 +65,16 @@ import javax.security.auth.x500.X500Principal; * * <p>NOTE: If a private key is not authorized to sign the self-signed certificate, then the * certificate will be created with an invalid signature which will not verify. Such a certificate - * is still useful because it provides access to the public key. To generate a valid - * signature for the certificate the key needs to be authorized for all of the following: + * is still useful because it provides access to the public key. To generate a valid signature for + * the certificate the key needs to be authorized for all of the following: * <ul> * <li>{@link KeyProperties#PURPOSE_SIGN},</li> * <li>operation without requiring the user to be authenticated (see * {@link Builder#setUserAuthenticationRequired(boolean)}),</li> * <li>signing/origination at this moment in time (see {@link Builder#setKeyValidityStart(Date)} * and {@link Builder#setKeyValidityForOriginationEnd(Date)}),</li> - * <li>suitable digest or {@link KeyProperties#DIGEST_NONE},</li> - * <li>(RSA keys only) padding scheme {@link KeyProperties#SIGNATURE_PADDING_RSA_PKCS1} or - * {@link KeyProperties#ENCRYPTION_PADDING_NONE}.</li> + * <li>suitable digest,</li> + * <li>(RSA keys only) padding scheme {@link KeyProperties#SIGNATURE_PADDING_RSA_PKCS1}.</li> * </ul> * * <p>NOTE: The key material of the generated symmetric and private keys is not accessible. The key @@ -668,7 +667,8 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { * * <p>For RSA private keys used by TLS/SSL servers to authenticate themselves to clients it * is usually necessary to authorize the use of no/any padding - * ({@link KeyProperties#ENCRYPTION_PADDING_NONE}). This is because RSA decryption is + * ({@link KeyProperties#ENCRYPTION_PADDING_NONE}) and/or PKCS#1 encryption padding + * ({@link KeyProperties#ENCRYPTION_PADDING_RSA_PKCS1}). This is because RSA decryption is * required by some cipher suites, and some stacks request decryption using no padding * whereas others request PKCS#1 padding. * diff --git a/keystore/java/android/security/keystore/KeyProperties.java b/keystore/java/android/security/keystore/KeyProperties.java index 2b49297841de..d6b1cf1da8a2 100644 --- a/keystore/java/android/security/keystore/KeyProperties.java +++ b/keystore/java/android/security/keystore/KeyProperties.java @@ -364,9 +364,6 @@ public abstract class KeyProperties { /** * No encryption padding. - * - * <p><b>NOTE</b>: If a key is authorized to be used with no padding, then it can be used with - * any padding scheme, both for encryption and signing. */ public static final String ENCRYPTION_PADDING_NONE = "NoPadding"; @@ -513,9 +510,6 @@ public abstract class KeyProperties { /** * No digest: sign/authenticate the raw message. - * - * <p><b>NOTE</b>: If a key is authorized to be used with no digest, then it can be used with - * any digest. */ public static final String DIGEST_NONE = "NONE"; diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java index ec0ef24c095d..b71dc8248a1c 100644 --- a/keystore/java/android/security/keystore/KeyProtection.java +++ b/keystore/java/android/security/keystore/KeyProtection.java @@ -386,7 +386,8 @@ public final class KeyProtection implements ProtectionParameter { * * <p>For RSA private keys used by TLS/SSL servers to authenticate themselves to clients it * is usually necessary to authorize the use of no/any padding - * ({@link KeyProperties#ENCRYPTION_PADDING_NONE}). This is because RSA decryption is + * ({@link KeyProperties#ENCRYPTION_PADDING_NONE}) and/or PKCS#1 encryption padding + * ({@link KeyProperties#ENCRYPTION_PADDING_RSA_PKCS1}). This is because RSA decryption is * required by some cipher suites, and some stacks request decryption using no padding * whereas others request PKCS#1 padding. * diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp index 3ebd57b33c81..1e39bfa4b583 100644 --- a/libs/hwui/renderstate/RenderState.cpp +++ b/libs/hwui/renderstate/RenderState.cpp @@ -124,9 +124,15 @@ void RenderState::bindFramebuffer(GLuint fbo) { } void RenderState::invokeFunctor(Functor* functor, DrawGlInfo::Mode mode, DrawGlInfo* info) { - interruptForFunctorInvoke(); - (*functor)(mode, info); - resumeFromFunctorInvoke(); + if (mode == DrawGlInfo::kModeProcessNoContext) { + // If there's no context we don't need to interrupt as there's + // no gl state to save/restore + (*functor)(mode, info); + } else { + interruptForFunctorInvoke(); + (*functor)(mode, info); + resumeFromFunctorInvoke(); + } } void RenderState::interruptForFunctorInvoke() { diff --git a/libs/hwui/renderstate/Stencil.cpp b/libs/hwui/renderstate/Stencil.cpp index 92a057d92c5d..319cfe4ba0d0 100644 --- a/libs/hwui/renderstate/Stencil.cpp +++ b/libs/hwui/renderstate/Stencil.cpp @@ -60,8 +60,14 @@ GLenum Stencil::getLayerStencilFormat() { } void Stencil::clear() { + glStencilMask(0xff); glClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); + + if (mState == kTest) { + // reset to test state, with immutable stencil + glStencilMask(0); + } } void Stencil::enableTest(int incrementThreshold) { @@ -104,17 +110,17 @@ void Stencil::enableDebugTest(GLint value, bool greater) { // We only want to test, let's keep everything glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); mState = kTest; + glStencilMask(0); } void Stencil::enableDebugWrite() { - if (mState != kWrite) { - enable(); - glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff); - // The test always passes so the first two values are meaningless - glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - mState = kWrite; - } + enable(); + glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff); + // The test always passes so the first two values are meaningless + glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + mState = kWrite; + glStencilMask(0xff); } void Stencil::enable() { diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index e472e937316b..6dfb6e811e60 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -229,10 +229,11 @@ void CanvasContext::draw() { SkRect dirty; mDamageAccumulator.finish(&dirty); - if (dirty.isEmpty() && Properties::skipEmptyFrames) { - mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame); - return; - } + // TODO: Re-enable after figuring out cause of b/22592975 +// if (dirty.isEmpty() && Properties::skipEmptyFrames) { +// mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame); +// return; +// } mCurrentFrameInfo->markIssueDrawCommandsStart(); diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index c29ec0de355b..bde3d196c37c 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -54,7 +54,7 @@ import java.util.Arrays; * can be played on a device operating at a sample rate of 48000Hz; the sample rate conversion is * automatically handled by the platform, it will not play at 6x speed. * - * <p>As of API {@link android.os.Build.VERSION_CODES#MNC}, + * <p>As of API {@link android.os.Build.VERSION_CODES#M}, * sample rates up to 192kHz are supported * for <code>AudioRecord</code> and <code>AudioTrack</code>, with sample rate conversion * performed as needed. @@ -99,7 +99,7 @@ import java.util.Arrays; * Floats are efficiently manipulated by modern CPUs, * have greater precision than 24 bit signed integers, * and have greater dynamic range than 32 bit signed integers. - * <code>AudioRecord</code> as of API {@link android.os.Build.VERSION_CODES#MNC} and + * <code>AudioRecord</code> as of API {@link android.os.Build.VERSION_CODES#M} and * <code>AudioTrack</code> as of API {@link android.os.Build.VERSION_CODES#LOLLIPOP} * support <code>ENCODING_PCM_FLOAT</code>. * </li> @@ -123,7 +123,7 @@ import java.util.Arrays; * the samples and their arrangement in the audio frame. They are also used in the endpoint (e.g. * a USB audio interface, a DAC connected to headphones) to specify allowable configurations of a * particular device. - * <br>As of API {@link android.os.Build.VERSION_CODES#MNC}, there are two types of channel masks: + * <br>As of API {@link android.os.Build.VERSION_CODES#M}, there are two types of channel masks: * channel position masks and channel index masks. * * <h5 id="channelPositionMask">Channel position masks</h5> @@ -152,7 +152,7 @@ import java.util.Arrays; * {@link #CHANNEL_OUT_FRONT_RIGHT}. * * <h5 id="channelIndexMask">Channel index masks</h5> - * Channel index masks are introduced in API {@link android.os.Build.VERSION_CODES#MNC}. They allow + * Channel index masks are introduced in API {@link android.os.Build.VERSION_CODES#M}. They allow * the selection of a particular channel from the source or sink endpoint by number, i.e. the first * channel, the second channel, and so forth. This avoids problems with artificially assigning * positions to channels of an endpoint, or figuring what the i<sup>th</sup> position bit is within diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 62810c6f8b5a..8880dad99270 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -27,7 +27,6 @@ import java.util.Collection; import android.annotation.IntDef; import android.annotation.NonNull; -import android.annotation.SystemApi; import android.app.ActivityThread; import android.app.AppOpsManager; import android.content.Context; @@ -1174,9 +1173,12 @@ public class AudioTrack * Poll for a timestamp on demand. * <p> * If you need to track timestamps during initial warmup or after a routing or mode change, - * you should request a new timestamp once per second until the reported timestamps - * show that the audio clock is stable. - * Thereafter, query for a new timestamp approximately once every 10 seconds to once per minute. + * you should request a new timestamp periodically until the reported timestamps + * show that the frame position is advancing, or until it becomes clear that + * timestamps are unavailable for this route. + * <p> + * After the clock is advancing at a stable rate, + * query for a new timestamp approximately once every 10 seconds to once per minute. * Calling this method more often is inefficient. * It is also counter-productive to call this method more often than recommended, * because the short-term differences between successive timestamp reports are not meaningful. @@ -1199,6 +1201,11 @@ public class AudioTrack * In the case that no timestamp is available, any supplied instance is left unaltered. * A timestamp may be temporarily unavailable while the audio clock is stabilizing, * or during and immediately after a route change. + * A timestamp is permanently unavailable for a given route if the route does not support + * timestamps. In this case, the approximate frame position can be obtained + * using {@link #getPlaybackHeadPosition}. + * However, it may be useful to continue to query for + * timestamps occasionally, to recover after a route change. */ // Add this text when the "on new timestamp" API is added: // Use if you need to get the most recent timestamp outside of the event callback handler. @@ -1409,7 +1416,7 @@ public class AudioTrack * <br> * If looping is currently enabled and the new position is greater than or equal to the * loop end marker, the behavior varies by API level: - * as of {@link android.os.Build.VERSION_CODES#MNC}, + * as of {@link android.os.Build.VERSION_CODES#M}, * the looping is first disabled and then the position is set. * For earlier API levels, the behavior is unspecified. * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, @@ -1446,7 +1453,7 @@ public class AudioTrack * {@link #ERROR_BAD_VALUE} is returned. * The loop range is the interval [startInFrames, endInFrames). * <br> - * As of {@link android.os.Build.VERSION_CODES#MNC}, the position is left unchanged, + * As of {@link android.os.Build.VERSION_CODES#M}, the position is left unchanged, * unless it is greater than or equal to the loop end marker, in which case * it is forced to the loop start marker. * For earlier API levels, the effect on position is unspecified. @@ -2077,7 +2084,7 @@ public class AudioTrack * The track must be stopped or paused, and * the track's creation mode must be {@link #MODE_STATIC}. * <p> - * As of {@link android.os.Build.VERSION_CODES#MNC}, also resets the value returned by + * As of {@link android.os.Build.VERSION_CODES#M}, also resets the value returned by * {@link #getPlaybackHeadPosition()} to zero. * For earlier API levels, the reset behavior is unspecified. * <p> diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 5f60891cef51..6c224e5c35e6 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -21,12 +21,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.graphics.ImageFormat; import android.graphics.Rect; -import android.media.Image; -import android.media.MediaCodecInfo; +import android.graphics.SurfaceTexture; import android.media.MediaCodecInfo.CodecCapabilities; -import android.media.MediaCodecList; -import android.media.MediaCrypto; -import android.media.MediaFormat; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -37,6 +33,7 @@ import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.ReadOnlyBufferException; import java.util.Arrays; import java.util.HashMap; @@ -233,8 +230,9 @@ import java.util.Map; data and submit it as a single codec-config buffer. <p> Android uses the following codec-specific data buffers. These are also required to be set in - the track format for proper {@link MediaMuxer} track configuration. Each parameter set and - codec-specific-data must start with a start code of {@code "\x00\x00\x00\x01"}. + the track format for proper {@link MediaMuxer} track configuration. Each parameter set and the + codec-specific-data sections marked with (<sup>*</sup>) must start with a start code of + {@code "\x00\x00\x00\x01"}. <p> <style>td.NA { background: #ccc; } .mid > tr > td { vertical-align: middle; }</style> <table> @@ -242,28 +240,48 @@ import java.util.Map; <th>Format</th> <th>CSD buffer #0</th> <th>CSD buffer #1</th> + <th>CSD buffer #2</th> </thead> <tbody class=mid> <tr> <td>AAC</td> - <td>Decoder-specific information from ESDS</td> + <td>Decoder-specific information from ESDS<sup>*</sup></td> <td class=NA>Not Used</td> + <td class=NA>Not Used</td> + </tr> + <tr> + <td>VORBIS</td> + <td>Identification header</td> + <td>Setup header</td> + <td class=NA>Not Used</td> + </tr> + <tr> + <td>OPUS</td> + <td>Identification header</td> + <td>Pre-skip in nanosecs<br> + (unsigned 64-bit {@linkplain ByteOrder#nativeOrder native-order} integer.)<br> + This overrides the pre-skip value in the identification header.</td> + <td>Seek Pre-roll in nanosecs<br> + (unsigned 64-bit {@linkplain ByteOrder#nativeOrder native-order} integer.)</td> </tr> <tr> <td>MPEG-4</td> - <td>Decoder-specific information from ESDS</td> + <td>Decoder-specific information from ESDS<sup>*</sup></td> + <td class=NA>Not Used</td> <td class=NA>Not Used</td> </tr> <tr> <td>H.264 AVC</td> - <td>SPS (Sequence Parameter Sets)</td> - <td>PPS (Picture Parameter Sets)</td> + <td>SPS (Sequence Parameter Sets<sup>*</sup>)</td> + <td>PPS (Picture Parameter Sets<sup>*</sup>)</td> + <td class=NA>Not Used</td> </tr> <tr> <td>H.265 HEVC</td> - <td>VPS (Video Parameter Sets) +<br> - SPS (Sequence Parameter Sets) +<br> - PPS (Picture Parameter Sets)</td> + <td>VPS (Video Parameter Sets<sup>*</sup>) +<br> + SPS (Sequence Parameter Sets<sup>*</sup>) +<br> + PPS (Picture Parameter Sets<sup>*</sup>)</td> + <td class=NA>Not Used</td> <td class=NA>Not Used</td> </tr> </tbody> @@ -302,10 +320,10 @@ import java.util.Map; releaseOutputBuffer} methods to return the buffer to the codec. <p> While you are not required to resubmit/release buffers immediately to the codec, holding onto - input and/or output buffers may stall the codec, and this behavior is device dependent. E.g. it - is possible that a codec may hold off on generating output buffers until all outstanding buffers - have been released/resubmitted. Therefore, try to hold onto to available buffers as little as - possible. + input and/or output buffers may stall the codec, and this behavior is device dependent. + <strong>Specifically, it is possible that a codec may hold off on generating output buffers until + <em>all</em> outstanding buffers have been released/resubmitted.</strong> Therefore, try to + hold onto to available buffers as little as possible. <p> Depending on the API version, you can process data in three ways: <table> @@ -351,7 +369,7 @@ import java.util.Map; <p> MediaCodec is typically used like this in asynchronous mode: <pre class=prettyprint> - MediaCodec codec = MediaCodec.createCodecByName(name); + MediaCodec codec = MediaCodec.createByCodecName(name); MediaFormat mOutputFormat; // member variable codec.setCallback(new MediaCodec.Callback() { {@literal @Override} @@ -408,7 +426,7 @@ import java.util.Map; <p> MediaCodec is typically used like this in synchronous mode: <pre> - MediaCodec codec = MediaCodec.createCodecByName(name); + MediaCodec codec = MediaCodec.createByCodecName(name); codec.configure(format, …); MediaFormat outputFormat = codec.getOutputFormat(); // option B codec.start(); @@ -447,7 +465,7 @@ import java.util.Map; between the size of the arrays and the number of input and output buffers used by the system, although the array size provides an upper bound. <pre> - MediaCodec codec = MediaCodec.createCodecByName(name); + MediaCodec codec = MediaCodec.createByCodecName(name); codec.configure(format, …); codec.start(); ByteBuffer[] inputBuffers = codec.getInputBuffers(); @@ -510,11 +528,11 @@ import java.util.Map; #releaseOutputBuffer(int, long) releaseOutputBuffer(bufferId, timestamp)}.</li> </ul> <p> - Since {@link android.os.Build.VERSION_CODES#MNC}, the default timestamp is the {@linkplain + Since {@link android.os.Build.VERSION_CODES#M}, the default timestamp is the {@linkplain BufferInfo#presentationTimeUs presentation timestamp} of the buffer (converted to nanoseconds). It was not defined prior to that. <p> - Also since {@link android.os.Build.VERSION_CODES#MNC}, you can change the output Surface + Also since {@link android.os.Build.VERSION_CODES#M}, you can change the output Surface dynamically using {@link #setOutputSurface setOutputSurface}. <h4>Using an Input Surface</h4> @@ -648,10 +666,10 @@ import java.util.Map; class. For API version numbers, see {@link android.os.Build.VERSION_CODES}. <style> - .api > tr > th, td { text-align: center; padding: 4px 4px; } + .api > tr > th, .api > tr > td { text-align: center; padding: 4px 4px; } .api > tr > th { vertical-align: bottom; } .api > tr > td { vertical-align: middle; } - .sml > tr > th, td { text-align: center; padding: 2px 4px; } + .sml > tr > th, .sml > tr > td { text-align: center; padding: 2px 4px; } .fn { text-align: left; } .fn > code > a { font: 14px/19px Roboto Condensed, sans-serif; } .deg45 { @@ -1566,7 +1584,7 @@ final public class MediaCodec { private boolean mHasSurface = false; /** - * Instantiate a decoder supporting input data of the given mime type. + * Instantiate the preferred decoder supporting input data of the given mime type. * * The following is a partial list of defined mime types and their semantics: * <ul> @@ -1585,6 +1603,10 @@ final public class MediaCodec { * <li>"audio/g711-mlaw" - G.711 ulaw audio * </ul> * + * <strong>Note:</strong> It is preferred to use {@link MediaCodecList#findDecoderForFormat} + * and {@link #createByCodecName} to ensure that the resulting codec can handle a + * given format. + * * @param type The mime type of the input data. * @throws IOException if the codec cannot be created. * @throws IllegalArgumentException if type is not a valid mime type. @@ -1597,7 +1619,12 @@ final public class MediaCodec { } /** - * Instantiate an encoder supporting output data of the given mime type. + * Instantiate the preferred encoder supporting output data of the given mime type. + * + * <strong>Note:</strong> It is preferred to use {@link MediaCodecList#findEncoderForFormat} + * and {@link #createByCodecName} to ensure that the resulting codec can handle a + * given format. + * * @param type The desired mime type of the output data. * @throws IOException if the codec cannot be created. * @throws IllegalArgumentException if type is not a valid mime type. @@ -1666,6 +1693,8 @@ final public class MediaCodec { private native final void native_reset(); /** + * Free up resources used by the codec instance. + * * Make sure you call this when you're done to free up any opened * component instance instead of relying on the garbage collector * to do this for you at some point in the future. @@ -1886,17 +1915,25 @@ final public class MediaCodec { private native final void native_stop(); /** - * Flush both input and output ports of the component, all indices - * previously returned in calls to {@link #dequeueInputBuffer} and - * {@link #dequeueOutputBuffer} become invalid. + * Flush both input and output ports of the component. * <p> - * If codec is configured in asynchronous mode, call {@link #start} - * after {@code flush} has returned to resume codec operations. The - * codec will not request input buffers until this has happened. + * Upon return, all indices previously returned in calls to {@link #dequeueInputBuffer + * dequeueInputBuffer} and {@link #dequeueOutputBuffer dequeueOutputBuffer} — or obtained + * via {@link Callback#onInputBufferAvailable onInputBufferAvailable} or + * {@link Callback#onOutputBufferAvailable onOutputBufferAvailable} callbacks — become + * invalid, and all buffers are owned by the codec. * <p> - * If codec is configured in synchronous mode, codec will resume - * automatically if an input surface was created. Otherwise, it - * will resume when {@link #dequeueInputBuffer} is called. + * If the codec is configured in asynchronous mode, call {@link #start} + * after {@code flush} has returned to resume codec operations. The codec + * will not request input buffers until this has happened. + * <strong>Note, however, that there may still be outstanding {@code onOutputBufferAvailable} + * callbacks that were not handled prior to calling {@code flush}. + * The indices returned via these callbacks also become invalid upon calling {@code flush} and + * should be discarded.</strong> + * <p> + * If the codec is configured in synchronous mode, codec will resume + * automatically if it is configured with an input surface. Otherwise, it + * will resume when {@link #dequeueInputBuffer dequeueInputBuffer} is called. * * @throws IllegalStateException if not in the Executing state. * @throws MediaCodec.CodecException upon codec error. @@ -2087,6 +2124,15 @@ final public class MediaCodec { * To indicate that this is the final piece of input data (or rather that * no more input data follows unless the decoder is subsequently flushed) * specify the flag {@link #BUFFER_FLAG_END_OF_STREAM}. + * <p class=note> + * <strong>Note:</strong> Prior to {@link android.os.Build.VERSION_CODES#M}, + * {@code presentationTimeUs} was not propagated to the frame timestamp of (rendered) + * Surface output buffers, and the resulting frame timestamp was undefined. + * Use {@link #releaseOutputBuffer(int, long)} to ensure a specific frame timestamp is set. + * Similarly, since frame timestamps can be used by the destination surface for rendering + * synchronization, <strong>care must be taken to normalize presentationTimeUs so as to not be + * mistaken for a system time. (See {@linkplain #releaseOutputBuffer(int, long) + * SurfaceView specifics}).</strong> * * @param index The index of a client-owned input buffer previously returned * in a call to {@link #dequeueInputBuffer}. @@ -2094,7 +2140,10 @@ final public class MediaCodec { * @param size The number of bytes of valid input data. * @param presentationTimeUs The presentation timestamp in microseconds for this * buffer. This is normally the media time at which this - * buffer should be presented (rendered). + * buffer should be presented (rendered). When using an output + * surface, this will be propagated as the {@link + * SurfaceTexture#getTimestamp timestamp} for the frame (after + * conversion to nanoseconds). * @param flags A bitmask of flags * {@link #BUFFER_FLAG_CODEC_CONFIG} and {@link #BUFFER_FLAG_END_OF_STREAM}. * While not prohibited, most codecs do not use the @@ -2207,8 +2256,10 @@ final public class MediaCodec { }; /** - * Similar to {@link #queueInputBuffer} but submits a buffer that is + * Similar to {@link #queueInputBuffer queueInputBuffer} but submits a buffer that is * potentially encrypted. + * <strong>Check out further notes at {@link #queueInputBuffer queueInputBuffer}.</strong> + * * @param index The index of a client-owned input buffer previously returned * in a call to {@link #dequeueInputBuffer}. * @param offset The byte offset into the input buffer at which the data starts. @@ -2315,7 +2366,7 @@ final public class MediaCodec { /** * Dequeue an output buffer, block at most "timeoutUs" microseconds. * Returns the index of an output buffer that has been successfully - * decoded or one of the INFO_* constants below. + * decoded or one of the INFO_* constants. * @param info Will be filled with buffer meta data. * @param timeoutUs The timeout in microseconds, a negative timeout indicates "infinite". * @throws IllegalStateException if not in the Executing state, @@ -2343,9 +2394,11 @@ final public class MediaCodec { @NonNull BufferInfo info, long timeoutUs); /** - * If you are done with a buffer, use this call to return the buffer to - * the codec. If you previously specified a surface when configuring this - * video decoder you can optionally render the buffer. + * If you are done with a buffer, use this call to return the buffer to the codec + * or to render it on the output surface. If you configured the codec with an + * output surface, setting {@code render} to {@code true} will first send the buffer + * to that output surface. The surface will release the buffer back to the codec once + * it is no longer used/displayed. * * Once an output buffer is released to the codec, it MUST NOT * be used until it is later retrieved by {@link #getOutputBuffer} in response @@ -2679,6 +2732,8 @@ final public class MediaCodec { * <b>Note:</b> As of API 21, dequeued input buffers are * automatically {@link java.nio.Buffer#clear cleared}. * + * <em>Do not use this method if using an input surface.</em> + * * @throws IllegalStateException if not in the Executing state, * or codec is configured in asynchronous mode. * @throws MediaCodec.CodecException upon codec error. @@ -2708,6 +2763,8 @@ final public class MediaCodec { * buffers that are dequeued will be set to the valid data * range. * + * <em>Do not use this method if using an output surface.</em> + * * @throws IllegalStateException if not in the Executing state, * or codec is configured in asynchronous mode. * @throws MediaCodec.CodecException upon codec error. @@ -2993,6 +3050,10 @@ final public class MediaCodec { /** * Called when an output frame has rendered on the output surface. + * <p> + * <strong>Note:</strong> This callback is for informational purposes only: to get precise + * render timing samples, and can be significantly delayed and batched. Some frames may have + * been rendered even if there was no callback generated. * * @param codec the MediaCodec instance * @param presentationTimeUs the presentation time (media time) of the frame rendered. @@ -3009,10 +3070,14 @@ final public class MediaCodec { } /** - * Register a callback to be invoked when an output frame is rendered on the output surface. + * Registers a callback to be invoked when an output frame is rendered on the output surface. * <p> * This method can be called in any codec state, but will only have an effect in the * Executing state for codecs that render buffers to the output surface. + * <p> + * <strong>Note:</strong> This callback is for informational purposes only: to get precise + * render timing samples, and can be significantly delayed and batched. Some frames may have + * been rendered even if there was no callback generated. * * @param listener the callback that will be run * @param handler the callback will be run on the handler's thread. If {@code null}, diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 76d36a09b592..41019357a0e4 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -525,6 +525,14 @@ public final class MediaCodecInfo { /** * Query whether codec supports a given {@link MediaFormat}. + * + * <p class=note> + * <strong>Note:</strong> On {@link android.os.Build.VERSION_CODES#LOLLIPOP}, + * {@code format} must not contain a {@linkplain MediaFormat#KEY_FRAME_RATE + * frame rate}. Use + * <code class=prettyprint>format.setString(MediaFormat.KEY_FRAME_RATE, null)</code> + * to clear any existing frame rate setting in the format. + * * @param format media format with optional feature directives. * @throws IllegalArgumentException if format is not a valid media format. * @return whether the codec capabilities support the given format @@ -1198,15 +1206,20 @@ public final class MediaCodecInfo { (double) mFrameRateRange.getUpper())); } + private int getBlockCount(int width, int height) { + return Utils.divUp(width, mBlockWidth) * Utils.divUp(height, mBlockHeight); + } + @NonNull private Size findClosestSize(int width, int height) { - int targetPixels = width * height; + int targetBlockCount = getBlockCount(width, height); Size closestSize = null; - int mimPixelsDiff = Integer.MAX_VALUE; + int minDiff = Integer.MAX_VALUE; for (Size size : mMeasuredFrameRates.keySet()) { - int pixelsDiff = Math.abs(targetPixels - size.getWidth() * size.getHeight()); - if (pixelsDiff < mimPixelsDiff) { - mimPixelsDiff = pixelsDiff; + int diff = Math.abs(targetBlockCount - + getBlockCount(size.getWidth(), size.getHeight())); + if (diff < minDiff) { + minDiff = diff; closestSize = size; } } @@ -1216,7 +1229,7 @@ public final class MediaCodecInfo { private Range<Double> estimateFrameRatesFor(int width, int height) { Size size = findClosestSize(width, height); Range<Long> range = mMeasuredFrameRates.get(size); - Double ratio = (double)(width * height) / (size.getWidth() * size.getHeight()); + Double ratio = (double)(size.getWidth() * size.getHeight()) / (width * height); return Range.create(range.getLower() * ratio, range.getUpper() * ratio); } @@ -1225,8 +1238,22 @@ public final class MediaCodecInfo { * May return {@code null}, if the codec did not publish any measurement * data. * <p> - * This is a performance estimate, based on full-speed decoding - * and encoding measurements of common video sizes supported by the codec. + * This is a performance estimate provided by the device manufacturer + * based on full-speed decoding and encoding measurements in various configurations + * of common video sizes supported by the codec. As such it should only be used to + * compare individual codecs on the device. The value is not suitable for comparing + * different devices or even different android releases for the same device. + * <p> + * The returned range corresponds to the fastest frame rates achieved in the tested + * configurations. It is interpolated from the nearest frame size(s) tested. Codec + * performance is severely impacted by other activity on the device, and can vary + * significantly. + * <p class=note> + * Use this method in cases where only codec performance matters, e.g. to evaluate if + * a codec has any chance of meeting a performance target. Codecs are listed + * in {@link MediaCodecList} in the preferred order as defined by the device + * manufacturer. As such, applications should use the first suitable codec in the + * list to achieve the best balance between power use and performance. * * @param width the width of the video * @param height the height of the video diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java index f44e048397d4..cd7b3d35a590 100644 --- a/media/java/android/media/MediaCodecList.java +++ b/media/java/android/media/MediaCodecList.java @@ -190,6 +190,13 @@ final public class MediaCodecList { * Find a decoder supporting a given {@link MediaFormat} in the list * of media-codecs. * + * <p class=note> + * <strong>Note:</strong> On {@link android.os.Build.VERSION_CODES#LOLLIPOP}, + * {@code format} must not contain a {@linkplain MediaFormat#KEY_FRAME_RATE + * frame rate}. Use + * <code class=prettyprint>format.setString(MediaFormat.KEY_FRAME_RATE, null)</code> + * to clear any existing frame rate setting in the format. + * * @param format A decoder media format with optional feature directives. * @throws IllegalArgumentException if format is not a valid media format. * @throws NullPointerException if format is null. @@ -204,6 +211,13 @@ final public class MediaCodecList { * Find an encoder supporting a given {@link MediaFormat} in the list * of media-codecs. * + * <p class=note> + * <strong>Note:</strong> On {@link android.os.Build.VERSION_CODES#LOLLIPOP}, + * {@code format} must not contain a {@linkplain MediaFormat#KEY_FRAME_RATE + * frame rate}. Use + * <code class=prettyprint>format.setString(MediaFormat.KEY_FRAME_RATE, null)</code> + * to clear any existing frame rate setting in the format. + * * @param format An encoder media format with optional feature directives. * @throws IllegalArgumentException if format is not a valid media format. * @throws NullPointerException if format is null. diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index 9e9d60283ddf..c2bcd930dd29 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -52,7 +52,8 @@ public class Ringtone { MediaStore.Audio.Media.TITLE }; /** Selection that limits query results to just audio files */ - private static final String MEDIA_SELECTION = MediaColumns.MIME_TYPE + " LIKE 'audio/%'"; + private static final String MEDIA_SELECTION = MediaColumns.MIME_TYPE + " LIKE 'audio/%' OR " + + MediaColumns.MIME_TYPE + " IN ('application/ogg', 'application/x-flac')"; // keep references on active Ringtones until stopped or completion listener called. private static final ArrayList<Ringtone> sActiveRingtones = new ArrayList<Ringtone>(); diff --git a/media/java/android/media/midi/MidiDevice.java b/media/java/android/media/midi/MidiDevice.java index 93fb6d2960da..e1990cd6fbbb 100644 --- a/media/java/android/media/midi/MidiDevice.java +++ b/media/java/android/media/midi/MidiDevice.java @@ -113,8 +113,13 @@ public final class MidiDevice implements Closeable { /** * Called to open a {@link MidiInputPort} for the specified port number. * + * An input port can only be used by one sender at a time. + * Opening an input port will fail if another application has already opened it for use. + * A {@link MidiDeviceStatus} can be used to determine if an input port is already open. + * * @param portNumber the number of the input port to open - * @return the {@link MidiInputPort} + * @return the {@link MidiInputPort} if the open is successful, + * or null in case of failure. */ public MidiInputPort openInputPort(int portNumber) { try { @@ -133,8 +138,11 @@ public final class MidiDevice implements Closeable { /** * Called to open a {@link MidiOutputPort} for the specified port number. * + * An output port may be opened by multiple applications. + * * @param portNumber the number of the output port to open - * @return the {@link MidiOutputPort} + * @return the {@link MidiOutputPort} if the open is successful, + * or null in case of failure. */ public MidiOutputPort openOutputPort(int portNumber) { try { diff --git a/media/java/android/media/midi/package.html b/media/java/android/media/midi/package.html index 673c4ba9bfeb..7baa5bc42bd2 100644 --- a/media/java/android/media/midi/package.html +++ b/media/java/android/media/midi/package.html @@ -31,7 +31,7 @@ capabilities, etc.</li> <li> Timestamps to avoid jitter.</li> <li> Support creation of <em>virtual MIDI devices</em> that can be connected to other devices. An example might be a synthesizer app that can be controlled by a composing app.</li> - <li> Support direction connection or “patching” of devices for lower latency.</li> + <li> Support direct connection or “patching” of devices for lower latency.</li> </ul> <h2 id=transports_supported>Transports Supported</h2> @@ -75,6 +75,18 @@ Then the app will not appear in the Play Store for old devices that do not suppo <uses-feature android:name="android.software.midi" android:required="true"/> </pre> +<h2 id=check_feature>Check for Feature Support</h2> + +<p>An app can also check at run-time whether the MIDI feature is supported on a platform. +This is particularly useful during development when you install apps directly on a device. +</p> + +<pre class=prettyprint> +if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) { + // do MIDI stuff +} +</pre> + <h2 id=the_midimanager>The MidiManager</h2> @@ -338,5 +350,54 @@ public class MidiSynthDeviceService extends MidiDeviceService { } } </pre> + +<h1 id=using_midi_btle>Using MIDI Over Bluetooth LE</h1> + +<p>MIDI devices can be connected to Android using Bluetooth LE.</p> + +<p>Before using the device, the app must scan for available BTLE devices and then allow +the user to connect. An example program +will be provided so look for it on the Android developer website.</p> + +<h2 id=btle_location_permissions>Request Location Permission for BTLE</h2> + +<p>Applications that scan for Bluetooth devices must request permission in the +manifest file. This LOCATION permission is required because it may be possible to +guess the location of an Android device by seeing which BTLE devices are nearby.</p> + +<pre class=prettyprint> +<uses-permission android:name="android.permission.BLUETOOTH"/> +<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> +<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> +</pre> + +<p>Apps must also request location permission from the user at run-time. +See the documentation for <code>Activity.requestPermissions()</code> for details and an example. +</p> + +<h2 id=btle_scan_devices>Scan for MIDI Devices</h2> + +<p>The app will only want to see MIDI devices and not mice or other non-MIDI devices. +So construct a ScanFilter using the UUID for standard MIDI over BTLE.</p> + +<pre class=prettyprint> +MIDI over BTLE UUID = "03B80E5A-EDE8-4B33-A751-6CE34EC4C700" +</pre> + +<h2 id=btle_open_device>Open a MIDI Bluetooth Device</h2> + +<p>See the documentation for <code>android.bluetooth.le.BluetoothLeScanner.startScan()</code> +method for details. When the user selects a MIDI/BTLE device then you can open it +using the MidiManager.</p> + +<pre class=prettyprint> +m.openBluetoothDevice(bluetoothDevice, callback, handler); +</pre> + +<p>Once the MIDI/BTLE device has been opened by one app then it will also become available to other +apps using the +<a href="#get_list_of_already_plugged_in_entities">MIDI device discovery calls described above</a>. +</p> + </body> </html> diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 4f0c6a414c39..393771a9b447 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -162,7 +162,11 @@ public class ExternalStorageProvider extends DocumentsProvider { if (volume.getType() == VolumeInfo.TYPE_PUBLIC) { root.flags |= Root.FLAG_HAS_SETTINGS; } - root.visiblePath = volume.getPathForUser(userId); + if (volume.isVisibleForRead(userId)) { + root.visiblePath = volume.getPathForUser(userId); + } else { + root.visiblePath = null; + } root.path = volume.getInternalPathForUser(userId); root.docId = getDocIdForFile(root.path); diff --git a/packages/Keyguard/res/layout/keyguard_pattern_view.xml b/packages/Keyguard/res/layout/keyguard_pattern_view.xml index 09c01de8d477..ccb9af9ff731 100644 --- a/packages/Keyguard/res/layout/keyguard_pattern_view.xml +++ b/packages/Keyguard/res/layout/keyguard_pattern_view.xml @@ -63,9 +63,6 @@ android:layout_marginStart="8dip" android:layout_gravity="center_horizontal" android:gravity="center" - android:contentDescription="@string/keyguard_accessibility_pattern_area" - android:focusable="true" - android:focusableInTouchMode="true" android:clipChildren="false" android:clipToPadding="false" /> diff --git a/packages/Keyguard/res/values/strings.xml b/packages/Keyguard/res/values/strings.xml index 748129c3c2fd..cba122f3c8bd 100644 --- a/packages/Keyguard/res/values/strings.xml +++ b/packages/Keyguard/res/values/strings.xml @@ -101,7 +101,7 @@ <!-- Accessibility description of the password lock. [CHAR_LIMIT=none] --> <string name="keyguard_accessibility_password_unlock">Password unlock.</string> <!-- Accessibility description of the unlock pattern area. [CHAR_LIMIT=none] --> - <string name="keyguard_accessibility_pattern_area">Pattern area.</string> + <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">Pattern area.</string> <!-- Accessibility description of the unlock slide area. [CHAR_LIMIT=none] --> <string name="keyguard_accessibility_slide_area">Slide area.</string> <!-- Accessibility description of the PIN password view. [CHAR_LIMIT=none] --> diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java index e89caf776955..159ac4cc6cbd 100644 --- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java +++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java @@ -23,7 +23,6 @@ import java.util.Objects; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.res.Resources; import android.content.res.TypedArray; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; @@ -59,11 +58,11 @@ public class CarrierText extends TextView { updateCarrierText(); } - public void onScreenTurnedOff(int why) { + public void onFinishedGoingToSleep(int why) { setSelected(false); }; - public void onScreenTurnedOn() { + public void onStartedWakingUp() { setSelected(true); }; }; @@ -193,8 +192,8 @@ public class CarrierText extends TextView { super.onFinishInflate(); mSeparator = getResources().getString( com.android.internal.R.string.kg_text_message_separator); - final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); - setSelected(screenOn); // Allow marquee to work. + boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); + setSelected(shouldMarquee); // Allow marquee to work. } @Override diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 0c6837fcc60c..8f792de32db9 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -53,15 +53,18 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout super(context, attrs); } + @Override public void setKeyguardCallback(KeyguardSecurityCallback callback) { mCallback = callback; } + @Override public void setLockPatternUtils(LockPatternUtils utils) { mLockPatternUtils = utils; mEnableHaptics = mLockPatternUtils.isTactileFeedbackEnabled(); } + @Override public void reset() { // start fresh resetPasswordText(false /* animate */); @@ -95,6 +98,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout } } + @Override public void onEmergencyButtonClickedWhenInCall() { mCallback.reset(); } @@ -115,11 +119,11 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout mPendingLockCheck.cancel(false); } - if (entry.length() < MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT) { + if (entry.length() <= MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT) { // to avoid accidental lockout, only count attempts that are long enough to be a // real password. This may require some tweaking. setPasswordEntryInputEnabled(true); - onPasswordChecked(entry, false, 0); + onPasswordChecked(false /* matched */, 0, false /* not valid - too short */); return; } @@ -132,24 +136,27 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout public void onChecked(boolean matched, int timeoutMs) { setPasswordEntryInputEnabled(true); mPendingLockCheck = null; - onPasswordChecked(entry, matched, timeoutMs); + onPasswordChecked(matched, timeoutMs, true /* isValidPassword */); } }); } - private void onPasswordChecked(String entry, boolean matched, int timeoutMs) { + private void onPasswordChecked(boolean matched, int timeoutMs, boolean isValidPassword) { if (matched) { mCallback.reportUnlockAttempt(true, 0); mCallback.dismiss(true); } else { - mCallback.reportUnlockAttempt(false, timeoutMs); - int attempts = KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(); - if (timeoutMs > 0) { - long deadline = mLockPatternUtils.setLockoutAttemptDeadline( - KeyguardUpdateMonitor.getCurrentUser(), timeoutMs); - handleAttemptLockout(deadline); + if (isValidPassword) { + mCallback.reportUnlockAttempt(false, timeoutMs); + if (timeoutMs > 0) { + long deadline = mLockPatternUtils.setLockoutAttemptDeadline( + KeyguardUpdateMonitor.getCurrentUser(), timeoutMs); + handleAttemptLockout(deadline); + } + } + if (timeoutMs == 0) { + mSecurityMessageDisplay.setMessage(getWrongPasswordStringId(), true); } - mSecurityMessageDisplay.setMessage(getWrongPasswordStringId(), true); } resetPasswordText(true /* animate */); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java b/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java index 301b171c2fe5..2951af915ff8 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java @@ -58,10 +58,10 @@ class KeyguardMessageArea extends TextView implements SecurityMessageDisplay { }; private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { - public void onScreenTurnedOff(int why) { + public void onFinishedGoingToSleep(int why) { setSelected(false); }; - public void onScreenTurnedOn() { + public void onStartedWakingUp() { setSelected(true); }; }; @@ -126,8 +126,8 @@ class KeyguardMessageArea extends TextView implements SecurityMessageDisplay { @Override protected void onFinishInflate() { - final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); - setSelected(screenOn); // This is required to ensure marquee works + boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); + setSelected(shouldMarquee); // This is required to ensure marquee works } private void securityMessageChanged(CharSequence message) { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java index b000e26a7658..4bd1a2ed29fc 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java @@ -82,6 +82,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit * Useful for clearing out the wrong pattern after a delay */ private Runnable mCancelPatternRunnable = new Runnable() { + @Override public void run() { mLockPatternView.clearPattern(); } @@ -117,10 +118,12 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit R.dimen.disappear_y_translation); } + @Override public void setKeyguardCallback(KeyguardSecurityCallback callback) { mCallback = callback; } + @Override public void setLockPatternUtils(LockPatternUtils utils) { mLockPatternUtils = utils; } @@ -153,6 +156,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit } } + @Override public void onEmergencyButtonClickedWhenInCall() { mCallback.reset(); } @@ -174,6 +178,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit return result; } + @Override public void reset() { // reset lock pattern mLockPatternView.enableInput(); @@ -207,18 +212,22 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit private class UnlockPatternListener implements LockPatternView.OnPatternListener { + @Override public void onPatternStart() { mLockPatternView.removeCallbacks(mCancelPatternRunnable); mSecurityMessageDisplay.setMessage("", false); } + @Override public void onPatternCleared() { } + @Override public void onPatternCellAdded(List<LockPatternView.Cell> pattern) { mCallback.userActivity(); } + @Override public void onPatternDetected(final List<LockPatternView.Cell> pattern) { mLockPatternView.disableInput(); if (mPendingLockCheck != null) { @@ -227,7 +236,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit if (pattern.size() < LockPatternUtils.MIN_PATTERN_REGISTER_FAIL) { mLockPatternView.enableInput(); - onPatternChecked(pattern, false, 0); + onPatternChecked(false, 0, false /* not valid - too short */); return; } @@ -240,29 +249,30 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit public void onChecked(boolean matched, int timeoutMs) { mLockPatternView.enableInput(); mPendingLockCheck = null; - onPatternChecked(pattern, matched, timeoutMs); + onPatternChecked(matched, timeoutMs, true); } }); + if (pattern.size() > MIN_PATTERN_BEFORE_POKE_WAKELOCK) { + mCallback.userActivity(); + } } - private void onPatternChecked(List<LockPatternView.Cell> pattern, boolean matched, - int timeoutMs) { + private void onPatternChecked(boolean matched, int timeoutMs, boolean isValidPattern) { if (matched) { mCallback.reportUnlockAttempt(true, 0); mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); mCallback.dismiss(true); } else { - if (pattern.size() > MIN_PATTERN_BEFORE_POKE_WAKELOCK) { - mCallback.userActivity(); - } mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); - mCallback.reportUnlockAttempt(false, timeoutMs); - int attempts = mKeyguardUpdateMonitor.getFailedUnlockAttempts(); - if (timeoutMs > 0) { - long deadline = mLockPatternUtils.setLockoutAttemptDeadline( - KeyguardUpdateMonitor.getCurrentUser(), timeoutMs); - handleAttemptLockout(deadline); - } else { + if (isValidPattern) { + mCallback.reportUnlockAttempt(false, timeoutMs); + if (timeoutMs > 0) { + long deadline = mLockPatternUtils.setLockoutAttemptDeadline( + KeyguardUpdateMonitor.getCurrentUser(), timeoutMs); + handleAttemptLockout(deadline); + } + } + if (timeoutMs == 0) { mSecurityMessageDisplay.setMessage(R.string.kg_wrong_pattern, true); mLockPatternView.postDelayed(mCancelPatternRunnable, PATTERN_CLEAR_TIMEOUT_MS); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java index 4e9621af0876..f95b0aebfd70 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java @@ -67,12 +67,12 @@ public class KeyguardStatusView extends GridLayout { } @Override - public void onScreenTurnedOn() { + public void onStartedWakingUp() { setEnableMarquee(true); } @Override - public void onScreenTurnedOff(int why) { + public void onFinishedGoingToSleep(int why) { setEnableMarquee(false); } @@ -113,8 +113,8 @@ public class KeyguardStatusView extends GridLayout { mClockView.setShowCurrentUserTime(true); mOwnerInfo = (TextView) findViewById(R.id.owner_info); - final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); - setEnableMarquee(screenOn); + boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); + setEnableMarquee(shouldMarquee); refresh(); updateOwnerInfo(); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index ec185eb760ee..c7adc986565f 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -102,6 +102,23 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { = "com.android.facelock.FACE_UNLOCK_STOPPED"; private static final String FINGERPRINT_WAKE_LOCK_NAME = "wake-and-unlock wakelock"; + /** + * Mode in which we don't need to wake up the device when we get a fingerprint. + */ + private static final int FP_WAKE_NONE = 0; + + /** + * Mode in which we wake up the device, and directly dismiss Keyguard. Active when we acquire + * a fingerprint while the screen is off and the device was sleeping. + */ + private static final int FP_WAKE_DIRECT_UNLOCK = 1; + + /** + * Mode in which we wake up the device, but play the normal dismiss animation. Active when we + * acquire a fingerprint pulsing in doze mode. + * */ + private static final int FP_WAKE_WAKE_TO_BOUNCER = 2; + // Callback messages private static final int MSG_TIME_UPDATE = 301; private static final int MSG_BATTERY_UPDATE = 302; @@ -117,8 +134,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_USER_SWITCH_COMPLETE = 314; private static final int MSG_USER_INFO_CHANGED = 317; private static final int MSG_REPORT_EMERGENCY_CALL_ACTION = 318; - private static final int MSG_SCREEN_TURNED_ON = 319; - private static final int MSG_SCREEN_TURNED_OFF = 320; + private static final int MSG_STARTED_WAKING_UP = 319; + private static final int MSG_FINISHED_GOING_TO_SLEEP = 320; private static final int MSG_KEYGUARD_BOUNCER_CHANGED = 322; private static final int MSG_FACE_UNLOCK_STATE_CHANGED = 327; private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 328; @@ -155,6 +172,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mSwitchingUser; + private boolean mDeviceInteractive; private boolean mScreenOn; private SubscriptionManager mSubscriptionManager; private List<SubscriptionInfo> mSubscriptionInfo; @@ -211,11 +229,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { case MSG_REPORT_EMERGENCY_CALL_ACTION: handleReportEmergencyCallAction(); break; - case MSG_SCREEN_TURNED_OFF: - handleScreenTurnedOff(msg.arg1); + case MSG_FINISHED_GOING_TO_SLEEP: + handleFinishedGoingToSleep(msg.arg1); break; - case MSG_SCREEN_TURNED_ON: - handleScreenTurnedOn(); + case MSG_STARTED_WAKING_UP: + handleStartedWakingUp(); break; case MSG_FACE_UNLOCK_STATE_CHANGED: handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2); @@ -248,7 +266,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static int sCurrentUser; - private boolean mWakeAndUnlocking; + private int mFpWakeMode; public synchronized static void setCurrentUser(int currentUser) { sCurrentUser = currentUser; @@ -362,28 +380,28 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleFingerprintAuthFailed() { releaseFingerprintWakeLock(); - stopListeningForFingerprint(); handleFingerprintHelp(-1, mContext.getString(R.string.fingerprint_not_recognized)); - updateFingerprintListeningState(); } private void handleFingerprintAcquired(int acquireInfo) { if (acquireInfo != FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) { return; } - if (!mScreenOn) { + if (!mDeviceInteractive && !mScreenOn) { releaseFingerprintWakeLock(); mWakeLock = mPowerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, FINGERPRINT_WAKE_LOCK_NAME); mWakeLock.acquire(); - mWakeAndUnlocking = true; + mFpWakeMode = FP_WAKE_DIRECT_UNLOCK; if (DEBUG_FP_WAKELOCK) { Log.i(TAG, "fingerprint acquired, grabbing fp wakelock"); } mHandler.postDelayed(mReleaseFingerprintWakeLockRunnable, FINGERPRINT_WAKELOCK_TIMEOUT_MS); + } else if (!mDeviceInteractive) { + mFpWakeMode = FP_WAKE_WAKE_TO_BOUNCER; } else { - mWakeAndUnlocking = false; + mFpWakeMode = FP_WAKE_NONE; } } @@ -409,7 +427,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } private void handleFingerprintAuthenticated() { - if (mWakeAndUnlocking) { + if (mFpWakeMode == FP_WAKE_WAKE_TO_BOUNCER || mFpWakeMode == FP_WAKE_DIRECT_UNLOCK) { if (DEBUG_FP_WAKELOCK) { Log.i(TAG, "fp wakelock: Authenticated, waking up..."); } @@ -428,7 +446,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { Log.d(TAG, "Fingerprint disabled by DPM for userId: " + userId); return; } - onFingerprintAuthenticated(userId, mWakeAndUnlocking); + onFingerprintAuthenticated(userId, mFpWakeMode == FP_WAKE_DIRECT_UNLOCK); } finally { setFingerprintRunningDetectionRunning(false); } @@ -749,24 +767,24 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return sInstance; } - protected void handleScreenTurnedOn() { + protected void handleStartedWakingUp() { updateFingerprintListeningState(); final int count = mCallbacks.size(); for (int i = 0; i < count; i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { - cb.onScreenTurnedOn(); + cb.onStartedWakingUp(); } } } - protected void handleScreenTurnedOff(int arg1) { + protected void handleFinishedGoingToSleep(int arg1) { clearFingerprintRecognized(); final int count = mCallbacks.size(); for (int i = 0; i < count; i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { - cb.onScreenTurnedOff(arg1); + cb.onFinishedGoingToSleep(arg1); } } updateFingerprintListeningState(); @@ -1428,22 +1446,34 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { // TODO: use these callbacks elsewhere in place of the existing notifyScreen*() // (KeyguardViewMediator, KeyguardHostView) + public void dispatchStartedWakingUp() { + synchronized (this) { + mDeviceInteractive = true; + } + mHandler.sendEmptyMessage(MSG_STARTED_WAKING_UP); + } + + public void dispatchFinishedGoingToSleep(int why) { + synchronized(this) { + mDeviceInteractive = false; + } + mHandler.sendMessage(mHandler.obtainMessage(MSG_FINISHED_GOING_TO_SLEEP, why, 0)); + } + public void dispatchScreenTurnedOn() { synchronized (this) { mScreenOn = true; } - mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_ON); } - public void dispatchScreenTurnedOff(int why) { + public void dispatchScreenTurnedOff() { synchronized(this) { mScreenOn = false; } - mHandler.sendMessage(mHandler.obtainMessage(MSG_SCREEN_TURNED_OFF, why, 0)); } - public boolean isScreenOn() { - return mScreenOn; + public boolean isDeviceInteractive() { + return mDeviceInteractive; } /** diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 9fd8d30858aa..0cdf99999bb9 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -148,17 +148,17 @@ public class KeyguardUpdateMonitorCallback { } /** - * Called when the screen turns on + * Called when the device has started waking up. */ - public void onScreenTurnedOn() { } + public void onStartedWakingUp() { } /** - * Called when the screen turns off + * Called when the device has finished going to sleep. * @param why either {@link WindowManagerPolicy#OFF_BECAUSE_OF_ADMIN}, * {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER}, or * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT}. */ - public void onScreenTurnedOff(int why) { } + public void onFinishedGoingToSleep(int why) { } /** * Called when trust changes for a user. diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java index 49e67408c420..bafccaee749e 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java @@ -46,6 +46,7 @@ import android.util.Log; import android.util.Slog; import android.util.Xml; +import com.android.internal.logging.MetricsLogger; import com.android.internal.os.HandlerCaller; import com.android.internal.util.FastXmlSerializer; import com.android.printspooler.R; @@ -493,6 +494,7 @@ public final class PrintSpoolerService extends Service { Slog.i(LOG_TAG, "[STATE CHANGED] " + printJob); } + MetricsLogger.histogram(this, "print_job_state", state); switch (state) { case PrintJobInfo.STATE_COMPLETED: case PrintJobInfo.STATE_CANCELED: diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java index 6baa4b374345..e8a5e43ce874 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java @@ -72,6 +72,7 @@ import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; +import com.android.internal.logging.MetricsLogger; import com.android.printspooler.R; import com.android.printspooler.model.MutexFileProvider; import com.android.printspooler.model.PrintSpoolerProvider; @@ -325,6 +326,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (mState != STATE_INITIALIZING && mCurrentPrinter != null) { mPrinterRegistry.setTrackedPrinter(mCurrentPrinter.getId()); } + MetricsLogger.count(this, "print_preview", 1); } @Override @@ -1074,6 +1076,8 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private void confirmPrint() { setState(STATE_PRINT_CONFIRMED); + MetricsLogger.count(this, "print_confirmed", 1); + updateOptionsUi(); addCurrentPrinterToHistory(); diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index 40d5437b0a72..9eb7d0ebfcc3 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -1239,6 +1239,21 @@ public class ApplicationsState { } }; + public static final AppFilter FILTER_PERSONAL_WITHOUT_DISABLED_UNTIL_USED = new AppFilter() { + private int mCurrentUser; + + public void init() { + mCurrentUser = ActivityManager.getCurrentUser(); + } + + @Override + public boolean filterApp(AppEntry entry) { + return UserHandle.getUserId(entry.info.uid) == mCurrentUser && + entry.info.enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; + } + }; + + public static final AppFilter FILTER_WORK = new AppFilter() { private int mCurrentUser; diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 249eaa5d44d3..b0429ef43cf9 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -808,7 +808,7 @@ public final class CachedBluetoothDevice implements Comparable<CachedBluetoothDe // The pairing dialog now warns of phone-book access for paired devices. // No separate prompt is displayed after pairing. if (getPhonebookPermissionChoice() == CachedBluetoothDevice.ACCESS_UNKNOWN) { - setPhonebookPermissionChoice(CachedBluetoothDevice.ACCESS_REJECTED); + setPhonebookPermissionChoice(CachedBluetoothDevice.ACCESS_ALLOWED); } } } diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 3f0d71c1d43b..1cd2908e77e9 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -210,4 +210,6 @@ <!-- Default state of tap to wake --> <bool name="def_double_tap_to_wake">true</bool> + <!-- Default for Settings.Secure.NFC_PAYMENT_COMPONENT --> + <string name="def_nfc_payment_component"></string> </resources> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 8d9f3fd4e9fd..73971adaca0c 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -42,6 +42,9 @@ import android.os.Build; import android.os.Bundle; import android.os.DropBoxManager; import android.os.Environment; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.SystemProperties; @@ -204,9 +207,6 @@ public class SettingsProvider extends ContentProvider { // We have to call in the user manager with no lock held, private volatile UserManager mUserManager; - // We have to call in the app ops manager with no lock held, - private volatile AppOpsManager mAppOpsManager; - // We have to call in the package manager with no lock held, private volatile PackageManager mPackageManager; @@ -214,7 +214,6 @@ public class SettingsProvider extends ContentProvider { public boolean onCreate() { synchronized (mLock) { mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE); - mAppOpsManager = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE); mPackageManager = getContext().getPackageManager(); mSettingsRegistry = new SettingsRegistry(); } @@ -532,7 +531,7 @@ public class SettingsProvider extends ContentProvider { } while (cursor.moveToNext()); } - private static final String toDumpString(String s) { + private static String toDumpString(String s) { if (s != null) { return s; } @@ -643,11 +642,6 @@ public class SettingsProvider extends ContentProvider { // Make sure the caller can change the settings - treated as secure. enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS); - // Verify whether this operation is allowed for the calling package. - if (!isAppOpWriteSettingsAllowedForCallingPackage()) { - return false; - } - // Resolve the userId on whose behalf the call is made. final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId); @@ -773,11 +767,6 @@ public class SettingsProvider extends ContentProvider { // Make sure the caller can change the settings. enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS); - // Verify whether this operation is allowed for the calling package. - if (!isAppOpWriteSettingsAllowedForCallingPackage()) { - return false; - } - // Resolve the userId on whose behalf the call is made. final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId); @@ -904,14 +893,13 @@ public class SettingsProvider extends ContentProvider { private boolean mutateSystemSetting(String name, String value, int runAsUserId, int operation) { - // Check for permissions first. - if (!hasPermissionsToMutateSystemSettings()) { - return false; - } - - // Verify whether this operation is allowed for the calling package. - if (!isAppOpWriteSettingsAllowedForCallingPackage()) { - return false; + if (!hasWriteSecureSettingsPermission()) { + // If the caller doesn't hold WRITE_SECURE_SETTINGS, we verify whether this + // operation is allowed for the calling package through appops. + if (!Settings.checkAndNoteWriteSettingsOperation(getContext(), + Binder.getCallingUid(), getCallingPackage(), true)) { + return false; + } } // Enforce what the calling package can mutate the system settings. @@ -956,25 +944,13 @@ public class SettingsProvider extends ContentProvider { } } - private boolean hasPermissionsToMutateSystemSettings() { + private boolean hasWriteSecureSettingsPermission() { // Write secure settings is a more protected permission. If caller has it we are good. if (getContext().checkCallingOrSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) == PackageManager.PERMISSION_GRANTED) { return true; } - // The write settings permission gates mutation of system settings. - if (getContext().checkCallingOrSelfPermission(Manifest.permission.WRITE_SETTINGS) - == PackageManager.PERMISSION_GRANTED) { - return true; - } - - // Excpet we let system apps change system settings without the permission. - PackageInfo packageInfo = getCallingPackageInfoOrThrow(); - if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - return true; - } - return false; } @@ -1102,15 +1078,6 @@ public class SettingsProvider extends ContentProvider { } } - private boolean isAppOpWriteSettingsAllowedForCallingPackage() { - final int callingUid = Binder.getCallingUid(); - - mAppOpsManager.checkPackage(Binder.getCallingUid(), getCallingPackage()); - - return mAppOpsManager.noteOp(AppOpsManager.OP_WRITE_SETTINGS, callingUid, - getCallingPackage()) == AppOpsManager.MODE_ALLOWED; - } - private void enforceWritePermission(String permission) { if (getContext().checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { @@ -1190,18 +1157,6 @@ public class SettingsProvider extends ContentProvider { getCallingPackage()); } - private void sendNotify(Uri uri, int userId) { - final long identity = Binder.clearCallingIdentity(); - try { - getContext().getContentResolver().notifyChange(uri, null, true, userId); - if (DEBUG) { - Slog.v(LOG_TAG, "Notifying for " + userId + ": " + uri); - } - } finally { - Binder.restoreCallingIdentity(identity); - } - } - private static void warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk( int targetSdkVersion, String name) { // If the app targets Lollipop MR1 or older SDK we warn, otherwise crash. @@ -1422,8 +1377,11 @@ public class SettingsProvider extends ContentProvider { private final BackupManager mBackupManager; + private final Handler mHandler; + public SettingsRegistry() { mBackupManager = new BackupManager(getContext()); + mHandler = new MyHandler(getContext().getMainLooper()); migrateAllLegacySettingsIfNeeded(); } @@ -1765,7 +1723,7 @@ public class SettingsProvider extends ContentProvider { // Inform the backup manager about a data change if (backedUpDataChanged) { - mBackupManager.dataChanged(); + mHandler.obtainMessage(MyHandler.MSG_NOTIFY_DATA_CHANGED).sendToTarget(); } // Now send the notification through the content framework. @@ -1773,7 +1731,9 @@ public class SettingsProvider extends ContentProvider { final int userId = getUserIdFromKey(key); Uri uri = getNotificationUriFor(key, name); - sendNotify(uri, userId); + mHandler.obtainMessage(MyHandler.MSG_NOTIFY_URI_CHANGED, + userId, 0, uri).sendToTarget(); + if (isSecureSettingsKey(key)) { maybeNotifyProfiles(userId, uri, name, sSecureCloneToManagedSettings); } else if (isSystemSettingsKey(key)) { @@ -1790,7 +1750,8 @@ public class SettingsProvider extends ContentProvider { UserInfo profile = profiles.get(i); // the notification for userId has already been sent. if (profile.id != userId) { - sendNotify(uri, profile.id); + mHandler.obtainMessage(MyHandler.MSG_NOTIFY_URI_CHANGED, + profile.id, 0, uri).sendToTarget(); } } } @@ -1866,8 +1827,35 @@ public class SettingsProvider extends ContentProvider { } } + private final class MyHandler extends Handler { + private static final int MSG_NOTIFY_URI_CHANGED = 1; + private static final int MSG_NOTIFY_DATA_CHANGED = 2; + + public MyHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_NOTIFY_URI_CHANGED: { + final int userId = msg.arg1; + Uri uri = (Uri) msg.obj; + getContext().getContentResolver().notifyChange(uri, null, true, userId); + if (DEBUG) { + Slog.v(LOG_TAG, "Notifying for " + userId + ": " + uri); + } + } break; + + case MSG_NOTIFY_DATA_CHANGED: { + mBackupManager.dataChanged(); + } break; + } + } + } + private final class UpgradeController { - private static final int SETTINGS_VERSION = 121; + private static final int SETTINGS_VERSION = 122; private final int mUserId; @@ -1995,10 +1983,30 @@ public class SettingsProvider extends ContentProvider { currentVersion = 120; } - // Before 121, we used a different string encoding logic. We just bump the version - // here; SettingsState knows how to handle pre-version 120 files. - currentVersion = 121; + if (currentVersion == 120) { + // Before 121, we used a different string encoding logic. We just bump the + // version here; SettingsState knows how to handle pre-version 120 files. + currentVersion = 121; + } + if (currentVersion == 121) { + // Version 122: allow OEMs to set a default payment component in resources. + // Note that we only write the default if no default has been set; + // if there is, we just leave the default at whatever it currently is. + final SettingsState secureSettings = getSecureSettingsLocked(userId); + String defaultComponent = (getContext().getResources().getString( + R.string.def_nfc_payment_component)); + Setting currentSetting = secureSettings.getSettingLocked( + Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT); + if (defaultComponent != null && !defaultComponent.isEmpty() && + currentSetting == null) { + secureSettings.insertSettingLocked( + Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, + defaultComponent, + SettingsState.SYSTEM_PACKAGE_NAME); + } + currentVersion = 122; + } // vXXX: Add new settings above this point. // Return the current version. diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index ea2cc51f28da..bbef25951172 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -60,7 +60,7 @@ <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" /> <uses-permission android:name="android.permission.CONTROL_VPN" /> - + <uses-permission android:name="android.permission.PEERS_MAC_ADDRESS"/> <!-- Physical hardware --> <uses-permission android:name="android.permission.MANAGE_USB" /> <uses-permission android:name="android.permission.DEVICE_POWER" /> diff --git a/packages/SystemUI/res/anim/navbar_fade_in.xml b/packages/SystemUI/res/anim/navbar_fade_in.xml new file mode 100644 index 000000000000..e3429e68dd13 --- /dev/null +++ b/packages/SystemUI/res/anim/navbar_fade_in.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2015 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<alpha xmlns:android="http://schemas.android.com/apk/res/android" + android:fromAlpha="0.0" + android:toAlpha="1.0" + android:interpolator="@android:interpolator/linear_out_slow_in" + android:duration="200"/> diff --git a/packages/SystemUI/res/layout/split_clock_view.xml b/packages/SystemUI/res/layout/split_clock_view.xml index 808460a88f46..d1269dabf286 100644 --- a/packages/SystemUI/res/layout/split_clock_view.xml +++ b/packages/SystemUI/res/layout/split_clock_view.xml @@ -35,6 +35,7 @@ android:singleLine="true" android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock" android:textSize="@dimen/qs_time_collapsed_size" + android:importantForAccessibility="no" /> <!-- Empty text view so we have the same height when expanded/collapsed--> @@ -46,4 +47,4 @@ android:singleLine="true" android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock" /> -</com.android.systemui.statusbar.policy.SplitClockView>
\ No newline at end of file +</com.android.systemui.statusbar.policy.SplitClockView> diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml index 8c8a3dd7132a..5eca47106a1d 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml @@ -44,31 +44,31 @@ android:scaleType="centerInside"/> </com.android.systemui.statusbar.phone.MultiUserSwitch> - <com.android.keyguard.AlphaOptimizedLinearLayout + <com.android.systemui.statusbar.AlphaOptimizedFrameLayout android:id="@+id/settings_button_container" android:layout_width="48dp" android:layout_height="@dimen/status_bar_header_height" - android:paddingStart="12dp" android:clipChildren="false" android:clipToPadding="false" android:layout_toStartOf="@id/multi_user_switch"> <com.android.systemui.statusbar.phone.SettingsButton android:id="@+id/settings_button" style="@android:style/Widget.Material.Button.Borderless" - android:layout_width="24dp" - android:layout_height="@dimen/status_bar_header_height" + android:layout_width="match_parent" + android:layout_height="match_parent" android:background="@drawable/ripple_drawable" android:src="@drawable/ic_settings" android:contentDescription="@string/accessibility_desc_settings" /> <com.android.systemui.statusbar.AlphaOptimizedImageView android:id="@+id/tuner_icon" - android:layout_width="12dp" - android:layout_height="@dimen/status_bar_header_height" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingStart="36dp" android:tint="#4DFFFFFF" android:tintMode="src_in" android:visibility="invisible" android:src="@drawable/tuner" /> - </com.android.keyguard.AlphaOptimizedLinearLayout> + </com.android.systemui.statusbar.AlphaOptimizedFrameLayout> <LinearLayout android:id="@+id/system_icons_super_container" android:layout_width="wrap_content" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 472e0450c724..f58ae7338d37 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is die volumedialoog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Raak om die oorspronklike terug te stel."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Jy gebruik tans jou werkprofiel"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Stelsel-UI-ontvanger"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Stelsel-UI-ontvanger"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Wys persentasie van ingebedde battery"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Wys batteryvlakpersentasie binne die statusbalkikoon wanneer dit nie laai nie"</string> <string name="quick_settings" msgid="10042998191725428">"Kitsinstellings"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Kitsinstellings, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Warmkol"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Werkprofiel"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Pret vir party mense, maar nie vir almal nie"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Stelsel-UI-ontvanger gee jou ekstra maniere om die Android-gebruikerkoppelvlak in te stel en te pasmaak. Hierdie eksperimentele kenmerke kan in toekomstige uitreikings verander, breek of verdwyn. Gaan versigtig voort."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Hierdie eksperimentele kenmerke kan in toekomstige weergawes verander, breek of verdwyn. Gaan versigtig voort."</string> + <string name="got_it" msgid="2239653834387972602">"Het dit"</string> + <string name="tuner_toast" msgid="603429811084428439">"Geluk! Stelsel-UI-ontvanger is by Instellings gevoeg"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Verwyder uit Instellings"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Verwyder Stelsel-UI-ontvanger uit Instellings en staak die gebruik van al sy kenmerke?"</string> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index e55d48b08fcb..07c780b2792b 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> የድምጽ መጠን መገናኛው ነው"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"የመጀመሪያውን ወደነበረበት ለመመለስ ይንኩ።"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"የስራ መገለጫዎን እየተጠቀሙ ነው"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"የስርዓት በይነገጽ መቃኛ"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"የስርዓት በይነገጽ መቃኛ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"የተቀላቀለ የባትሪ አጠቃቀም መቶኛ አሳይ"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ኃይል በማይሞላበት ጊዜ በሁነታ አሞሌ አዶ ውስጥ የባትሪ ደረጃ መቶኛን አሳይ"</string> <string name="quick_settings" msgid="10042998191725428">"ፈጣን ቅንብሮች"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ፈጣን ቅንብሮች፣ <xliff:g id="TITLE">%s</xliff:g>።"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"መገናኛ ነጥብ"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"የስራ መገለጫ"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"ለአንዳንዶች አስደሳች ቢሆንም ለሁሉም አይደለም"</string> + <string name="tuner_warning" msgid="8730648121973575701">"የስርዓት በይነገጽ መቃኛ የAndroid ተጠቃሚ በይነገጹን የሚነካኩበት እና የሚያበጁበት ተጨማሪ መንገዶች ይሰጠዎታል። እነዚህ የሙከራ ባህሪዎች ወደፊት በሚኖሩ ልቀቶች ላይ ሊለወጡ፣ ሊሰበሩ ወይም ሊጠፉ ይችላሉ። ከጥንቃቄ ጋር ወደፊት ይቀጥሉ።"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"እነዚህ የሙከራ ባህሪዎች ወደፊት በሚኖሩ ልቀቶች ላይ ሊለወጡ፣ ሊሰበሩ ወይም ሊጠፉ ይችላሉ። ከጥንቃቄ ጋር ወደፊት ይቀጥሉ።"</string> + <string name="got_it" msgid="2239653834387972602">"ገባኝ"</string> + <string name="tuner_toast" msgid="603429811084428439">"እንኳን ደስ ያለዎት! የስርዓት በይነገጽ መቃኛ ወደ ቅንብሮች ታክሏል"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"ከቅንብሮች አስወግድ"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ከቅንብሮች ላይ የስርዓት በይነገጽ መቃኛ ተወግዶ ሁሉም ባህሪዎቹን መጠቀም ይቁም?"</string> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 94eaccc48862..dac9b01b01c8 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -402,7 +402,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> هو مربع حوار مستوى الصوت"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"المس لاستعادة الإعداد الأصلي."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"أنت تستخدم ملفك الشخصي للعمل"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"أداة ضبط واجهة مستخدم النظام"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"أداة ضبط واجهة مستخدم النظام"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"عرض نسبة البطارية المدمجة"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"عرض نسبة مستوى البطارية داخل رمز شريط الحالة أثناء عدم الشحن"</string> <string name="quick_settings" msgid="10042998191725428">"الإعدادات السريعة"</string> @@ -423,4 +423,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"الإعدادات السريعة، <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"نقطة اتصال"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"الملف الشخصي للعمل"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"متعة للبعض وليس للجميع"</string> + <string name="tuner_warning" msgid="8730648121973575701">"توفر لك أداة ضبط واجهة مستخدم النظام طرقًا إضافية لتعديل واجهة مستخدم Android وتخصيصها. ويمكن أن تطرأ تغييرات على هذه الميزات التجريبية أو يمكن أن تتعطل هذه الميزات أو تختفي في الإصدارات المستقبلية. عليك متابعة الاستخدام مع توخي الحذر."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"يمكن أن تطرأ تغييرات على هذه الميزات التجريبية أو يمكن أن تتعطل هذه الميزات أو تختفي في الإصدارات المستقبلية. عليك متابعة الاستخدام مع توخي الحذر."</string> + <string name="got_it" msgid="2239653834387972602">"حسنًا"</string> + <string name="tuner_toast" msgid="603429811084428439">"تهانينا! تمت إضافة أداة ضبط واجهة مستخدم النظام إلى الإعدادات"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"إزالة من الإعدادات"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"هل تريد إزالة أداة ضبط واجهة مستخدم النظام من الإعدادات وإيقاف استخدام كل ميزاتها؟"</string> </resources> diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml index c9397c615460..41a6e26bb744 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> proqramı səs səviyyəsi dialoqudur"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Orijinalı bərpa etmək üçün toxun."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"İş profilinizi istifadə edirsiniz"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sistem UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Daxil batareya faizini göstərin"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Elektrik şəbəsinə qoşulu olmayan zaman batareya səviyyəsini status paneli ikonası daxilində göstərin"</string> <string name="quick_settings" msgid="10042998191725428">"Sürətli Ayarlar"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Sürətli Ayarlar, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"İş profili"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Hamı üçün deyil, bəziləri üçün əyləncəli"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner Android istifadəçi interfeysini dəyişdirmək və fərdiləşdirmək üçün Sizə ekstra yollar təklif edir."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Bu eksperimental funksiyalar gələcək buraxılışlarda dəyişə, məhv ola və ya yoxa çıxa bilər. Ehtiyatlı olun."</string> + <string name="got_it" msgid="2239653834387972602">"Anladım"</string> + <string name="tuner_toast" msgid="603429811084428439">"Təbriklər! System UI Tuner Ayarlara əlavə edildi"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Ayarlardan Silin"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"System UI Tuner Ayarlardan silinsin və onun bütün funksiyalarından istifadə dayandırılsın?"</string> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 1db1917b3d5c..f3d93fc5d8e8 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> изпълнява ролята на диалоговия прозорец за силата на звука"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Докоснете, за да възстановите оригинала."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Използвате служебния си потребителски профил"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Тунер на системния ПИ"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Тунер на системния потребителски интерфейс"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Показване на процента на вградената батерия"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Показване на процента на нивото на батерията в иконата на лентата на състоянието, когато не се зарежда"</string> <string name="quick_settings" msgid="10042998191725428">"Бързи настройки"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Бързи настройки (<xliff:g id="TITLE">%s</xliff:g>)."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Точка за достъп"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Потребителски профил в Work"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Забавно – но не за всички"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Тунерът на системния потребителски интерфейс ви предоставя допълнителни възможности за прецизиране и персонализиране на практическата работа с Android. Тези експериментални функции може да се променят, повредят или да изчезнат в бъдещите версии. Действайте внимателно."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Тези експериментални функции може да се променят, повредят или да изчезнат в бъдещите версии. Действайте внимателно."</string> + <string name="got_it" msgid="2239653834387972602">"Разбрах"</string> + <string name="tuner_toast" msgid="603429811084428439">"Поздравления! Тунерът на системния потребителски интерфейс е добавен към „Настройки“"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Премахване от „Настройки“"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Да се премахне ли от „Настройки“ тунерът на системния потребителски интерфейс и да се спре ли използването на всичките му функции?"</string> </resources> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 4605b7c2708f..0c1847912435 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> হল ভলিউম ডায়লগ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"আসলটি পুনঃস্থাপন করতে স্পর্শ করুন৷"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"আপনি আপনার কাজের প্রোফাইল ব্যবহার করছেন"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"সিস্টেম UI টিউনার"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"সিস্টেম UI টিউনার"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"এম্বেড করা ব্যাটারির শতকরা হার দেখায়"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"যখন চার্জ করা হবে না তখন স্থিতি দন্ডের আইকনের ভিতরে ব্যাটারি স্তরের শতকার হার দেখায়"</string> <string name="quick_settings" msgid="10042998191725428">"দ্রুত সেটিংস"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"দ্রুত সেটিংস, <xliff:g id="TITLE">%s</xliff:g>৷"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"হটস্পট"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"কাজের প্রোফাইল"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"কিছু ব্যক্তির জন্য মজাদার কিন্তু সকলের জন্য নয়"</string> + <string name="tuner_warning" msgid="8730648121973575701">"এই পরীক্ষামূলক বৈশিষ্ট্যগুলি ভবিষ্যতের সংস্করণগুলির মধ্যে পরিবর্তিত, বিভাজিত এবং অদৃশ্য হয়ে যেতে পারে৷ সাবধানতার সাথে এগিয়ে যান৷ সিস্টেম UI টিউনার আপনাকে Android ব্যবহারকারী ইন্টারফেসের সূক্ষ্ম সমন্বয় এবং কাস্টমাইজ করার অতিরিক্ত উপায়গুলি প্রদান করে৷"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"এই পরীক্ষামূলক বৈশিষ্ট্যগুলি ভবিষ্যতের সংস্করণগুলির মধ্যে পরিবর্তিত, বিভাজিত এবং অদৃশ্য হয়ে যেতে পারে৷ সাবধানতার সাথে এগিয়ে যান৷"</string> + <string name="got_it" msgid="2239653834387972602">"বুঝেছি"</string> + <string name="tuner_toast" msgid="603429811084428439">"অভিনন্দন! সেটিংস -এ সিস্টেম UI টিউনার যোগ করা হয়েছে"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"সেটিংস থেকে সরান"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"সেটিংস থেকে সিস্টেম UI টিউনার সরাতে এবং এটির সমস্ত বৈশিষ্ট্য ব্যবহার করা বন্ধ করতে চান?"</string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index b9edc4912abb..d534ab9ed199 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> és el diàleg de volum"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca per restaurar l\'original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estàs utilitzant el perfil professional"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Configurador de la IU del sistema"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Configurador de la IU del sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostra el percentatge de la bateria inserit"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostra el percentatge del nivell de bateria dins de la icona de la barra d\'estat quan no s\'estigui carregant"</string> <string name="quick_settings" msgid="10042998191725428">"Configuració ràpida"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Configuració ràpida, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Zona Wi-Fi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil professional"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diversió per a uns quants, però no per a tothom"</string> + <string name="tuner_warning" msgid="8730648121973575701">"El Configurador de la IU del sistema presenta opcions addicionals per canviar i personalitzar la interfície d\'usuari d\'Android. És possible que aquestes funcions experimentals canviïn, deixin de funcionar o desapareguin en versions futures. Continua amb precaució."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"És possible que aquestes funcions experimentals canviïn, deixin de funcionar o desapareguin en versions futures. Continua amb precaució."</string> + <string name="got_it" msgid="2239653834387972602">"D\'acord"</string> + <string name="tuner_toast" msgid="603429811084428439">"Enhorabona! El Configurador de la IU del sistema s\'ha afegit a Configuració."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Treu de Configuració"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vols treure el Configurador de la UI del sistema de Configuració i deixar d\'utilitzar-ne totes les funcions?"</string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 3138892dd0b5..333050063ef4 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -402,7 +402,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je dialog hlasitosti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Klepnutím obnovíte originál."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Používáte pracovní profil"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Nástroj na ladění uživatelského rozhraní systému"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Nástroj na ladění uživatelského rozhraní systému"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Zobrazovat vložené procento nabití baterie"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Když neprobíhá nabíjení, zobrazit v ikoně na stavovém řádku procento nabití baterie"</string> <string name="quick_settings" msgid="10042998191725428">"Rychlé nastavení"</string> @@ -423,4 +423,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Rychlé nastavení <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Pracovní profil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Zábava, která není pro každého"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Nástroj na ladění uživatelského rozhraní systému vám nabízí další způsoby, jak si vyladit a přizpůsobit uživatelské rozhraní Android. Tyto experimentální funkce mohou v dalších verzích chybět, nefungovat nebo být změněny. Postupujte proto prosím opatrně."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Tyto experimentální funkce mohou v dalších verzích chybět, nefungovat nebo být změněny. Postupujte proto prosím opatrně."</string> + <string name="got_it" msgid="2239653834387972602">"Rozumím"</string> + <string name="tuner_toast" msgid="603429811084428439">"Úspěch! Do Nastavení byl přidán nástroj na ladění uživatelského rozhraní systému."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Odstranit z Nastavení"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Chcete nástroj na ladění uživatelského rozhraní systému odstranit z Nastavení a přestat používat všechny jeho funkce?"</string> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 2cc96daaee64..3c0c0b2046ba 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er dialogboksen for lydstyrke"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tryk for at gendanne originalen."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du bruger din arbejdsprofil"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Vis procent for det indbyggede batteri"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Vis procenttallet for batteriniveauet i ikonet for statusbjælken, når der ikke oplades"</string> <string name="quick_settings" msgid="10042998191725428">"Hurtige indstillinger"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Hurtigindstillinger <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Arbejdsprofil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Sjovt for nogle, men ikke for alle"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner giver dig flere muligheder for at justere og tilpasse Android-brugerfladen. Disse eksperimentelle funktioner kan ændres, gå i stykker eller forsvinde i fremtidige udgivelser. Vær forsigtig, hvis du fortsætter."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Disse eksperimentelle funktioner kan ændres, gå i stykker eller forsvinde i fremtidige udgivelser. Vær forsigtig, hvis du fortsætter."</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"System UI Tuner blev føjet til Indstillinger"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Fjern fra Indstillinger"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vil du fjerne System UI Tuner fra Indstillinger og stoppe med at bruge alle dens funktioner?"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 42ffb804c132..310436ae4298 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> regelt die Lautstärke."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Zum Wiederherstellen des Originals hier tippen"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Sie verwenden Ihr Arbeitsprofil."</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"SystemUI-Tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Eingebettete Akku-Prozentzahl anzeigen"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Prozentzahl für Akkustand in Statusleistensymbol anzeigen, wenn das Gerät nicht geladen wird"</string> <string name="quick_settings" msgid="10042998191725428">"Schnelleinstellungen"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Schnelleinstellungen (<xliff:g id="TITLE">%s</xliff:g>)"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Arbeitsprofil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Für einige ein Vergnügen, aber nicht für alle"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Mit System UI Tuner erhalten Sie zusätzliche Möglichkeiten, die Android-Benutzeroberfläche anzupassen. Achtung: Diese Testfunktionen können sich ändern, abstürzen oder in zukünftigen Versionen verschwinden."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Achtung: Diese Testfunktionen können sich ändern, abstürzen oder in zukünftigen Versionen verschwinden."</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"Herzlichen Glückwunsch! System UI Tuner wurde \"Einstellungen\" hinzugefügt."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Aus \"Einstellungen\" entfernen"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"System UI Tuner aus \"Einstellungen\" entfernen und die Verwendung von allen zugehörigen Funktionen beenden?"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index f445321b817f..5efe87b8a61f 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> αποτελεί το παράθυρο διαλόγου ελέγχου έντασης"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Αγγίξτε για επαναφορά αρχικού."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Χρησιμοποιείτε το προφίλ εργασίας σας"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Δέκτης διεπαφής συστήματος"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Εμφάνιση ποσοστού ενσωματωμένης μπαταρίας"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Εμφάνιση ποσοστού επιπέδου μπαταρίας μέσα στο εικονίδιο της γραμμής κατάστασης όταν δεν γίνεται φόρτιση"</string> <string name="quick_settings" msgid="10042998191725428">"Γρήγορες ρυθμίσεις"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Γρήγορες ρυθμίσεις, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Σημείο πρόσβασης Wi-Fi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Προφίλ εργασίας"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Διασκέδαση για ορισμένους, αλλά όχι για όλους"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Το System UI Tuner σάς προσφέρει επιπλέον τρόπους για να τροποποιήσετε και να προσαρμόσετε τη διεπαφή χρήστη Android. Αυτές οι πειραματικές λειτουργίες ενδέχεται να τροποποιηθούν, να παρουσιάσουν σφάλματα ή να καταργηθούν σε μελλοντικές εκδόσεις. Συνεχίστε με προσοχή."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Αυτές οι πειραματικές λειτουργίες ενδέχεται να τροποποιηθούν, να παρουσιάσουν σφάλματα ή να καταργηθούν σε μελλοντικές εκδόσεις. Συνεχίστε με προσοχή."</string> + <string name="got_it" msgid="2239653834387972602">"Το κατάλαβα"</string> + <string name="tuner_toast" msgid="603429811084428439">"Συγχαρητήρια! Το System UI Tuner προστέθηκε στις Ρυθμίσεις"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Κατάργηση από τις Ρυθμίσεις"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Κατάργηση System UI Tuner από τις Ρυθμίσεις και διακοπή χρήσης όλων των λειτουργιών του;"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 6ed7d7cc4b6a..d630e441e34e 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Show embedded battery percentage"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Show battery level percentage inside the status bar icon when not charging"</string> <string name="quick_settings" msgid="10042998191725428">"Quick Settings"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Quick Settings, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Work profile"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Fun for some but not for all"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner gives you extra ways to tweak and customise the Android user interface. These experimental features may change, break or disappear in future releases. Proceed with caution."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"These experimental features may change, break or disappear in future releases. Proceed with caution."</string> + <string name="got_it" msgid="2239653834387972602">"Understood"</string> + <string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 6ed7d7cc4b6a..d630e441e34e 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Show embedded battery percentage"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Show battery level percentage inside the status bar icon when not charging"</string> <string name="quick_settings" msgid="10042998191725428">"Quick Settings"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Quick Settings, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Work profile"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Fun for some but not for all"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner gives you extra ways to tweak and customise the Android user interface. These experimental features may change, break or disappear in future releases. Proceed with caution."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"These experimental features may change, break or disappear in future releases. Proceed with caution."</string> + <string name="got_it" msgid="2239653834387972602">"Understood"</string> + <string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 6ed7d7cc4b6a..d630e441e34e 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Show embedded battery percentage"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Show battery level percentage inside the status bar icon when not charging"</string> <string name="quick_settings" msgid="10042998191725428">"Quick Settings"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Quick Settings, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Work profile"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Fun for some but not for all"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner gives you extra ways to tweak and customise the Android user interface. These experimental features may change, break or disappear in future releases. Proceed with caution."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"These experimental features may change, break or disappear in future releases. Proceed with caution."</string> + <string name="got_it" msgid="2239653834387972602">"Understood"</string> + <string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index da0054d4f009..4a56237ba334 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar el original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando tu perfil de trabajo"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador de IU del sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaje de la batería integrada"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar porcentaje del nivel de batería en el ícono de la barra de estado cuando no se está cargando"</string> <string name="quick_settings" msgid="10042998191725428">"Configuración rápida"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Configuración rápida: <xliff:g id="TITLE">%s</xliff:g>"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de trabajo"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diversión para algunos, pero no para todos"</string> + <string name="tuner_warning" msgid="8730648121973575701">"El sintonizador de IU del sistema te brinda más formas para editar y personalizar la interfaz de usuario de Android. Estas funciones experimentales pueden cambiar, dejar de funcionar o no incluirse en futuras versiones. Procede con precaución."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Estas funciones experimentales pueden cambiar, dejar de funcionar o no incluirse en futuras versiones. Procede con precaución."</string> + <string name="got_it" msgid="2239653834387972602">"Entendido"</string> + <string name="tuner_toast" msgid="603429811084428439">"Se agregó el sintonizador de IU del sistema a Configuración"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Quitar de Configuración"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"¿Quieres quitar el sintonizador de IU del sistema de Configuración y dejar de utilizar todas sus funciones?"</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 99aabd982a19..7a8071531332 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar la versión original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando tu perfil de trabajo"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Configurador de IU del sistema"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Configurador de IU del sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaje de batería insertado"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar el porcentaje del nivel de batería en el icono de la barra de estado cuando no se esté cargando"</string> <string name="quick_settings" msgid="10042998191725428">"Ajustes rápidos"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Ajustes rápidos, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Zona Wi-Fi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de trabajo"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diversión solo para algunos"</string> + <string name="tuner_warning" msgid="8730648121973575701">"El configurador de IU del sistema te ofrece otras formas de modificar y personalizar la interfaz de usuario de Android. Estas funciones experimentales pueden cambiar, fallar o desaparecer en futuras versiones. Te recomendamos que tengas cuidado."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Estas funciones experimentales pueden cambiar, fallar o desaparecer en futuras versiones. Te recomendamos que tengas cuidado."</string> + <string name="got_it" msgid="2239653834387972602">"Entendido"</string> + <string name="tuner_toast" msgid="603429811084428439">"¡Enhorabuena! El configurador de IU del sistema se ha añadido a Ajustes"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Eliminar de Ajustes"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"¿Eliminar el configurador de IU del sistema de Ajustes y dejar de utilizar sus funciones?"</string> </resources> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index 2cdc4f7cb9f2..aec490673210 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> on helitugevuse dialoog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Originaali taastamiseks puudutage."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Kasutate oma tööprofiili"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Süsteemi kasutajaliidese tuuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Süsteemi kasutajaliidese tuuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Kuva lisatud akutaseme protsent"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Akutaseme protsendi kuvamine olekuriba ikoonil, kui akut ei laeta"</string> <string name="quick_settings" msgid="10042998191725428">"Kiirseaded"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Kiirseaded, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Leviala"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Tööprofiil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Kõik ei pruugi sellest rõõmu tunda"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Süsteemi kasutajaliidese tuuner pakub täiendavaid võimalusi Androidi kasutajaliidese muutmiseks ja kohandamiseks. Need katselised funktsioonid võivad muutuda, rikki minna või tulevastest versioonidest kaduda. Olge jätkamisel ettevaatlik."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Need katselised funktsioonid võivad muutuda, rikki minna või tulevastest versioonidest kaduda. Olge jätkamisel ettevaatlik."</string> + <string name="got_it" msgid="2239653834387972602">"Selge"</string> + <string name="tuner_toast" msgid="603429811084428439">"Õnnitleme! Süsteemi kasutajaliidese tuuner lisati seadetesse"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Eemalda seadetest"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Kas eemaldada seadetest süsteemi kasutajaliidese tuuner ja lõpetada kõikide selle funktsioonide kasutamine?"</string> </resources> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index 9de47f6053b1..c1967a38c7d2 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> da bolumenaren leihoa"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Ukitu jatorrizkora leheneratzeko"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Work profila erabiltzen ari zara"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sistemako erabiltzaile-interfazearen konfiguratzailea"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sistemako erabiltzaile-interfazearen konfiguratzailea"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Erakutsi txertatutako bateriaren ehunekoa"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Erakutsi bateria-mailaren ehunekoa egoera-barraren ikonoan, kargatzen ari ez denean"</string> <string name="quick_settings" msgid="10042998191725428">"Ezarpen bizkorrak"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Ezarpen bizkorrak: <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Sare publikoa"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Work profila"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Dibertsioa batzuentzat, baina ez guztientzat"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Sistemako erabiltzaile-interfazearen konfiguratzaileak Android erabiltzaile-interfazea moldatzeko eta pertsonalizatzeko modu gehiago eskaintzen dizkizu. Baliteke eginbide esperimental horiek hurrengo kaleratzeetan aldatuta, etenda edo desagertuta egotea. Kontuz erabili."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Baliteke eginbide esperimental horiek hurrengo kaleratzeetan aldatuta, etenda edo desagertuta egotea. Kontuz erabili."</string> + <string name="got_it" msgid="2239653834387972602">"Ados"</string> + <string name="tuner_toast" msgid="603429811084428439">"Zorionak! Sistemako erabiltzaile-interfazearen konfiguratzailea Ezarpenak atalean gehitu da"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Kendu Ezarpenak ataletik"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Sistemako erabiltzaile-interfazearen konfiguratzailea ezarpenetatik kendu nahi duzu, eta haren eginbide guztiak erabiltzeari utzi nahi diozu?"</string> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 845ced53ea99..b5bd42393e8d 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -55,7 +55,7 @@ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"به برنامه <xliff:g id="APPLICATION">%1$s</xliff:g> اجازه میدهد تا به وسیله جانبی USB دسترسی داشته باشد؟"</string> <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"وقتی این دستگاه USB وصل است، <xliff:g id="ACTIVITY">%1$s</xliff:g> باز شود؟"</string> <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"وقتی این وسیله جانبی USB وصل است، <xliff:g id="ACTIVITY">%1$s</xliff:g> باز شود؟"</string> - <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"هیچ برنامهٔ کاربردی نصب شدهای با این وسیله جانبی USB کار نمیکند. در <xliff:g id="URL">%1$s</xliff:g> دربارهٔ این وسیله جانبی اطلاعات بیشتری کسب کنید"</string> + <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"هیچ برنامه نصب شدهای با این وسیله جانبی USB کار نمیکند. در <xliff:g id="URL">%1$s</xliff:g> دربارهٔ این وسیله جانبی اطلاعات بیشتری کسب کنید"</string> <string name="title_usb_accessory" msgid="4966265263465181372">"لوازم جانبی USB"</string> <string name="label_view" msgid="6304565553218192990">"مشاهده"</string> <string name="always_use_device" msgid="1450287437017315906">"استفاده به صورت پیشفرض برای این دستگاه USB"</string> @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> کنترلکننده صدا است"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"برای بازیابی کنترلکننده اصلی، لمس کنید."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"درحال استفاده از نمایه کاریتان هستید"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"تنظیمکننده واسط کاربری سیستم"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"تنظیمکننده واسط کاربری سیستم"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"نمایش درصد شارژ باتری جاسازی شده"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"نمایش درصد سطح باتری در نماد نوار وضعیت، هنگامی که باتری شارژ نمیشود"</string> <string name="quick_settings" msgid="10042998191725428">"تنظیمات سریع"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"تنظیمات سریع، <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"نقطه اتصال"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"نمایه کاری"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"برای بعضی افراد سرگرمکننده است اما نه برای همه"</string> + <string name="tuner_warning" msgid="8730648121973575701">"«تنظیمکننده واسط کاربری سیستم» روشهای بیشتری برای تنظیم دقیق و سفارشی کردن واسط کاربری Android در اختیار شما قرار میدهد. ممکن است این ویژگیهای آزمایشی تغییر کنند، خراب شوند یا در نسخههای آینده جود نداشته باشند. با احتیاط ادامه دهید."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ممکن است این ویژگیهای آزمایشی تغییر کنند، خراب شوند یا در نسخههای آینده وجود نداشته باشند. با احتیاط ادامه دهید."</string> + <string name="got_it" msgid="2239653834387972602">"متوجه شدم"</string> + <string name="tuner_toast" msgid="603429811084428439">"تبریک میگوییم! «تنظیمکننده واسط کاربری سیستم» به «تنظیمات» اضافه شد"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"حذف از تنظیمات"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"«تنظیمکننده واسط کاربری سیستم» از تنظیمات حذف شود و همه ویژگیهای آن متوقف شوند؟"</string> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 63d4ab4a30ed..5a540bcf1cb4 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> on äänenvoimakkuusvalinta."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Palauta alkuperäinen koskettamalla."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Käytät työprofiilia."</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"SystemUI-viritin"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Näytä akun varaus kuvakkeessa"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Näyttää akun varausprosentin tilapalkin kuvakkeessa, kun laitetta ei ladata."</string> <string name="quick_settings" msgid="10042998191725428">"Pika-asetukset"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Pika-asetukset, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Työprofiili"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Ei sovellu kaikkien käyttöön"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner antaa lisämahdollisuuksia Android-käyttöliittymän muokkaamiseen. Nämä kokeelliset ominaisuudet voivat muuttua, lakata toimimasta tai kadota milloin tahansa. Jatka omalla vastuullasi."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Nämä kokeelliset ominaisuudet voivat muuttua, lakata toimimasta tai kadota milloin tahansa. Jatka omalla vastuullasi."</string> + <string name="got_it" msgid="2239653834387972602">"Selvä"</string> + <string name="tuner_toast" msgid="603429811084428439">"Hienoa! System UI Tuner on nyt lisätty Asetuksiin."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Poista Asetuksista"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Haluatko poistaa System UI Tunerin Asetuksista ja lopettaa sen ominaisuuksien käytön?"</string> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 9d7a7f09b226..5a46b10b0665 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> correspond à la boîte de dialogue du volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touchez pour restaurer l\'original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Vous utilisez votre profil professionnel."</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Paramètres SystemUI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Afficher le pourcentage intégré de charge"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Afficher le pourcentage correspondant au niveau de la pile dans l\'icône de la barre d\'état lorsque l\'appareil n\'est pas en charge."</string> <string name="quick_settings" msgid="10042998191725428">"Paramètres rapides"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Configuration rapide – <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Point d\'accès sans fil"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil professionnel"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Divertissant pour certains, mais pas pour tous"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner vous propose de nouvelles manières d\'adapter et de personnaliser l\'interface utilisateur d\'Android. Ces fonctionnalités expérimentales peuvent être modifiées, cesser de fonctionner ou disparaître dans les versions futures. À utiliser avec prudence."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ces fonctionnalités expérimentales peuvent être modifiées, cesser de fonctionner ou disparaître dans les versions futures. À utiliser avec prudence."</string> + <string name="got_it" msgid="2239653834387972602">"J\'ai compris"</string> + <string name="tuner_toast" msgid="603429811084428439">"Félicitations! System UI Tuner a bien été ajouté aux paramètres."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Supprimer des paramètres"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Supprimer « System UI Tuner » des paramètres et arrêter d\'utiliser toutes ses fonctionnalités?"</string> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 09daca681187..6b81bde0c6f8 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> correspond à la boîte de dialogue du volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Appuyez pour restaurer l\'interface d\'origine."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Vous utilisez votre profil professionnel."</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Afficher le pourcentage intégré de la batterie"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Affichez le pourcentage correspondant au niveau de la batterie dans l\'icône de la barre d\'état lorsque l\'appareil n\'est pas en charge."</string> <string name="quick_settings" msgid="10042998191725428">"Configuration rapide"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Configuration rapide – <xliff:g id="TITLE">%s</xliff:g>"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Point d\'accès"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil professionnel"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Divertissant pour certains, mais pas pour tous"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner vous propose de nouvelles manières d\'adapter et de personnaliser l\'interface utilisateur Android. Ces fonctionnalités expérimentales peuvent être modifiées, cesser de fonctionner ou disparaître dans les versions futures. À utiliser avec prudence."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ces fonctionnalités expérimentales peuvent être modifiées, cesser de fonctionner ou ne plus être disponibles dans les versions futures. À utiliser avec prudence."</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"Félicitations ! System UI Tuner a bien été ajouté aux paramètres."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Supprimer l\'outil des paramètres"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Supprimer System UI Tuner des paramètres et arrêter d\'utiliser toutes ses fonctionnalités ?"</string> </resources> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 631c74bd004a..a67f5a7e2d43 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é o cadro de diálogo de volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar o orixinal."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando o perfil de traballo"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sintonizador da interface de usuario do sistema"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Configurador da IU do sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaxe de batería inserida"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar porcentaxe do nivel de batería na icona da barra de estado cando non está en carga"</string> <string name="quick_settings" msgid="10042998191725428">"Configuración rápida"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Configuración rápida: <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Zona wifi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de traballo"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diversión só para algúns"</string> + <string name="tuner_warning" msgid="8730648121973575701">"O configurador da IU do sistema ofréceche formas adicionais de modificar e personalizar a interface de usuario de Android. Estas funcións experimentais poden cambiar, interromperse ou desaparecer en futuras versións. Continúa con precaución."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Estas funcións experimentais poden cambiar, interromperse ou desaparecer en futuras versións. Continúa con precaución."</string> + <string name="got_it" msgid="2239653834387972602">"De acordo"</string> + <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O configurador da IU do sistema engadiuse a Configuración"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Eliminar da Configuración"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Queres eliminar o configurador da IU do sistema da Configuración e deixar de usar todas as súas funcións?"</string> </resources> diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index ca40c90bce1d..fb71e6e00afb 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> એ વૉલ્યૂમ સંવાદ છે"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"મૂળને પુનઃસ્થાપિત કરવા માટે ટચ કરો."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"તમે તમારી કાર્ય પ્રોફાઇલનો ઉપયોગ કરી રહ્યાં છો"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"સિસ્ટમ UI ટ્યૂનર"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"સિસ્ટમ UI ટ્યૂનર"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"એમ્બેડ કરેલ બૅટરી ટકા બતાવો"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"જ્યારે ચાર્જ ન થઈ રહ્યું હોય ત્યારે સ્થિતિ બાર આયકનની અંદર બૅટરી સ્તર ટકા બતાવો"</string> <string name="quick_settings" msgid="10042998191725428">"ઝડપી સેટિંગ્સ"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ઝડપી સેટિંગ્સ, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"હોટસ્પોટ"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"કાર્ય પ્રોફાઇલ"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"કેટલાક માટે મજા પરંતુ બધા માટે નહીં"</string> + <string name="tuner_warning" msgid="8730648121973575701">"સિસ્ટમ UI ટ્યૂનર તમને Android વપરાશકર્તા ઇન્ટરફેસને ટ્વીક અને કસ્ટમાઇઝ કરવાની વધારાની રીતો આપે છે. ભાવિ રીલિઝેસમાં આ પ્રાયોગિક સુવિધાઓ બદલાઈ, ભંગ અથવા અદૃશ્ય થઈ શકે છે. સાવધાની સાથે આગળ વધો."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ભાવિ રીલિઝેસમાં આ પ્રાયોગિક સુવિધાઓ બદલાઈ, ભંગ અથવા અદૃશ્ય થઈ શકે છે. સાવધાની સાથે આગળ વધો."</string> + <string name="got_it" msgid="2239653834387972602">"સમજાઈ ગયું"</string> + <string name="tuner_toast" msgid="603429811084428439">"અભિનંદન! સિસ્ટમ UI ટ્યૂનરને સેટિંગ્સમાં ઉમેરવામાં આવ્યું છે"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"સેટિંગ્સમાંથી દૂર કરો"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"સેટિંગ્સમાંથી સિસ્ટમ UI ટ્યૂનર દૂર કરી અને તેની તમામ સુવિધાઓનો ઉપયોગ કરવાનું બંધ કરીએ?"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index c2ff32ace2e5..aac17253f7b5 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -41,7 +41,7 @@ <string name="battery_low_why" msgid="4553600287639198111">"सेटिंग"</string> <string name="battery_saver_confirmation_title" msgid="5299585433050361634">"बैटरी बचतकर्ता चालू करें?"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"चालू करें"</string> - <string name="battery_saver_start_action" msgid="5576697451677486320">"बैटरी बचतकर्ता को चालू करें"</string> + <string name="battery_saver_start_action" msgid="5576697451677486320">"बैटरी बचाएँ"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिंग"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाई-फ़ाई"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"स्क्रीन अपनेआप घुमाएं"</string> @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> वॉल्यूम संवाद है"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूल वॉल्यूम को फिर से लाने के लिए स्पर्श करें."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"आप अपनी कार्य प्रोफ़ाइल का उपयोग कर रहे हैं"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI ट्यूनर"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"सिस्टम UI ट्यूनर"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"एम्बेड किया गया बैटरी प्रतिशत दिखाएं"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"जब चार्ज नहीं किया जा रहा हो तब स्थिति बार आइकन में बैटरी स्तर का प्रतिशत दिखाएं"</string> <string name="quick_settings" msgid="10042998191725428">"तेज़ सेटिंग"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"तेज़ सेटिंग, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"हॉटस्पॉट"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"कार्य प्रोफ़ाइल"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"कुछ के लिए मज़ेदार लेकिन सबके लिए नहीं"</string> + <string name="tuner_warning" msgid="8730648121973575701">"सिस्टम UI ट्यूनर आपको Android उपयोगकर्ता इंटरफ़ेस में सुधार करने और उसे कस्टमाइज़ करने के अतिरिक्त तरीके प्रदान करता है. ये प्रयोगात्मक सुविधाएं आगामी रिलीज़ में बदल सकती हैं, रुक सकती हैं या दिखाई देना बंद हो सकती हैं. सावधानी से आगे बढ़ें."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ये प्रयोगात्मक सुविधाएं आगामी रिलीज़ में बदल सकती हैं, रुक सकती हैं या दिखाई देना बंद हो सकती हैं. सावधानी से आगे बढ़ें."</string> + <string name="got_it" msgid="2239653834387972602">"समझ लिया"</string> + <string name="tuner_toast" msgid="603429811084428439">"बधाई हो! सिस्टम UI ट्यूनर को सेटिंग में जोड़ दिया गया है"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"सेटिंग से निकालें"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"सेटिंग से सिस्टम UI ट्यूनर निकालें और इसकी सभी सुविधाओं का उपयोग रोक दें?"</string> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 468cdb752617..85e9eff7b575 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -399,7 +399,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> predstavlja dijaloški okvir za upravljanje glasnoćom"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dodirnite da biste vratili izvorno."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Upotrebljavate radni profil"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Prijamnik korisničkog sučelja sustava"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Ugađanje korisničkog sučelja sustava"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Prikaži ugrađeni postotak baterije"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Prikazivanje postotka razine baterije na ikoni trake statusa kada se ne puni"</string> <string name="quick_settings" msgid="10042998191725428">"Brze postavke"</string> @@ -420,4 +420,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Brze postavke, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Žarišna točka"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Radni profil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Zabava za neke, ali ne za sve"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Ugađanje korisničkog sučelja sustava pruža vam dodatne načine za prilagodbu korisničkog sučelja Androida. Te se eksperimentalne značajke mogu promijeniti, prekinuti ili nestati u budućim izdanjima. Nastavite uz oprez."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Te se eksperimentalne značajke mogu promijeniti, prekinuti ili nestati u budućim izdanjima. Nastavite uz oprez."</string> + <string name="got_it" msgid="2239653834387972602">"Shvaćam"</string> + <string name="tuner_toast" msgid="603429811084428439">"Čestitamo! Ugađanje korisničkog sučelja sustava dodano je u Postavke"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Ukloni iz Postavki"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Želite li ukloniti Ugađanje korisničkog sučelja sustava iz Postavki i prestati upotrebljavati njegove značajke?"</string> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index f72833f91647..3b34d19837b0 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás kezeli a hangerőt"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Érintse meg az eredeti érték visszaállításához."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"A munkaprofilt használja"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Kezelőfelület-hangoló"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Kezelőfelület-hangoló"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"A beépített akkumulátor töltöttségi szintjének megjelenítése"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Az akkumulátor töltöttségi szintjének megjelenítése az állapotsori ikonban, amikor az eszköz nem töltődik"</string> <string name="quick_settings" msgid="10042998191725428">"Gyorsbeállítások"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Gyorsbeállítások – <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Munkaprofil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Egyeseknek tetszik, másoknak nem"</string> + <string name="tuner_warning" msgid="8730648121973575701">"A Kezelőfelület-hangoló az Android felhasználói felületének szerkesztéséhez és testreszabásához nyújt további megoldásokat. Ezek a kísérleti funkciók változhatnak vagy megsérülhetnek a későbbi kiadásokban,illetve eltűnhetnek azokból. Körültekintően járjon el."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ezek a kísérleti funkciók változhatnak vagy megsérülhetnek a későbbi kiadásokban, illetve eltűnhetnek azokból. Körültekintően járjon el."</string> + <string name="got_it" msgid="2239653834387972602">"Értem"</string> + <string name="tuner_toast" msgid="603429811084428439">"Gratulálunk! A Kezelőfelület-hangolót hozzáadtuk a Beállításokhoz"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Eltávolítás a Beállítások közül"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Eltávolítja a Kezelőfelület-hangolót a Beállításokból, és nem használja tovább egyik funkcióját sem?"</string> </resources> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 0a88ddef2b62..beefa8ec52b5 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ը ձայնի ուժգնության երկխոսության հավելված է"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Դիպչեք՝ սկզբնօրինակը վերականգնելու համար:"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Դուք օգտագործում եք ձեր աշխատանքային պրոֆիլը"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Համակարգի ՕՄ-ի կարգավորիչ"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Համակարգի ՕՄ-ի կարգավորիչ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Ցուցադրել ներկառուցված մարտկոցի տոկոսայնությունը"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Ցուցադրել մարտկոցի լիցքավորման տոկոսայնությունը կարգավիճակի գոտու պատկերակի վրա, երբ այն չի լիցքավորվում"</string> <string name="quick_settings" msgid="10042998191725428">"Արագ կարգավորումներ"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Արագ կարգավորումներ, <xliff:g id="TITLE">%s</xliff:g>:"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Թեժ կետ"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Աշխատանքային պրոֆիլ"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Զվարճանք մեկ՝ որոշակի մարդու համար"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Համակարգի ՕՄ-ի կարգավորիչը հնարավորություն է տալիս հարմարեցնել Android-ի օգտվողի միջերեսը: Այս փորձնական գործառույթները կարող են հետագա թողարկումների մեջ փոփոխվել, խափանվել կամ ընդհանրապես չհայտնվել: Եթե շարունակում եք, զգուշացեք:"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Այս փորձնական գործառույթները կարող են հետագա թողարկումների մեջ փոփոխվել, խափանվել կամ ընդհանրապես չհայտնվել: Եթե շարունակում եք, զգուշացեք:"</string> + <string name="got_it" msgid="2239653834387972602">"Հասկանալի է"</string> + <string name="tuner_toast" msgid="603429811084428439">"Համակարգի ՕՄ-ի կարգավորիչը ավելացվել է կարգավորումներին"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Հեռացնել կարգավորումներից"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Հեռացնե՞լ Համակարգի ՕՄ-ի կարգավորիչը կարգավորումներից և չօգտվել այլևս նրա գործառույթներից:"</string> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index e8d3d43d9441..f1d2907ef613 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> adalah dialog volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Sentuh untuk memulihkan aslinya."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Anda menggunakan profil kerja"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Penyetel Antarmuka Sistem"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Penyetel Antarmuka Pengguna Sistem"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Tampilkan persentase baterai yang tersemat"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Tampilkan persentase tingkat baterai dalam ikon bilah status saat tidak mengisi daya"</string> <string name="quick_settings" msgid="10042998191725428">"Setelan Cepat"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Setelan Cepat, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil kerja"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Tidak semua orang menganggapnya baik"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Penyetel Antarmuka Pengguna Sistem memberikan cara tambahan untuk mengubah dan menyesuaikan antarmuka pengguna Android. Fitur eksperimental ini dapat berubah, rusak, atau menghilang dalam rilis di masa mendatang. Lanjutkan dengan hati-hati."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Fitur eksperimental ini dapat berubah, rusak, atau menghilang dalam rilis di masa mendatang. Lanjutkan dengan hati-hati."</string> + <string name="got_it" msgid="2239653834387972602">"Mengerti"</string> + <string name="tuner_toast" msgid="603429811084428439">"Selamat! Penyetel Antarmuka Pengguna Sistem telah ditambahkan ke Setelan"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Hapus dari Setelan"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Hapus Penyetel Antarmuka Pengguna Sistem dari Setelan dan berhenti menggunakan semua fiturnya?"</string> </resources> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index 3d42bc70c499..b9867836017c 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er hljóðstyrksvalmyndin"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Snertu til að færa í upprunalegt horf."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Þú ert að nota vinnusniðið"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Fínstillingar kerfisviðmóts"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Fínstillingar kerfisviðmóts"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Sýna innfellda rafhlöðustöðu"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Sýna rafhlöðustöðuna í stöðustikunni þegar tækið er ekki í hleðslu"</string> <string name="quick_settings" msgid="10042998191725428">"Flýtistillingar"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Flýtistillingar, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Heitur reitur"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Vinnusnið"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Þetta er ekki allra"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Fínstillingar kerfisviðmóts gera þér kleift að fínstilla og sérsníða notendaviðmót Android. Þessir tilraunaeiginleikar geta breyst, bilað eða horfið í síðari útgáfum. Gakktu því hægt um gleðinnar dyr."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Þessir tilraunaeiginleikar geta breyst, bilað eða horfið í síðari útgáfum. Gakktu því hægt um gleðinnar dyr."</string> + <string name="got_it" msgid="2239653834387972602">"Ég skil"</string> + <string name="tuner_toast" msgid="603429811084428439">"Til hamingju! Fínstillingum kerfisviðmóts hefur verið bætt við stillingar"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Fjarlægja úr stillingum"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Viltu fjarlægja fínstillingar kerfisviðmóts úr stillingum og hætta að nota eiginleika þeirra?"</string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 26457f355f12..461db5381421 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> rappresenta la finestra di dialogo relativa al volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tocca per ripristinare l\'originale."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Stai utilizzando il profilo di lavoro"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sintonizzatore UI sistema"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sintetizzatore interfaccia utente di sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostra percentuale batteria incorporata"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostra la percentuale di carica della batteria nell\'icona della barra di stato quando non è in carica"</string> <string name="quick_settings" msgid="10042998191725428">"Impostazioni rapide"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Impostazioni rapide: <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profilo di lavoro"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Il divertimento riservato a pochi eletti"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Il sintetizzatore interfaccia utente di sistema mette a disposizione altri metodi per modificare e personalizzare l\'interfaccia utente di Android. Queste funzioni sperimentali potrebbero cambiare, interrompersi o scomparire nelle versioni successive. Procedi con cautela."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Queste funzioni sperimentali potrebbero cambiare, interrompersi o scomparire nelle versioni successive. Procedi con cautela."</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"Complimenti! Il sintetizzatore interfaccia utente di sistema è stato aggiunto alle impostazioni."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Rimuovi dalle impostazioni"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vuoi rimuovere il sintetizzatore interfaccia utente di sistema dalle impostazioni e smettere di utilizzare tutte le sue funzioni?"</string> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 92adc90f6f47..8893bec55bf4 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> הוא תיבת הדו-שיח של עוצמת הקול"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"גע כדי לשחזר את עוצמת הקול המקורית."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"אתה משתמש בפרופיל העבודה שלך"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"SystemUI Tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"הצג בשורת הסטטוס את אחוז עוצמת הסוללה"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"הצג את אחוז עוצמת הסוללה בתוך הסמל שבשורת הסטטוס כשהמכשיר אינו בטעינה"</string> <string name="quick_settings" msgid="10042998191725428">"הגדרות מהירות"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"הגדרות מהירות, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"נקודה לשיתוף אינטרנט"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"פרופיל עבודה"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"מהנה בשביל חלק מהאנשים, אבל לא בשביל כולם"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner מספק לך דרכים נוספות להתאים אישית את ממשק המשתמש של Android. התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string> + <string name="got_it" msgid="2239653834387972602">"הבנתי"</string> + <string name="tuner_toast" msgid="603429811084428439">"מזל טוב! System UI Tuner נוסף ל\'הגדרות\'"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"הסר מההגדרות"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index b8b4d3b1b4b3..260a92b46173 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>を音量ダイアログとして使用"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"タップすると元の音量ダイアログが復元されます。"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"仕事用プロファイルを使用しています"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"システムUI調整ツール"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"内蔵電池の残量の割合を表示する"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"充電していないときには電池残量の割合をステータスバーアイコンに表示する"</string> <string name="quick_settings" msgid="10042998191725428">"クイック設定"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"クイック設定、<xliff:g id="TITLE">%s</xliff:g>。"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"アクセスポイント"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"仕事用プロファイル"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"一部の方のみお楽しみいただける限定公開ツール"</string> + <string name="tuner_warning" msgid="8730648121973575701">"システムUI調整ツールでは、Androidユーザーインターフェースの調整やカスタマイズを行えます。これらの試験運用機能は今後のリリースで変更となったり、中止となったり、削除されたりする可能性がありますのでご注意ください。"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"これらの試験運用機能は今後のリリースで変更となったり、中止となったり、削除されたりする可能性がありますのでご注意ください。"</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"システムUI調整ツールを設定に追加しました"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"設定から削除"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"設定からシステムUI調整ツールを削除して、全機能の使用を停止しますか?"</string> </resources> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 8576371e8015..54f545d88b9a 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ხმოვან დიალოგშია"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ორიგინალის აღდგენისათვის, შეეხეთ."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"თქვენ სამსახურის პროფილს იყენებთ"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI ტუნერი"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"სისტემის UI ტუნერი"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"ჩამაგრებული ბატარეის პროცენტის ჩვენება"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ბატარეის დონის პროცენტის ჩვენება სტატუსის ზოლის ხატულას შიგნით, როდესაც არ იტენება"</string> <string name="quick_settings" msgid="10042998191725428">"სწრაფი პარამეტრები"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"სწრაფი პარამეტრები, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"წვდომის წერტილი"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"სამსახურის პროფილი"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"ზოგისთვის გასართობია, მაგრამ არა ყველასთვის"</string> + <string name="tuner_warning" msgid="8730648121973575701">"სისტემის UI ტუნერი გაძლევთ დამატებით გზებს Android-ის სამომხმარებლო ინტერფეისის პარამეტრების დაყენებისთვის. ეს ექსპერიმენტული მახასიათებლები შეიძლება შეიცვალოს, შეწყდეს ან გაქრეს მომავალ ვერსიებში. სიფრთხილით გააგრძელეთ."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ეს ექსპერიმენტული მახასიათებლები შეიძლება შეიცვალოს, შეწყდეს ან გაქრეს მომავალ ვერსიებში. სიფრთხილით გააგრძელეთ."</string> + <string name="got_it" msgid="2239653834387972602">"გასაგებია"</string> + <string name="tuner_toast" msgid="603429811084428439">"გილოცავთ! სისტემის UI ტუნერი დაემატა პარამეტრებს"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"პარამეტრებიდან წაშლა"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"გსურთ სისტემის UI ტუნერის პარამეტრებიდან წაშლა და მისი ყველა ფუნქციის გამოყენების შეწყვეტა?"</string> </resources> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index 43fa4dce6c53..e80c03ada277 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> — көлем диалогтық терезесі"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Түпнұсқаны қалпына келтіру үшін түртіңіз."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Сіз жұмыс профиліңізді пайдаланып жатырсыз"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Жүйе интерфейсінің тюнері"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Жүйелік пайдаланушылық интерфейс тюнері"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Ендірілген батарея пайыздық шамасын көрсету"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Зарядталмай тұрғанда, күй жолағы белгішесінің ішінде батарея деңгейінің пайыздық шамасын көрсетеді"</string> <string name="quick_settings" msgid="10042998191725428">"Жылдам параметрлер"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Жылдам параметрлер, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Хот-спот"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Жұмыс профилі"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Кейбіреулерге қызық, бірақ барлығына емес"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Жүйелік пайдаланушылық интерфейс тюнері Android пайдаланушылық интерфейсін реттеудің қосымша жолдарын береді. Бұл эксперименттік мүмкіндіктер болашақ шығарылымдарда өзгеруі, бұзылуы немесе жоғалуы мүмкін. Сақтықпен жалғастырыңыз."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Бұл эксперименттік мүмкіндіктер болашақ шығарылымдарда өзгеруі, бұзылуы немесе жоғалуы мүмкін. Сақтықпен жалғастырыңыз."</string> + <string name="got_it" msgid="2239653834387972602">"Түсіндім"</string> + <string name="tuner_toast" msgid="603429811084428439">"Құттықтаймыз! Жүйелік пайдаланушылық интерфейс тюнері \"Параметрлер\" тармағына қосылды"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Параметрлерден жою"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Жүйелік пайдаланушылық интерфейс тюнерін \"Параметрлер\" тармағынан жойып, оның барлық мүмкіндіктерін пайдалануды тоқтату керек пе?"</string> </resources> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 081fc4445d2c..df3dfb797485 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> គឺជាប្រអប់សម្លេង"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ប៉ះដើម្បីស្តារច្បាប់ដើម។"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"អ្នកកំពុងប្រើប្រវត្តិរូបការងាររបស់អ្នក"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"ឧបករណ៍ចាប់ SystemUI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"កម្មវិធីសម្រួល UI ប្រព័ន្ធ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"បង្ហាញភាគរយថាមពលថ្មដែលបានបង្កប់"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"បង្ហាញភាគរយនៃកម្រិតថាមពលថ្មនៅក្នុងរូបតំណាងរបារស្ថានភាពនៅពេលមិនសាកថ្ម"</string> <string name="quick_settings" msgid="10042998191725428">"ការកំណត់រហ័ស"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ការកំណត់រហ័ស <xliff:g id="TITLE">%s</xliff:g>។"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ហតស្ប៉ត"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"ប្រវត្តិរូបការងារ"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"ល្អសម្រាប់អ្នកប្រើមួយចំនួន តែមិនសម្រាប់គ្រប់គ្នាទេ"</string> + <string name="tuner_warning" msgid="8730648121973575701">"កម្មវិធីសម្រួល UI ប្រព័ន្ធផ្តល់ជូនអ្នកនូវមធ្យោបាយបន្ថែមទៀតដើម្បីកែសម្រួល និងប្តូរចំណុចប្រទាក់អ្នកប្រើ Android តាមបំណង។ លក្ខណៈពិសេសសាកល្បងនេះអាចនឹងផ្លាស់ប្តូរ បំបែក ឬបាត់បង់បន្ទាប់ពីការចេញផ្សាយនាពេលអនាគត។ សូមបន្តដោយប្រុងប្រយ័ត្ន។"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"លក្ខណៈពិសេសសាកល្បងនេះអាចនឹងផ្លាស់ប្តូរ បំបែក ឬបាត់បង់បន្ទាប់ពីការចេញផ្សាយនាពេលអនាគត។ សូមបន្តដោយប្រុងប្រយ័ត្ន។"</string> + <string name="got_it" msgid="2239653834387972602">"យល់ហើយ"</string> + <string name="tuner_toast" msgid="603429811084428439">"សូមអបអរសាទរ! កម្មវិធីសម្រួល UI ប្រព័ន្ធត្រូវបានបន្ថែមទៅការកំណត់ហើយ"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"យកចេញពីការកំណត់"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"យកកម្មវិធីសម្រួល UI ប្រព័ន្ធចេញពីការកំណត់ ហើយឈប់ប្រើលក្ខណៈពិសេសរបស់វាទាំងអស់?"</string> </resources> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 75a8c9135503..6033303593da 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ವಾಲ್ಯೂಮ್ ಸಂವಾದವಾಗಿದೆ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ಮೂಲ ಮರುಸ್ಥಾಪಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ನೀವು ಬಳಸುತ್ತಿರುವಿರಿ"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"ಎಂಬೆಡ್ ಮಾಡಲಾದ ಬ್ಯಾಟರಿ ಶೇಕಡಾ ತೋರಿಸಿ"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ಚಾರ್ಜ್ ಮಾಡದಿರುವಾಗ ಸ್ಥಿತಿ ಪಟ್ಟಿ ಐಕಾನ್ ಒಳಗೆ ಬ್ಯಾಟರಿ ಮಟ್ಟದ ಶೇಕಡಾವನ್ನು ತೋರಿಸಿ"</string> <string name="quick_settings" msgid="10042998191725428">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ಹಾಟ್ಸ್ಪಾಟ್"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"ಕೆಲವರಿಗೆ ಮೋಜು ಆಗಿದೆ ಎಲ್ಲರಿಗೆ ಇಲ್ಲ"</string> + <string name="tuner_warning" msgid="8730648121973575701">"ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ನಿಮಗೆ Android ಬಳಕೆದಾರ ಅಂತರಸಂಪರ್ಕವನ್ನು ಸರಿಪಡಿಸಲು ಮತ್ತು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹೆಚ್ಚುವರಿ ಮಾರ್ಗಗಳನ್ನು ನೀಡುತ್ತದೆ. ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಭವಿಷ್ಯದ ಬಿಡುಗಡೆಗಳಲ್ಲಿ ಬದಲಾಗಬಹುದು, ವಿರಾಮವಾಗಬಹುದು ಅಥವಾ ಕಾಣಿಸಿಕೊಳ್ಳದಿರಬಹುದು. ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಭವಿಷ್ಯದ ಬಿಡುಗಡೆಗಳಲ್ಲಿ ಬದಲಾಗಬಹುದು, ವಿರಾಮವಾಗಬಹುದು ಅಥವಾ ಕಾಣಿಸಿಕೊಳ್ಳದಿರಬಹುದು. ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ."</string> + <string name="got_it" msgid="2239653834387972602">"ಅರ್ಥವಾಯಿತು"</string> + <string name="tuner_toast" msgid="603429811084428439">"ಅಭಿನಂದನೆಗಳು! ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಸೇರಿಸಲಾಗಿದೆ"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ತೆಗೆದುಹಾಕಿ"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ತೆಗೆದುಹಾಕುವುದೇ ಮತ್ತು ಅದರ ಎಲ್ಲಾ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸುವುದನ್ನು ನಿಲ್ಲಿಸುವುದೇ?"</string> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index ab299e8cd9cf..21796d0ae733 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>은(는) 볼륨 대화입니다."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"원본을 복원하려면 터치하세요."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"직장 프로필을 사용하고 있습니다."</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"시스템 UI 튜너"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"시스템 UI 튜너"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"내장형 배터리 잔량 비율 표시"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"충전 중이 아닌 경우 상태 표시줄 아이콘 내에 배터리 잔량 비율 표시"</string> <string name="quick_settings" msgid="10042998191725428">"빠른 설정"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"빠른 설정하기, <xliff:g id="TITLE">%s</xliff:g>"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"핫스팟"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"직장 프로필"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"마음에 들지 않을 수도 있음"</string> + <string name="tuner_warning" msgid="8730648121973575701">"시스템 UI 튜너를 사용하면 Android 사용자 인터페이스를 변경 및 맞춤설정할 수 있습니다. 이러한 실험실 기능은 향후 출시 버전에서는 변경되거나 다운되거나 사라질 수 있습니다. 신중하게 진행하시기 바랍니다."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"이러한 실험실 기능은 향후 출시 버전에서는 변경되거나 다운되거나 사라질 수 있습니다. 신중하게 진행하시기 바랍니다."</string> + <string name="got_it" msgid="2239653834387972602">"확인"</string> + <string name="tuner_toast" msgid="603429811084428439">"축하합니다. 시스템 UI 튜너가 설정에 추가되었습니다."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"설정에서 삭제"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"시스템 UI 튜너를 설정에서 삭제하고 모든 관련 기능의 사용을 중지하시겠습니까?"</string> </resources> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index ce82331d95fa..44ccbac49aea 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -423,7 +423,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> үндү катуулатуу диалогу"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Түпнусканы калыбына келтирүү үчүн тийип коюңуз."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Жумуш профилиңизди колдонуп жатасыз"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"SystemUI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Батарянын кубатнын деңгээли пайыз менен көрсөтлсүн"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Түзмөк кубаттанбай турганда, батареянын деңгээли статус тилкесинде көрүнүп турат"</string> <string name="quick_settings" msgid="10042998191725428">"Ыкчам жөндөөлөр"</string> @@ -444,4 +444,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Ыкчам жөндөөлөр, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Туташуу чекити"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Жумуш профили"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Баарына эле жага бербейт"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner Android колдонуучу интерфейсин жөнгө салып жана ыңгайлаштыруунун кошумча ыкмаларын сунуштайт. Бул сынамык функциялар кийинки чыгарылыштарда өзгөрүлүп, бузулуп же жоголуп кетиши мүмкүн. Абайлап колдонуңуз."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Бул сынамык функциялар кийинки чыгарылыштарда өзгөрүлүп, бузулуп же жоголуп кетиши мүмкүн. Абайлап колдонуңуз."</string> + <string name="got_it" msgid="2239653834387972602">"Түшүндүм"</string> + <string name="tuner_toast" msgid="603429811084428439">"Куттуктайбыз! Жөндөөлөргө System UI Tuner кошулду"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Жөндөөлөрдөн алып салуу"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"System UI Tuner Жөндөөлөрдөн алынып салынып, анын бардык функциялары токтотулсунбу?"</string> </resources> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index b76dc587fce8..0d33dcbd3539 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ແມ່ນໜ້າຕ່າງລະດັບສຽງ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ສໍາຜັດເພື່ອກູ້ຄືນຕົ້ນສະບັບ."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ທ່ານກຳລັງໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"ຕົວປັບ UI ລະບົບ"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"ສະແດງເປີເຊັນແບັດເຕີຣີທີ່ຕິດມາ"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ສະແດງເປີເຊັນລະດັບແບັດເຕີຣີຢູ່ດ້ານໃນໄອຄອນແຖບສະຖານະ ເມື່ອບໍ່ສາກຢູ່"</string> <string name="quick_settings" msgid="10042998191725428">"ການຕັ້ງຄ່າດ່ວນ"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ການຕັ້ງຄ່າດ່ວນ, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ຮັອດສະປອດ"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"ມ່ວນຊື່ນສຳລັບບາງຄົນ ແຕ່ບໍ່ແມ່ນສຳລັບທຸກຄົນ"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner ໃຫ້ທ່ານມີວິທີພິເສດຕື່ມອີກໃນການປັບປ່ຽນ ແລະຕົບແຕ່ງສ່ວນຕໍ່ປະສານຜູ້ໃຊ້ຂອງ Android. ຄຸນສົມບັດທົດລອງໃຊ້ເຫຼົ່ານີ້ອາດຈະປ່ຽນແປງ, ຢຸດເຊົາ ຫຼືຫາຍໄປໃນການວາງຈຳໜ່າຍໃນອະນາຄົດ. ຈົ່ງດຳເນີນຕໍ່ດ້ວຍຄວາມລະມັດລະວັງ."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ຄຸນສົມບັດທົດລອງໃຊ້ງານເຫຼົ່ານີ້ອາດຈະປ່ຽນແປງ, ຢຸດເຊົາ ຫຼືຫາຍໄປໃນການອອກຈຳໜ່າຍໃນອະນາຄົດ. ຈົ່ງສືບຕໍ່ດ້ວຍຄວາມລະມັດລະວັງ."</string> + <string name="got_it" msgid="2239653834387972602">"ໄດ້ແລ້ວ"</string> + <string name="tuner_toast" msgid="603429811084428439">"ຍິນດີດ້ວຍ! System UI Tuner ໄດ້ຖືກເພີ່ມໃສ່ການຕັ້ງຄ່າແລ້ວ"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"ເອົາອອກຈາກການຕັ້ງຄ່າ"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ເອົາ System UI Tuner ອອກຈາກການຕັ້ງຄ່າ ແລະຢຸດການໃຊ້ທຸກຄຸນສົມບັດໃຊ້ງານຂອງມັນ?"</string> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 34f0ea0f6d68..54ee52ce7fe5 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ yra garsumo valdymo dialogo langas"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Palieskite, kad atkurtumėte originalą."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Naudojate darbo profilį"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sistemos naudotojo sąsajos derinimo priemonė"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sistemos naudotojo sąsajos derinimo priemonė"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Rodyti įterptą akumuliat. įkrovos procentinę vertę"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Rodyti akumuliatoriaus įkrovos lygio procentinę vertę būsenos juostos piktogramoje, kai įrenginys nėra įkraunamas"</string> <string name="quick_settings" msgid="10042998191725428">"Spartieji nustatymai"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Spartieji nustatymai, „<xliff:g id="TITLE">%s</xliff:g>“."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Viešosios interneto prieigos taškas"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Darbo profilis"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Smagu, bet ne visada"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Sistemos naudotojo sąsajos derinimo priemonė suteikia papildomų galimybių pagerinti ir tinkinti „Android“ naudotojo sąsają. Šios eksperimentinės funkcijos gali pasikeisti, nutrūkti ar išnykti iš būsimų laidų. Tęskite atsargiai."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Šios eksperimentinės funkcijos gali pasikeisti, nutrūkti ar išnykti iš būsimų laidų. Tęskite atsargiai."</string> + <string name="got_it" msgid="2239653834387972602">"Supratau"</string> + <string name="tuner_toast" msgid="603429811084428439">"Sveikiname! Sistemos naudotojo sąsajos derinimo priemonė pridėta prie nustatymų"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Pašalinti iš nustatymų"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Ar norite pašalinti sistemos naudotojo sąsajos derinimo priemonę iš nustatymų ir nebenaudoti jokių jos funkcijų?"</string> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 1fa26eda8487..4e699e3de152 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -399,7 +399,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ir skaļuma dialoglodziņš"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Pieskarieties, lai atjaunotu sākotnējo."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Jūs izmantojat darba profilu."</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sistēmas saskarnes regulators"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sistēmas saskarnes regulators"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Rādīt akumulatora uzlādes līmeni procentos"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Rādīt akumulatora uzlādes līmeni procentos statusa joslas ikonā, kad netiek veikta uzlāde"</string> <string name="quick_settings" msgid="10042998191725428">"Ātrie iestatījumi"</string> @@ -420,4 +420,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Ātrie iestatījumi: <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Tīklājs"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Darba profils"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Jautri dažiem, bet ne visiem"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Sistēmas saskarnes regulators sniedz papildu veidus, kā mainīt un pielāgot Android lietotāja saskarni. Nākamajās versijās šīs eksperimentālās funkcijas var tikt mainītas, bojātas vai to darbība var tikt pārtraukta. Turpinot esiet uzmanīgs."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Nākamajās versijās šīs eksperimentālās funkcijas var tikt mainītas, bojātas vai to darbība var tikt pārtraukta. Turpinot esiet uzmanīgs."</string> + <string name="got_it" msgid="2239653834387972602">"Labi"</string> + <string name="tuner_toast" msgid="603429811084428439">"Apsveicam! Sistēmas saskarnes regulators ir pievienots iestatījumiem."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Noņemt no iestatījumiem"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vai noņemt sistēmas saskarnes regulatoru no iestatījumiem un pārtraukt izmantot visas tā funkcijas?"</string> </resources> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index d09ced371251..6a855905082f 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> е дијалог за јачина на звук"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Допрете за да го вратите оригиналот."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Го користите работниот профил"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Дотерување на кориснички интерфејс"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Адаптер на УИ на системот"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Прикажи вграден процент на батеријата"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Прикажи процент на ниво на батеријата во внатрешноста на иконата со статусна лента кога не се полни"</string> <string name="quick_settings" msgid="10042998191725428">"Брзи поставки"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Брзи поставки, <xliff:g id="TITLE">%s</xliff:g>"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Точка на пристап"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Работен профил"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Забава за некои, но не за сите"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Адаптерот на УИ на системот ви дава дополнителни начини за дотерување и приспособување на корисничкиот интерфејс на Android. Овие експериментални функции можеби ќе се изменат, расипат или ќе исчезнат во следните изданија. Продолжете со претпазливост."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Овие експериментални функции можеби ќе се изменат, расипат или ќе исчезнат во следните изданија. Продолжете со претпазливост."</string> + <string name="got_it" msgid="2239653834387972602">"Разбрав"</string> + <string name="tuner_toast" msgid="603429811084428439">"Честито! Го додадовте Адаптерот на УИ на системот на Поставки"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Отстрани од поставки"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Да се отстрани Адаптерот на УИ на системот од Поставки и да престанат да се користат сите негови функции?"</string> </resources> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index 17e0199c7829..eeb0106e7e5f 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>, വോളിയം ഡയലോഗാണ്"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ആദ്യത്തേത് പുനഃസ്ഥാപിക്കാൻ സ്പർശിക്കുക."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"നിങ്ങൾ ഉപയോഗിക്കുന്നത് ഔദ്യോഗിക പ്രൊഫൈലാണ്"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI ട്യൂണർ"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"സിസ്റ്റം UI ട്യൂണർ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"എംബഡ് ചെയ്ത ബാറ്ററി ശതമാനം കാണിക്കുക"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ചാർജ്ജുചെയ്യാതിരിക്കുമ്പോൾ സ്റ്റാറ്റസ് ബാർ ഐക്കണിൽ ബാറ്ററി ലെവൽ ശതമാനം കാണിക്കുക"</string> <string name="quick_settings" msgid="10042998191725428">"ദ്രുത ക്രമീകരണം"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ദ്രുത ക്രമീകരണം, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ഹോട്ട്സ്പോട്ട്"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"ചിലർക്ക് വിനോദം, എന്നാൽ എല്ലാവർക്കുമില്ല"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Android ഉപയോക്തൃ ഇന്റർഫേസ് ആവശ്യമുള്ള രീതിയിൽ മാറ്റുന്നതിനും ഇഷ്ടാനുസൃതമാക്കുന്നതിനും സിസ്റ്റം UI ട്യൂണർ നിങ്ങൾക്ക് അധിക വഴികൾ നൽകുന്നു. ഭാവി റിലീസുകളിൽ ഈ പരീക്ഷണാത്മക ഫീച്ചറുകൾ മാറ്റുകയോ നിർത്തുകയോ അപ്രത്യക്ഷമാവുകയോ ചെയ്തേക്കാം. ശ്രദ്ധയോടെ മുന്നോട്ടുപോകുക."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ഭാവി റിലീസുകളിൽ ഈ പരീക്ഷണാത്മക ഫീച്ചറുകൾ മാറ്റുകയോ നിർത്തുകയോ അപ്രത്യക്ഷമാവുകയോ ചെയ്തേക്കാം. ശ്രദ്ധയോടെ മുന്നോട്ടുപോകുക."</string> + <string name="got_it" msgid="2239653834387972602">"മനസ്സിലായി"</string> + <string name="tuner_toast" msgid="603429811084428439">"അഭിനന്ദനങ്ങൾ! ക്രമീകരണത്തിലേക്ക് സിസ്റ്റം UI ട്യൂണർ ചേർത്തിരിക്കുന്നു"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"ക്രമീകരണത്തിൽ നിന്ന് നീക്കംചെയ്യുക"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ക്രമീകരണത്തിൽ നിന്ന് സിസ്റ്റം UI ട്യൂണർ നീക്കംചെയ്യുകയും അതിന്റെ ഫീച്ചറുകളെല്ലാം ഉപയോഗിക്കുന്നത് നിർത്തുകയും ചെയ്യണോ?"</string> </resources> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index 7c7aa06477da..5ac85ed99984 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -396,7 +396,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь дууны диалог юм."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Анхны хувилбарыг эргүүлэн хадгалахыг хүсвэл хүрнэ үү."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Та өөрийн ажлын профайлыг ашиглаж байна"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Системийн UI Тохируулагч"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Залгаатай тэжээлийн хувийг харуулах"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Тэжээлийн хувийг цэнэглээгүй байх үед статусын хэсэгт харуулна уу"</string> <string name="quick_settings" msgid="10042998191725428">"Түргэвчилсэн Tохиргоо"</string> @@ -417,4 +417,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Түргэн Тохиргоо, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Сүлжээний цэг"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Ажлын профайл"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Зарим хүнд хөгжилтэй байж болох ч бүх хүнд тийм биш"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Системийн UI Tохируулагч нь Android хэрэглэгчийн интерфэйсийг тааруулах, өөрчлөх нэмэлт аргыг зааж өгөх болно. Эдгээр туршилтын тохиргоо нь цаашид өөрчлөгдөх, эвдрэх, алга болох магадлалтай. Үйлдлийг болгоомжтой хийнэ үү."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Эдгээр туршилтын тохиргоо нь цаашид өөрчлөгдөх, эвдрэх, алга болох магадлалтай. Үйлдлийг болгоомжтой хийнэ үү."</string> + <string name="got_it" msgid="2239653834387972602">"Ойлголоо"</string> + <string name="tuner_toast" msgid="603429811084428439">"Баяр хүргэе! Системийн UI Tохируулагчийг тохиргоонд нэмлээ"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Тохиргооноос устгах"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Системийн UI Тохируулагчийг тохиргооноос устгаж, үүнтэй холбоотой бүх тохиргоог ашиглахаа болих уу?"</string> </resources> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index e4773b7271c3..eb726eda3d79 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> हा व्हॉल्यूम संवाद आहे"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूळ पुनर्संचयित करण्यासाठी स्पर्श करा."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"आपण आपले कार्य प्रोफाईल वापरत आहात"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"सिस्टीम UI ट्यूनर"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"सिस्टीम UI ट्यूनर"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"एम्बेडेड बॅटरी टक्केवारी दर्शवा"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"चार्ज होत नसताना स्टेटस बार चिन्हामध्ये बॅटरी पातळी टक्केवारी दर्शवा"</string> <string name="quick_settings" msgid="10042998191725428">"दृत सेटिंग्ज"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"द्रुत सेटिंग्ज, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"हॉटस्पॉट"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"कार्य प्रोफाईल"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"सर्वांसाठी नाही तर काहींसाठी मजेदार असू शकते"</string> + <string name="tuner_warning" msgid="8730648121973575701">"सिस्टीम UI ट्यूनर आपल्याला Android वापरकर्ता इंटरफेस ट्विक आणि सानुकूल करण्याचे अनेक प्रकार देते. ही प्रयोगात्मक वैशिष्ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्यातील रिलीझ मध्ये कदाचित दिसणार नाहीत. सावधगिरी बाळगून पुढे सुरु ठेवा."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ही प्रयोगात्मक वैशिष्ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्यातील रिलीझ मध्ये कदाचित दिसणार नाहीत."</string> + <string name="got_it" msgid="2239653834387972602">"समजले"</string> + <string name="tuner_toast" msgid="603429811084428439">"अभिनंदन! सिस्टीम UI ट्यूनर सेटिंग्जमध्ये जोडले गेले आहे"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"सेटिंग्ज मधून काढा"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"सेटिंग्ज मधून सिस्टीम UI ट्यूनर काढून त्याची सर्व वैशिष्ट्ये वापरणे थांबवायचे?"</string> </resources> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index 3547a724b07c..9caa935f8087 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ialah dialog kelantangan"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Sentuh untuk memulihkan yang asal."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Anda sedang menggunakan profil kerja"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Penala Sistem UI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Penala UI Sistem"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Tunjukkan peratusan bateri terbenam"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Tunjukkan peratusan aras bateri dalam ikon bar status semasa tidak mengecas"</string> <string name="quick_settings" msgid="10042998191725428">"Tetapan Pantas"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Tetapan Pantas, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Tempat liputan"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil kerja"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Menarik untuk sesetengah orang tetapi bukan untuk semua"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Penala UI Sistem memberi anda cara tambahan untuk mengolah dan menyesuaikan antara muka Android. Ciri eksperimen ini boleh berubah, rosak atau hilang dalam keluaran masa hadapan. Teruskan dengan berhati-hati."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ciri eksperimen ini boleh berubah, rosak atau hilang dalam keluaran masa hadapan. Teruskan dengan berhati-hati."</string> + <string name="got_it" msgid="2239653834387972602">"Ok"</string> + <string name="tuner_toast" msgid="603429811084428439">"Tahniah! Penala UI Sistem telah ditambahkan pada Tetapan"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Alih keluar daripada Tetapan"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Alih keluar Penala UI Sistem daripada Tetapan dan berhenti menggunakan semua cirinya?"</string> </resources> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 64460f1bb298..0e5622e70a73 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် အသံဒိုင်ယာလော့ခ်ဖြစ်သည်"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"မူရင်းအားပြန်လည်သိမ်းဆည်းရန် ထိပါ။"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"သင်သည် အလုပ်ပရိုဖိုင်းအား သုံးနေသည်"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"စနစ် UI ဖမ်းစက်"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"မြုတ်ထားသည့် ဘတ်ထရီ ရာခိုင်နှုန်းကို ပြပါ"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"အားမသွင်းနေစဉ်တွင် ဘတ်ထရီအဆင့် ရာခိုင်နှုန်းကို အခြေနေပြဘား အိုင်ကွန်တွင် ပြပါ"</string> <string name="quick_settings" msgid="10042998191725428">"အမြန် ဆက်တင်များ"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"အမြန်ချိန်ညှိခြင်း၊ <xliff:g id="TITLE">%s</xliff:g>။"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ဟော့စပေါ့"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"အလုပ် ပရိုဖိုင်"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"အချို့သူများ အတွက် ပျော်စရာ ဖြစ်ပေမဲ့ အားလုံး အတွက် မဟုတ်ပါ"</string> + <string name="tuner_warning" msgid="8730648121973575701">"စနစ် UI ဖမ်းစက်က သင့်အတွက် Android အသုံးပြုသူ အင်တာဖေ့စ်ကို ပြောင်းကြည့်ရန် နှင့် စိတ်ကြိုက်ပြုလုပ်ရန် နည်းလမ်း အပိုများကို သင့်အတွက် စီစဉ်ပေးသည်။ ဤ စမ်းသပ်ရေး အင်္ဂါရပ်များမှာ ပြောင်းလဲ၊ ကျိုးပျက် သို့မဟုတ် ပျောက်ကွယ် သွားနိုင်သည်။ သတိထားလျက် ဆက်လက် ဆောင်ရွက်ပါ။"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ဤ စမ်းသပ်ရေး အင်္ဂါရပ်များမှာ ပြောင်းလဲ၊ ကျိုးပျက် သို့မဟုတ် ပျောက်ကွယ် သွားနိုင်သည်။ သတိထားလျက် ဆက်လက် ဆောင်ရွက်ပါ။"</string> + <string name="got_it" msgid="2239653834387972602">"ရပါပြီ"</string> + <string name="tuner_toast" msgid="603429811084428439">"ဂုဏ်ပြုပါရစေ! စနစ် UI ဖမ်းစက်ကို ဆက်တင်ထဲသို့ ထည့်ပြီးပြီ။"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"ဆက်တင် အထဲမှ ဖယ်ရှားရန်"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ဆက်တင် အထဲမှ စနစ် UI ဖမ်းစက်ကို ဖယ်ရှားလျက် ၎င်း၏ အင်္ဂါရပ်များ အားလုံး အသုံးပြုမှု ရပ်တန့်ရမလား?"</string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 5a0c8e32a332..4c55a9855241 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er volumdialogen"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Trykk for å gå tilbake til den opprinnelige volumdialogen."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du bruker jobbprofilen din"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"SystemUI Tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Vis prosent for det innebygde batteriet"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Vis batterinivåprosenten inni statusfeltikonet når du ikke lader"</string> <string name="quick_settings" msgid="10042998191725428">"Hurtiginnstillinger"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Hurtiginnstillinger, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Wi-Fi-sone"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Work-profil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Gøy for noen – ikke for alle"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Med System UI Tuner har du flere måter å justere og tilpasse Android-brukergrensesnittet på. Disse eksperimentelle funksjonene kan endres, avbrytes eller fjernes i fremtidige utgivelser. Fortsett med forbehold."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Disse eksperimentelle funksjonene kan endres, avbrytes eller fjernes i fremtidige utgivelser. Fortsett med forbehold."</string> + <string name="got_it" msgid="2239653834387972602">"Greit"</string> + <string name="tuner_toast" msgid="603429811084428439">"Gratulerer! System UI Tuner er lagt til i Innstillinger"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Fjern fra Innstillinger"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vil du fjerne System UI Tuner fra Innstillinger og slutte å bruke alle de tilknyttede funksjonene?"</string> </resources> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 0f9d45a588c2..9d5a67995d9e 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> भोल्यूम संवाद हो"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूल पुनर्स्थापना गर्न छुनुहोस्।"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"तपाईँले कार्य प्रोफाइल प्रयोग गर्दै हुनुहुन्छ"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"प्रणाली UI ट्युनर"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"प्रणाली UI ट्युनर"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"इम्बेड गरिएको ब्याट्री प्रतिशत देखाउनुहोस्"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"चार्ज नगरेको बेला वस्तुस्थिति पट्टी आइकन भित्र ब्याट्री प्रतिशत स्तर देखाउनुहोस्"</string> <string name="quick_settings" msgid="10042998191725428">"द्रुत सेटिङहरू"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"द्रुत सेटिङ, <xliff:g id="TITLE">%s</xliff:g>।"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"कार्य प्रोफाइल"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"केहीका लागि रमाइलो हुन्छ तर सबैका लागि होइन"</string> + <string name="tuner_warning" msgid="8730648121973575701">"प्रणाली UI ट्युनरले तपाईँलाई Android प्रयोगकर्ता इन्टरफेस अनुकूलन गर्न र ट्विक गर्न थप तरिकाहरू प्रदान गर्छ। यी प्रयोगात्मक सुविधाहरू भावी विमोचनमा परिवर्तन हुन, बिग्रिन वा हराउन सक्ने छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"यी प्रयोगात्मक सुविधाहरू भावी विमोचनहरूमा परिवर्तन हुन, बिग्रन वा हराउन सक्छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।"</string> + <string name="got_it" msgid="2239653834387972602">"बुझेँ"</string> + <string name="tuner_toast" msgid="603429811084428439">"बधाईँ छ! सेटिङहरूमा प्रणाली UI ट्युनर थप गरिएको छ"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"सेटिङहरूबाट हटाउनुहोस्"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"प्रणाली UI ट्युनर सेटिङहरूबाट हटाउने र यसका सबै सुविधाहरू प्रयोग गर्न रोक्ने हो?"</string> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index de4ac48d3492..33a8bdf76c53 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is het volumedialoogvenster"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tik hierop om het origineel te herstellen."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"U gebruikt uw werkprofiel"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Systeem-UI-tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Systeem-UI-tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Percentage ingebouwde accu weergeven"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Accupercentage weergeven in het pictogram op de statusbalk wanneer er niet wordt opgeladen"</string> <string name="quick_settings" msgid="10042998191725428">"Snelle instellingen"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Snelle instellingen, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Werkprofiel"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Leuk voor sommige gebruikers, maar niet voor iedereen"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Met Systeem-UI-tuner beschikt u over extra manieren om de Android-gebruikersinterface aan te passen. Deze experimentele functies kunnen veranderen, vastlopen of verdwijnen in toekomstige releases. Ga voorzichtig verder."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Deze experimentele functies kunnen veranderen, vastlopen of verdwijnen in toekomstige releases. Ga voorzichtig verder."</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"Systeem-UI-tuner is toegevoegd aan Instellingen"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Verwijderen uit Instellingen"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Systeem-UI-tuner uit Instellingen verwijderen en het gebruik van alle functies daarvan stopzetten?"</string> </resources> diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index 0225cb4618b6..f33b44169959 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਵੋਲਯੂਮ ਡਾਇਲੌਗ ਹੈ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ਅਸਲੀ ਨੂੰ ਰੀਸਟੋਰ ਕਰਨ ਲਈ ਛੋਹਵੋ।"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ਤੁਸੀਂ ਆਪਣੀ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਵਰਤ ਰਹੇ ਹੋ"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"SystemUI ਟਿਊਨਰ"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI ਟਿਊਨਰ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"ਜੋਡ਼ੀ ਗਈ ਬੈਟਰੀ ਪ੍ਰਤਿਸ਼ਤਤਾ ਦਿਖਾਓ"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ਜਦੋਂ ਚਾਰਜ ਨਾ ਹੋ ਰਹੀ ਹੋਵੇ ਤਾਂ ਸਥਿਤੀ ਬਾਰ ਦੇ ਅੰਦਰ ਬੈਟਰੀ ਪੱਧਰ ਪ੍ਰਤਿਸ਼ਤਤਾ ਦਿਖਾਓ"</string> <string name="quick_settings" msgid="10042998191725428">"ਤਤਕਾਲ ਸੈੱਟਿੰਗਜ਼"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ, <xliff:g id="TITLE">%s</xliff:g>।"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ਹੌਟਸਪੌਟ"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"ਕੰਮ ਪ੍ਰੋਫਾਈਲ"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"ਕੁਝ ਵਾਸਤੇ ਤਾਂ ਮਜ਼ੇਦਾਰ ਹੈ ਲੇਕਿਨ ਸਾਰਿਆਂ ਵਾਸਤੇ ਨਹੀਂ"</string> + <string name="tuner_warning" msgid="8730648121973575701">"ਸਿਸਟਮ UI ਟਿਊਨਰ ਤੁਹਾਨੂੰ Android ਉਪਭੋਗਤਾ ਇੰਟਰਫੇਸ ਤਬਦੀਲ ਕਰਨ ਅਤੇ ਅਨੁਕੂਲਿਤ ਕਰਨ ਲਈ ਵਾਧੂ ਤਰੀਕੇ ਦਿੰਦਾ ਹੈ। ਇਹ ਪ੍ਰਯੋਗਾਤਮਿਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਭਵਿੱਖ ਦੀ ਰੀਲੀਜ਼ ਵਿੱਚ ਬਦਲ ਸਕਦੀਆਂ ਹਨ, ਟੁੱਟ ਸਕਦੀਆਂ ਹਨ, ਜਾਂ ਅਲੋਪ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਸਾਵਧਾਨੀ ਨਾਲ ਅੱਗੇ ਵੱਧੋ।"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ਇਹ ਪ੍ਰਯੋਗਾਤਮਿਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਭਵਿੱਖ ਦੀ ਰੀਲੀਜ਼ ਵਿੱਚ ਬਦਲ ਸਕਦੀਆਂ ਹਨ, ਟੁੱਟ ਸਕਦੀਆਂ ਹਨ, ਜਾਂ ਅਲੋਪ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਸਾਵਧਾਨੀ ਨਾਲ ਅੱਗੇ ਵੱਧੋ।"</string> + <string name="got_it" msgid="2239653834387972602">"ਸਮਝ ਗਿਆ"</string> + <string name="tuner_toast" msgid="603429811084428439">"ਵਧਾਈਆਂ! ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਸੈਟਿੰਗਜ਼ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ ਹੈ"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"ਸੈਟਿੰਗਜ਼ ਤੋਂ ਹਟਾਓ"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ਕੀ ਸੈਟਿੰਗਜ਼ ਤੋਂ ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਹਟਾਉਣਾ ਹੈ ਅਤੇ ਇਸਦੀਆਂ ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਉਪਯੋਗ ਕਰਨ ਤੋਂ ਰੋਕਣਾ ਹੈ?"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 808056983296..7314c4214f4a 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> steruje głośnością"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dotknij, by przywrócić pierwotną."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Używasz profilu do pracy"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Kalibrator System UI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Kalibrator System UI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Pokaż procent naładowania baterii"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Pokaż procent naładowania baterii w ikonie na pasku stanu, gdy telefon się nie ładuje"</string> <string name="quick_settings" msgid="10042998191725428">"Szybkie ustawienia"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Szybkie ustawienia, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil do pracy"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Dobra zabawa, ale nie dla każdego"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Kalibrator System UI udostępnia dodatkowe sposoby dostrajania i dostosowywania interfejsu Androida. Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string> + <string name="got_it" msgid="2239653834387972602">"Rozumiem"</string> + <string name="tuner_toast" msgid="603429811084428439">"Gratulujemy, Kalibrator System UI został dodany do Ustawień"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Usuń z Ustawień"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Usunąć Kalibrator System UI z Ustawień i przestać używać wszystkich jego funkcji?"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000000..68f87e519e2a --- /dev/null +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -0,0 +1,431 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2009, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="7164937344850004466">"Interf sist"</string> + <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string> + <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string> + <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informações do app"</string> + <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Suas telas recentes aparecem aqui"</string> + <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dispensar apps recentes"</string> + <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759"> + <item quantity="one">%d telas em \"Visão geral\"</item> + <item quantity="other">%d telas em \"Visão geral\"</item> + </plurals> + <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string> + <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string> + <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string> + <string name="battery_low_title" msgid="6456385927409742437">"Bateria fraca"</string> + <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restantes"</string> + <string name="battery_low_percent_format_saver_started" msgid="6859235584035338833">"<xliff:g id="PERCENTAGE">%s</xliff:g> restantes. A Economia de bateria está ativada."</string> + <string name="invalid_charger" msgid="4549105996740522523">"O carregamento via USB não é suportado.\nUse apenas o carregador fornecido."</string> + <string name="invalid_charger_title" msgid="3515740382572798460">"O carregamento via USB não é suportado."</string> + <string name="invalid_charger_text" msgid="5474997287953892710">"Use apenas o carregador fornecido."</string> + <string name="battery_low_why" msgid="4553600287639198111">"Configurações"</string> + <string name="battery_saver_confirmation_title" msgid="5299585433050361634">"Ativar a economia de bateria?"</string> + <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Ativar"</string> + <string name="battery_saver_start_action" msgid="5576697451677486320">"Ativar a economia de bateria"</string> + <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configurações"</string> + <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> + <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Girar automaticamente a tela"</string> + <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUDO"</string> + <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> + <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificações"</string> + <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth vinculado"</string> + <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Configurar métodos de entrada"</string> + <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Teclado físico"</string> + <string name="usb_device_permission_prompt" msgid="834698001271562057">"Permitir que o app <xliff:g id="APPLICATION">%1$s</xliff:g> acesse o dispositivo USB?"</string> + <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Permitir que o app <xliff:g id="APPLICATION">%1$s</xliff:g> acesse o acessório USB?"</string> + <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Abrir <xliff:g id="ACTIVITY">%1$s</xliff:g> quando este dispositivo USB estiver conectado?"</string> + <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Abrir <xliff:g id="ACTIVITY">%1$s</xliff:g> quando este acessório USB estiver conectado?"</string> + <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Nenhum apl. instalado funciona com o USB. Saiba mais sobre o acessório em <xliff:g id="URL">%1$s</xliff:g>"</string> + <string name="title_usb_accessory" msgid="4966265263465181372">"Acessório USB"</string> + <string name="label_view" msgid="6304565553218192990">"Visualizar"</string> + <string name="always_use_device" msgid="1450287437017315906">"Usar por padrão para este dispositivo USB"</string> + <string name="always_use_accessory" msgid="1210954576979621596">"Usar por padrão para este acessório USB"</string> + <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuração USB?"</string> + <string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA deste computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> + <string name="usb_debugging_always" msgid="303335496705863070">"Sempre permitir a partir deste computador"</string> + <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string> + <string name="usb_debugging_secondary_user_message" msgid="6011931347142270156">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"<xliff:g id="NAME">%s</xliff:g>\"."</string> + <string name="compat_mode_on" msgid="6623839244840638213">"Zoom p/ preencher a tela"</string> + <string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string> + <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvando captura de tela..."</string> + <string name="screenshot_saving_title" msgid="8242282144535555697">"Salvando captura de tela..."</string> + <string name="screenshot_saving_text" msgid="2419718443411738818">"A captura de tela está sendo salva."</string> + <string name="screenshot_saved_title" msgid="6461865960961414961">"Captura de tela obtida."</string> + <string name="screenshot_saved_text" msgid="1152839647677558815">"Toque para visualizar a captura de tela."</string> + <string name="screenshot_failed_title" msgid="705781116746922771">"Não foi possível obter a captura de tela."</string> + <string name="screenshot_failed_text" msgid="1260203058661337274">"Não é possível capturar a tela porque não há espaço suficiente ou o app ou organização não permite."</string> + <string name="usb_preference_title" msgid="6551050377388882787">"Opções transf. arq. por USB"</string> + <string name="use_mtp_button_title" msgid="4333504413563023626">"Conectar como media player (MTP)"</string> + <string name="use_ptp_button_title" msgid="7517127540301625751">"Montar como uma câmera (PTP)"</string> + <string name="installer_cd_button_title" msgid="2312667578562201583">"Instalar apl. de transf. arq. do Android para Mac"</string> + <string name="accessibility_back" msgid="567011538994429120">"Voltar"</string> + <string name="accessibility_home" msgid="8217216074895377641">"Página inicial"</string> + <string name="accessibility_menu" msgid="316839303324695949">"Menu"</string> + <string name="accessibility_recent" msgid="5208608566793607626">"Visão geral"</string> + <string name="accessibility_search_light" msgid="1103867596330271848">"Pesquisar"</string> + <string name="accessibility_camera_button" msgid="8064671582820358152">"Câmera"</string> + <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefone"</string> + <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Assistência de voz"</string> + <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> + <string name="accessibility_unlock_button_fingerprint" msgid="8214125623493923751">"Botão de desbloqueio. Aguardando impressão digital"</string> + <string name="accessibility_unlock_without_fingerprint" msgid="7541705575183694446">"Desbloquear sem usar impressão digital"</string> + <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> + <string name="phone_label" msgid="2320074140205331708">"abrir telefone"</string> + <string name="voice_assist_label" msgid="3956854378310019854">"abrir assistência de voz"</string> + <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> + <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> + <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth desconectado."</string> + <string name="accessibility_no_battery" msgid="358343022352820946">"Sem bateria."</string> + <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Uma barra de bateria."</string> + <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Duas barras de bateria."</string> + <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Três barras de bateria."</string> + <string name="accessibility_battery_full" msgid="8909122401720158582">"Bateria cheia."</string> + <string name="accessibility_no_phone" msgid="4894708937052611281">"Sem telefone."</string> + <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Uma barra de sinal do telefone."</string> + <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Duas barras de sinal do telefone."</string> + <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Três barras de sinal do telefone."</string> + <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Sinal do telefone cheio."</string> + <string name="accessibility_no_data" msgid="4791966295096867555">"Nenhum dado."</string> + <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Uma barra de sinal de dados."</string> + <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Duas barras de sinal de dados."</string> + <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Três barras do sinal de dados."</string> + <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Sinal de dados cheio."</string> + <string name="accessibility_wifi_name" msgid="7202151365171148501">"Conectado a <xliff:g id="WIFI">%s</xliff:g>."</string> + <string name="accessibility_bluetooth_name" msgid="8441517146585531676">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> + <string name="accessibility_no_wimax" msgid="4329180129727630368">"Sem WiMAX."</string> + <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"Uma barra do WiMAX."</string> + <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Duas barras do WiMAX."</string> + <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Três barras do WiMAX."</string> + <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Sinal WiMAX completo."</string> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet desconectada."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet conectada."</string> + <string name="accessibility_no_signal" msgid="7064645320782585167">"Sem sinal."</string> + <string name="accessibility_not_connected" msgid="6395326276213402883">"Sem conexão."</string> + <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nenhuma barra."</string> + <string name="accessibility_one_bar" msgid="1685730113192081895">"Uma barra."</string> + <string name="accessibility_two_bars" msgid="6437363648385206679">"Duas barras."</string> + <string name="accessibility_three_bars" msgid="2648241415119396648">"Três barras."</string> + <string name="accessibility_signal_full" msgid="9122922886519676839">"Sinal cheio."</string> + <string name="accessibility_desc_on" msgid="2385254693624345265">"Ligado."</string> + <string name="accessibility_desc_off" msgid="6475508157786853157">"Desligado."</string> + <string name="accessibility_desc_connected" msgid="8366256693719499665">"Conectado."</string> + <string name="accessibility_desc_connecting" msgid="3812924520316280149">"Conectando."</string> + <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string> + <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string> + <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string> + <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string> + <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string> + <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string> + <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string> + <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string> + <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string> + <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string> + <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string> + <string name="accessibility_no_sim" msgid="8274017118472455155">"Sem SIM."</string> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering Bluetooth."</string> + <string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avião."</string> + <string name="accessibility_no_sims" msgid="3957997018324995781">"Sem cartão SIM."</string> + <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Alteração de rede de operadora."</string> + <!-- String.format failed for translation --> + <!-- no translation found for accessibility_battery_level (7451474187113371965) --> + <skip /> + <string name="accessibility_settings_button" msgid="799583911231893380">"Configurações do sistema"</string> + <string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificações."</string> + <string name="accessibility_remove_notification" msgid="3603099514902182350">"Limpar notificação."</string> + <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS ativado."</string> + <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"Aquisição de GPS."</string> + <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTYpewriter ativado."</string> + <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibração da campainha."</string> + <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Campainha silenciosa."</string> + <!-- no translation found for accessibility_casting (6887382141726543668) --> + <skip /> + <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Descartar <xliff:g id="APP">%s</xliff:g>."</string> + <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartado."</string> + <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todos os apps recentes foram dispensados."</string> + <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> + <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificação dispensada."</string> + <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Aba de notificações."</string> + <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configurações rápidas."</string> + <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Tela de bloqueio."</string> + <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configurações"</string> + <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visão geral."</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Fechar"</string> + <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuário <xliff:g id="USER">%s</xliff:g>."</string> + <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> + <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"O Wi-Fi foi desativado."</string> + <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"O Wi-Fi foi ativado."</string> + <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Celular <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> + <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Bateria <xliff:g id="STATE">%s</xliff:g>."</string> + <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Modo avião desativado."</string> + <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Modo avião ativado."</string> + <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"O modo avião foi desativado."</string> + <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"O modo avião foi ativado."</string> + <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"Não perturbe\" ativado, somente prioridade."</string> + <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"\"Não perturbe\" ativado, silêncio total."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"Não perturbe\" ativado, somente alarmes."</string> + <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Não perturbe\" desativado."</string> + <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Não perturbe\" desativado."</string> + <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Não perturbe\" ativado."</string> + <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Bluetooth desativado."</string> + <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Bluetooth ativado."</string> + <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"Conectando Bluetooth."</string> + <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth conectado."</string> + <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"O Bluetooth foi desativado."</string> + <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"O Bluetooth foi ativado."</string> + <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"Relatório de Localização desativado."</string> + <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"Relatório de Localização ativado."</string> + <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"O Relatório de Localização foi desativado."</string> + <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"O Relatório de Localização foi ativado."</string> + <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string> + <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Fechar painel."</string> + <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mais tempo."</string> + <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Menos tempo."</string> + <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lanterna desativada."</string> + <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lanterna ativada."</string> + <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"A lanterna foi desativada."</string> + <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"A lanterna foi ativada."</string> + <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"A inversão de cores foi desativada."</string> + <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"A inversão de cores foi ativada."</string> + <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"O ponto de acesso móvel foi desativado."</string> + <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"O ponto de acesso móvel foi ativado."</string> + <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"A transmissão de tela foi interrompida."</string> + <string name="accessibility_brightness" msgid="8003681285547803095">"Brilho da tela"</string> + <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os dados 2G e 3G foram pausados"</string> + <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os dados 4G foram pausados"</string> + <string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Os dados da rede celular foram pausados"</string> + <string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Os dados foram pausados"</string> + <string name="data_usage_disabled_dialog" msgid="8453242888903772524">"Como seu limite de dados definido foi atingido, o dispositivo pausou o uso de dados para o restante deste ciclo.\n\nA retomada pode gerar cobranças por parte da sua operadora."</string> + <string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Retomar"</string> + <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Sem conexão à Internet"</string> + <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi conectado"</string> + <string name="gps_notification_searching_text" msgid="8574247005642736060">"Buscando GPS"</string> + <string name="gps_notification_found_text" msgid="4619274244146446464">"Local definido por GPS"</string> + <string name="accessibility_location_active" msgid="2427290146138169014">"Solicitações de localização ativas"</string> + <string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string> + <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Configurações de notificação"</string> + <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"Configurações de <xliff:g id="APP_NAME">%s</xliff:g>"</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"A tela girará automaticamente."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"A tela está bloqueada na orientação paisagem."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"A tela está bloqueada na orientação retrato."</string> + <string name="accessibility_rotation_lock_off_changed" msgid="8134601071026305153">"Agora a tela vai girar automaticamente."</string> + <string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"A tela está bloqueada na orientação cenário."</string> + <string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"A tela está bloqueada na orientação retrato."</string> + <string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string> + <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> + <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string> + <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Só prioridade"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string> + <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Silêncio total"</string> + <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> + <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivos)"</string> + <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth desativado"</string> + <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Não há dispositivos pareados disponíveis"</string> + <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string> + <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotação automática"</string> + <string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"Rotação bloqueada"</string> + <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"Retrato"</string> + <string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"Paisagem"</string> + <string name="quick_settings_ime_label" msgid="7073463064369468429">"Método de entrada"</string> + <string name="quick_settings_location_label" msgid="5011327048748762257">"Localização"</string> + <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Localização desativada"</string> + <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispositivo de mídia"</string> + <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string> + <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Somente chamadas de emergência"</string> + <string name="quick_settings_settings_label" msgid="5326556592578065401">"Configurações"</string> + <string name="quick_settings_time_label" msgid="4635969182239736408">"Hora"</string> + <string name="quick_settings_user_label" msgid="5238995632130897840">"Eu"</string> + <string name="quick_settings_user_title" msgid="4467690427642392403">"Usuário"</string> + <string name="quick_settings_user_new_user" msgid="9030521362023479778">"Novo usuário"</string> + <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string> + <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Não conectado"</string> + <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Sem rede"</string> + <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desligado"</string> + <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string> + <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> + <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto para transmitir"</string> + <string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Não há dispositivos disponíveis"</string> + <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brilho"</string> + <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string> + <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Inverter cores"</string> + <string name="quick_settings_color_space_label" msgid="853443689745584770">"Modo de correção de cor"</string> + <string name="quick_settings_more_settings" msgid="326112621462813682">"Mais configurações"</string> + <string name="quick_settings_done" msgid="3402999958839153376">"Concluído"</string> + <string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string> + <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> + <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="8575062783675171695">"Dados da rede celular"</string> + <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Uso de dados"</string> + <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Dados restantes"</string> + <string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Limite excedido"</string> + <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Usados: <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">"Aviso de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <string name="recents_empty_message" msgid="8682129509540827999">"Suas telas recentes aparecem aqui"</string> + <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações do app"</string> + <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixação de tela"</string> + <string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string> + <string name="recents_launch_error_message" msgid="2969287838120550506">"Não foi possível iniciar <xliff:g id="APP">%s</xliff:g>."</string> + <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Dispensar todos os apps"</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> + <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string> + <string name="expanded_header_battery_charging" msgid="205623198487189724">"Carregando"</string> + <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> até concluir"</string> + <string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"Não está carregando"</string> + <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"A rede pode estar\nsob monitoração"</string> + <string name="description_target_search" msgid="3091587249776033139">"Pesquisar"</string> + <string name="description_direction_up" msgid="7169032478259485180">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string> + <string name="description_direction_left" msgid="7207478719805562165">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string> + <string name="zen_priority_introduction" msgid="3070506961866919502">"Você não será perturbado por sons e vibrações, com exceção de alarmes, lembretes, eventos e autores de chamadas que você especificar."</string> + <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string> + <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos. Você ainda poderá fazer chamadas telefônicas."</string> + <string name="zen_silence_introduction" msgid="3137882381093271568">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos."</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">"Notificações menos urgentes abaixo"</string> + <string name="notification_tap_again" msgid="8524949573675922138">"Toque novamente para abrir"</string> + <string name="keyguard_unlock" msgid="8043466894212841998">"Deslize para cima para desbloquear"</string> + <string name="phone_hint" msgid="4872890986869209950">"Deslize a partir do ícone do telefone"</string> + <string name="voice_hint" msgid="8939888732119726665">"Deslize a partir do ícone de assistência de voz"</string> + <string name="camera_hint" msgid="7939688436797157483">"Deslize a partir do ícone da câmera"</string> + <string name="interruption_level_none_with_warning" msgid="5114872171614161084">"Silêncio total. Isso também silenciará os leitores de tela."</string> + <string name="interruption_level_none" msgid="6000083681244492992">"Silêncio total"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Só prioridade"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Somente alarmes"</string> + <string name="interruption_level_none_twoline" msgid="3957581548190765889">"Silêncio\ntotal"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Somente\nprioridade"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Somente\nalarmes"</string> + <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Carregando (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> até concluir)"</string> + <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Trocar usuário"</string> + <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Alternar usuário. Usuário atual <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> + <string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Usuário atual <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> + <string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"Mostrar perfil"</string> + <string name="user_add_user" msgid="5110251524486079492">"Adicionar usuário"</string> + <string name="user_new_user_name" msgid="426540612051178753">"Novo usuário"</string> + <string name="guest_nickname" msgid="8059989128963789678">"Convidado"</string> + <string name="guest_new_guest" msgid="600537543078847803">"Adicionar convidado"</string> + <string name="guest_exit_guest" msgid="7187359342030096885">"Remover convidado"</string> + <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"Remover convidado?"</string> + <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"Todos os apps e dados nesta sessão serão excluídos."</string> + <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"Remover"</string> + <string name="guest_wipe_session_title" msgid="6419439912885956132">"Bem-vindo, convidado."</string> + <string name="guest_wipe_session_message" msgid="8476238178270112811">"Deseja continuar a sessão?"</string> + <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Recomeçar"</string> + <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sim, continuar"</string> + <string name="guest_notification_title" msgid="1585278533840603063">"Usuário convidado"</string> + <string name="guest_notification_text" msgid="335747957734796689">"Para excluir apps e dados, remova o usuário convidado"</string> + <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVER CONVIDADO"</string> + <string name="user_add_user_title" msgid="4553596395824132638">"Adicionar novo usuário?"</string> + <string name="user_add_user_message_short" msgid="2161624834066214559">"Quando você adiciona um novo usuário, essa pessoa precisa configurar o próprio espaço.\n\nQualquer usuário pode atualizar apps para os demais usuários."</string> + <string name="battery_saver_notification_title" msgid="237918726750955859">"A Economia de bateria está ativada"</string> + <string name="battery_saver_notification_text" msgid="820318788126672692">"Reduz o desempenho e os dados em segundo plano"</string> + <string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desativar a economia de bateria"</string> + <string name="notification_hidden_text" msgid="1135169301897151909">"Conteúdo oculto"</string> + <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> começará a capturar tudo o que for exibido na tela."</string> + <string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar novamente"</string> + <string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string> + <string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar agora"</string> + <string name="empty_shade_text" msgid="708135716272867002">"Sem notificações"</string> + <string name="device_owned_footer" msgid="3802752663326030053">"O dispositivo pode ser monitorado"</string> + <string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pode ser monitorado"</string> + <string name="vpn_footer" msgid="2388611096129106812">"A rede pode ser monitorada"</string> + <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Monitoramento de dispositivos"</string> + <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoramento de perfis"</string> + <string name="monitoring_title" msgid="169206259253048106">"Monitoramento de rede"</string> + <string name="disable_vpn" msgid="4435534311510272506">"Desativar VPN"</string> + <string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string> + <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações sobre a localização do dispositivo. Para mais informações, entre em contato com o administrador."</string> + <string name="monitoring_description_vpn" msgid="4445150119515393526">"Você deu permissão para um app configurar uma conexão VPN.\n\nEsse app pode monitorar seu dispositivo e a atividade na rede, incluindo e-mails, apps e websites."</string> + <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a uma VPN, a qual pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara mais informações, entre em contato com seu administrador."</string> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara mais informações, entre em contato com seu administrador.\n\nVocê também está conectado a uma VPN, a qual pode monitorar suas atividades de rede."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6259179342284742878">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites."</string> + <string name="monitoring_description_app_personal" msgid="484599052118316268">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites."</string> + <string name="monitoring_description_app_work" msgid="1754325860918060897">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ele está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador."</string> + <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ele está conectado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorar sua atividade pessoal na rede."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador."</string> + <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"O dispositivo permanecerá bloqueado até que você o desbloqueie manualmente"</string> + <string name="hidden_notifications_title" msgid="7139628534207443290">"Receba notificações mais rápido"</string> + <string name="hidden_notifications_text" msgid="2326409389088668981">"Veja-as antes de desbloquear"</string> + <string name="hidden_notifications_cancel" msgid="3690709735122344913">"Não, obrigado"</string> + <string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string> + <string name="notification_expand_button_text" msgid="1037425494153780718">"Ver tudo"</string> + <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ocultar tudo"</string> + <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> + <string name="volume_zen_end_now" msgid="3179845345429841822">"Finalizar agora"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expandir"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Recolher"</string> + <string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string> + <string name="screen_pinning_description" msgid="1346522416878235405">"Ela é mantida à vista até que seja liberada. Toque em \"Voltar\" e \"Visão Geral\" e mantenha essas opções pressionadas ao mesmo tempo para liberar."</string> + <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Ela é mantida à vista até que seja liberada. Toque em \"Visão geral\" e mantenha essa opção pressionada para liberar."</string> + <string name="screen_pinning_positive" msgid="3783985798366751226">"Entendi"</string> + <string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string> + <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> + <string name="volumeui_prompt_message" msgid="918680947433389110">"<xliff:g id="APP_NAME">%1$s</xliff:g> deseja ser a caixa de diálogo referente ao volume."</string> + <string name="volumeui_prompt_allow" msgid="7954396902482228786">"Permitir"</string> + <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Negar"</string> + <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo referente ao volume"</string> + <string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string> + <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Você está usando seu perfil de trabalho"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador System UI"</string> + <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentagem de bateria incorporada"</string> + <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar porcentagem de nível de bateria dentro do ícone da barra de status quando não estiver carregando"</string> + <string name="quick_settings" msgid="10042998191725428">"Configurações rápidas"</string> + <string name="status_bar" msgid="4877645476959324760">"Barra de status"</string> + <string name="demo_mode" msgid="2389163018533514619">"Modo de demonstração"</string> + <string name="enable_demo_mode" msgid="4844205668718636518">"Ativar modo de demonstração"</string> + <string name="show_demo_mode" msgid="2018336697782464029">"Mostrar modo de demonstração"</string> + <string name="status_bar_ethernet" msgid="5044290963549500128">"Ethernet"</string> + <string name="status_bar_alarm" msgid="8536256753575881818">"Alarme"</string> + <string name="status_bar_work" msgid="6022553324802866373">"Perfil de trabalho"</string> + <string name="status_bar_airplane" msgid="7057575501472249002">"Modo avião"</string> + <string name="add_tile" msgid="2995389510240786221">"Adicionar bloco"</string> + <string name="broadcast_tile" msgid="3894036511763289383">"Transmitir bloco"</string> + <string name="zen_alarm_warning_indef" msgid="3482966345578319605">"Você não ouvirá o próximo alarme às <xliff:g id="WHEN">%1$s</xliff:g>, a menos que desative essa opção antes desse horário"</string> + <string name="zen_alarm_warning" msgid="444533119582244293">"Você não ouvirá o próximo alarme às <xliff:g id="WHEN">%1$s</xliff:g>"</string> + <string name="alarm_template" msgid="3980063409350522735">"às <xliff:g id="WHEN">%1$s</xliff:g>"</string> + <string name="alarm_template_far" msgid="4242179982586714810">"<xliff:g id="WHEN">%1$s</xliff:g>"</string> + <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Configurações rápidas, <xliff:g id="TITLE">%s</xliff:g>."</string> + <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Ponto de acesso"</string> + <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de trabalho"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diversão para alguns, mas não para todos"</string> + <string name="tuner_warning" msgid="8730648121973575701">"O sintonizador System UI fornece maneiras adicionais de ajustar e personalizar a interface do usuário do Android. Esses recursos experimentais podem mudar, falhar ou desaparecer nas versões futuras. Prossiga com cuidado."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Esses recursos experimentais podem mudar, falhar ou desaparecer nas versões futuras. Prossiga com cuidado."</string> + <string name="got_it" msgid="2239653834387972602">"Entendi"</string> + <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O sintonizador System UI foi adicionado às configurações"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Remover das configurações"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remover sintonizador System UI das configurações e parar de usar todos os seus recursos?"</string> +</resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 2d518c68f284..a4016a5fc090 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo do volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Está a utilizar o seu perfil de trabalho"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sintonizador da IU do sistema"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador da interface do sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar percentagem da bateria incorporada"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar a percentagem do nível da bateria no ícone da barra de estado quando não estiver a carregar"</string> <string name="quick_settings" msgid="10042998191725428">"Definições rápidas"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Definições rápidas, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Zona Wi-Fi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de trabalho"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diversão para alguns, mas não para todos"</string> + <string name="tuner_warning" msgid="8730648121973575701">"O Sintonizador da interface do sistema disponibiliza-lhe formas adicionais ajustar e personalizar a interface do utilizador do Android. Estas funcionalidades experimentais podem ser alteradas, deixar de funcionar ou desaparecer em versões futuras. Prossiga com cuidado."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Estas funcionalidades experimentais podem ser alteradas, deixar de funcionar ou desaparecer em versões futuras. Prossiga com cuidado."</string> + <string name="got_it" msgid="2239653834387972602">"Compreendi"</string> + <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O Sintonizador da interface do sistema foi adicionado às Definições"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Remover das Definições"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Pretende remover o Sintonizador da interface do sistema das Definições e deixar de utilizar todas as respetivas funcionalidades?"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index a9017742e206..68f87e519e2a 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo referente ao volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Você está usando seu perfil de trabalho"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sintonizador System UI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador System UI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentagem de bateria incorporada"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar porcentagem de nível de bateria dentro do ícone da barra de status quando não estiver carregando"</string> <string name="quick_settings" msgid="10042998191725428">"Configurações rápidas"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Configurações rápidas, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Ponto de acesso"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de trabalho"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diversão para alguns, mas não para todos"</string> + <string name="tuner_warning" msgid="8730648121973575701">"O sintonizador System UI fornece maneiras adicionais de ajustar e personalizar a interface do usuário do Android. Esses recursos experimentais podem mudar, falhar ou desaparecer nas versões futuras. Prossiga com cuidado."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Esses recursos experimentais podem mudar, falhar ou desaparecer nas versões futuras. Prossiga com cuidado."</string> + <string name="got_it" msgid="2239653834387972602">"Entendi"</string> + <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O sintonizador System UI foi adicionado às configurações"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Remover das configurações"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remover sintonizador System UI das configurações e parar de usar todos os seus recursos?"</string> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 2349d2aac59a..874f51ab17fe 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -399,7 +399,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> afișează caseta de dialog pentru volum"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Atingeți pentru a reveni la setarea inițială."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Acum folosiți profilul de serviciu"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Afișați procentajul bateriei încorporat"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Afișați procentajul cu nivelul bateriei în interiorul pictogramei din bara de stare, atunci când nu se încarcă"</string> <string name="quick_settings" msgid="10042998191725428">"Setări rapide"</string> @@ -420,4 +420,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Setări rapide, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil de serviciu"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Distractiv pentru unii, dar nu pentru toată lumea"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner vă oferă modalități suplimentare de a ajusta și a personaliza interfața de utilizare Android. Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuați cu prudență."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Aceste funcții experimentale pot să se schimbe, să se blocheze sau să dispară din versiunile viitoare. Continuați cu prudență."</string> + <string name="got_it" msgid="2239653834387972602">"Am înțeles"</string> + <string name="tuner_toast" msgid="603429811084428439">"Felicitări! System UI Tuner a fost adăugat în Setări"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Eliminați din Setări"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Eliminați System UI Tuner din Setări și încetați utilizarea tuturor funcțiilor sale?"</string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 788a136ff1fa..49228d13b06a 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -402,7 +402,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> назначено регулятором громкости"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Нажмите, чтобы восстановить приложение по умолчанию."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Вы перешли в рабочий профиль"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"SystemUI Tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Показывать уровень заряда батареи в процентах"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Когда устройство работает в автономном режиме, процент заряда батареи показан в строке состояния"</string> <string name="quick_settings" msgid="10042998191725428">"Быстрые настройки"</string> @@ -423,4 +423,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Быстрые настройки, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Точка доступа"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Рабочий профиль"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Внимание!"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner позволяет настраивать интерфейс устройства Android по вашему вкусу. В будущем эта экспериментальная функция может измениться, перестать работать или исчезнуть."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Это экспериментальная функция. В будущем она может измениться, перестать работать или исчезнуть."</string> + <string name="got_it" msgid="2239653834387972602">"ОК"</string> + <string name="tuner_toast" msgid="603429811084428439">"Функция System UI Tuner добавлена в меню настроек"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Удалить из настроек"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Убрать функцию System UI Tuner из меню настроек и прекратить ее работу?"</string> </resources> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 358441767c03..eb6d981a4166 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ධාරිතා සංවාදයයි"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"මුල් තත්ත්වය නැවත ප්රතිසාධනය කිරීමට ස්පර්ශ කරන්න."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ඔබ ඔබේ කාර්යාල පැතිකඩ භාවිත කරමින් සිටී"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"පද්ධති UI Tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"පද්ධති UI සුසරකය"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"කාවද්දන ලද බැටරි ප්රතිශතය පෙන්වන්න"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ආරෝපණය නොවන විට තත්ත්ව තීරු නිරූපකය ඇතුළත බැටරි මට්ටම් ප්රතිශතය පෙන්වන්න"</string> <string name="quick_settings" msgid="10042998191725428">"ඉක්මන් සැකසීම්"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ඉක්මන් සැකසුම්, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"හොට්ස්පොට්"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"කාර්යාල පැතිකඩ"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"සමහරක් දේවල් වලට විනෝදයි, නමුත් සියල්ලටම නොවේ"</string> + <string name="tuner_warning" msgid="8730648121973575701">"පද්ධති UI සුසරකය ඔබට Android පරිශීලක අතුරු මුහුණත වෙනස් කිරීමට හෝ අභිරුචිකරණය කිරීමට අමතර ක්රම ලබා දේ. මෙම පර්යේෂණාත්මක අංග ඉදිරි නිකුත් වීම් වල වෙනස් වීමට, වැඩ නොකිරීමට, හෝ නැතිවීමට හැක. ප්රවේශමෙන් ඉදිරියට යන්න."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"මෙම පර්යේෂණාත්මක අංග ඉදිරි නිකුත් වීම් වල වෙනස් වීමට, වැඩ නොකිරීමට, හෝ නැතිවීමට හැක. ප්රවේශමෙන් ඉදිරියට යන්න."</string> + <string name="got_it" msgid="2239653834387972602">"තේරුණා"</string> + <string name="tuner_toast" msgid="603429811084428439">"සුබ පැතුම්! පද්ධති UI සුසරකය සැකසීම් වෙත එක් කර ඇත"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"සැකසීම් වෙතින් ඉවත් කරන්න"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"සැකසීම් වෙතින් පද්ධති UI සුසරකය ඉවත් කර සහ එහි සියලු අංග භාවිතය නවත් වන්නද?"</string> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index db17b9cb2731..1eb5901b93f8 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -402,7 +402,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je dialóg hlasitosti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Klepnutím obnovíte originál."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Používate svoj pracovný profil."</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Tuner používateľského rozhrania systému"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Tuner používateľského rozhrania systému"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Zobraziť percentá vloženej batérie"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Percentuálne zobrazenie nabitia batérie vnútri ikony v stavovom riadku, keď neprebieha nabíjanie"</string> <string name="quick_settings" msgid="10042998191725428">"Rýchle nastavenia"</string> @@ -423,4 +423,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Rýchle nastavenia, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Pracovný profil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Pri používaní tuneru postupujte opatrne"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Tuner používateľského rozhrania systému poskytujte ďalšie spôsoby ladenia a prispôsobenia používateľského rozhrania Android. Tieto experimentálne funkcie sa môžu v budúcich verziách zmeniť, ich poskytovanie môže byť prerušené alebo môžu byť odstránené. Pokračujte opatrne."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Tieto experimentálne funkcie sa môžu v budúcich verziách zmeniť, ich poskytovanie môže byť prerušené alebo môžu byť odstránené. Pokračujte opatrne."</string> + <string name="got_it" msgid="2239653834387972602">"Dobre"</string> + <string name="tuner_toast" msgid="603429811084428439">"Výborne, tuner používateľského rozhrania systému bol pridaný do Nastavení"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Odstrániť z Nastavení"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Chcete odstrániť tuner používateľského rozhrania systému z Nastavení a prestať používať všetky jeho funkcie?"</string> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 7ccf8dac94b6..d9102a22b124 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je pogovorno okno glede prostornine"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dotaknite se, če želite obnoviti izvirnik."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Uporabljate delovni profil"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Uglaševalnik uporabniškega vmesnika sistema"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Uglaševalnik uporabniškega vmesnika sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Prikaži odstotek napolnjenosti vgraj. akumulatorja"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Prikaz odstotka napolnjenosti akumulatorja znotraj ikone v vrstici stanja, ko se ne polni"</string> <string name="quick_settings" msgid="10042998191725428">"Hitre nastavitve"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Hitre nastavitve, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Dostopna točka"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Delovni profil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Zabavno za nekatere, a ne za vse"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Uglaševalnik uporabniškega vmesnika sistema vam omogoča dodatne načine za spreminjanje in prilagajanje uporabniškega vmesnika Android. Te poskusne funkcije lahko v prihodnjih izdajah kadar koli izginejo, se spremenijo ali pokvarijo. Bodite previdni."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Te poskusne funkcije lahko v prihodnjih izdajah kadar koli izginejo, se spremenijo ali pokvarijo. Bodite previdni."</string> + <string name="got_it" msgid="2239653834387972602">"Razumem"</string> + <string name="tuner_toast" msgid="603429811084428439">"Čestitke! Uglaševalnik uporabniškega vmesnika sistema je bil dodan v nastavitve."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Odstrani iz nastavitev"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Ali želite odstraniti Uglaševalnik uporabniškega vmesnika sistema iz nastavitev in prenehati uporabljati vse njegove funkcije?"</string> </resources> diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index 8b3ff929e45a..cb8a50c1e3d3 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> është dialogu i volumit"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Prek për të restauruar origjinalin."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Po përdor profilin tënd të punës"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sintonizuesi SystemUI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Shfaq përqindjen e baterisë së integruar"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Shfaq përqindjen e nivelit të baterisë brenda ikonës së shiritit të statusit kur nuk është duke u ngarkuar."</string> <string name="quick_settings" msgid="10042998191725428">"Cilësimet e shpejta"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Cilësimet e shpejta, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Zona e qasjes për internet"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profili i punës"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Argëtim për disa, por jo për të gjithë!"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit të jep mënyra shtesë për të tërhequr dhe personalizuar ndërfaqen Android të përdoruesit. Këto funksione eksperimentale mund të ndryshojnë, prishen ose zhduken në versionet e ardhshme. Vazhdo me kujdes."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Këto karakteristika eksperimentale mund të ndryshojnë, prishen ose të zhduken në versionet e ardhshme. Vazhdo me kujdes."</string> + <string name="got_it" msgid="2239653834387972602">"E kuptova"</string> + <string name="tuner_toast" msgid="603429811084428439">"Urime! Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit u shtua te Cilësimet"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Hiqe nga Cilësimet"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Të hiqet Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit nga Cilësimet dhe të ndërpritet përdorimi i të gjitha funksioneve të tij?"</string> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index dd91dd23f97f..181c136208f9 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -399,7 +399,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> је дијалог за јачину звука"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Додирните да бисте вратили оригинал."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Користите профил за Work"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Тјунер за кориснички интерфејс система"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Тјунер за кориснички интерфејс система"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Приказуј уграђени проценат батерије"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Приказивање нивоа напуњености батерије у процентима унутар иконе на статусној траци када се батерија не пуни"</string> <string name="quick_settings" msgid="10042998191725428">"Брза подешавања"</string> @@ -420,4 +420,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Брза подешавања, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Хотспот"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Профил за Work"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Забава за неке, али не за све"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Тјунер за кориснички интерфејс система вам пружа додатне начине за подешавање и прилагођавање Android корисничког интерфејса. Ове експерименталне функције могу да се промене, откажу или нестану у будућим издањима. Будите опрезни."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ове експерименталне функције могу да се промене, откажу или нестану у будућим издањима. Будите опрезни."</string> + <string name="got_it" msgid="2239653834387972602">"Важи"</string> + <string name="tuner_toast" msgid="603429811084428439">"Честитамо! Тјунер за кориснички интерфејс система је додат у Подешавања"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Уклони из Подешавања"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Желите ли да уклоните Тјунер за кориснички интерфејс система из Подешавања и да престанете да користите све његове функције?"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 136ee9c6fbd4..61b3344adbb7 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> används som volymkontroll"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tryck här om du vill återställa den ursprungliga appen."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du använder din jobbprofil"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Inställningar för systemgränssnitt"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Inställningar för systemgränssnitt"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Visa inbäddad batteriprocent"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Visa batterinivå i procent i statusfältsikonen när enheten inte laddas"</string> <string name="quick_settings" msgid="10042998191725428">"Snabbinställningar"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Snabbinställningar, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Trådlös surfzon"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Jobbprofil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Kul för vissa, inte för alla"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Du kan använda inställningarna för systemgränssnitt för att justera användargränssnittet i Android. Dessa experimentfunktioner kan när som helst ändras, sluta fungera eller försvinna. Använd med försiktighet."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Dessa experimentfunktioner kan när som helst ändras, sluta fungera eller försvinna. Använd med försiktighet."</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"Grattis! Inställningar för systemgränssnitt har lagts till i inställningarna."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Ta bort från inställningarna"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vill du ta bort inställningar för systemgränssnitt från inställningarna och sluta använda alla tillhörande funktioner?"</string> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 189ff0f0517b..2e15c6138572 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ni mazungumzo ya sauti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Gusa ili urejeshe ya awali."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Unatumia wasifu wako wa kazini"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Kipokea ishara cha SystemUI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Kipokea Ishara cha SystemUI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Onyesha asilimia ya betri iliyopachikwa"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Onyesha asilimia ya kiwango cha betri ndani ya aikoni ya sehemu ya arifa inapokuwa haichaji"</string> <string name="quick_settings" msgid="10042998191725428">"Mipangilio ya Haraka"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Mipangilio ya Haraka, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Mtandao-hewa"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Wasifu wa kazini"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Kinafurahisha kwa baadhi ya watu lakini si wote"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Kipokea Ishara cha System UI kinakupa njia zaidi za kugeuza na kubadilisha kiolesura cha Android ili kikufae. Vipengele hivi vya majaribio vinaweza kubadilika, kuharibika, au kupotea katika matoleo ya siku zijazo. Endelea kwa uangalifu."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Vipengele hivi vya majaribio vinaweza kubadilika, kuharibika, au kupotea katika matoleo ya siku zijazo. Endelea kwa uangalifu."</string> + <string name="got_it" msgid="2239653834387972602">"Nimeelewa"</string> + <string name="tuner_toast" msgid="603429811084428439">"Hongera! Kipokea Ishara cha System UI kimeongezwa kwenye Mipangilio"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Ondoa kwenye Mipangilio"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Je, ungependa kuondoa Kipokea ishara cha SystemUI kwenye Mipangilio na uache kutumia vipengele vyake vyote?"</string> </resources> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 24c59e1479f5..4ed5e029d0e6 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"ஒலியளவு செய்தி: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"அசலை மீட்டமைக்கத் தொடவும்."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"பணி சுயவிவரத்தைப் பயன்படுத்துகிறீர்கள்"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"System UI ட்யூனர்"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"உள்ளிணைந்த பேட்டரி சதவீதத்தைக் காட்டு"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"சார்ஜ் செய்யாத போது, நிலைப் பட்டி ஐகானின் உள்ளே பேட்டரி அளவு சதவீதத்தைக் காட்டும்"</string> <string name="quick_settings" msgid="10042998191725428">"உடனடி அமைப்புகள்"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"விரைவு அமைப்புகள், <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ஹாட்ஸ்பாட்"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"பணி சுயவிவரம்"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"சில வேடிக்கையாக இருந்தாலும் கவனம் தேவை"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner, Android பயனர் இடைமுகத்தை மாற்றவும் தனிப்பயனாக்கவும் கூடுதல் வழிகளை வழங்குகிறது. இந்தப் பரிசோதனைக்குரிய அம்சங்கள் எதிர்கால வெளியீடுகளில் மாற்றப்படலாம், இடைநிறுத்தப்படலாம் அல்லது தோன்றாமல் போகலாம். கவனத்துடன் தொடரவும்."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"இந்தப் பரிசோதனைக்குரிய அம்சங்கள் எதிர்கால வெளியீடுகளில் மாற்றப்படலாம், இடைநிறுத்தப்படலாம் அல்லது தோன்றாமல் போகலாம். கவனத்துடன் தொடரவும்."</string> + <string name="got_it" msgid="2239653834387972602">"சரி"</string> + <string name="tuner_toast" msgid="603429811084428439">"வாழ்த்துகள்! அமைப்புகளில் System UI Tuner சேர்க்கப்பட்டது"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"அமைப்புகளிலிருந்து அகற்று"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"அமைப்புகளிலிருந்து System UI Tunerஐ அகற்றிவிட்டு, அதன் எல்லா அம்சங்களையும் பயன்படுத்துவதை நிறுத்தவா?"</string> </resources> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index c24be7375345..6b1c7620a503 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> అనేది వాల్యూమ్ డైలాగ్"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"అసలుదాన్ని పునరుద్ధరించడానికి తాకండి."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"మీరు మీ కార్యాలయ ప్రొఫైల్ను ఉపయోగిస్తున్నారు"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"సిస్టమ్ UI ట్యూనర్"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"సిస్టమ్ UI ట్యూనర్"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"పొందుపరిచిన బ్యాటరీ శాతం చూపు"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ఛార్జింగ్లో లేనప్పుడు స్థితి పట్టీ చిహ్నం లోపల బ్యాటరీ స్థాయి శాతం చూపుతుంది"</string> <string name="quick_settings" msgid="10042998191725428">"శీఘ్ర సెట్టింగ్లు"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"శీఘ్ర సెట్టింగ్లు, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"హాట్స్పాట్"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"కార్యాలయ ప్రొఫైల్"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"కొందరికి సరదాగా ఉంటుంది కానీ అందరికీ అలాగే ఉండదు"</string> + <string name="tuner_warning" msgid="8730648121973575701">"సిస్టమ్ UI ట్యూనర్ Android వినియోగదారు ఇంటర్ఫేస్ను మెరుగుపరచడానికి మరియు అనుకూలీకరించడానికి మీకు మరిన్ని మార్గాలను అందిస్తుంది. ఈ ప్రయోగాత్మక లక్షణాలు భవిష్యత్తు విడుదలల్లో మార్పుకు లోనవ్వచ్చు, తాత్కాలికంగా లేదా పూర్తిగా నిలిపివేయవచ్చు. జాగ్రత్తగా కొనసాగండి."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"ఈ ప్రయోగాత్మక లక్షణాలు భవిష్యత్తు విడుదలల్లో మార్పుకు లోనవ్వచ్చు, తాత్కాలికంగా లేదా పూర్తిగా నిలిపివేయవచ్చు. జాగ్రత్తగా కొనసాగండి."</string> + <string name="got_it" msgid="2239653834387972602">"అర్థమైంది"</string> + <string name="tuner_toast" msgid="603429811084428439">"అభినందనలు! సెట్టింగ్లకు సిస్టమ్ UI ట్యూనర్ జోడించబడింది"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"సెట్టింగ్ల నుండి తీసివేయి"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"సిస్టమ్ UI ట్యూనర్ను సెట్టింగ్ల నుండి తీసివేసి, దాని అన్ని లక్షణాలను ఉపయోగించడం ఆపివేయాలా?"</string> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index c5f715260fa8..29437c5bb169 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> เป็นช่องโต้ตอบระดับเสียง"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"แตะเพื่อคืนค่าดั้งเดิม"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"คุณกำลังใช้โปรไฟล์งานของคุณ"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"ตัวปรับ UI ระบบ"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"ตัวรับสัญญาณ UI ระบบ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"แสดงเปอร์เซ็นต์ของแบตเตอรี่ในตัว"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"แสดงเปอร์เซ็นต์ของระดับแบตเตอรี่ภายในไอคอนแถบสถานะเมื่อไม่มีการชาร์จ"</string> <string name="quick_settings" msgid="10042998191725428">"การตั้งค่าด่วน"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"การตั้งค่าด่วน <xliff:g id="TITLE">%s</xliff:g>"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ฮอตสปอต"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"โปรไฟล์งาน"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"เพลิดเพลินกับบางส่วนแต่ไม่ใช่ทั้งหมด"</string> + <string name="tuner_warning" msgid="8730648121973575701">"ตัวรับสัญญาณ UI ระบบช่วยให้คุณมีวิธีพิเศษในการปรับแต่งและกำหนดค่าส่วนติดต่อผู้ใช้ Android คุณลักษณะรุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"คุณลักษณะรุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string> + <string name="got_it" msgid="2239653834387972602">"รับทราบ"</string> + <string name="tuner_toast" msgid="603429811084428439">"ยินดีด้วย! เพิ่มตัวรับสัญญาณ UI ระบบไปยังการตั้งค่าแล้ว"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"นำออกจากการตั้งค่า"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"นำตัวรับสัญญาณ UI ระบบออกจากการตั้งค่าและหยุดใช้คุณลักษณะทั้งหมดของตัวรับสัญญาณใช่ไหม"</string> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 79c2aee79582..cde538c96414 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"Ang <xliff:g id="APP_NAME">%1$s</xliff:g> ang volume dialog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Pindutin upang ibalik ang orihinal."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Ginagamit mo ang iyong profile sa trabaho"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Tuner ng System UI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Tuner ng System UI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Ipakita ang naka-embed na porsyento ng baterya"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Ipakita ang porsyento ng antas ng baterya na nasa icon ng status bar kapag nagcha-charge"</string> <string name="quick_settings" msgid="10042998191725428">"Mga Maikling Setting"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Mga Maikling Setting, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profile sa trabaho"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Masaya para sa ilan ngunit hindi para sa lahat"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Nagbibigay sa iyo ang Tuner ng System UI ng mga karagdagang paraan upang baguhin at i-customize ang user interface ng Android. Ang mga pang-eksperimentong feature na ito ay maaaring magbago, masira o mawala sa mga pagpapalabas sa hinaharap. Magpatuloy nang may pag-iingat."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ang mga pang-eksperimentong feature na ito ay maaaring magbago, masira o mawala sa mga pagpapalabas sa hinaharap. Magpatuloy nang may pag-iingat."</string> + <string name="got_it" msgid="2239653834387972602">"Naintindihan ko"</string> + <string name="tuner_toast" msgid="603429811084428439">"Binabati kita! Naidagdag na ang Tuner ng System UI sa Mga Setting"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Alisin sa Mga Setting"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Alisin ang Tuner ng System UI sa Mga Setting at ihinto ang paggamit ng lahat ng feature nito?"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 2207bb2ed742..544a28defa35 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ses denetimi iletişim kutusu olarak ayarlandı"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Orijinali geri yüklemek için dokunun."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"İş profilinizi kullanıyorsunuz"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Sistem Arayüzü ayarlayıcısı"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sistem Arayüzü Ayarlayıcısı"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Yerleşik pil yüzdesini göster"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Şarj olmazken durum çubuğu simgesinin içinde pil düzeyi yüzdesini göster"</string> <string name="quick_settings" msgid="10042998191725428">"Hızlı Ayarlar"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Hızlı Ayarlar, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"İş profili"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Bazıları için eğlenceliyken diğerleri için olmayabilir"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Sistem Kullanıcı Arayüzü Ayarlayıcı, Android kullanıcı arayüzünde değişiklikler yapmanız ve arayüzü özelleştirmeniz için ekstra yollar sağlar. Bu deneysel özellikler değişebilir, bozulabilir veya gelecekteki sürümlerde yer almayabilir. Dikkatli bir şekilde devam edin."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Bu deneysel özellikler değişebilir, bozulabilir veya gelecekteki sürümlerde yer almayabilir. Dikkatli bir şekilde devam edin."</string> + <string name="got_it" msgid="2239653834387972602">"Anladım"</string> + <string name="tuner_toast" msgid="603429811084428439">"Tebrikler! Sistem Kullanıcı Arayüzü Ayarlayıcı Ayarlar\'a eklendi"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Ayarlar\'dan kaldır"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Sistem Kullanıcı Arayüzü Ayarlayıcısı Ayarlar\'dan kaldırılsın ve tüm özelliklerinin kullanılması durdurulsun mu?"</string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 85e7cf52cd47..4f507873bc7d 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> призначено регулятором гучності"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Торкніться, щоб відновити оригінал."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Ви в робочому профілі"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Тюнер System UI"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Показувати заряд акумулятора у відсотках"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Показувати заряд акумулятора у відсотках в рядку стану, коли пристрій не заряджається"</string> <string name="quick_settings" msgid="10042998191725428">"Швидкі налаштування"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Швидкі налаштування, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Точка доступу"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Робочий профіль"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Це цікаво, але будьте обачні"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner пропонує нові способи налаштувати та персоналізувати інтерфейс користувача Android. Ці експериментальні функції можуть змінюватися, не працювати чи зникати в майбутніх версіях. Будьте обачні."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ці експериментальні функції можуть змінюватися, не працювати чи зникати в майбутніх версіях. Будьте обачні."</string> + <string name="got_it" msgid="2239653834387972602">"Зрозуміло"</string> + <string name="tuner_toast" msgid="603429811084428439">"Вітаємо! System UI Tuner установлено в додатку Налаштування"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Видалити з додатка Налаштування"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Видалити інструмент System UI Tuner із додатка Налаштування та припинити користуватися всіма його функціями?"</string> </resources> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index de81fa92e22f..269bb1fc059b 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> والیوم ڈائلاگ ہے"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"اصل کو بحال کرنے کیلئے ٹچ کریں۔"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"آپ اپنا دفتری پروفائل استعمال کر رہے ہیں۔"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"سسٹم UI ٹیونر"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"سسٹم UI ٹیونر"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"سرایت کردہ بیٹری کی فیصد دکھائیں"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"جب چارج نہ ہو رہا ہو تو بیٹری کی سطح کی فیصد اسٹیٹس بار آئیکن کے اندر دکھائیں"</string> <string name="quick_settings" msgid="10042998191725428">"فوری ترتیبات"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"فوری ترتیبات، <xliff:g id="TITLE">%s</xliff:g>۔"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ہاٹ اسپاٹ"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"دفتری پروفائل"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"کچھ کیلئے دلچسپ لیکن سبھی کیلئے نہیں"</string> + <string name="tuner_warning" msgid="8730648121973575701">"سسٹم UI ٹیونر Android صارف انٹر فیس میں ردوبدل کرنے اور اسے حسب ضرورت بنانے کیلئے آپ کو اضافی طریقے دیتا ہے۔ یہ تجرباتی خصوصیات مستقبل کی ریلیزز میں تبدیل ہو سکتی، رک سکتی یا غائب ہو سکتی ہیں۔ احتیاط کے ساتھ آگے بڑھیں۔"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"یہ تجرباتی خصوصیات مستقبل کی ریلیزز میں تبدیل ہو سکتی، رک سکتی یا غائب ہو سکتی ہیں۔ احتیاط کے ساتھ آگے بڑھیں۔"</string> + <string name="got_it" msgid="2239653834387972602">"سمجھ آ گئی"</string> + <string name="tuner_toast" msgid="603429811084428439">"مبارک ہو! سسٹم UI ٹیونر کو ترتیبات میں شامل کر دیا گیا ہے"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"ترتیبات سے ہٹائیں"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ترتیبات سے سسٹم UI ٹیونر کو ہٹائیں اور اس کی سبھی خصوصیات کا استعمال بند کریں؟"</string> </resources> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 544713884f59..63248c3b6e77 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -130,8 +130,8 @@ <string name="accessibility_two_bars" msgid="6437363648385206679">"Ikkita ustun."</string> <string name="accessibility_three_bars" msgid="2648241415119396648">"Uchta ustun."</string> <string name="accessibility_signal_full" msgid="9122922886519676839">"Signal to‘liq."</string> - <string name="accessibility_desc_on" msgid="2385254693624345265">"Yoqilgan."</string> - <string name="accessibility_desc_off" msgid="6475508157786853157">"O‘chirilgan."</string> + <string name="accessibility_desc_on" msgid="2385254693624345265">"Yoniq"</string> + <string name="accessibility_desc_off" msgid="6475508157786853157">"O‘chiq"</string> <string name="accessibility_desc_connected" msgid="8366256693719499665">"Ulangan."</string> <string name="accessibility_desc_connecting" msgid="3812924520316280149">"Ulanmoqda…"</string> <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string> @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ovoz balandligini boshqaradi"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Aslini tiklash uchun bosing."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Siz ishchi profildan foydalanmoqdasiz"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"SystemUI Tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"SystemUI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Batareya foizi ko‘rsatilsin"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Batareya quvvat olmayotgan vaqtda uning foizi holat qatorida ko‘rsatilsin"</string> <string name="quick_settings" msgid="10042998191725428">"Tezkor sozlamalar"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Tezkor sozlamalar, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Ulanish nuqtasi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Ishchi profil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diqqat!"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner yordamida siz Android foydalanuvchi interfeysini tuzatish va o‘zingizga moslashtirishingiz mumkin. Ushbu tajribaviy funksiyalar o‘zgarishi, buzilishi yoki keyingi versiyalarda olib tashlanishi mumkin. Ehtiyot bo‘lib davom eting."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ushbu tajribaviy funksiyalar o‘zgarishi, buzilishi yoki keyingi versiyalarda olib tashlanishi mumkin. Ehtiyot bo‘lib davom eting."</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"Tabriklaymiz! System UI Tuner Sozlamalarga qo‘shildi."</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Sozlamalardan olib tashlash"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"System UI Tuner Sozlamalardan olib tashlanib, uning barcha funksiyalaridan foydalanish to‘xtatilsinmi?"</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index de121c4bd068..158d2a642746 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> là hộp thoại khối lượng"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Chạm để khôi phục bản gốc."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Bạn đang sử dụng hồ sơ công việc của mình"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Bộ điều hướng giao diện người dùng hệ thống"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Bộ điều hướng giao diện người dùng hệ thống"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Hiển thị tỷ lệ phần trăm pin được nhúng"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Hiển thị tỷ lệ phần trăm mức pin bên trong biểu tượng thanh trạng thái khi không sạc"</string> <string name="quick_settings" msgid="10042998191725428">"Cài đặt nhanh"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Cài đặt nhanh, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Điểm phát sóng"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Hồ sơ công việc"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Thú vị đối với một số người nhưng không phải tất cả"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Bộ điều hướng giao diện người dùng hệ thống cung cấp thêm cho bạn những cách chỉnh sửa và tùy chỉnh giao diện người dùng Android. Những tính năng thử nghiệm này có thể thay đổi, hỏng hoặc biến mất trong các phiên bản tương lai. Hãy thận trọng khi tiếp tục."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Những tính năng thử nghiệm này có thể thay đổi, hỏng hoặc biến mất trong các phiên bản tương lai. Hãy thận trọng khi tiếp tục."</string> + <string name="got_it" msgid="2239653834387972602">"OK"</string> + <string name="tuner_toast" msgid="603429811084428439">"Xin chúc mừng! Bộ điều hướng giao diện người dùng hệ thống đã được thêm vào Cài đặt"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Xóa khỏi Cài đặt"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Xóa Bộ điều hướng giao diện người dùng hệ thống khỏi Cài đặt và ngừng sử dụng tất cả tính năng của ứng dụng này?"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 24ada1b7c463..84e0eea3ddc5 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”已用作音量控制对话框"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"触摸即可恢复原始设置。"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您当前正在使用工作资料"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"系统界面调谐器"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"系统界面调谐器"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"嵌入式显示电池电量百分比 显示嵌入的电池电量百分比"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"未充电时在状态栏图标内显示电池电量百分比"</string> <string name="quick_settings" msgid="10042998191725428">"快速设置"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"快速设置,<xliff:g id="TITLE">%s</xliff:g>。"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"热点"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"工作资料"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"是否有趣完全取决于个人感觉"</string> + <string name="tuner_warning" msgid="8730648121973575701">"系统界面调谐器可让您通过其他方式调整及自定义 Android 用户界面。在日后推出的版本中,这些实验性功能可能会变更、损坏或消失。操作时请务必谨慎。"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"在日后推出的版本中,这些实验性功能可能会变更、损坏或消失。操作时请务必谨慎。"</string> + <string name="got_it" msgid="2239653834387972602">"知道了"</string> + <string name="tuner_toast" msgid="603429811084428439">"恭喜!系统界面调谐器已添加到“设置”中"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"从“设置”中移除"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"要将系统界面调谐器从“设置”中移除,并停止使用所有相关功能吗?"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 5bce61b7f576..aacdd0e30d39 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」為音量對話框"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"輕觸即可復原。"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您正在使用工作設定檔"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"系統使用者介面調諧器"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"系統使用者介面調諧器"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"顯示嵌入的電池百分比"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"非充電時,在狀態列圖示顯示電量百分比"</string> <string name="quick_settings" msgid="10042998191725428">"快速設定"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"<xliff:g id="TITLE">%s</xliff:g>的快速設定。"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"熱點"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"工作設定檔"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"這只是測試版本,並不包含完整功能"</string> + <string name="tuner_warning" msgid="8730648121973575701">"使用者介面調諧器讓您以更多方法修改和自訂 Android 使用者介面。但請小心,這些實驗功能可能會在日後發佈時更改、分拆或消失。"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"請小心,這些實驗功能可能會在日後發佈時更改、分拆或消失。"</string> + <string name="got_it" msgid="2239653834387972602">"知道了"</string> + <string name="tuner_toast" msgid="603429811084428439">"恭喜您!系統使用者介面調諧器已新增至「設定」中"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"從「設定」移除"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"要從「設定」移除系統使用者介面調諧器,並停止其所有功能嗎?"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 091d33d8eb13..e0464b73705c 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -400,7 +400,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」現在是預設的音量控制對話方塊。"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"輕觸這裡即可恢復原始設定。"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您正在使用 Work 設定檔"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"系統使用者介面調整精靈"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"系統使用者介面調整精靈"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"顯示嵌入式電池百分比"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"未充電時在狀態列圖示中顯示電量百分比"</string> <string name="quick_settings" msgid="10042998191725428">"快速設定"</string> @@ -421,4 +421,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"快速設定,<xliff:g id="TITLE">%s</xliff:g>。"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"無線基地台"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Work 設定檔"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"有趣與否,見仁見智"</string> + <string name="tuner_warning" msgid="8730648121973575701">"系統使用者介面調整精靈可讓您透過其他方式,調整及自訂 Android 使用者介面。這些實驗性功能隨著版本更新可能會變更、損壞或消失,執行時請務必謹慎。"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"這些實驗性功能隨著版本更新可能會變更、損壞或消失,執行時請務必謹慎。"</string> + <string name="got_it" msgid="2239653834387972602">"知道了"</string> + <string name="tuner_toast" msgid="603429811084428439">"恭喜!系統使用者介面調整精靈已新增到設定中"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"從設定中移除"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"要將系統使用者介面調整精靈從設定中移除,並停止使用所有相關功能嗎?"</string> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index d86d583c8c7d..9b491bafaa26 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -398,7 +398,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> yingxoxo yevolumu"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Thinta ukuze ubuyisele kokwangempela."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Usebenzisa iphrofayela yakho yomsebenzi"</string> - <string name="system_ui_tuner" msgid="3442596010150119600">"Isishuni se-UI yesistimu"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Isishuni se-UI yesistimu"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Bonisa amaphesenti ebhethri elinamathiselwe"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Bonisa amaphesenti eleveli yebhethri ngaphakathi kwesithonjana sebha yesimo uma kungashajwa"</string> <string name="quick_settings" msgid="10042998191725428">"Izilungiselelo ezisheshayo"</string> @@ -419,4 +419,11 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Izilungiselelo ezisheshayo, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"I-Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Iphrofayela yomsebenzi"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Kuyajabulisa kwabanye kodwa hhayi bonke"</string> + <string name="tuner_warning" msgid="8730648121973575701">"Isishuni se-UI sesistimu sikunika izindlela ezingeziwe zokuhlobisa nokwenza ngezifiso isixhumanisi sokubona se-Android. Lezi zici zesilingo zingashintsha, zephuke, noma zinyamalale ekukhishweni kwangakusasa. Qhubeka ngokuqaphela."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Lezi zici zesilingo zingashintsha, zephuke, noma zinyamalale ekukhishweni kwangakusasa. Qhubeka ngokuqaphela."</string> + <string name="got_it" msgid="2239653834387972602">"Ngiyezwa"</string> + <string name="tuner_toast" msgid="603429811084428439">"Siyakuhalalisela! Isishuni se-UI sesistimu singeziwe kuzilungiselelo"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Susa kusuka kuzilungiselelo"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Susa isishuni se-UI yesistimu kusuka kuzilungiselelo futhi uyeke ukusebenzisa zonke izici zakhona?"</string> </resources> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 6d84727c2656..8eef23e3db52 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -49,5 +49,6 @@ <!-- For notification icons for which targetSdk < L, this caches whether the icon is grayscale --> <item type="id" name="icon_is_grayscale" /> + <item type="id" name="is_clicked_heads_up_tag" /> </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 188986274e77..8241ddf6a378 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -206,6 +206,11 @@ <item name="android:windowExitAnimation">@*android:anim/shrink_fade_out_from_bottom</item> </style> + <style name="Animation.NavigationBarFadeIn"> + <item name="android:windowEnterAnimation">@anim/navbar_fade_in</item> + <item name="android:windowExitAnimation">@null</item> + </style> + <!-- Standard animations for hiding and showing the status bar. --> <style name="Animation.StatusBar"> </style> diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java index 3f721256a25d..9eb768c51851 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java @@ -244,12 +244,12 @@ public class DozeLog { } @Override - public void onScreenTurnedOn() { + public void onStartedWakingUp() { traceScreenOn(); } @Override - public void onScreenTurnedOff(int why) { + public void onFinishedGoingToSleep(int why) { traceScreenOff(why); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 9f21dbe7bb09..d78800ffe521 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -132,6 +132,18 @@ public class KeyguardService extends Service { } @Override // Binder interface + public void onScreenTurnedOn() { + checkPermission(); + mKeyguardViewMediator.onScreenTurnedOn(); + } + + @Override // Binder interface + public void onScreenTurnedOff() { + checkPermission(); + mKeyguardViewMediator.onScreenTurnedOff(); + } + + @Override // Binder interface public void setKeyguardEnabled(boolean enabled) { checkPermission(); mKeyguardViewMediator.setKeyguardEnabled(enabled); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 7d72dab46475..9f86a52c20c1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -41,7 +41,6 @@ import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; -import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -138,7 +137,7 @@ public class KeyguardViewMediator extends SystemUI { private static final int HIDE = 3; private static final int RESET = 4; private static final int VERIFY_UNLOCK = 5; - private static final int NOTIFY_SCREEN_OFF = 6; + private static final int NOTIFY_FINISHED_GOING_TO_SLEEP = 6; private static final int NOTIFY_SCREEN_TURNING_ON = 7; private static final int KEYGUARD_DONE = 9; private static final int KEYGUARD_DONE_DRAWING = 10; @@ -150,6 +149,8 @@ public class KeyguardViewMediator extends SystemUI { private static final int ON_ACTIVITY_DRAWN = 19; private static final int KEYGUARD_DONE_PENDING_TIMEOUT = 20; private static final int NOTIFY_STARTED_WAKING_UP = 21; + private static final int NOTIFY_SCREEN_TURNED_ON = 22; + private static final int NOTIFY_SCREEN_TURNED_OFF = 23; /** * The default amount of time we stay awake (used for all key input) @@ -467,12 +468,13 @@ public class KeyguardViewMediator extends SystemUI { mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated(); } } else { - if (wakeAndUnlocking && unlockingWithFingerprintAllowed) { + if (wakeAndUnlocking && mShowing && unlockingWithFingerprintAllowed) { mWakeAndUnlocking = true; + mStatusBarKeyguardViewManager.setWakeAndUnlocking(); keyguardDone(true, true); - } else { + } else if (mShowing && mDeviceInteractive) { if (wakeAndUnlocking) { - mStatusBarKeyguardViewManager.notifyScreenWakeUpRequested(); + mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested(); } mStatusBarKeyguardViewManager.animateCollapsePanels( FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR); @@ -702,7 +704,7 @@ public class KeyguardViewMediator extends SystemUI { resetKeyguardDonePendingLocked(); mHideAnimationRun = false; - notifyScreenOffLocked(); + notifyFinishedGoingToSleep(); if (mPendingReset) { resetStateLocked(); @@ -713,7 +715,7 @@ public class KeyguardViewMediator extends SystemUI { mPendingLock = false; } } - KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurnedOff(why); + KeyguardUpdateMonitor.getInstance(mContext).dispatchFinishedGoingToSleep(why); } private void doKeyguardLaterLocked() { @@ -778,12 +780,22 @@ public class KeyguardViewMediator extends SystemUI { if (DEBUG) Log.d(TAG, "onStartedWakingUp, seq = " + mDelayedShowingSequence); notifyStartedWakingUp(); } - KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurnedOn(); + KeyguardUpdateMonitor.getInstance(mContext).dispatchStartedWakingUp(); maybeSendUserPresentBroadcast(); } public void onScreenTurningOn(IKeyguardDrawnCallback callback) { - notifyScreenOnLocked(callback); + notifyScreenOn(callback); + } + + public void onScreenTurnedOn() { + notifyScreenTurnedOn(); + mUpdateMonitor.dispatchScreenTurnedOn(); + } + + public void onScreenTurnedOff() { + notifyScreenTurnedOff(); + mUpdateMonitor.dispatchScreenTurnedOff(); } private void maybeSendUserPresentBroadcast() { @@ -1101,15 +1113,9 @@ public class KeyguardViewMediator extends SystemUI { mHandler.sendEmptyMessage(VERIFY_UNLOCK); } - - /** - * Send a message to keyguard telling it the screen just turned on. - * @see #onScreenTurnedOff(int) - * @see #handleNotifyScreenOff - */ - private void notifyScreenOffLocked() { - if (DEBUG) Log.d(TAG, "notifyScreenOffLocked"); - mHandler.sendEmptyMessage(NOTIFY_SCREEN_OFF); + private void notifyFinishedGoingToSleep() { + if (DEBUG) Log.d(TAG, "notifyFinishedGoingToSleep"); + mHandler.sendEmptyMessage(NOTIFY_FINISHED_GOING_TO_SLEEP); } private void notifyStartedWakingUp() { @@ -1117,12 +1123,24 @@ public class KeyguardViewMediator extends SystemUI { mHandler.sendEmptyMessage(NOTIFY_STARTED_WAKING_UP); } - private void notifyScreenOnLocked(IKeyguardDrawnCallback callback) { - if (DEBUG) Log.d(TAG, "notifyScreenOnLocked"); + private void notifyScreenOn(IKeyguardDrawnCallback callback) { + if (DEBUG) Log.d(TAG, "notifyScreenOn"); Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNING_ON, callback); mHandler.sendMessage(msg); } + private void notifyScreenTurnedOn() { + if (DEBUG) Log.d(TAG, "notifyScreenTurnedOn"); + Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNED_ON); + mHandler.sendMessage(msg); + } + + private void notifyScreenTurnedOff() { + if (DEBUG) Log.d(TAG, "notifyScreenTurnedOff"); + Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNED_OFF); + mHandler.sendMessage(msg); + } + /** * Send message to keyguard telling it to show itself * @see #handleShow @@ -1206,12 +1224,18 @@ public class KeyguardViewMediator extends SystemUI { case VERIFY_UNLOCK: handleVerifyUnlock(); break; - case NOTIFY_SCREEN_OFF: - handleNotifyScreenOff(); + case NOTIFY_FINISHED_GOING_TO_SLEEP: + handleNotifyFinishedGoingToSleep(); break; case NOTIFY_SCREEN_TURNING_ON: handleNotifyScreenTurningOn((IKeyguardDrawnCallback) msg.obj); break; + case NOTIFY_SCREEN_TURNED_ON: + handleNotifyScreenTurnedOn(); + break; + case NOTIFY_SCREEN_TURNED_OFF: + handleNotifyScreenTurnedOff(); + break; case NOTIFY_STARTED_WAKING_UP: handleNotifyStartedWakingUp(); break; @@ -1525,20 +1549,20 @@ public class KeyguardViewMediator extends SystemUI { } /** - * Handle message sent by {@link #notifyScreenOffLocked()} - * @see #NOTIFY_SCREEN_OFF + * Handle message sent by {@link #notifyFinishedGoingToSleep()} + * @see #NOTIFY_FINISHED_GOING_TO_SLEEP */ - private void handleNotifyScreenOff() { + private void handleNotifyFinishedGoingToSleep() { synchronized (KeyguardViewMediator.this) { - if (DEBUG) Log.d(TAG, "handleNotifyScreenOff"); - mStatusBarKeyguardViewManager.onScreenTurnedOff(); + if (DEBUG) Log.d(TAG, "handleNotifyFinishedGoingToSleep"); + mStatusBarKeyguardViewManager.onFinishedGoingToSleep(); } } private void handleNotifyStartedWakingUp() { synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleNotifyWakingUp"); - mStatusBarKeyguardViewManager.onScreenTurnedOn(); + mStatusBarKeyguardViewManager.onStartedWakingUp(); } } @@ -1555,6 +1579,20 @@ public class KeyguardViewMediator extends SystemUI { } } + private void handleNotifyScreenTurnedOn() { + synchronized (this) { + if (DEBUG) Log.d(TAG, "handleNotifyScreenTurnedOn"); + mStatusBarKeyguardViewManager.onScreenTurnedOn(); + } + } + + private void handleNotifyScreenTurnedOff() { + synchronized (this) { + if (DEBUG) Log.d(TAG, "handleNotifyScreenTurnedOff"); + mStatusBarKeyguardViewManager.onScreenTurnedOff(); + } + } + private void notifyDrawn(final IKeyguardDrawnCallback callback) { try { callback.onDrawn(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java index 5d7460460a8b..21cbef21c22a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java @@ -79,6 +79,8 @@ public class FlashlightTile extends QSTile<QSTile.BooleanState> implements return; } state.value = value; + } else { + state.value = mFlashlightController.isEnabled(); } final AnimationIcon icon = state.value ? mEnable : mDisable; icon.setAllowAnimation(arg instanceof UserBoolean && ((UserBoolean) arg).userInitiated); 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 17db4718bd26..298a1cced3ff 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -48,6 +48,8 @@ import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.SystemProperties; @@ -85,6 +87,15 @@ public class SystemServicesProxy { final static String TAG = "SystemServicesProxy"; final static BitmapFactory.Options sBitmapOptions; + final static HandlerThread sBgThread; + + static { + sBgThread = new HandlerThread("Recents-SystemServicesProxy", + android.os.Process.THREAD_PRIORITY_BACKGROUND); + sBgThread.start(); + sBitmapOptions = new BitmapFactory.Options(); + sBitmapOptions.inMutable = true; + } AccessibilityManager mAccm; ActivityManager mAm; @@ -98,17 +109,14 @@ public class SystemServicesProxy { String mRecentsPackage; ComponentName mAssistComponent; + Handler mBgThreadHandler; + Bitmap mDummyIcon; int mDummyThumbnailWidth; int mDummyThumbnailHeight; Paint mBgProtectionPaint; Canvas mBgProtectionCanvas; - static { - sBitmapOptions = new BitmapFactory.Options(); - sBitmapOptions.inMutable = true; - } - /** Private constructor */ public SystemServicesProxy(Context context) { mAccm = AccessibilityManager.getInstance(context); @@ -121,6 +129,7 @@ public class SystemServicesProxy { mWm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); mDisplay = mWm.getDefaultDisplay(); mRecentsPackage = context.getPackageName(); + mBgThreadHandler = new Handler(sBgThread.getLooper()); // Get the dummy thumbnail width/heights Resources res = context.getResources(); @@ -383,12 +392,17 @@ public class SystemServicesProxy { } /** Removes the task */ - public void removeTask(int taskId) { + public void removeTask(final int taskId) { if (mAm == null) return; if (Constants.DebugFlags.App.EnableSystemServicesProxy) return; // Remove the task. - mAm.removeTask(taskId); + mBgThreadHandler.post(new Runnable() { + @Override + public void run() { + mAm.removeTask(taskId); + } + }); } /** @@ -656,22 +670,6 @@ public class SystemServicesProxy { return windowRect; } - /** - * Takes a screenshot of the current surface. - */ - public Bitmap takeScreenshot() { - DisplayInfo di = new DisplayInfo(); - mDisplay.getDisplayInfo(di); - return SurfaceControl.screenshot(di.getNaturalWidth(), di.getNaturalHeight()); - } - - /** - * Takes a screenshot of the current app. - */ - public Bitmap takeAppScreenshot() { - return takeScreenshot(); - } - /** Starts an activity from recents. */ public boolean startActivityFromRecents(Context context, int taskId, String taskName, ActivityOptions options) { diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java index b2aa2b67c574..ad25c85860ed 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java @@ -343,11 +343,14 @@ public class RecentsTaskLoader { if (infoHandle.info != null) { label = ssp.getActivityLabel(infoHandle.info); mActivityLabelCache.put(taskKey, label); + return label; } else { Log.w(TAG, "Missing ActivityInfo for " + taskKey.baseIntent.getComponent() + " u=" + taskKey.userId); } - return label; + // If the activity info does not exist or fails to load, return an empty label for now, + // but do not cache it + return ""; } /** Returns the content description using as many cached values as we can. */ @@ -358,14 +361,22 @@ public class RecentsTaskLoader { if (label != null) { return label; } + // If the given activity label is empty, don't compute or cache the content description + if (activityLabel.isEmpty()) { + return ""; + } + label = ssp.getContentDescription(taskKey.baseIntent, taskKey.userId, activityLabel, res); if (label != null) { mContentDescriptionCache.put(taskKey, label); + return label; } else { Log.w(TAG, "Missing content description for " + taskKey.baseIntent.getComponent() + " u=" + taskKey.userId); } - return label; + // If the content description does not exist, return an empty label for now, but do not + // cache it + return ""; } /** Returns the activity icon using as many cached values as we can. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java index 78b351279f6e..2e0b80a9a512 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java @@ -316,7 +316,7 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { overscrollRange); // Invalidate to kick off computeScroll mSv.invalidate(); - } else if (mScroller.isScrollOutOfBounds()) { + } else if (mIsScrolling && mScroller.isScrollOutOfBounds()) { // Animate the scroll back into bounds mScroller.animateBoundScroll(); } else if (mActiveTaskView == null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 41b37b09354b..00fa65379026 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1328,14 +1328,20 @@ public abstract class BaseStatusBar extends SystemUI implements View bigContentViewLocal = null; View headsUpContentViewLocal = null; try { - contentViewLocal = contentView.apply(mContext, contentContainer, + contentViewLocal = contentView.apply( + sbn.getPackageContext(mContext), + contentContainer, mOnClickHandler); if (bigContentView != null) { - bigContentViewLocal = bigContentView.apply(mContext, contentContainer, + bigContentViewLocal = bigContentView.apply( + sbn.getPackageContext(mContext), + contentContainer, mOnClickHandler); } if (headsUpContentView != null) { - headsUpContentViewLocal = headsUpContentView.apply(mContext, contentContainer, + headsUpContentViewLocal = headsUpContentView.apply( + sbn.getPackageContext(mContext), + contentContainer, mOnClickHandler); } } @@ -1362,7 +1368,8 @@ public abstract class BaseStatusBar extends SystemUI implements View publicViewLocal = null; if (publicNotification != null) { try { - publicViewLocal = publicNotification.contentView.apply(mContext, + publicViewLocal = publicNotification.contentView.apply( + sbn.getPackageContext(mContext), contentContainerPublic, mOnClickHandler); if (publicViewLocal != null) { @@ -1518,6 +1525,7 @@ public abstract class BaseStatusBar extends SystemUI implements // // In most cases, when FLAG_AUTO_CANCEL is set, the notification will // become canceled shortly by NoMan, but we can't assume that. + HeadsUpManager.setIsClickedNotification(row, true); mHeadsUpManager.releaseImmediately(notificationKey); } new Thread() { @@ -1981,15 +1989,18 @@ public abstract class BaseStatusBar extends SystemUI implements // Reapply the RemoteViews contentView.reapply(mContext, entry.getContentView(), mOnClickHandler); if (bigContentView != null && entry.getExpandedContentView() != null) { - bigContentView.reapply(mContext, entry.getExpandedContentView(), + bigContentView.reapply(notification.getPackageContext(mContext), + entry.getExpandedContentView(), mOnClickHandler); } View headsUpChild = entry.getHeadsUpContentView(); if (headsUpContentView != null && headsUpChild != null) { - headsUpContentView.reapply(mContext, headsUpChild, mOnClickHandler); + headsUpContentView.reapply(notification.getPackageContext(mContext), + headsUpChild, mOnClickHandler); } if (publicContentView != null && entry.getPublicContentView() != null) { - publicContentView.reapply(mContext, entry.getPublicContentView(), mOnClickHandler); + publicContentView.reapply(notification.getPackageContext(mContext), + entry.getPublicContentView(), mOnClickHandler); } // update the contentIntent mNotificationClicker.register(entry.row, notification); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index ccec759dec7f..71baf5782109 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -374,7 +374,11 @@ public abstract class ExpandableView extends FrameLayout { } private void updateClipping() { - mClipRect.set(0, mClipTopOptimization, getWidth(), getActualHeight()); + int top = mClipTopOptimization; + if (top >= getActualHeight()) { + top = getActualHeight() - 1; + } + mClipRect.set(0, top, getWidth(), getActualHeight()); setClipBounds(mClipRect); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 7c08efc08ba0..6627360a641a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -634,13 +634,13 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } @Override - public void onScreenTurnedOn() { - mLockIcon.setScreenOn(true); + public void onStartedWakingUp() { + mLockIcon.setDeviceInteractive(true); } @Override - public void onScreenTurnedOff(int why) { - mLockIcon.setScreenOn(false); + public void onFinishedGoingToSleep(int why) { + mLockIcon.setDeviceInteractive(false); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index d93f7c29d08a..06d2fca442f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -47,9 +47,9 @@ public class LockIcon extends KeyguardAffordanceView { private static final int STATE_FINGERPRINT_ERROR = 4; private int mLastState = 0; - private boolean mLastScreenOn; + private boolean mLastDeviceInteractive; private boolean mTransientFpError; - private boolean mScreenOn; + private boolean mDeviceInteractive; private final TrustDrawable mTrustDrawable; private final UnlockMethodCache mUnlockMethodCache; private AccessibilityController mAccessibilityController; @@ -83,13 +83,14 @@ public class LockIcon extends KeyguardAffordanceView { update(); } - public void setScreenOn(boolean screenOn) { - mScreenOn = screenOn; + public void setDeviceInteractive(boolean deviceInteractive) { + mDeviceInteractive = deviceInteractive; update(); } public void update() { - boolean visible = isShown() && KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); + boolean visible = isShown() + && KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); if (visible) { mTrustDrawable.start(); } else { @@ -101,8 +102,9 @@ public class LockIcon extends KeyguardAffordanceView { // TODO: Real icon for facelock. int state = getState(); boolean anyFingerprintIcon = state == STATE_FINGERPRINT || state == STATE_FINGERPRINT_ERROR; - if (state != mLastState || mScreenOn != mLastScreenOn) { - int iconRes = getAnimationResForTransition(mLastState, state, mLastScreenOn, mScreenOn); + if (state != mLastState || mDeviceInteractive != mLastDeviceInteractive) { + int iconRes = getAnimationResForTransition(mLastState, state, mLastDeviceInteractive, + mDeviceInteractive); if (iconRes == R.drawable.lockscreen_fingerprint_draw_off_animation) { anyFingerprintIcon = true; } @@ -149,7 +151,7 @@ public class LockIcon extends KeyguardAffordanceView { } } mLastState = state; - mLastScreenOn = mScreenOn; + mLastDeviceInteractive = mDeviceInteractive; } // Hide trust circle when fingerprint is running. 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 416fb366d48d..59cf2bfaac9b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -91,6 +91,7 @@ public class NavigationBarView extends LinearLayout { private OnVerticalChangedListener mOnVerticalChangedListener; private boolean mIsLayoutRtl; + private boolean mLayoutTransitionsEnabled; private class NavTransitionListener implements TransitionListener { private boolean mBackTransitioning; @@ -333,13 +334,6 @@ public class NavigationBarView extends LinearLayout { if (!lt.getTransitionListeners().contains(mTransitionListener)) { lt.addTransitionListener(mTransitionListener); } - if (!mScreenOn && mCurrentView != null) { - lt.disableTransitionType( - LayoutTransition.CHANGE_APPEARING | - LayoutTransition.CHANGE_DISAPPEARING | - LayoutTransition.APPEARING | - LayoutTransition.DISAPPEARING); - } } } if (inLockTask() && disableRecent && !disableHome) { @@ -367,6 +361,46 @@ public class NavigationBarView extends LinearLayout { } } + public void setWakeAndUnlocking(boolean wakeAndUnlocking) { + setUseFadingAnimations(wakeAndUnlocking); + setLayoutTransitionsEnabled(!wakeAndUnlocking); + } + + private void setLayoutTransitionsEnabled(boolean enabled) { + mLayoutTransitionsEnabled = enabled; + ViewGroup navButtons = (ViewGroup) mCurrentView.findViewById(R.id.nav_buttons); + LayoutTransition lt = navButtons.getLayoutTransition(); + if (lt != null) { + if (enabled) { + lt.enableTransitionType(LayoutTransition.APPEARING); + lt.enableTransitionType(LayoutTransition.DISAPPEARING); + lt.enableTransitionType(LayoutTransition.CHANGE_APPEARING); + lt.enableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + } else { + lt.disableTransitionType(LayoutTransition.APPEARING); + lt.disableTransitionType(LayoutTransition.DISAPPEARING); + lt.disableTransitionType(LayoutTransition.CHANGE_APPEARING); + lt.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + } + } + } + + private void setUseFadingAnimations(boolean useFadingAnimations) { + WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams(); + if (lp != null) { + boolean old = lp.windowAnimations != 0; + if (!old && useFadingAnimations) { + lp.windowAnimations = R.style.Animation_NavigationBarFadeIn; + } else if (old && !useFadingAnimations) { + lp.windowAnimations = 0; + } else { + return; + } + WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE); + wm.updateViewLayout(this, lp); + } + } + public void setSlippery(boolean newSlippery) { WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams(); if (lp != null) { @@ -425,6 +459,7 @@ public class NavigationBarView extends LinearLayout { } mCurrentView = mRotatedViews[rot]; mCurrentView.setVisibility(View.VISIBLE); + setLayoutTransitionsEnabled(mLayoutTransitionsEnabled); getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 56e303264dc8..17fd7a738ea9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -32,7 +32,6 @@ import android.util.MathUtils; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; -import android.view.ViewRootImpl; import android.view.ViewTreeObserver; import android.view.WindowInsets; import android.view.accessibility.AccessibilityEvent; @@ -203,10 +202,12 @@ public class NotificationPanelView extends PanelView implements private int mPositionMinSideMargin; private int mLastOrientation = -1; private boolean mClosingWithAlphaFadeOut; + private boolean mHeadsUpAnimatingAway; private Runnable mHeadsUpExistenceChangedRunnable = new Runnable() { @Override public void run() { + mHeadsUpAnimatingAway = false; notifyBarPanelExpansionChanged(); } }; @@ -626,6 +627,7 @@ public class NotificationPanelView extends PanelView implements && shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, h)) { mQsTracking = true; onQsExpansionStarted(); + notifyExpandingFinished(); mInitialHeightOnTouch = mQsExpansionHeight; mInitialTouchY = y; mInitialTouchX = x; @@ -825,9 +827,7 @@ public class NotificationPanelView extends PanelView implements mInitialTouchX = event.getY(); // If we interrupt an expansion gesture here, make sure to update the state correctly. - if (mIsExpanding) { - onExpandingFinished(); - } + notifyExpandingFinished(); } } @@ -970,7 +970,6 @@ public class NotificationPanelView extends PanelView implements private void onQsExpansionStarted(int overscrollAmount) { cancelQsAnimation(); cancelHeightAnimator(); - notifyExpandingFinished(); // Reset scroll position and apply that position to the expanded height. float height = mQsExpansionHeight - mScrollView.getScrollY() - overscrollAmount; @@ -2294,6 +2293,7 @@ public class NotificationPanelView extends PanelView implements mHeadsUpExistenceChangedRunnable.run(); updateNotificationTranslucency(); } else { + mHeadsUpAnimatingAway = true; mNotificationStackScroller.runAfterAnimationFinished( mHeadsUpExistenceChangedRunnable); } @@ -2384,4 +2384,8 @@ public class NotificationPanelView extends PanelView implements public void clearNotificattonEffects() { mStatusBar.clearNotificationEffects(); } + + protected boolean isPanelVisibleBecauseOfHeadsUp() { + return mHeadsUpManager.hasPinnedHeadsUp() || mHeadsUpAnimatingAway; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 0d20d520ea2c..8b25e0814cb5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -1009,10 +1009,12 @@ public abstract class PanelView extends FrameLayout { protected void notifyBarPanelExpansionChanged() { mBar.panelExpansionChanged(this, mExpandedFraction, mExpandedFraction > 0f || mPeekPending - || mPeekAnimator != null || mInstantExpanding || mHeadsUpManager.hasPinnedHeadsUp() + || mPeekAnimator != null || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp() || mTracking || mHeightAnimator != null); } + protected abstract boolean isPanelVisibleBecauseOfHeadsUp(); + /** * Gets called when the user performs a click anywhere in the empty area of the panel. * diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index dfce170363fa..86755d178e8c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -3955,7 +3955,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mScreenOnComingFromTouch = true; mScreenOnTouchLocation = new PointF(event.getX(), event.getY()); mNotificationPanel.setTouchDisabled(false); - mStatusBarKeyguardViewManager.notifyScreenWakeUpRequested(); + mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested(); } } 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 6816399a3a64..1a35500abac2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -22,11 +22,12 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Color; +import android.util.Log; import android.view.View; import android.view.ViewTreeObserver; -import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; +import android.view.animation.PathInterpolator; import com.android.systemui.R; import com.android.systemui.statusbar.BackDropView; @@ -62,6 +63,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, private boolean mDarkenWhileDragging; private boolean mBouncerShowing; + private boolean mWakeAndUnlocking; private boolean mAnimateChange; private boolean mUpdatePending; private boolean mExpanding; @@ -71,7 +73,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, private Runnable mOnAnimationFinished; private boolean mAnimationStarted; private final Interpolator mInterpolator = new DecelerateInterpolator(); - private final Interpolator mLinearOutSlowInInterpolator; + private final Interpolator mKeyguardFadeOutInterpolator = new PathInterpolator(0f, 0, 0.7f, 1f); private BackDropView mBackDropView; private boolean mScrimSrcEnabled; private boolean mDozing; @@ -92,8 +94,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, mHeadsUpScrim = headsUpScrim; final Context context = scrimBehind.getContext(); mUnlockMethodCache = UnlockMethodCache.getInstance(context); - mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, - android.R.interpolator.linear_out_slow_in); mScrimSrcEnabled = scrimSrcEnabled; updateHeadsUpScrim(false); } @@ -128,7 +128,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, scheduleUpdate(); } + public void setWakeAndUnlocking() { + mWakeAndUnlocking = true; + scheduleUpdate(); + } + public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished) { + mWakeAndUnlocking = false; mAnimateKeyguardFadingOut = true; mDurationOverride = duration; mAnimationDelay = delay; @@ -151,8 +157,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } public void setDozing(boolean dozing) { - mDozing = dozing; - scheduleUpdate(); + if (mDozing != dozing) { + mDozing = dozing; + scheduleUpdate(); + } } public void setDozeInFrontAlpha(float alpha) { @@ -186,6 +194,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, if (mAnimateKeyguardFadingOut || mForceHideScrims) { setScrimInFrontColor(0f); setScrimBehindColor(0f); + } else if (mWakeAndUnlocking) { + + // During wake and unlock, we first hide everything behind a black scrim, which then + // gets faded out from animateKeyguardFadingOut. + setScrimInFrontColor(1f); + setScrimBehindColor(0f); } else if (!mKeyguardShowing && !mBouncerShowing) { updateScrimNormal(); setScrimInFrontColor(0); @@ -319,7 +333,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } private Interpolator getInterpolator() { - return mAnimateKeyguardFadingOut ? mLinearOutSlowInInterpolator : mInterpolator; + return mAnimateKeyguardFadingOut ? mKeyguardFadeOutInterpolator : mInterpolator; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 6b3a59df71e0..44aa780706d9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -20,6 +20,7 @@ import android.content.ComponentCallbacks2; import android.content.Context; import android.os.Bundle; import android.os.SystemClock; +import android.os.Trace; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -59,7 +60,8 @@ public class StatusBarKeyguardViewManager { private ViewGroup mContainer; private StatusBarWindowManager mStatusBarWindowManager; - private boolean mScreenOn = false; + private boolean mDeviceInteractive = false; + private boolean mScreenTurnedOn; private KeyguardBouncer mBouncer; private boolean mShowing; private boolean mOccluded; @@ -69,8 +71,11 @@ public class StatusBarKeyguardViewManager { private boolean mLastOccluded; private boolean mLastBouncerShowing; private boolean mLastBouncerDismissible; + private boolean mLastDeferScrimFadeOut; private OnDismissAction mAfterKeyguardGoneAction; - private boolean mScreenWillWakeUp; + private boolean mDeviceWillWakeUp; + private boolean mWakeAndUnlocking; + private boolean mDeferScrimFadeOut; public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils) { @@ -155,20 +160,34 @@ public class StatusBarKeyguardViewManager { } } - public void onScreenTurnedOff() { - mScreenOn = false; + public void onFinishedGoingToSleep() { + mDeviceInteractive = false; mPhoneStatusBar.onScreenTurnedOff(); mBouncer.onScreenTurnedOff(); } - public void onScreenTurnedOn() { - mScreenOn = true; - mScreenWillWakeUp = false; + public void onStartedWakingUp() { + mDeviceInteractive = true; + mDeviceWillWakeUp = false; mPhoneStatusBar.onScreenTurnedOn(); } - public void notifyScreenWakeUpRequested() { - mScreenWillWakeUp = !mScreenOn; + public void onScreenTurnedOn() { + mScreenTurnedOn = true; + mWakeAndUnlocking = false; + if (mDeferScrimFadeOut) { + mDeferScrimFadeOut = false; + animateScrimControllerKeyguardFadingOut(0, 200); + updateStates(); + } + } + + public void onScreenTurnedOff() { + mScreenTurnedOn = false; + } + + public void notifyDeviceWakeUpRequested() { + mDeviceWillWakeUp = !mDeviceInteractive; } public void verifyUnlock() { @@ -252,21 +271,11 @@ public class StatusBarKeyguardViewManager { mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration); boolean staying = mPhoneStatusBar.hideKeyguard(); if (!staying) { - if (fadeoutDuration == 0) { - mPhoneStatusBar.finishKeyguardFadingAway(); - WindowManagerGlobal.getInstance().trimMemory( - ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); + mStatusBarWindowManager.setKeyguardFadingAway(true); + if (mWakeAndUnlocking && !mScreenTurnedOn) { + mDeferScrimFadeOut = true; } else { - mStatusBarWindowManager.setKeyguardFadingAway(true); - mScrimController.animateKeyguardFadingOut(delay, fadeoutDuration, new Runnable() { - @Override - public void run() { - mStatusBarWindowManager.setKeyguardFadingAway(false); - mPhoneStatusBar.finishKeyguardFadingAway(); - WindowManagerGlobal.getInstance().trimMemory( - ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); - } - }); + animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration); } } else { mScrimController.animateGoingToFullShade(delay, fadeoutDuration); @@ -281,6 +290,23 @@ public class StatusBarKeyguardViewManager { } + private void animateScrimControllerKeyguardFadingOut(long delay, long duration) { + Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "Fading out", 0); + mScrimController.animateKeyguardFadingOut(delay, duration, new Runnable() { + @Override + public void run() { + mStatusBarWindowManager.setKeyguardFadingAway(false); + mPhoneStatusBar.finishKeyguardFadingAway(); + if (mPhoneStatusBar.getNavigationBarView() != null) { + mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(false); + } + WindowManagerGlobal.getInstance().trimMemory( + ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); + Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, "Fading out", 0); + } + }); + } + private void executeAfterKeyguardGoneAction() { if (mAfterKeyguardGoneAction != null) { mAfterKeyguardGoneAction.onDismiss(); @@ -292,7 +318,7 @@ public class StatusBarKeyguardViewManager { * Dismisses the keyguard by going to the next screen or making it gone. */ public void dismiss() { - if (mScreenOn || mScreenWillWakeUp) { + if (mDeviceInteractive || mDeviceWillWakeUp) { showBouncer(); } } @@ -352,6 +378,7 @@ public class StatusBarKeyguardViewManager { boolean occluded = mOccluded; boolean bouncerShowing = mBouncer.isShowing(); boolean bouncerDismissible = !mBouncer.isFullscreenBouncer(); + boolean deferScrimFadeOut = mDeferScrimFadeOut; if ((bouncerDismissible || !showing) != (mLastBouncerDismissible || !mLastShowing) || mFirstUpdate) { @@ -361,10 +388,15 @@ public class StatusBarKeyguardViewManager { mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK); } } - if ((!(showing && !occluded) || bouncerShowing) - != (!(mLastShowing && !mLastOccluded) || mLastBouncerShowing) || mFirstUpdate) { + + // Hide navigation bar on Keyguard but not on bouncer and also if we are deferring a scrim + // fade out, i.e. we are waiting for the screen to have turned on. + boolean navBarVisible = !deferScrimFadeOut && (!(showing && !occluded) || bouncerShowing); + boolean lastNavBarVisible = !mLastDeferScrimFadeOut && (!(mLastShowing && !mLastOccluded) + || mLastBouncerShowing); + if (navBarVisible != lastNavBarVisible || mFirstUpdate) { if (mPhoneStatusBar.getNavigationBarView() != null) { - if (!(showing && !occluded) || bouncerShowing) { + if (navBarVisible) { mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable, getNavBarShowDelay()); } else { @@ -391,6 +423,7 @@ public class StatusBarKeyguardViewManager { mFirstUpdate = false; mLastShowing = showing; mLastOccluded = occluded; + mLastDeferScrimFadeOut = deferScrimFadeOut; mLastBouncerShowing = bouncerShowing; mLastBouncerDismissible = bouncerDismissible; @@ -450,4 +483,12 @@ public class StatusBarKeyguardViewManager { public void notifyKeyguardAuthenticated() { mBouncer.notifyKeyguardAuthenticated(); } + + public void setWakeAndUnlocking() { + mWakeAndUnlocking = true; + mScrimController.setWakeAndUnlocking(); + if (mPhoneStatusBar.getNavigationBarView() != null) { + mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(true); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index c8c45e300480..bd537f7c816d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -127,7 +127,7 @@ public class UnlockMethodCache { } @Override - public void onScreenTurnedOn() { + public void onStartedWakingUp() { update(false /* updateAlways */); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java index cd1914c55663..29a8f67e4cfe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java @@ -93,6 +93,10 @@ public class FlashlightController { } } + public synchronized boolean isEnabled() { + return mFlashlightEnabled; + } + public synchronized boolean isAvailable() { return mTorchAvailable; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java index 63f57116ea67..ed9b123f7431 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java @@ -51,6 +51,7 @@ public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL private static final String TAG = "HeadsUpManager"; private static final boolean DEBUG = false; private static final String SETTING_HEADS_UP_SNOOZE_LENGTH_MS = "heads_up_snooze_length_ms"; + private static final int TAG_CLICKED_NOTIFICATION = R.id.is_clicked_heads_up_tag; private final int mHeadsUpNotificationDecay; private final int mMinimumDisplayTime; @@ -452,8 +453,8 @@ public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL for (NotificationData.Entry entry : mEntriesToRemoveAfterExpand) { removeHeadsUpEntry(entry); } - mEntriesToRemoveAfterExpand.clear(); } + mEntriesToRemoveAfterExpand.clear(); } public void setTrackingHeadsUp(boolean trackingHeadsUp) { @@ -526,6 +527,15 @@ public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL }); } + public static void setIsClickedNotification(View child, boolean clicked) { + child.setTag(TAG_CLICKED_NOTIFICATION, clicked ? true : null); + } + + public static boolean isClickedHeadsUpNotification(View child) { + Boolean clicked = (Boolean) child.getTag(TAG_CLICKED_NOTIFICATION); + return clicked != null && clicked; + } + /** * This represents a notification and how long it is in a heads up mode. It also manages its * lifecycle automatically when created. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 13e9b1631b14..ed1dca38780f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -51,7 +51,7 @@ public class MobileSignalController extends SignalController< @VisibleForTesting final PhoneStateListener mPhoneStateListener; // Save entire info for logging, we only use the id. - private final SubscriptionInfo mSubscriptionInfo; + final SubscriptionInfo mSubscriptionInfo; // @VisibleForDemoMode final SparseArray<MobileIconGroup> mNetworkToIconLookup; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 57dfff5877ac..29968081e758 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -66,6 +66,11 @@ public class NetworkControllerImpl extends BroadcastReceiver // additional diagnostics, but not logspew static final boolean CHATTY = Log.isLoggable(TAG + "Chat", Log.DEBUG); + private static final int EMERGENCY_NO_CONTROLLERS = 0; + private static final int EMERGENCY_FIRST_CONTROLLER = 100; + private static final int EMERGENCY_VOICE_CONTROLLER = 200; + private static final int EMERGENCY_NO_SUB = 300; + private final Context mContext; private final TelephonyManager mPhone; private final WifiManager mWifiManager; @@ -118,6 +123,9 @@ public class NetworkControllerImpl extends BroadcastReceiver // Handler that all callbacks are made on. private final CallbackHandler mCallbackHandler; + private int mEmergencySource; + private boolean mIsEmergency; + @VisibleForTesting ServiceState mLastServiceState; @@ -267,6 +275,7 @@ public class NetworkControllerImpl extends BroadcastReceiver if (mMobileSignalControllers.size() == 0) { // When there are no active subscriptions, determine emengency state from last // broadcast. + mEmergencySource = EMERGENCY_NO_CONTROLLERS; return mLastServiceState != null && mLastServiceState.isEmergencyOnly(); } int voiceSubId = mSubDefaults.getDefaultVoiceSubId(); @@ -274,16 +283,20 @@ public class NetworkControllerImpl extends BroadcastReceiver for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { if (!mobileSignalController.getState().isEmergency) { + mEmergencySource = EMERGENCY_FIRST_CONTROLLER + + mobileSignalController.mSubscriptionInfo.getSubscriptionId(); if (DEBUG) Log.d(TAG, "Found emergency " + mobileSignalController.mTag); return false; } } } if (mMobileSignalControllers.containsKey(voiceSubId)) { + mEmergencySource = EMERGENCY_VOICE_CONTROLLER + voiceSubId; if (DEBUG) Log.d(TAG, "Getting emergency from " + voiceSubId); return mMobileSignalControllers.get(voiceSubId).getState().isEmergency; } if (DEBUG) Log.e(TAG, "Cannot find controller for voice sub: " + voiceSubId); + mEmergencySource = EMERGENCY_NO_SUB + voiceSubId; // Something is wrong, better assume we can't make calls... return true; } @@ -293,7 +306,8 @@ public class NetworkControllerImpl extends BroadcastReceiver * so we should recheck and send out the state to listeners. */ void recalculateEmergency() { - mCallbackHandler.setEmergencyCallsOnly(isEmergencyOnly()); + mIsEmergency = isEmergencyOnly(); + mCallbackHandler.setEmergencyCallsOnly(mIsEmergency); } public void addSignalCallback(SignalCallback cb) { @@ -606,6 +620,10 @@ public class NetworkControllerImpl extends BroadcastReceiver pw.println(mLocale); pw.print(" mLastServiceState="); pw.println(mLastServiceState); + pw.print(" mIsEmergency="); + pw.println(mIsEmergency); + pw.print(" mEmergencySource="); + pw.println(emergencyToString(mEmergencySource)); for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { mobileSignalController.dump(pw); @@ -617,6 +635,19 @@ public class NetworkControllerImpl extends BroadcastReceiver mAccessPoints.dump(pw); } + private static final String emergencyToString(int emergencySource) { + if (emergencySource > EMERGENCY_NO_SUB) { + return "NO_SUB(" + (emergencySource - EMERGENCY_NO_SUB) + ")"; + } else if (emergencySource > EMERGENCY_VOICE_CONTROLLER) { + return "VOICE_CONTROLLER(" + (emergencySource - EMERGENCY_VOICE_CONTROLLER) + ")"; + } else if (emergencySource > EMERGENCY_FIRST_CONTROLLER) { + return "FIRST_CONTROLLER(" + (emergencySource - EMERGENCY_FIRST_CONTROLLER) + ")"; + } else if (emergencySource == EMERGENCY_NO_CONTROLLERS) { + return "NO_CONTROLLERS"; + } + return "UNKNOWN_SOURCE"; + } + private boolean mDemoMode; private boolean mDemoInetCondition; private WifiSignalController.WifiState mDemoWifiState; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java index 50e3977c9214..faa1a28ace8b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java @@ -101,6 +101,8 @@ public class SplitClockView extends LinearLayout { } mTimeView.setFormat12Hour(timeString); mTimeView.setFormat24Hour(timeString); + mTimeView.setContentDescriptionFormat12Hour(formatString); + mTimeView.setContentDescriptionFormat24Hour(formatString); mAmPmView.setFormat12Hour(amPmString); mAmPmView.setFormat24Hour(amPmString); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 0d89b214a6b7..23d9b9fe94b8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -222,6 +222,7 @@ public class NotificationStackScrollLayout extends ViewGroup private int[] mTempInt2 = new int[2]; private boolean mGenerateChildOrderChangedEvent; private HashSet<Runnable> mAnimationFinishedRunnables = new HashSet<>(); + private HashSet<View> mClearOverlayViewsWhenFinished = new HashSet<>(); private HashSet<Pair<ExpandableNotificationRow, Boolean>> mHeadsUpChangeAnimations = new HashSet<>(); private HeadsUpManager mHeadsUpManager; @@ -1656,6 +1657,11 @@ public class NotificationStackScrollLayout extends ViewGroup mAddedHeadsUpChildren.remove(child); return false; } + if (isClickedHeadsUp(child)) { + // An animation is already running, add it to the Overlay + mClearOverlayViewsWhenFinished.add(child); + return true; + } if (mIsExpanded && mAnimationsEnabled && !isChildInInvisibleGroup(child)) { if (!mChildrenToAddAnimated.contains(child)) { // Generate Animations @@ -1671,6 +1677,10 @@ public class NotificationStackScrollLayout extends ViewGroup return false; } + private boolean isClickedHeadsUp(View child) { + return HeadsUpManager.isClickedHeadsUpNotification(child); + } + /** * Remove a removed child view from the heads up animations if it was just added there * @@ -2327,6 +2337,13 @@ public class NotificationStackScrollLayout extends ViewGroup public void onChildAnimationFinished() { requestChildrenUpdate(); runAnimationFinishedRunnables(); + clearViewOverlays(); + } + + private void clearViewOverlays() { + for (View view : mClearOverlayViewsWhenFinished) { + getOverlay().remove(view); + } } private void runAnimationFinishedRunnables() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index 5d2e5b768623..82064a7c9c27 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -413,7 +413,9 @@ public class StackScrollAlgorithm { ExpandableNotificationRow topHeadsUpEntry = ambientState.getTopHeadsUpEntry(); int childCount = algorithmState.visibleChildren.size(); - int numberOfElementsCompletelyIn = (int) algorithmState.itemsInTopStack; + int numberOfElementsCompletelyIn = algorithmState.partialInTop == 1.0f + ? algorithmState.lastTopStackIndex + : (int) algorithmState.itemsInTopStack; for (int i = 0; i < childCount; i++) { ExpandableView child = algorithmState.visibleChildren.get(i); StackViewState childViewState = resultState.getViewStateForView(child); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java index 5b8fe89702e1..97c7d301bd44 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -29,6 +29,7 @@ import com.android.systemui.R; import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.ExpandableView; import com.android.systemui.statusbar.SpeedBumpView; +import com.android.systemui.statusbar.policy.HeadsUpManager; import java.util.ArrayList; import java.util.HashSet; @@ -670,6 +671,7 @@ public class StackStateAnimator { animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { + HeadsUpManager.setIsClickedNotification(child, false); child.setTag(TAG_ANIMATOR_TRANSLATION_Y, null); child.setTag(TAG_START_TRANSLATION_Y, null); child.setTag(TAG_END_TRANSLATION_Y, null); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index 5055bfefe889..00b8de237347 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy; import android.os.HandlerThread; import android.telephony.SubscriptionInfo; import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController.IconState; @@ -32,6 +33,7 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; +@SmallTest public class CallbackHandlerTest extends AndroidTestCase { private CallbackHandler mHandler; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index 360562c8a967..0ec8802f9c60 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -2,9 +2,11 @@ package com.android.systemui.statusbar.policy; import android.os.Looper; import android.telephony.TelephonyManager; +import android.test.suitebuilder.annotation.SmallTest; import org.mockito.Mockito; +@SmallTest public class NetworkControllerDataTest extends NetworkControllerBaseTest { public void test3gDataIcon() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java index 5d63d8dd506c..b2fedfaeb8f6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java @@ -1,12 +1,14 @@ package com.android.systemui.statusbar.policy; import android.net.NetworkCapabilities; +import android.test.suitebuilder.annotation.SmallTest; import com.android.systemui.statusbar.policy.NetworkController.IconState; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +@SmallTest public class NetworkControllerEthernetTest extends NetworkControllerBaseTest { public void testEthernetIcons() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index d9b9063396cb..660fd9c40721 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -25,6 +25,7 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.TelephonyManager; +import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; @@ -36,6 +37,7 @@ import org.mockito.Mockito; import java.util.ArrayList; import java.util.List; +@SmallTest public class NetworkControllerSignalTest extends NetworkControllerBaseTest { public void testNoIconWithoutMobile() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java index cecf2fde3cfb..d7c4e1e06514 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java @@ -5,12 +5,14 @@ import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.test.suitebuilder.annotation.SmallTest; import com.android.systemui.statusbar.policy.NetworkController.IconState; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +@SmallTest public class NetworkControllerWifiTest extends NetworkControllerBaseTest { // These match the constants in WifiManager and need to be kept up to date. private static final int MIN_RSSI = -100; diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index bf41f0f120a4..83b953ebf179 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -8091,6 +8091,7 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF keyValueAgentCleanup(); } + // TODO: clean up naming; this is now used at finish by both k/v and stream restores void keyValueAgentCleanup() { mBackupDataName.delete(); mStageName.delete(); @@ -8126,8 +8127,17 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF // usual full initialization. Note that this is only done for // full-system restores: when a single app has requested a restore, // it is explicitly not killed following that operation. - if (mTargetPackage == null && (mCurrentPackage.applicationInfo.flags - & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0) { + // + // We execute this kill when these conditions hold: + // 1. the app did not request its own restore (mTargetPackage == null), and either + // 2a. the app is a full-data target (TYPE_FULL_STREAM) or + // b. the app does not state android:killAfterRestore="false" in its manifest + final int appFlags = mCurrentPackage.applicationInfo.flags; + final boolean killAfterRestore = + (mRestoreDescription.getDataType() == RestoreDescription.TYPE_FULL_STREAM) + || ((appFlags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0); + + if (mTargetPackage == null && killAfterRestore) { if (DEBUG) Slog.d(TAG, "Restore complete, killing host process of " + mCurrentPackage.applicationInfo.processName); mActivityManager.killApplicationProcess( @@ -9535,16 +9545,8 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF public void run() { // clean up the session's bookkeeping synchronized (mSession) { - try { - if (mSession.mRestoreTransport != null) { - mSession.mRestoreTransport.finishRestore(); - } - } catch (Exception e) { - Slog.e(TAG, "Error in finishRestore", e); - } finally { - mSession.mRestoreTransport = null; - mSession.mEnded = true; - } + mSession.mRestoreTransport = null; + mSession.mEnded = true; } // clean up the BackupManagerImpl side of the bookkeeping diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index 417f18db9d76..2a3492b4f06b 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -32,6 +32,7 @@ import java.util.Map; import android.app.ActivityManager; import android.app.ActivityThread; +import android.app.AppGlobals; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.ApplicationInfo; @@ -56,15 +57,18 @@ import android.util.Log; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseIntArray; import android.util.TimeUtils; import android.util.Xml; import com.android.internal.app.IAppOpsService; import com.android.internal.app.IAppOpsCallback; import com.android.internal.os.Zygote; +import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.XmlUtils; +import libcore.util.EmptyArray; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; @@ -98,19 +102,38 @@ public class AppOpsService extends IAppOpsService.Stub { } }; - final SparseArray<HashMap<String, Ops>> mUidOps - = new SparseArray<HashMap<String, Ops>>(); + final SparseArray<UidState> mUidStates = new SparseArray<>(); private final SparseArray<boolean[]> mOpRestrictions = new SparseArray<boolean[]>(); + private static final class UidState { + public final int uid; + public ArrayMap<String, Ops> pkgOps; + public SparseIntArray opModes; + + public UidState(int uid) { + this.uid = uid; + } + + public void clear() { + pkgOps = null; + opModes = null; + } + + public boolean isDefault() { + return (pkgOps == null || pkgOps.isEmpty()) + && (opModes == null || opModes.size() <= 0); + } + } + public final static class Ops extends SparseArray<Op> { public final String packageName; - public final int uid; + public final UidState uidState; public final boolean isPrivileged; - public Ops(String _packageName, int _uid, boolean _isPrivileged) { + public Ops(String _packageName, UidState _uidState, boolean _isPrivileged) { packageName = _packageName; - uid = _uid; + uidState = _uidState; isPrivileged = _isPrivileged; } } @@ -220,27 +243,42 @@ public class AppOpsService extends IAppOpsService.Stub { public void systemReady() { synchronized (this) { boolean changed = false; - for (int i=0; i<mUidOps.size(); i++) { - HashMap<String, Ops> pkgs = mUidOps.valueAt(i); + for (int i = mUidStates.size() - 1; i >= 0; i--) { + UidState uidState = mUidStates.valueAt(i); + + String[] packageNames = getPackagesForUid(uidState.uid); + if (ArrayUtils.isEmpty(packageNames)) { + uidState.clear(); + mUidStates.removeAt(i); + changed = true; + continue; + } + + ArrayMap<String, Ops> pkgs = uidState.pkgOps; + if (pkgs == null) { + continue; + } + Iterator<Ops> it = pkgs.values().iterator(); while (it.hasNext()) { Ops ops = it.next(); int curUid; try { curUid = mContext.getPackageManager().getPackageUid(ops.packageName, - UserHandle.getUserId(ops.uid)); + UserHandle.getUserId(ops.uidState.uid)); } catch (NameNotFoundException e) { curUid = -1; } - if (curUid != ops.uid) { + if (curUid != ops.uidState.uid) { Slog.i(TAG, "Pruning old package " + ops.packageName - + "/" + ops.uid + ": new uid=" + curUid); + + "/" + ops.uidState + ": new uid=" + curUid); it.remove(); changed = true; } } - if (pkgs.size() <= 0) { - mUidOps.removeAt(i); + + if (uidState.isDefault()) { + mUidStates.removeAt(i); } } if (changed) { @@ -279,22 +317,34 @@ public class AppOpsService extends IAppOpsService.Stub { public void packageRemoved(int uid, String packageName) { synchronized (this) { - HashMap<String, Ops> pkgs = mUidOps.get(uid); - if (pkgs != null) { - if (pkgs.remove(packageName) != null) { - if (pkgs.size() <= 0) { - mUidOps.remove(uid); - } - scheduleFastWriteLocked(); - } + UidState uidState = mUidStates.get(uid); + if (uidState == null) { + return; + } + + boolean changed = false; + + // Remove any package state if such. + if (uidState.pkgOps != null && uidState.pkgOps.remove(packageName) != null) { + changed = true; + } + + // If we just nuked the last package state check if the UID is valid. + if (changed && uidState.pkgOps.isEmpty() + && getPackagesForUid(uid).length <= 0) { + mUidStates.remove(uid); + } + + if (changed) { + scheduleFastWriteLocked(); } } } public void uidRemoved(int uid) { synchronized (this) { - if (mUidOps.indexOfKey(uid) >= 0) { - mUidOps.remove(uid); + if (mUidStates.indexOfKey(uid) >= 0) { + mUidStates.remove(uid); scheduleFastWriteLocked(); } } @@ -346,16 +396,23 @@ public class AppOpsService extends IAppOpsService.Stub { Binder.getCallingPid(), Binder.getCallingUid(), null); ArrayList<AppOpsManager.PackageOps> res = null; synchronized (this) { - for (int i=0; i<mUidOps.size(); i++) { - HashMap<String, Ops> packages = mUidOps.valueAt(i); - for (Ops pkgOps : packages.values()) { + final int uidStateCount = mUidStates.size(); + for (int i = 0; i < uidStateCount; i++) { + UidState uidState = mUidStates.valueAt(i); + if (uidState.pkgOps == null || uidState.pkgOps.isEmpty()) { + continue; + } + ArrayMap<String, Ops> packages = uidState.pkgOps; + final int packageCount = packages.size(); + for (int j = 0; j < packageCount; j++) { + Ops pkgOps = packages.valueAt(j); ArrayList<AppOpsManager.OpEntry> resOps = collectOps(pkgOps, ops); if (resOps != null) { if (res == null) { res = new ArrayList<AppOpsManager.PackageOps>(); } AppOpsManager.PackageOps resPackage = new AppOpsManager.PackageOps( - pkgOps.packageName, pkgOps.uid, resOps); + pkgOps.packageName, pkgOps.uidState.uid, resOps); res.add(resPackage); } } @@ -380,7 +437,7 @@ public class AppOpsService extends IAppOpsService.Stub { } ArrayList<AppOpsManager.PackageOps> res = new ArrayList<AppOpsManager.PackageOps>(); AppOpsManager.PackageOps resPackage = new AppOpsManager.PackageOps( - pkgOps.packageName, pkgOps.uid, resOps); + pkgOps.packageName, pkgOps.uidState.uid, resOps); res.add(resPackage); return res; } @@ -392,15 +449,126 @@ public class AppOpsService extends IAppOpsService.Stub { if (ops != null) { ops.remove(op.op); if (ops.size() <= 0) { - HashMap<String, Ops> pkgOps = mUidOps.get(uid); + UidState uidState = ops.uidState; + ArrayMap<String, Ops> pkgOps = uidState.pkgOps; if (pkgOps != null) { pkgOps.remove(ops.packageName); - if (pkgOps.size() <= 0) { - mUidOps.remove(uid); + if (pkgOps.isEmpty()) { + uidState.pkgOps = null; + } + if (uidState.isDefault()) { + mUidStates.remove(uid); + } + } + } + } + } + } + + @Override + public void setUidMode(int code, int uid, int mode) { + if (Binder.getCallingPid() != Process.myPid()) { + mContext.enforcePermission(android.Manifest.permission.UPDATE_APP_OPS_STATS, + Binder.getCallingPid(), Binder.getCallingUid(), null); + } + verifyIncomingOp(code); + code = AppOpsManager.opToSwitch(code); + + synchronized (this) { + final int defaultMode = AppOpsManager.opToDefaultMode(code); + + UidState uidState = getUidStateLocked(uid, false); + if (uidState == null) { + if (mode == defaultMode) { + return; + } + uidState = new UidState(uid); + uidState.opModes = new SparseIntArray(); + uidState.opModes.put(code, mode); + mUidStates.put(uid, uidState); + scheduleWriteLocked(); + } else if (uidState.opModes == null) { + if (mode != defaultMode) { + uidState.opModes = new SparseIntArray(); + uidState.opModes.put(code, mode); + scheduleWriteLocked(); + } + } else { + if (uidState.opModes.get(code) == mode) { + return; + } + if (mode == defaultMode) { + uidState.opModes.delete(code); + if (uidState.opModes.size() <= 0) { + uidState.opModes = null; + } + } else { + uidState.opModes.put(code, mode); + } + scheduleWriteLocked(); + } + } + + ArrayMap<Callback, ArraySet<String>> callbackSpecs = null; + + ArrayList<Callback> callbacks = mOpModeWatchers.get(code); + if (callbacks != null) { + final int callbackCount = callbacks.size(); + for (int i = 0; i < callbackCount; i++) { + Callback callback = callbacks.get(i); + callbackSpecs = new ArrayMap<>(); + callbackSpecs.put(callback, null); + } + } + + String[] uidPackageNames = getPackagesForUid(uid); + for (String uidPackageName : uidPackageNames) { + callbacks = mPackageModeWatchers.get(uidPackageName); + if (callbacks != null) { + if (callbackSpecs == null) { + callbackSpecs = new ArrayMap<>(); + } + final int callbackCount = callbacks.size(); + for (int i = 0; i < callbackCount; i++) { + Callback callback = callbacks.get(i); + ArraySet<String> changedPackages = callbackSpecs.get(callback); + if (changedPackages == null) { + changedPackages = new ArraySet<>(); + callbackSpecs.put(callback, changedPackages); + } + changedPackages.add(uidPackageName); + } + } + } + + if (callbackSpecs == null) { + return; + } + + // There are components watching for mode changes such as window manager + // and location manager which are in our process. The callbacks in these + // components may require permissions our remote caller does not have. + final long identity = Binder.clearCallingIdentity(); + try { + for (int i = 0; i < callbackSpecs.size(); i++) { + Callback callback = callbackSpecs.keyAt(i); + ArraySet<String> reportedPackageNames = callbackSpecs.valueAt(i); + try { + if (reportedPackageNames == null) { + callback.mCallback.opChanged(code, null); + } else { + final int reportedPackageCount = reportedPackageNames.size(); + for (int j = 0; j < reportedPackageCount; j++) { + String reportedPackageName = reportedPackageNames.valueAt(j); + callback.mCallback.opChanged(code, reportedPackageName); } } + } catch (RemoteException e) { + Log.w(TAG, "Error dispatching op op change", e); } } + } finally { + Binder.restoreCallingIdentity(identity); } } @@ -414,6 +582,7 @@ public class AppOpsService extends IAppOpsService.Stub { ArrayList<Callback> repCbs = null; code = AppOpsManager.opToSwitch(code); synchronized (this) { + UidState uidState = getUidStateLocked(uid, false); Op op = getOpLocked(code, uid, packageName, true); if (op != null) { if (op.mode != mode) { @@ -468,14 +637,26 @@ public class AppOpsService extends IAppOpsService.Stub { if (callbacks == null) { callbacks = new HashMap<Callback, ArrayList<Pair<String, Integer>>>(); } + boolean duplicate = false; for (int i=0; i<cbs.size(); i++) { Callback cb = cbs.get(i); ArrayList<Pair<String, Integer>> reports = callbacks.get(cb); if (reports == null) { reports = new ArrayList<Pair<String, Integer>>(); callbacks.put(cb, reports); + } else { + final int reportCount = reports.size(); + for (int j = 0; j < reportCount; j++) { + Pair<String, Integer> report = reports.get(j); + if (report.second == op && report.first.equals(packageName)) { + duplicate = true; + break; + } + } + } + if (!duplicate) { + reports.add(new Pair<>(packageName, op)); } - reports.add(new Pair<String, Integer>(packageName, op)); } return callbacks; } @@ -488,16 +669,54 @@ public class AppOpsService extends IAppOpsService.Stub { callingPid, callingUid, null); reqUserId = ActivityManager.handleIncomingUser(callingPid, callingUid, reqUserId, true, true, "resetAllModes", null); + + int reqUid = -1; + if (reqPackageName != null) { + try { + reqUid = AppGlobals.getPackageManager().getPackageUid( + reqPackageName, reqUserId); + } catch (RemoteException e) { + /* ignore - local call */ + } + } + HashMap<Callback, ArrayList<Pair<String, Integer>>> callbacks = null; synchronized (this) { boolean changed = false; - for (int i=mUidOps.size()-1; i>=0; i--) { - HashMap<String, Ops> packages = mUidOps.valueAt(i); + for (int i = mUidStates.size() - 1; i >= 0; i--) { + UidState uidState = mUidStates.valueAt(i); + + SparseIntArray opModes = uidState.opModes; + if (opModes != null && (uidState.uid == reqUid || reqUid == -1)) { + final int uidOpCount = opModes.size(); + for (int j = uidOpCount - 1; j >= 0; j--) { + final int code = opModes.keyAt(j); + if (AppOpsManager.opAllowsReset(code)) { + opModes.removeAt(j); + if (opModes.size() <= 0) { + uidState.opModes = null; + } + for (String packageName : getPackagesForUid(uidState.uid)) { + callbacks = addCallbacks(callbacks, packageName, code, + mOpModeWatchers.get(code)); + callbacks = addCallbacks(callbacks, packageName, code, + mPackageModeWatchers.get(packageName)); + } + } + } + } + + if (uidState.pkgOps == null) { + continue; + } + if (reqUserId != UserHandle.USER_ALL - && reqUserId != UserHandle.getUserId(mUidOps.keyAt(i))) { + && reqUserId != UserHandle.getUserId(uidState.uid)) { // Skip any ops for a different user continue; } + + Map<String, Ops> packages = uidState.pkgOps; Iterator<Map.Entry<String, Ops>> it = packages.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Ops> ent = it.next(); @@ -526,10 +745,11 @@ public class AppOpsService extends IAppOpsService.Stub { it.remove(); } } - if (packages.size() == 0) { - mUidOps.removeAt(i); + if (uidState.isDefault()) { + mUidStates.remove(uidState.uid); } } + if (changed) { scheduleFastWriteLocked(); } @@ -552,7 +772,7 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void startWatchingMode(int op, String packageName, IAppOpsCallback callback) { synchronized (this) { - op = AppOpsManager.opToSwitch(op); + op = (op != AppOpsManager.OP_NONE) ? AppOpsManager.opToSwitch(op) : op; Callback cb = mModeWatchers.get(callback.asBinder()); if (cb == null) { cb = new Callback(callback); @@ -621,7 +841,15 @@ public class AppOpsService extends IAppOpsService.Stub { if (isOpRestricted(uid, code, packageName)) { return AppOpsManager.MODE_IGNORED; } - Op op = getOpLocked(AppOpsManager.opToSwitch(code), uid, packageName, false); + code = AppOpsManager.opToSwitch(code); + UidState uidState = getUidStateLocked(uid, false); + if (uidState != null && uidState.opModes != null) { + final int uidMode = uidState.opModes.get(code); + if (uidMode != AppOpsManager.MODE_ALLOWED) { + return uidMode; + } + } + Op op = getOpLocked(code, uid, packageName, false); if (op == null) { return AppOpsManager.opToDefaultMode(code); } @@ -732,6 +960,17 @@ public class AppOpsService extends IAppOpsService.Stub { } op.duration = 0; final int switchCode = AppOpsManager.opToSwitch(code); + UidState uidState = ops.uidState; + if (uidState.opModes != null) { + final int uidMode = uidState.opModes.get(switchCode); + if (uidMode != AppOpsManager.MODE_ALLOWED) { + if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " + + switchCode + " (" + code + ") uid " + uid + " package " + + packageName); + op.rejectTime = System.currentTimeMillis(); + return uidMode; + } + } final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op; if (switchOp.mode != AppOpsManager.MODE_ALLOWED) { if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " @@ -766,6 +1005,17 @@ public class AppOpsService extends IAppOpsService.Stub { return AppOpsManager.MODE_IGNORED; } final int switchCode = AppOpsManager.opToSwitch(code); + UidState uidState = ops.uidState; + if (uidState.opModes != null) { + final int uidMode = uidState.opModes.get(switchCode); + if (uidMode != AppOpsManager.MODE_ALLOWED) { + if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " + + switchCode + " (" + code + ") uid " + uid + " package " + + packageName); + op.rejectTime = System.currentTimeMillis(); + return uidMode; + } + } final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op; if (switchOp.mode != AppOpsManager.MODE_ALLOWED) { if (DEBUG) Log.d(TAG, "startOperation: reject #" + op.mode + " for code " @@ -847,6 +1097,18 @@ public class AppOpsService extends IAppOpsService.Stub { throw new IllegalArgumentException("Bad operation #" + op); } + private UidState getUidStateLocked(int uid, boolean edit) { + UidState uidState = mUidStates.get(uid); + if (uidState == null) { + if (!edit) { + return null; + } + uidState = new UidState(uid); + mUidStates.put(uid, uidState); + } + return uidState; + } + private Ops getOpsLocked(int uid, String packageName, boolean edit) { if (uid == 0) { packageName = "root"; @@ -857,15 +1119,19 @@ public class AppOpsService extends IAppOpsService.Stub { } private Ops getOpsRawLocked(int uid, String packageName, boolean edit) { - HashMap<String, Ops> pkgOps = mUidOps.get(uid); - if (pkgOps == null) { + UidState uidState = getUidStateLocked(uid, edit); + if (uidState == null) { + return null; + } + + if (uidState.pkgOps == null) { if (!edit) { return null; } - pkgOps = new HashMap<String, Ops>(); - mUidOps.put(uid, pkgOps); + uidState.pkgOps = new ArrayMap<>(); } - Ops ops = pkgOps.get(packageName); + + Ops ops = uidState.pkgOps.get(packageName); if (ops == null) { if (!edit) { return null; @@ -904,8 +1170,8 @@ public class AppOpsService extends IAppOpsService.Stub { Binder.restoreCallingIdentity(ident); } } - ops = new Ops(packageName, uid, isPrivileged); - pkgOps.put(packageName, ops); + ops = new Ops(packageName, uidState, isPrivileged); + uidState.pkgOps.put(packageName, ops); } return ops; } @@ -940,7 +1206,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (!edit) { return null; } - op = new Op(ops.uid, ops.packageName, code); + op = new Op(ops.uidState.uid, ops.packageName, code); ops.put(code, op); } if (edit) { @@ -1000,6 +1266,8 @@ public class AppOpsService extends IAppOpsService.Stub { String tagName = parser.getName(); if (tagName.equals("pkg")) { readPackage(parser); + } if (tagName.equals("uid")) { + readUidOps(parser); } else { Slog.w(TAG, "Unknown element under <app-ops>: " + parser.getName()); @@ -1021,7 +1289,7 @@ public class AppOpsService extends IAppOpsService.Stub { Slog.w(TAG, "Failed parsing " + e); } finally { if (!success) { - mUidOps.clear(); + mUidStates.clear(); } try { stream.close(); @@ -1032,6 +1300,34 @@ public class AppOpsService extends IAppOpsService.Stub { } } + void readUidOps(XmlPullParser parser) throws NumberFormatException, + XmlPullParserException, IOException { + final int uid = Integer.parseInt(parser.getAttributeValue(null, "n")); + 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; + } + + String tagName = parser.getName(); + if (tagName.equals("op")) { + final int code = Integer.parseInt(parser.getAttributeValue(null, "n")); + final int mode = Integer.parseInt(parser.getAttributeValue(null, "m")); + UidState uidState = getUidStateLocked(uid, true); + if (uidState.opModes == null) { + uidState.opModes = new SparseIntArray(); + } + uidState.opModes.put(code, mode); + } else { + Slog.w(TAG, "Unknown element under <uid-ops>: " + + parser.getName()); + XmlUtils.skipCurrentTag(parser); + } + } + } + void readPackage(XmlPullParser parser) throws NumberFormatException, XmlPullParserException, IOException { String pkgName = parser.getAttributeValue(null, "n"); @@ -1114,15 +1410,16 @@ public class AppOpsService extends IAppOpsService.Stub { if (proxyPackageName != null) { op.proxyPackageName = proxyPackageName; } - HashMap<String, Ops> pkgOps = mUidOps.get(uid); - if (pkgOps == null) { - pkgOps = new HashMap<String, Ops>(); - mUidOps.put(uid, pkgOps); + + UidState uidState = getUidStateLocked(uid, true); + if (uidState.pkgOps == null) { + uidState.pkgOps = new ArrayMap<>(); } - Ops ops = pkgOps.get(pkgName); + + Ops ops = uidState.pkgOps.get(pkgName); if (ops == null) { - ops = new Ops(pkgName, uid, isPrivileged); - pkgOps.put(pkgName, ops); + ops = new Ops(pkgName, uidState, isPrivileged); + uidState.pkgOps.put(pkgName, ops); } ops.put(op.op, op); } else { @@ -1149,7 +1446,27 @@ public class AppOpsService extends IAppOpsService.Stub { XmlSerializer out = new FastXmlSerializer(); out.setOutput(stream, StandardCharsets.UTF_8.name()); out.startDocument(null, true); - out.startTag(null, "app-ops"); + out.startTag(null, "app"); + + final int uidStateCount = mUidStates.size(); + for (int i = 0; i < uidStateCount; i++) { + UidState uidState = mUidStates.valueAt(i); + if (uidState.opModes != null && uidState.opModes.size() > 0) { + out.startTag(null, "uid"); + out.attribute(null, "n", Integer.toString(uidState.uid)); + SparseIntArray uidOpModes = uidState.opModes; + final int opCount = uidOpModes.size(); + for (int j = 0; j < opCount; j++) { + final int op = uidOpModes.keyAt(j); + final int mode = uidOpModes.valueAt(j); + out.startTag(null, "op"); + out.attribute(null, "n", Integer.toString(op)); + out.attribute(null, "m", Integer.toString(mode)); + out.endTag(null, "op"); + } + out.endTag(null, "uid"); + } + } if (allOps != null) { String lastPkg = null; @@ -1316,9 +1633,27 @@ public class AppOpsService extends IAppOpsService.Stub { if (needSep) { pw.println(); } - for (int i=0; i<mUidOps.size(); i++) { - pw.print(" Uid "); UserHandle.formatUid(pw, mUidOps.keyAt(i)); pw.println(":"); - HashMap<String, Ops> pkgOps = mUidOps.valueAt(i); + for (int i=0; i<mUidStates.size(); i++) { + UidState uidState = mUidStates.valueAt(i); + + pw.print(" Uid "); UserHandle.formatUid(pw, uidState.uid); pw.println(":"); + + SparseIntArray opModes = uidState.opModes; + if (opModes != null) { + final int opModeCount = opModes.size(); + for (int j = 0; j < opModeCount; j++) { + final int code = opModes.keyAt(j); + final int mode = opModes.valueAt(j); + pw.print(" "); pw.print(AppOpsManager.opToName(code)); + pw.print(": mode="); pw.println(mode); + } + } + + ArrayMap<String, Ops> pkgOps = uidState.pkgOps; + if (pkgOps == null) { + continue; + } + for (Ops ops : pkgOps.values()) { pw.print(" Package "); pw.print(ops.packageName); pw.println(":"); for (int j=0; j<ops.size(); j++) { @@ -1382,4 +1717,16 @@ public class AppOpsService extends IAppOpsService.Stub { } } + private static String[] getPackagesForUid(int uid) { + String[] packageNames = null; + try { + packageNames= AppGlobals.getPackageManager().getPackagesForUid(uid); + } catch (RemoteException e) { + /* ignore - local call */ + } + if (packageNames == null) { + return EmptyArray.STRING; + } + return packageNames; + } } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index b9f62e678562..50bd544a308f 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -805,6 +805,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { IBinder mService; ComponentName mClassName; Intent mIntent; + boolean mInvokingProxyCallbacks = false; ProfileServiceConnections(Intent intent) { mService = null; @@ -871,34 +872,54 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } catch (RemoteException e) { Log.e(TAG, "Unable to linkToDeath", e); } - int n = mProxies.beginBroadcast(); - for (int i = 0; i < n; i++) { - try { - mProxies.getBroadcastItem(i).onServiceConnected(className, service); - } catch (RemoteException e) { - Log.e(TAG, "Unable to connect to proxy", e); + + if (mInvokingProxyCallbacks) { + Log.e(TAG, "Proxy callbacks already in progress."); + return; + } + mInvokingProxyCallbacks = true; + + final int n = mProxies.beginBroadcast(); + try { + for (int i = 0; i < n; i++) { + try { + mProxies.getBroadcastItem(i).onServiceConnected(className, service); + } catch (RemoteException e) { + Log.e(TAG, "Unable to connect to proxy", e); + } } + } finally { + mProxies.finishBroadcast(); + mInvokingProxyCallbacks = false; } - mProxies.finishBroadcast(); } @Override public void onServiceDisconnected(ComponentName className) { - if (mService == null) { - return; - } + if (mService == null) return; mService.unlinkToDeath(this, 0); mService = null; mClassName = null; - int n = mProxies.beginBroadcast(); - for (int i = 0; i < n; i++) { - try { - mProxies.getBroadcastItem(i).onServiceDisconnected(className); - } catch (RemoteException e) { - Log.e(TAG, "Unable to disconnect from proxy", e); + + if (mInvokingProxyCallbacks) { + Log.e(TAG, "Proxy callbacks already in progress."); + return; + } + mInvokingProxyCallbacks = true; + + final int n = mProxies.beginBroadcast(); + try { + for (int i = 0; i < n; i++) { + try { + mProxies.getBroadcastItem(i).onServiceDisconnected(className); + } catch (RemoteException e) { + Log.e(TAG, "Unable to disconnect from proxy", e); + } } + } finally { + mProxies.finishBroadcast(); + mInvokingProxyCallbacks = false; } - mProxies.finishBroadcast(); } @Override @@ -916,16 +937,19 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } private void sendBluetoothStateCallback(boolean isUp) { - int n = mStateChangeCallbacks.beginBroadcast(); - if (DBG) Log.d(TAG,"Broadcasting onBluetoothStateChange("+isUp+") to " + n + " receivers."); - for (int i=0; i <n;i++) { - try { - mStateChangeCallbacks.getBroadcastItem(i).onBluetoothStateChange(isUp); - } catch (RemoteException e) { - Log.e(TAG, "Unable to call onBluetoothStateChange() on callback #" + i , e); + try { + int n = mStateChangeCallbacks.beginBroadcast(); + if (DBG) Log.d(TAG,"Broadcasting onBluetoothStateChange("+isUp+") to " + n + " receivers."); + for (int i=0; i <n;i++) { + try { + mStateChangeCallbacks.getBroadcastItem(i).onBluetoothStateChange(isUp); + } catch (RemoteException e) { + Log.e(TAG, "Unable to call onBluetoothStateChange() on callback #" + i , e); + } } + } finally { + mStateChangeCallbacks.finishBroadcast(); } - mStateChangeCallbacks.finishBroadcast(); } /** @@ -934,16 +958,19 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private void sendBluetoothServiceUpCallback() { if (!mConnection.isGetNameAddressOnly()) { if (DBG) Log.d(TAG,"Calling onBluetoothServiceUp callbacks"); - int n = mCallbacks.beginBroadcast(); - Log.d(TAG,"Broadcasting onBluetoothServiceUp() to " + n + " receivers."); - for (int i=0; i <n;i++) { - try { - mCallbacks.getBroadcastItem(i).onBluetoothServiceUp(mBluetooth); - } catch (RemoteException e) { - Log.e(TAG, "Unable to call onBluetoothServiceUp() on callback #" + i, e); + try { + int n = mCallbacks.beginBroadcast(); + Log.d(TAG,"Broadcasting onBluetoothServiceUp() to " + n + " receivers."); + for (int i=0; i <n;i++) { + try { + mCallbacks.getBroadcastItem(i).onBluetoothServiceUp(mBluetooth); + } catch (RemoteException e) { + Log.e(TAG, "Unable to call onBluetoothServiceUp() on callback #" + i, e); + } } + } finally { + mCallbacks.finishBroadcast(); } - mCallbacks.finishBroadcast(); } } /** @@ -952,16 +979,19 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private void sendBluetoothServiceDownCallback() { if (!mConnection.isGetNameAddressOnly()) { if (DBG) Log.d(TAG,"Calling onBluetoothServiceDown callbacks"); - int n = mCallbacks.beginBroadcast(); - Log.d(TAG,"Broadcasting onBluetoothServiceDown() to " + n + " receivers."); - for (int i=0; i <n;i++) { - try { - mCallbacks.getBroadcastItem(i).onBluetoothServiceDown(); - } catch (RemoteException e) { - Log.e(TAG, "Unable to call onBluetoothServiceDown() on callback #" + i, e); + try { + int n = mCallbacks.beginBroadcast(); + Log.d(TAG,"Broadcasting onBluetoothServiceDown() to " + n + " receivers."); + for (int i=0; i <n;i++) { + try { + mCallbacks.getBroadcastItem(i).onBluetoothServiceDown(); + } catch (RemoteException e) { + Log.e(TAG, "Unable to call onBluetoothServiceDown() on callback #" + i, e); + } } + } finally { + mCallbacks.finishBroadcast(); } - mCallbacks.finishBroadcast(); } } @@ -1476,6 +1506,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { //Unbind mContext.unbindService(mConnection); } + mBluetoothGatt = null; } SystemClock.sleep(100); @@ -1781,6 +1812,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { //Unbind mContext.unbindService(mConnection); } + mBluetoothGatt = null; } mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 76d2258e0b85..6a22f22e82a6 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2142,6 +2142,10 @@ public class ConnectivityService extends IConnectivityManager.Stub mDefaultInetConditionPublished = 0; } notifyIfacesChanged(); + // TODO - we shouldn't send CALLBACK_LOST to requests that can be satisfied + // by other networks that are already connected. Perhaps that can be done by + // sending all CALLBACK_LOST messages (for requests, not listens) at the end + // of rematchAllNetworksAndRequests notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOST); nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED); mNetworkAgentInfos.remove(msg.replyTo); @@ -2250,7 +2254,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // is currently satisfying the request. This is desirable when // cellular ends up validating but WiFi does not. // 2. Unvalidated WiFi will not be reaped when validated cellular - // is currently satsifying the request. This is desirable when + // is currently satisfying the request. This is desirable when // WiFi ends up validating and out scoring cellular. mNetworkForRequestId.get(nri.request.requestId).getCurrentScore() < nai.getCurrentScoreAsValidated())) { @@ -2378,14 +2382,10 @@ public class ConnectivityService extends IConnectivityManager.Stub } if (!accept) { - // Tell the NetworkAgent that the network does not have Internet access (because that's - // what we just told the user). This will hint to Wi-Fi not to autojoin this network in - // the future. We do this now because NetworkMonitor might not yet have finished - // validating and thus we might not yet have received an EVENT_NETWORK_TESTED. - nai.asyncChannel.sendMessage(NetworkAgent.CMD_REPORT_NETWORK_STATUS, - NetworkAgent.INVALID_NETWORK, 0, null); - // TODO: Tear the network down once we have determined how to tell WifiStateMachine not - // to reconnect to it immediately. http://b/20739299 + // Tell the NetworkAgent to not automatically reconnect to the network. + nai.asyncChannel.sendMessage(NetworkAgent.CMD_PREVENT_AUTOMATIC_RECONNECT); + // Teardown the nework. + teardownUnneededNetwork(nai); } } @@ -3048,7 +3048,10 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public LegacyVpnInfo getLegacyVpnInfo(int userId) { enforceCrossUserPermission(userId); - throwIfLockdownEnabled(); + if (mLockdownEnabled) { + return null; + } + synchronized(mVpns) { return mVpns.get(userId).getLegacyVpnInfo(); } @@ -3799,10 +3802,10 @@ public class ConnectivityService extends IConnectivityManager.Stub // TODO: Instead of passing mDefaultRequest, provide an API to determine whether a Network // satisfies mDefaultRequest. - NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), + final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), new Network(reserveNetId()), new NetworkInfo(networkInfo), new LinkProperties( linkProperties), new NetworkCapabilities(networkCapabilities), currentScore, - mContext, mTrackerHandler, new NetworkMisc(networkMisc), mDefaultRequest); + mContext, mTrackerHandler, new NetworkMisc(networkMisc), mDefaultRequest, this); synchronized (this) { nai.networkMonitor.systemReady = mSystemReady; } @@ -4196,8 +4199,9 @@ public class ConnectivityService extends IConnectivityManager.Stub ArrayList<NetworkRequestInfo> addedRequests = new ArrayList<NetworkRequestInfo>(); if (VDBG) log(" network has: " + newNetwork.networkCapabilities); for (NetworkRequestInfo nri : mNetworkRequests.values()) { - NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(nri.request.requestId); - if (newNetwork == currentNetwork) { + final NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(nri.request.requestId); + final boolean satisfies = newNetwork.satisfies(nri.request); + if (newNetwork == currentNetwork && satisfies) { if (VDBG) { log("Network " + newNetwork.name() + " was already satisfying" + " request " + nri.request.requestId + ". No change."); @@ -4208,7 +4212,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // check if it satisfies the NetworkCapabilities if (VDBG) log(" checking if request is satisfied: " + nri.request); - if (newNetwork.satisfies(nri.request)) { + if (satisfies) { if (!nri.isRequest) { // This is not a request, it's a callback listener. // Add it to newNetwork regardless of score. @@ -4251,6 +4255,37 @@ public class ConnectivityService extends IConnectivityManager.Stub oldDefaultNetwork = currentNetwork; } } + } else if (newNetwork.networkRequests.get(nri.request.requestId) != null) { + // If "newNetwork" is listed as satisfying "nri" but no longer satisfies "nri", + // mark it as no longer satisfying "nri". Because networks are processed by + // rematchAllNetworkAndRequests() in descending score order, "currentNetwork" will + // match "newNetwork" before this loop will encounter a "currentNetwork" with higher + // score than "newNetwork" and where "currentNetwork" no longer satisfies "nri". + // This means this code doesn't have to handle the case where "currentNetwork" no + // longer satisfies "nri" when "currentNetwork" does not equal "newNetwork". + if (DBG) { + log("Network " + newNetwork.name() + " stopped satisfying" + + " request " + nri.request.requestId); + } + newNetwork.networkRequests.remove(nri.request.requestId); + if (currentNetwork == newNetwork) { + mNetworkForRequestId.remove(nri.request.requestId); + sendUpdatedScoreToFactories(nri.request, 0); + } else { + if (nri.isRequest == true) { + Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " + + newNetwork.name() + + " without updating mNetworkForRequestId or factories!"); + } + } + // TODO: technically, sending CALLBACK_LOST here is + // incorrect if nri is a request (not a listen) and there + // is a replacement network currently connected that can + // satisfy it. However, the only capability that can both + // a) be requested and b) change is NET_CAPABILITY_TRUSTED, + // so this code is only incorrect for a network that loses + // the TRUSTED capability, which is a rare case. + callCallbackForRequest(nri, newNetwork, ConnectivityManager.CALLBACK_LOST); } } // Linger any networks that are no longer needed. @@ -4269,41 +4304,41 @@ public class ConnectivityService extends IConnectivityManager.Stub unlinger(nai); } } - if (keep) { - if (isNewDefault) { - // Notify system services that this network is up. - makeDefault(newNetwork); - synchronized (ConnectivityService.this) { - // have a new default network, release the transition wakelock in - // a second if it's held. The second pause is to allow apps - // to reconnect over the new network - if (mNetTransitionWakeLock.isHeld()) { - mHandler.sendMessageDelayed(mHandler.obtainMessage( - EVENT_CLEAR_NET_TRANSITION_WAKELOCK, - mNetTransitionWakeLockSerialNumber, 0), - 1000); - } + if (isNewDefault) { + // Notify system services that this network is up. + makeDefault(newNetwork); + synchronized (ConnectivityService.this) { + // have a new default network, release the transition wakelock in + // a second if it's held. The second pause is to allow apps + // to reconnect over the new network + if (mNetTransitionWakeLock.isHeld()) { + mHandler.sendMessageDelayed(mHandler.obtainMessage( + EVENT_CLEAR_NET_TRANSITION_WAKELOCK, + mNetTransitionWakeLockSerialNumber, 0), + 1000); } } + } - // do this after the default net is switched, but - // before LegacyTypeTracker sends legacy broadcasts - for (NetworkRequestInfo nri : addedRequests) notifyNetworkCallback(newNetwork, nri); + // do this after the default net is switched, but + // before LegacyTypeTracker sends legacy broadcasts + for (NetworkRequestInfo nri : addedRequests) notifyNetworkCallback(newNetwork, nri); - if (isNewDefault) { - // Maintain the illusion: since the legacy API only - // understands one network at a time, we must pretend - // that the current default network disconnected before - // the new one connected. - if (oldDefaultNetwork != null) { - mLegacyTypeTracker.remove(oldDefaultNetwork.networkInfo.getType(), - oldDefaultNetwork, true); - } - mDefaultInetConditionPublished = newNetwork.lastValidated ? 100 : 0; - mLegacyTypeTracker.add(newNetwork.networkInfo.getType(), newNetwork); - notifyLockdownVpn(newNetwork); + if (isNewDefault) { + // Maintain the illusion: since the legacy API only + // understands one network at a time, we must pretend + // that the current default network disconnected before + // the new one connected. + if (oldDefaultNetwork != null) { + mLegacyTypeTracker.remove(oldDefaultNetwork.networkInfo.getType(), + oldDefaultNetwork, true); } + mDefaultInetConditionPublished = newNetwork.lastValidated ? 100 : 0; + mLegacyTypeTracker.add(newNetwork.networkInfo.getType(), newNetwork); + notifyLockdownVpn(newNetwork); + } + if (keep) { // Notify battery stats service about this network, both the normal // interface and any stacked links. // TODO: Avoid redoing this; this must only be done once when a network comes online. @@ -4697,4 +4732,11 @@ public class ConnectivityService extends IConnectivityManager.Stub } } } + + @VisibleForTesting + public NetworkMonitor createNetworkMonitor(Context context, Handler handler, + NetworkAgentInfo nai, NetworkRequest defaultRequest) { + return new NetworkMonitor(context, handler, nai, defaultRequest); + } + } diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index 42794e721672..5e2fe5a7c431 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -335,7 +335,12 @@ public class LockSettingsService extends ILockSettings.Stub { public String getStringUnchecked(String key, String defaultValue, int userId) { if (Settings.Secure.LOCK_PATTERN_ENABLED.equals(key)) { - return mLockPatternUtils.isLockPatternEnabled(userId) ? "1" : "0"; + long ident = Binder.clearCallingIdentity(); + try { + return mLockPatternUtils.isLockPatternEnabled(userId) ? "1" : "0"; + } finally { + Binder.restoreCallingIdentity(ident); + } } return mStorage.readKeyValue(key, defaultValue, userId); diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 857394f57b12..53e8d147ad3c 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -69,7 +69,6 @@ import android.os.storage.IMountServiceListener; import android.os.storage.IMountShutdownObserver; import android.os.storage.IObbActionListener; import android.os.storage.MountServiceInternal; -import android.os.storage.MountServiceInternal.ExternalStorageMountPolicy; import android.os.storage.OnObbStateChangeListener; import android.os.storage.StorageManager; import android.os.storage.StorageResultCode; @@ -560,6 +559,7 @@ class MountService extends IMountService.Stub private static final int H_FSTRIM = 4; private static final int H_VOLUME_MOUNT = 5; private static final int H_VOLUME_BROADCAST = 6; + private static final int H_INTERNAL_BROADCAST = 7; class MountServiceHandler extends Handler { public MountServiceHandler(Looper looper) { @@ -656,6 +656,13 @@ class MountService extends IMountService.Stub } break; } + case H_INTERNAL_BROADCAST: { + // Internal broadcasts aimed at system components, not for + // third-party apps. + final Intent intent = (Intent) msg.obj; + mContext.sendBroadcastAsUser(intent, UserHandle.ALL, + android.Manifest.permission.WRITE_MEDIA_STORAGE); + } } } } @@ -809,7 +816,7 @@ class MountService extends IMountService.Stub synchronized (mVolumes) { for (int i = 0; i < mVolumes.size(); i++) { final VolumeInfo vol = mVolumes.valueAt(i); - if (vol.isVisibleToUser(userId) && vol.isMountedReadable()) { + if (vol.isVisibleForRead(userId) && vol.isMountedReadable()) { final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, false); mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget(); @@ -1127,8 +1134,7 @@ class MountService extends IMountService.Stub intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(DiskInfo.EXTRA_DISK_ID, disk.id); intent.putExtra(DiskInfo.EXTRA_VOLUME_COUNT, volumeCount); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL, - android.Manifest.permission.WRITE_MEDIA_STORAGE); + mHandler.obtainMessage(H_INTERNAL_BROADCAST, intent).sendToTarget(); final CountDownLatch latch = mDiskScanLatches.remove(disk.id); if (latch != null) { @@ -1240,8 +1246,7 @@ class MountService extends IMountService.Stub intent.putExtra(VolumeInfo.EXTRA_VOLUME_STATE, newState); intent.putExtra(VolumeRecord.EXTRA_FS_UUID, vol.fsUuid); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL, - android.Manifest.permission.WRITE_MEDIA_STORAGE); + mHandler.obtainMessage(H_INTERNAL_BROADCAST, intent).sendToTarget(); } final String oldStateEnv = VolumeInfo.getEnvironmentForState(oldState); @@ -1252,7 +1257,7 @@ class MountService extends IMountService.Stub // started after this point will trigger additional // user-specific broadcasts. for (int userId : mStartedUsers) { - if (vol.isVisibleToUser(userId)) { + if (vol.isVisibleForRead(userId)) { final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, false); mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget(); @@ -2610,13 +2615,14 @@ class MountService extends IMountService.Stub } @Override - public StorageVolume[] getVolumeList(int uid, String packageName) { + public StorageVolume[] getVolumeList(int uid, String packageName, int flags) { + final boolean forWrite = (flags & StorageManager.FLAG_FOR_WRITE) != 0; + final ArrayList<StorageVolume> res = new ArrayList<>(); boolean foundPrimary = false; final int userId = UserHandle.getUserId(uid); final boolean reportUnmounted; - final long identity = Binder.clearCallingIdentity(); try { reportUnmounted = !mMountServiceInternal.hasExternalStorage( @@ -2628,7 +2634,7 @@ class MountService extends IMountService.Stub synchronized (mLock) { for (int i = 0; i < mVolumes.size(); i++) { final VolumeInfo vol = mVolumes.valueAt(i); - if (vol.isVisibleToUser(userId)) { + if (forWrite ? vol.isVisibleForWrite(userId) : vol.isVisibleForRead(userId)) { final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, reportUnmounted); if (vol.isPrimary()) { diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index a06bb3069d64..19a4851525a6 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -362,10 +362,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } try { - mContext.enforceCallingPermission( + mContext.enforceCallingOrSelfPermission( android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, "addOnSubscriptionsChangedListener"); - // SKIP checking for run-time permission since obtained PRIVILEGED + // SKIP checking for run-time permission since caller or self has PRIVILEGED permission } catch (SecurityException e) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.READ_PHONE_STATE, @@ -481,9 +481,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) { try { - mContext.enforceCallingPermission( + mContext.enforceCallingOrSelfPermission( android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); - // SKIP checking for run-time permission since obtained PRIVILEGED + // SKIP checking for run-time permission since caller or self has PRIVILEGED + // permission } catch (SecurityException e) { if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), callingPackage) != AppOpsManager.MODE_ALLOWED) { @@ -661,10 +662,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } private boolean canReadPhoneState(String callingPackage) { - if (mContext.checkCallingPermission( + if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { - // SKIP checking for run-time permission since obtained PRIVILEGED + // SKIP checking for run-time permission since caller or self has PRIVILEGED permission return true; } boolean canReadPhoneState = mContext.checkCallingOrSelfPermission( @@ -1589,9 +1590,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) { try { - mContext.enforceCallingPermission( + mContext.enforceCallingOrSelfPermission( android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); - // SKIP checking for run-time permission since obtained PRIVILEGED + // SKIP checking for run-time permission since caller or self has PRIVILEGED + // permission } catch (SecurityException e) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.READ_PHONE_STATE, null); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index cf7ebe882f59..b8d32c3afb93 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5840,7 +5840,10 @@ public final class ActivityManagerService extends ActivityManagerNative // We shouldn't already have a process under this name, but just in case we // need to clean up whatever may be there now. ProcessRecord old = removeProcessNameLocked(proc.processName, proc.uid); - if (old != null) { + if (old == proc && proc.persistent) { + // We are re-adding a persistent process. Whatevs! Just leave it there. + Slog.w(TAG, "Re-adding persistent process " + proc); + } else if (old != null) { Slog.wtf(TAG, "Already have existing proc " + old + " when adding " + proc); } UidRecord uidRec = mActiveUids.get(proc.uid); @@ -6549,6 +6552,17 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override + public boolean isRootVoiceInteraction(IBinder token) { + synchronized(this) { + ActivityRecord r = ActivityRecord.isInStackLocked(token); + if (r == null) { + return false; + } + return r.rootVoiceInteraction; + } + } + + @Override public IIntentSender getIntentSender(int type, String packageName, IBinder token, String resultWho, int requestCode, Intent[] intents, String[] resolvedTypes, @@ -9151,9 +9165,10 @@ public final class ActivityManagerService extends ActivityManagerNative private final List<ProviderInfo> generateApplicationProvidersLocked(ProcessRecord app) { List<ProviderInfo> providers = null; try { - providers = AppGlobals.getPackageManager(). + ParceledListSlice<ProviderInfo> slice = AppGlobals.getPackageManager(). queryContentProviders(app.processName, app.uid, STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS); + providers = slice != null ? slice.getList() : null; } catch (RemoteException ex) { } if (DEBUG_MU) Slog.v(TAG_MU, @@ -17198,8 +17213,7 @@ public final class ActivityManagerService extends ActivityManagerNative public void updatePersistentConfiguration(Configuration values) { enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, "updateConfiguration()"); - enforceCallingPermission(android.Manifest.permission.WRITE_SETTINGS, - "updateConfiguration()"); + enforceWriteSettingsPermission("updateConfiguration()"); if (values == null) { throw new NullPointerException("Configuration must not be null"); } @@ -17211,6 +17225,25 @@ public final class ActivityManagerService extends ActivityManagerNative } } + private void enforceWriteSettingsPermission(String func) { + int uid = Binder.getCallingUid(); + if (uid == Process.ROOT_UID) { + return; + } + + if (Settings.checkAndNoteWriteSettingsOperation(mContext, uid, + Settings.getPackageNameForUid(mContext, uid), false)) { + return; + } + + String msg = "Permission Denial: " + func + " from pid=" + + Binder.getCallingPid() + + ", uid=" + uid + + " requires " + android.Manifest.permission.WRITE_SETTINGS; + Slog.w(TAG, msg); + throw new SecurityException(msg); + } + public void updateConfiguration(Configuration values) { enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, "updateConfiguration()"); diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index d16eab6850a9..3de200954b15 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -107,6 +107,7 @@ final class ActivityRecord { boolean fullscreen; // covers the full screen? final boolean noDisplay; // activity is not displayed? final boolean componentSpecified; // did caller specifiy an explicit component? + final boolean rootVoiceInteraction; // was this the root activity of a voice interaction? static final int APPLICATION_ACTIVITY_TYPE = 0; static final int HOME_ACTIVITY_TYPE = 1; @@ -207,6 +208,9 @@ final class ActivityRecord { pw.print(prefix); pw.print("stateNotNeeded="); pw.print(stateNotNeeded); pw.print(" componentSpecified="); pw.print(componentSpecified); pw.print(" mActivityType="); pw.println(mActivityType); + if (rootVoiceInteraction) { + pw.print(prefix); pw.print("rootVoiceInteraction="); pw.println(rootVoiceInteraction); + } pw.print(prefix); pw.print("compat="); pw.print(compat); pw.print(" labelRes=0x"); pw.print(Integer.toHexString(labelRes)); pw.print(" icon=0x"); pw.print(Integer.toHexString(icon)); @@ -432,7 +436,8 @@ final class ActivityRecord { int _launchedFromUid, String _launchedFromPackage, Intent _intent, String _resolvedType, ActivityInfo aInfo, Configuration _configuration, ActivityRecord _resultTo, String _resultWho, int _reqCode, - boolean _componentSpecified, ActivityStackSupervisor supervisor, + boolean _componentSpecified, boolean _rootVoiceInteraction, + ActivityStackSupervisor supervisor, ActivityContainer container, Bundle options) { service = _service; appToken = new Token(this, service); @@ -444,6 +449,7 @@ final class ActivityRecord { shortComponentName = _intent.getComponent().flattenToShortString(); resolvedType = _resolvedType; componentSpecified = _componentSpecified; + rootVoiceInteraction = _rootVoiceInteraction; configuration = _configuration; stackConfigOverride = (container != null) ? container.mStack.mOverrideConfig : Configuration.EMPTY; @@ -530,13 +536,13 @@ final class ActivityRecord { AttributeCache.Entry ent = AttributeCache.instance().get(packageName, realTheme, com.android.internal.R.styleable.Window, userId); - final boolean translucent = ent.array.getBoolean( + final boolean translucent = ent != null && (ent.array.getBoolean( com.android.internal.R.styleable.Window_windowIsTranslucent, false) || (!ent.array.hasValue( com.android.internal.R.styleable.Window_windowIsTranslucent) && ent.array.getBoolean( com.android.internal.R.styleable.Window_windowSwipeToDismiss, - false)); + false))); fullscreen = ent != null && !ent.array.getBoolean( com.android.internal.R.styleable.Window_windowIsFloating, false) && !translucent; @@ -1257,7 +1263,7 @@ final class ActivityRecord { } final ActivityRecord r = new ActivityRecord(service, /*caller*/null, launchedFromUid, launchedFromPackage, intent, resolvedType, aInfo, service.getConfiguration(), - null, null, 0, componentSpecified, stackSupervisor, null, null); + null, null, 0, componentSpecified, false, stackSupervisor, null, null); r.persistentState = persistentState; r.taskDescription = taskDescription; diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 05c58d75848e..71fd49b71c98 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1506,6 +1506,7 @@ public final class ActivityStackSupervisor implements DisplayListener { if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) { try { + intent.addCategory(Intent.CATEGORY_VOICE); if (!AppGlobals.getPackageManager().activitySupportsIntent( intent.getComponent(), intent, resolvedType)) { err = ActivityManager.START_NOT_VOICE_COMPATIBLE; @@ -1626,7 +1627,7 @@ public final class ActivityStackSupervisor implements DisplayListener { ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho, - requestCode, componentSpecified, this, container, options); + requestCode, componentSpecified, voiceSession != null, this, container, options); if (outActivity != null) { outActivity[0] = r; } @@ -3205,10 +3206,10 @@ public final class ActivityStackSupervisor implements DisplayListener { void handleAppCrashLocked(ProcessRecord app) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - final int numStacks = stacks.size(); - for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { - final ActivityStack stack = stacks.get(stackNdx); - stack.handleAppCrashLocked(app); + int stackNdx = stacks.size() - 1; + while (stackNdx >= 0) { + stacks.get(stackNdx).handleAppCrashLocked(app); + stackNdx--; } } } @@ -3721,19 +3722,19 @@ public final class ActivityStackSupervisor implements DisplayListener { @Override public void onDisplayAdded(int displayId) { - Slog.v(TAG, "Display added displayId=" + displayId); + if (DEBUG_STACK) Slog.v(TAG, "Display added displayId=" + displayId); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0)); } @Override public void onDisplayRemoved(int displayId) { - Slog.v(TAG, "Display removed displayId=" + displayId); + if (DEBUG_STACK) Slog.v(TAG, "Display removed displayId=" + displayId); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0)); } @Override public void onDisplayChanged(int displayId) { - Slog.v(TAG, "Display changed displayId=" + displayId); + if (DEBUG_STACK) Slog.v(TAG, "Display changed displayId=" + displayId); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0)); } diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java index a7e6471d58a1..1fbfd9feff8e 100644 --- a/services/core/java/com/android/server/am/BroadcastRecord.java +++ b/services/core/java/com/android/server/am/BroadcastRecord.java @@ -240,8 +240,12 @@ final class BroadcastRecord extends Binder { } didSomething = true; receivers.remove(i); + if (i < nextReceiver) { + nextReceiver--; + } } } + nextReceiver = Math.min(nextReceiver, receivers.size()); return didSomething; } diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java index 6ee165093e39..b2161149d663 100644 --- a/services/core/java/com/android/server/am/RecentTasks.java +++ b/services/core/java/com/android/server/am/RecentTasks.java @@ -435,7 +435,8 @@ class RecentTasks extends ArrayList<TaskRecord> { */ int trimForTaskLocked(TaskRecord task, boolean doTrim) { int recentsCount = size(); - final boolean document = task.intent != null && task.intent.isDocument(); + final Intent intent = task.intent; + final boolean document = intent != null && intent.isDocument(); int maxRecents = task.maxRecents - 1; for (int i = 0; i < recentsCount; i++) { final TaskRecord tr = get(i); @@ -446,12 +447,13 @@ class RecentTasks extends ArrayList<TaskRecord> { if (i > MAX_RECENT_BITMAPS) { tr.freeLastThumbnail(); } + final Intent trIntent = tr.intent; final boolean sameAffinity = task.affinity != null && task.affinity.equals(tr.affinity); - final boolean trIsDocument = tr.intent != null && tr.intent.isDocument(); + final boolean sameIntent = (intent != null && intent.filterEquals(trIntent)); + final boolean trIsDocument = trIntent != null && trIntent.isDocument(); final boolean bothDocuments = document && trIsDocument; - if (!sameAffinity && !bothDocuments) { - // Not the same affinity and not documents. Move along... + if (!sameAffinity && !sameIntent && !bothDocuments) { continue; } diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 78f9f181bae0..7e2ad2969843 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -1223,6 +1223,9 @@ final class TaskRecord { if (lastDescription != null) { pw.print(prefix); pw.print("lastDescription="); pw.println(lastDescription); } + if (stack != null) { + pw.print(prefix); pw.print("stackId="); pw.println(stack.mStackId); + } pw.print(prefix); pw.print("hasBeenVisible="); pw.print(hasBeenVisible); pw.print(" mResizeable="); pw.print(mResizeable); pw.print(" firstActiveTime="); pw.print(lastActiveTime); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 1223a0022ae2..094cb57afc11 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1260,7 +1260,11 @@ public class AudioService extends IAudioService.Stub { } for (int stream = 0; stream < mStreamStates.length; stream++) { if (streamTypeAlias == mStreamVolumeAlias[stream]) { - mStreamStates[stream].mute(state); + if (!(readCameraSoundForced() + && (mStreamStates[stream].getStreamType() + == AudioSystem.STREAM_SYSTEM_ENFORCED))) { + mStreamStates[stream].mute(state); + } } } } else if ((direction == AudioManager.ADJUST_RAISE) && diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index 8a7943032b33..39333f638af6 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -30,6 +30,7 @@ import android.os.Messenger; import android.util.SparseArray; import com.android.internal.util.AsyncChannel; +import com.android.server.ConnectivityService; import com.android.server.connectivity.NetworkMonitor; import java.util.ArrayList; @@ -51,7 +52,7 @@ import java.util.Comparator; // ConnectivityService will tell netd to create the network and immediately transition to // state #3. // 3. registered, created, connected, unvalidated -// If this network can satsify the default NetworkRequest, then NetworkMonitor will +// If this network can satisfy the default NetworkRequest, then NetworkMonitor will // probe for Internet connectivity. // If this network cannot satisfy the default NetworkRequest, it will immediately be // transitioned to state #4. @@ -164,7 +165,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info, LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler, - NetworkMisc misc, NetworkRequest defaultRequest) { + NetworkMisc misc, NetworkRequest defaultRequest, ConnectivityService connService) { this.messenger = messenger; asyncChannel = ac; network = net; @@ -172,7 +173,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { linkProperties = lp; networkCapabilities = nc; currentScore = score; - networkMonitor = new NetworkMonitor(context, handler, this, defaultRequest); + networkMonitor = connService.createNetworkMonitor(context, handler, this, defaultRequest); networkMisc = misc; } diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 952ba08b53a8..5108564e916b 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -349,7 +349,7 @@ public class NetworkMonitor extends StateMachine { // Being in the ValidatedState State indicates a Network is: // - Successfully validated, or // - Wanted "as is" by the user, or - // - Does not satsify the default NetworkRequest and so validation has been skipped. + // - Does not satisfy the default NetworkRequest and so validation has been skipped. private class ValidatedState extends State { @Override public void enter() { @@ -558,7 +558,7 @@ public class NetworkMonitor extends StateMachine { // Being in the LingeringState State indicates a Network's validated bit is true and it once // was the highest scoring Network satisfying a particular NetworkRequest, but since then - // another Network satsified the NetworkRequest with a higher score and hence this Network + // another Network satisfied the NetworkRequest with a higher score and hence this Network // is "lingered" for a fixed period of time before it is disconnected. This period of time // allows apps to wrap up communication and allows for seamless reactivation if the other // higher scoring Network happens to disconnect. @@ -633,7 +633,8 @@ public class NetworkMonitor extends StateMachine { * Do a URL fetch on a known server to see if we get the data we expect. * Returns HTTP response code. */ - private int isCaptivePortal() { + @VisibleForTesting + protected int isCaptivePortal() { if (!mIsCaptivePortalCheckEnabled) return 204; HttpURLConnection urlConnection = null; diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 658f6f858acc..c998c2c28aac 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -297,7 +297,6 @@ public class SyncManager { private final UserManager mUserManager; private static final long SYNC_ALARM_TIMEOUT_MIN = 30 * 1000; // 30 seconds - private static final long SYNC_ALARM_TIMEOUT_MAX = 2 * 60 * 60 * 1000; // two hours private List<UserInfo> getAllUsers() { return mUserManager.getUsers(); @@ -1478,9 +1477,9 @@ public class SyncManager { final long now = SystemClock.elapsedRealtime(); pw.print("now: "); pw.print(now); pw.println(" (" + formatTime(System.currentTimeMillis()) + ")"); - pw.print("offset: "); pw.print(DateUtils.formatElapsedTime(mSyncRandomOffsetMillis/1000)); + pw.print("offset: "); pw.print(DateUtils.formatElapsedTime(mSyncRandomOffsetMillis / 1000)); pw.println(" (HH:MM:SS)"); - pw.print("uptime: "); pw.print(DateUtils.formatElapsedTime(now/1000)); + pw.print("uptime: "); pw.print(DateUtils.formatElapsedTime(now / 1000)); pw.println(" (HH:MM:SS)"); pw.print("time spent syncing: "); pw.print(DateUtils.formatElapsedTime( @@ -1497,11 +1496,6 @@ public class SyncManager { pw.println("no alarm is scheduled (there had better not be any pending syncs)"); } - pw.print("notification info: "); - final StringBuilder sb = new StringBuilder(); - mSyncHandler.mSyncNotificationInfo.toString(sb); - pw.println(sb.toString()); - pw.println(); pw.println("Active Syncs: " + mActiveSyncContexts.size()); final PackageManager pm = mContext.getPackageManager(); @@ -1514,8 +1508,8 @@ public class SyncManager { pw.println(); } + final StringBuilder sb = new StringBuilder(); synchronized (mSyncQueue) { - sb.setLength(0); mSyncQueue.dump(sb); // Dump Pending Operations. getSyncStorageEngine().dumpPendingOperations(sb); @@ -2349,7 +2343,6 @@ public class SyncManager { } } finally { - manageSyncNotificationLocked(); manageSyncAlarmLocked(earliestFuturePollTime, nextPendingSyncTime); mSyncTimeTracker.update(); mSyncManagerWakeLock.release(); @@ -3169,67 +3162,6 @@ public class SyncManager { throw new IllegalStateException("we are not in an error state, " + syncResult); } - private void manageSyncNotificationLocked() { - boolean shouldCancel; - boolean shouldInstall; - - if (mActiveSyncContexts.isEmpty()) { - mSyncNotificationInfo.startTime = null; - - // we aren't syncing. if the notification is active then remember that we need - // to cancel it and then clear out the info - shouldCancel = mSyncNotificationInfo.isActive; - shouldInstall = false; - } else { - // we are syncing - final long now = SystemClock.elapsedRealtime(); - if (mSyncNotificationInfo.startTime == null) { - mSyncNotificationInfo.startTime = now; - } - - // there are three cases: - // - the notification is up: do nothing - // - the notification is not up but it isn't time yet: don't install - // - the notification is not up and it is time: need to install - - if (mSyncNotificationInfo.isActive) { - shouldInstall = shouldCancel = false; - } else { - // it isn't currently up, so there is nothing to cancel - shouldCancel = false; - - final boolean timeToShowNotification = - now > mSyncNotificationInfo.startTime + SYNC_NOTIFICATION_DELAY; - if (timeToShowNotification) { - shouldInstall = true; - } else { - // show the notification immediately if this is a manual sync - shouldInstall = false; - for (ActiveSyncContext activeSyncContext : mActiveSyncContexts) { - final boolean manualSync = activeSyncContext.mSyncOperation.extras - .getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false); - if (manualSync) { - shouldInstall = true; - break; - } - } - } - } - } - - if (shouldCancel && !shouldInstall) { - mNeedSyncActiveNotification = false; - sendSyncStateIntent(); - mSyncNotificationInfo.isActive = false; - } - - if (shouldInstall) { - mNeedSyncActiveNotification = true; - sendSyncStateIntent(); - mSyncNotificationInfo.isActive = true; - } - } - private void manageSyncAlarmLocked(long nextPeriodicEventElapsedTime, long nextPendingEventElapsedTime) { // in each of these cases the sync loop will be kicked, which will cause this @@ -3238,13 +3170,6 @@ public class SyncManager { if (mStorageIsLow) return; if (mDeviceIsIdle) return; - // When the status bar notification should be raised - final long notificationTime = - (!mSyncHandler.mSyncNotificationInfo.isActive - && mSyncHandler.mSyncNotificationInfo.startTime != null) - ? mSyncHandler.mSyncNotificationInfo.startTime + SYNC_NOTIFICATION_DELAY - : Long.MAX_VALUE; - // When we should consider canceling an active sync long earliestTimeoutTime = Long.MAX_VALUE; for (ActiveSyncContext currentSyncContext : mActiveSyncContexts) { @@ -3260,24 +3185,14 @@ public class SyncManager { } if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "manageSyncAlarm: notificationTime is " + notificationTime); - } - - if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "manageSyncAlarm: earliestTimeoutTime is " + earliestTimeoutTime); - } - - if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "manageSyncAlarm: nextPeriodicEventElapsedTime is " + nextPeriodicEventElapsedTime); - } - if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "manageSyncAlarm: nextPendingEventElapsedTime is " + nextPendingEventElapsedTime); } - long alarmTime = Math.min(notificationTime, earliestTimeoutTime); - alarmTime = Math.min(alarmTime, nextPeriodicEventElapsedTime); + long alarmTime = Math.min(earliestTimeoutTime, nextPeriodicEventElapsedTime); alarmTime = Math.min(alarmTime, nextPendingEventElapsedTime); // Bound the alarm time. @@ -3288,24 +3203,16 @@ public class SyncManager { + alarmTime + ", setting to " + (now + SYNC_ALARM_TIMEOUT_MIN)); } alarmTime = now + SYNC_ALARM_TIMEOUT_MIN; - } else if (alarmTime > now + SYNC_ALARM_TIMEOUT_MAX) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "manageSyncAlarm: the alarmTime is too large, " - + alarmTime + ", setting to " + (now + SYNC_ALARM_TIMEOUT_MIN)); - } - alarmTime = now + SYNC_ALARM_TIMEOUT_MAX; } - // determine if we need to set or cancel the alarm + // Determine if we need to set or cancel the alarm boolean shouldSet = false; boolean shouldCancel = false; final boolean alarmIsActive = (mAlarmScheduleTime != null) && (now < mAlarmScheduleTime); - final boolean needAlarm = alarmTime != Long.MAX_VALUE; - if (needAlarm) { - // Need the alarm if - // - it's currently not set - // - if the alarm is set in the past. - if (!alarmIsActive || alarmTime < mAlarmScheduleTime) { + + if (alarmTime != Long.MAX_VALUE) { + // Need the alarm if it isn't set or has changed. + if (!alarmIsActive || alarmTime != mAlarmScheduleTime) { shouldSet = true; } } else { @@ -3329,14 +3236,6 @@ public class SyncManager { } } - private void sendSyncStateIntent() { - Intent syncStateIntent = new Intent(Intent.ACTION_SYNC_STATE_CHANGED); - syncStateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - syncStateIntent.putExtra("active", mNeedSyncActiveNotification); - syncStateIntent.putExtra("failing", false); - mContext.sendBroadcastAsUser(syncStateIntent, UserHandle.OWNER); - } - private void installHandleTooManyDeletesNotification(Account account, String authority, long numDeletes, int userId) { if (mNotificationMgr == null) return; diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 8d2687ba9db9..452378ff1e45 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -106,6 +106,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private static final int BRIGHTNESS_RAMP_RATE_FAST = 200; private static final int BRIGHTNESS_RAMP_RATE_SLOW = 40; + private static final int REPORTED_TO_POLICY_SCREEN_OFF = 0; + private static final int REPORTED_TO_POLICY_SCREEN_TURNING_ON = 1; + private static final int REPORTED_TO_POLICY_SCREEN_ON = 2; + private final Object mLock = new Object(); private final Context mContext; @@ -231,8 +235,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // The elapsed real time when the screen on was blocked. private long mScreenOnBlockStartRealTime; - // True if we told the window manager policy that the screen was off. - private boolean mReportedScreenOffToPolicy; + // Screen state we reported to policy. Must be one of REPORTED_TO_POLICY_SCREEN_* fields. + private int mReportedScreenStateToPolicy; // Remembers whether certain kinds of brightness adjustments // were recently applied so that we can decide how to transition. @@ -699,6 +703,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final boolean finished = ready && !mScreenBrightnessRampAnimator.isAnimating(); + // Notify policy about screen turned on. + if (ready && state != Display.STATE_OFF + && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_ON) { + mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_ON; + mWindowManagerPolicy.screenTurnedOn(); + } + // Grab a wake lock if we have unfinished business. if (!finished && !mUnfinishedBusiness) { if (DEBUG) { @@ -776,12 +787,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // it is only removed once the window manager tells us that the activity has // finished drawing underneath. final boolean isOff = (state == Display.STATE_OFF); - if (isOff && !mReportedScreenOffToPolicy && !mScreenOffBecauseOfProximity) { - mReportedScreenOffToPolicy = true; + if (isOff && mReportedScreenStateToPolicy != REPORTED_TO_POLICY_SCREEN_OFF + && !mScreenOffBecauseOfProximity) { + mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_OFF; unblockScreenOn(); mWindowManagerPolicy.screenTurnedOff(); - } else if (!isOff && mReportedScreenOffToPolicy) { - mReportedScreenOffToPolicy = false; + } else if (!isOff && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF) { + mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_TURNING_ON; if (mPowerState.getColorFadeLevel() == 0.0f) { blockScreenOn(); } else { @@ -1095,7 +1107,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call pw.println(" mAppliedLowPower=" + mAppliedLowPower); pw.println(" mPendingScreenOnUnblocker=" + mPendingScreenOnUnblocker); pw.println(" mPendingScreenOff=" + mPendingScreenOff); - pw.println(" mReportedScreenOffToPolicy=" + mReportedScreenOffToPolicy); + pw.println(" mReportedToPolicy=" + reportedToPolicyToString(mReportedScreenStateToPolicy)); pw.println(" mScreenBrightnessRampAnimator.isAnimating()=" + mScreenBrightnessRampAnimator.isAnimating()); @@ -1132,6 +1144,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } + private static String reportedToPolicyToString(int state) { + switch (state) { + case REPORTED_TO_POLICY_SCREEN_OFF: + return "REPORTED_TO_POLICY_SCREEN_OFF"; + case REPORTED_TO_POLICY_SCREEN_TURNING_ON: + return "REPORTED_TO_POLICY_SCREEN_TURNING_ON"; + case REPORTED_TO_POLICY_SCREEN_ON: + return "REPORTED_TO_POLICY_SCREEN_ON"; + default: + return Integer.toString(state); + } + } + private static Spline createAutoBrightnessSpline(int[] lux, int[] brightness) { try { final int n = brightness.length; diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java index 81056757fb0a..206cc8a256d8 100644 --- a/services/core/java/com/android/server/dreams/DreamController.java +++ b/services/core/java/com/android/server/dreams/DreamController.java @@ -65,7 +65,7 @@ final class DreamController { private final Intent mDreamingStoppedIntent = new Intent(Intent.ACTION_DREAMING_STOPPED) .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - private final Intent mCloseNotificationShadeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + private final Intent mCloseNotificationShadeIntent; private DreamRecord mCurrentDream; @@ -92,6 +92,8 @@ final class DreamController { mHandler = handler; mListener = listener; mIWindowManager = WindowManagerGlobal.getWindowManagerService(); + mCloseNotificationShadeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + mCloseNotificationShadeIntent.putExtra("reason", "dream"); } public void dump(PrintWriter pw) { diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index cd982d32d45d..46bda8ccfd89 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1668,8 +1668,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public NetworkPolicy[] getNetworkPolicies(String callingPackage) { mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); try { - mContext.enforceCallingPermission(READ_PRIVILEGED_PHONE_STATE, TAG); - // SKIP checking run-time OP_READ_PHONE_STATE since using PRIVILEGED + mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, TAG); + // SKIP checking run-time OP_READ_PHONE_STATE since caller or self has PRIVILEGED + // permission } catch (SecurityException e) { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, TAG); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 7a6895f542e6..9426b76eba52 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1842,7 +1842,7 @@ public class NotificationManagerService extends SystemService { } pw.println(':'); int N; - final boolean zenOnly = filter != null && filter.zen; + final boolean zenOnly = filter.filtered && filter.zen; if (!zenOnly) { synchronized (mToastQueue) { @@ -1864,13 +1864,13 @@ public class NotificationManagerService extends SystemService { pw.println(" Notification List:"); for (int i=0; i<N; i++) { final NotificationRecord nr = mNotificationList.get(i); - if (filter != null && !filter.matches(nr.sbn)) continue; + if (filter.filtered && !filter.matches(nr.sbn)) continue; nr.dump(pw, " ", getContext(), filter.redact); } pw.println(" "); } - if (filter == null) { + if (!filter.filtered) { N = mLights.size(); if (N > 0) { pw.println(" Lights List:"); @@ -1911,7 +1911,7 @@ public class NotificationManagerService extends SystemService { mUsageStats.dump(pw, " ", filter); } - if (filter == null || zenOnly) { + if (!filter.filtered || zenOnly) { pw.println("\n Zen Mode:"); pw.print(" mInterruptionFilter="); pw.println(mInterruptionFilter); mZenModeHelper.dump(pw, " "); diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java index 0d1d1ea4830c..3227ef857f5e 100644 --- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java @@ -125,6 +125,7 @@ final class DefaultPermissionGrantPolicy { private PackagesProvider mVoiceInteractionPackagesProvider; private PackagesProvider mSmsAppPackagesProvider; private PackagesProvider mDialerAppPackagesProvider; + private PackagesProvider mSimCallManagerPackagesProvider; private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider; public DefaultPermissionGrantPolicy(PackageManagerService service) { @@ -151,6 +152,10 @@ final class DefaultPermissionGrantPolicy { mDialerAppPackagesProvider = provider; } + public void setSimCallManagerPackagesProviderLPw(PackagesProvider provider) { + mSimCallManagerPackagesProvider = provider; + } + public void setSyncAdapterPackagesProviderLPw(SyncAdapterPackagesProvider provider) { mSyncAdapterPackagesProvider = provider; } @@ -165,30 +170,23 @@ final class DefaultPermissionGrantPolicy { synchronized (mService.mPackages) { for (PackageParser.Package pkg : mService.mPackages.values()) { - if (!isSysComponentOrPersistentPlatformSignedPrivApp(pkg) - || !doesPackageSupportRuntimePermissions(pkg)) { + if (!isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg) + || !doesPackageSupportRuntimePermissions(pkg) + || pkg.requestedPermissions.isEmpty()) { continue; } + Set<String> permissions = new ArraySet<>(); final int permissionCount = pkg.requestedPermissions.size(); for (int i = 0; i < permissionCount; i++) { String permission = pkg.requestedPermissions.get(i); BasePermission bp = mService.mSettings.mPermissions.get(permission); if (bp != null && bp.isRuntime()) { - final int flags = mService.getPermissionFlags(permission, - pkg.packageName, userId); - if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) == 0) { - mService.grantRuntimePermission(pkg.packageName, permission, userId); - mService.updatePermissionFlags(permission, pkg.packageName, - PackageManager.MASK_PERMISSION_FLAGS, - PackageManager.FLAG_PERMISSION_SYSTEM_FIXED - | PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, userId); - if (DEBUG) { - Log.i(TAG, "Granted " + permission + " to system component " - + pkg.packageName); - } - } + permissions.add(permission); } } + if (!permissions.isEmpty()) { + grantRuntimePermissionsLPw(pkg, permissions, true, userId); + } } } } @@ -201,6 +199,7 @@ final class DefaultPermissionGrantPolicy { final PackagesProvider voiceInteractionPackagesProvider; final PackagesProvider smsAppPackagesProvider; final PackagesProvider dialerAppPackagesProvider; + final PackagesProvider simCallManagerPackagesProvider; final SyncAdapterPackagesProvider syncAdapterPackagesProvider; synchronized (mService.mPackages) { @@ -209,6 +208,7 @@ final class DefaultPermissionGrantPolicy { voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider; smsAppPackagesProvider = mSmsAppPackagesProvider; dialerAppPackagesProvider = mDialerAppPackagesProvider; + simCallManagerPackagesProvider = mSimCallManagerPackagesProvider; syncAdapterPackagesProvider = mSyncAdapterPackagesProvider; } @@ -222,6 +222,8 @@ final class DefaultPermissionGrantPolicy { ? smsAppPackagesProvider.getPackages(userId) : null; String[] dialerAppPackageNames = (dialerAppPackagesProvider != null) ? dialerAppPackagesProvider.getPackages(userId) : null; + String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null) + ? simCallManagerPackagesProvider.getPackages(userId) : null; String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ? syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null; String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ? @@ -313,6 +315,18 @@ final class DefaultPermissionGrantPolicy { } } + // Sim call manager + if (simCallManagerPackageNames != null) { + for (String simCallManagerPackageName : simCallManagerPackageNames) { + PackageParser.Package simCallManagerPackage = + getSystemPackageLPr(simCallManagerPackageName); + if (simCallManagerPackage != null) { + grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage, + userId); + } + } + } + // SMS if (smsAppPackageNames == null) { Intent smsIntent = new Intent(Intent.ACTION_MAIN); @@ -590,6 +604,25 @@ final class DefaultPermissionGrantPolicy { } } + private void grantDefaultPermissionsToDefaultSimCallManagerLPr( + PackageParser.Package simCallManagerPackage, int userId) { + Log.i(TAG, "Granting permissions to sim call manager for user:" + userId); + if (doesPackageSupportRuntimePermissions(simCallManagerPackage)) { + grantRuntimePermissionsLPw(simCallManagerPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(simCallManagerPackage, MICROPHONE_PERMISSIONS, userId); + } + } + + public void grantDefaultPermissionsToDefaultSimCallManagerLPr(String packageName, int userId) { + if (packageName == null) { + return; + } + PackageParser.Package simCallManagerPackage = getPackageLPr(packageName); + if (simCallManagerPackage != null) { + grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage, userId); + } + } + public void grantDefaultPermissionsToEnabledCarrierAppsLPr(String[] packageNames, int userId) { Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId); if (packageNames == null) { @@ -601,6 +634,7 @@ final class DefaultPermissionGrantPolicy { && doesPackageSupportRuntimePermissions(carrierPackage)) { grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId); grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId); + grantRuntimePermissionsLPw(carrierPackage, SMS_PERMISSIONS, userId); } } } @@ -662,7 +696,7 @@ final class DefaultPermissionGrantPolicy { List<PackageParser.Package> syncAdapterPackages = new ArrayList<>(); Intent homeIntent = new Intent(Intent.ACTION_MAIN); - homeIntent.addCategory(Intent.CATEGORY_HOME); + homeIntent.addCategory(Intent.CATEGORY_LAUNCHER); for (String syncAdapterPackageName : syncAdapterPackageNames) { homeIntent.setPackage(syncAdapterPackageName); @@ -699,7 +733,7 @@ final class DefaultPermissionGrantPolicy { private PackageParser.Package getSystemPackageLPr(String packageName) { PackageParser.Package pkg = getPackageLPr(packageName); if (pkg != null && pkg.isSystemApp()) { - return !isSysComponentOrPersistentPlatformSignedPrivApp(pkg) ? pkg : null; + return !isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg) ? pkg : null; } return null; } @@ -716,18 +750,36 @@ final class DefaultPermissionGrantPolicy { private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions, boolean systemFixed, boolean overrideUserChoice, int userId) { + if (pkg.requestedPermissions.isEmpty()) { + return; + } + List<String> requestedPermissions = pkg.requestedPermissions; + Set<String> grantablePermissions = null; if (pkg.isUpdatedSystemApp()) { PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName); if (sysPs != null) { - requestedPermissions = sysPs.pkg.requestedPermissions; + if (sysPs.pkg.requestedPermissions.isEmpty()) { + return; + } + if (!requestedPermissions.equals(sysPs.pkg.requestedPermissions)) { + grantablePermissions = new ArraySet<>(requestedPermissions); + requestedPermissions = sysPs.pkg.requestedPermissions; + } } } - final int permissionCount = requestedPermissions.size(); - for (int i = 0; i < permissionCount; i++) { + final int grantablePermissionCount = requestedPermissions.size(); + for (int i = 0; i < grantablePermissionCount; i++) { String permission = requestedPermissions.get(i); + + // If there is a disabled system app it may request a permission the updated + // version ot the data partition doesn't, In this case skip the permission. + if (grantablePermissions != null && !grantablePermissions.contains(permission)) { + continue; + } + if (permissions.contains(permission)) { final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId); @@ -763,12 +815,19 @@ final class DefaultPermissionGrantPolicy { } } - private boolean isSysComponentOrPersistentPlatformSignedPrivApp(PackageParser.Package pkg) { + private boolean isSysComponentOrPersistentPlatformSignedPrivAppLPr(PackageParser.Package pkg) { if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) { return true; } - if ((pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) == 0 - || (pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) { + if (!pkg.isPrivilegedApp()) { + return false; + } + PackageSetting sysPkg = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName); + if (sysPkg != null) { + if ((sysPkg.pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) { + return false; + } + } else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) { return false; } return PackageManagerService.compareSignatures(mService.mPlatformPackage.mSignatures, diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index b5ef3b798091..4a473fd42741 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -489,7 +489,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // User needs to accept permissions; give installer an intent they // can use to involve user. final Intent intent = new Intent(PackageInstaller.ACTION_CONFIRM_PERMISSIONS); - intent.setPackage("com.android.packageinstaller"); + intent.setPackage(mContext.getPackageManager().getPermissionControllerPackageName()); intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); try { mRemoteObserver.onUserActionRequired(intent); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b719b16c1a39..6fe8b8ab982c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -298,7 +298,7 @@ public class PackageManagerService extends IPackageManager.Stub { private static final boolean DEBUG_DEXOPT = false; private static final boolean DEBUG_ABI_SELECTION = false; - static final boolean CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE = Build.IS_DEBUGGABLE; + static final boolean CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE = false; private static final int RADIO_UID = Process.PHONE_UID; private static final int LOG_UID = Process.LOG_UID; @@ -323,6 +323,7 @@ public class PackageManagerService extends IPackageManager.Stub { static final int SCAN_BOOTING = 1<<8; static final int SCAN_TRUSTED_OVERLAY = 1<<9; static final int SCAN_DELETE_DATA_ON_FAILURES = 1<<10; + static final int SCAN_REPLACING = 1<<11; static final int SCAN_REQUIRE_KNOWN = 1<<12; static final int SCAN_MOVE = 1<<13; static final int SCAN_INITIAL = 1<<14; @@ -3194,6 +3195,13 @@ public class PackageManagerService extends IPackageManager.Stub { } } + @Override + public String getPermissionControllerPackageName() { + synchronized (mPackages) { + return mRequiredInstallerPackage; + } + } + /** * Checks if the request is from the system or an app that has INTERACT_ACROSS_USERS * or INTERACT_ACROSS_USERS_FULL permissions, if the userid is not for the caller. @@ -3627,8 +3635,6 @@ public class PackageManagerService extends IPackageManager.Stub { if (getCallingUid() != Process.SYSTEM_UID) { flagMask &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; flagValues &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; - flagMask &= ~PackageManager.FLAG_PERMISSION_POLICY_FIXED; - flagValues &= ~PackageManager.FLAG_PERMISSION_POLICY_FIXED; flagMask &= ~PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; flagValues &= ~PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; } @@ -5429,7 +5435,7 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override - public List<ProviderInfo> queryContentProviders(String processName, + public ParceledListSlice<ProviderInfo> queryContentProviders(String processName, int uid, int flags) { ArrayList<ProviderInfo> finalList = null; // reader @@ -5461,9 +5467,10 @@ public class PackageManagerService extends IPackageManager.Stub { if (finalList != null) { Collections.sort(finalList, mProviderInitOrderSorter); + return new ParceledListSlice<ProviderInfo>(finalList); } - return finalList; + return null; } @Override @@ -7133,6 +7140,14 @@ public class PackageManagerService extends IPackageManager.Stub { } } + // Request the ActivityManager to kill the process(only for existing packages) + // so that we do not end up in a confused state while the user is still using the older + // version of the application while the new one gets installed. + if ((scanFlags & SCAN_REPLACING) != 0) { + killApplication(pkg.applicationInfo.packageName, + pkg.applicationInfo.uid, "replace pkg"); + } + // Also need to kill any apps that are dependent on the library. if (clientLibPkgs != null) { for (int i=0; i<clientLibPkgs.size(); i++) { @@ -8592,7 +8607,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (!allowed) { if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_PRE23) != 0 - && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.MNC) { + && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) { // If this was a previously normal/dangerous permission that got moved // to a system permission as part of the runtime permission redesign, then // we still want to blindly grant it to old apps. @@ -9587,6 +9602,7 @@ public class PackageManagerService extends IPackageManager.Stub { killApplication(packageName, UserHandle.getUid(userId, pkgSetting.appId), "hiding pkg"); sendApplicationHiddenForUser(packageName, pkgSetting, userId); + return true; } } finally { Binder.restoreCallingIdentity(callingId); @@ -11770,7 +11786,6 @@ public class PackageManagerService extends IPackageManager.Stub { final String pkgName = pkg.packageName; final int[] allUsers; final boolean[] perUserInstalled; - final boolean weFroze; // First find the old package info and check signatures synchronized(mPackages) { @@ -11800,35 +11815,15 @@ public class PackageManagerService extends IPackageManager.Stub { for (int i = 0; i < allUsers.length; i++) { perUserInstalled[i] = ps != null ? ps.getInstalled(allUsers[i]) : false; } - - // Mark the app as frozen to prevent launching during the upgrade - // process, and then kill all running instances - if (!ps.frozen) { - ps.frozen = true; - weFroze = true; - } else { - weFroze = false; - } } - // Now that we're guarded by frozen state, kill app during upgrade - killApplication(pkgName, oldPackage.applicationInfo.uid, "replace pkg"); - - try { - boolean sysPkg = (isSystemApp(oldPackage)); - if (sysPkg) { - replaceSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, - user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); - } else { - replaceNonSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, - user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); - } - } finally { - // Regardless of success or failure of upgrade steps above, always - // unfreeze the package if we froze it - if (weFroze) { - unfreezePackage(pkgName); - } + boolean sysPkg = (isSystemApp(oldPackage)); + if (sysPkg) { + replaceSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, + user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); + } else { + replaceNonSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, + user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); } } @@ -11958,6 +11953,8 @@ public class PackageManagerService extends IPackageManager.Stub { } } + killApplication(packageName, oldPkg.applicationInfo.uid, "replace sys pkg"); + res.removedInfo.uid = oldPkg.applicationInfo.uid; res.removedInfo.removedPackage = packageName; // Remove existing system package @@ -12347,7 +12344,7 @@ public class PackageManagerService extends IPackageManager.Stub { startIntentFilterVerifications(args.user.getIdentifier(), replace, pkg); if (replace) { - replacePackageLI(pkg, parseFlags, scanFlags, args.user, + replacePackageLI(pkg, parseFlags, scanFlags | SCAN_REPLACING, args.user, installerPackageName, volumeUuid, res); } else { installNewPackageLI(pkg, parseFlags, scanFlags | SCAN_DELETE_DATA_ON_FAILURES, @@ -16529,6 +16526,13 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override + public void setSimCallManagerPackagesProvider(PackagesProvider provider) { + synchronized (mPackages) { + mDefaultPermissionPolicy.setSimCallManagerPackagesProviderLPw(provider); + } + } + + @Override public void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider) { synchronized (mPackages) { mDefaultPermissionPolicy.setSyncAdapterPackagesProviderLPw(provider); @@ -16550,6 +16554,13 @@ public class PackageManagerService extends IPackageManager.Stub { packageName, userId); } } + @Override + public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) { + synchronized (mPackages) { + mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultSimCallManagerLPr( + packageName, userId); + } + } } @Override diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index d12481c4e80b..da8fb702a56e 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -251,7 +251,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } /** Amount of time (in milliseconds) to wait for windows drawn before powering on. */ - static final int WAITING_FOR_DRAWN_TIMEOUT = 500; + static final int WAITING_FOR_DRAWN_TIMEOUT = 1000; /** * Lock protecting internal state. Must not call out into window @@ -2469,6 +2469,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { return isKeyguard ? -1 : R.anim.dock_top_enter; } } else if (win == mNavigationBar) { + if (win.getAttrs().windowAnimations != 0) { + return 0; + } // This can be on either the bottom or the right. if (mNavigationBarOnBottom) { if (transit == TRANSIT_EXIT @@ -3111,6 +3114,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { private void launchAssistAction(String hint, int deviceId) { sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST); + if (!isUserSetupComplete()) { + // Disable opening assist window during setup + return; + } Bundle args = null; if (deviceId > Integer.MIN_VALUE) { args = new Bundle(); @@ -5462,7 +5469,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { // the wake lock and let the system suspend once this function returns. synchronized (mLock) { mAwake = false; - mKeyguardDrawComplete = false; updateWakeGestureListenerLp(); updateOrientationListenerLp(); updateLockScreenTimeout(); @@ -5484,7 +5490,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { // may happen in a future call to goToSleep. synchronized (mLock) { mAwake = true; - mKeyguardDrawComplete = false; if (mKeyguardDelegate != null) { mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT); mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000); @@ -5553,9 +5558,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { synchronized (mLock) { mScreenOnEarly = false; mScreenOnFully = false; + mKeyguardDrawComplete = false; mWindowManagerDrawComplete = false; mScreenOnListener = null; updateOrientationListenerLp(); + + if (mKeyguardDelegate != null) { + mKeyguardDelegate.onScreenTurnedOff(); + } } } @@ -5568,6 +5578,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { synchronized (mLock) { mScreenOnEarly = true; mScreenOnFully = false; + mKeyguardDrawComplete = false; mWindowManagerDrawComplete = false; mScreenOnListener = screenOnListener; @@ -5581,6 +5592,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + // Called on the DisplayManager's DisplayPowerController thread. + @Override + public void screenTurnedOn() { + synchronized (mLock) { + if (mKeyguardDelegate != null) { + mKeyguardDelegate.onScreenTurnedOn(); + } + } + } + private void finishWindowsDrawn() { synchronized (mLock) { if (!mScreenOnEarly || mWindowManagerDrawComplete) { diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 0f3a199e79e8..5d5230756e42 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -8,6 +8,7 @@ import android.content.pm.ActivityInfo; import android.content.res.Resources; import android.graphics.PixelFormat; import android.os.Bundle; +import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; @@ -34,6 +35,7 @@ public class KeyguardServiceDelegate { protected KeyguardServiceWrapper mKeyguardService; private final Context mContext; private final View mScrim; // shown if keyguard crashes + private final Handler mScrimHandler; private final KeyguardState mKeyguardState = new KeyguardState(); private DrawnListener mDrawnListenerWhenConnect; @@ -103,6 +105,7 @@ public class KeyguardServiceDelegate { public KeyguardServiceDelegate(Context context) { mContext = context; mScrim = createScrim(context); + mScrimHandler = new Handler(); } public void bindService(Context context) { @@ -144,6 +147,7 @@ public class KeyguardServiceDelegate { mKeyguardService.onStartedWakingUp(); mKeyguardService.onScreenTurningOn( new KeyguardShowDelegate(mDrawnListenerWhenConnect)); + mKeyguardService.onScreenTurnedOn(); mDrawnListenerWhenConnect = null; } if (mKeyguardState.bootCompleted) { @@ -229,6 +233,13 @@ public class KeyguardServiceDelegate { } } + public void onScreenTurnedOff() { + if (mKeyguardService != null) { + if (DEBUG) Log.v(TAG, "onScreenTurnedOff()"); + mKeyguardService.onScreenTurnedOff(); + } + } + public void onScreenTurningOn(final DrawnListener drawnListener) { if (mKeyguardService != null) { if (DEBUG) Log.v(TAG, "onScreenTurnedOn(showListener = " + drawnListener + ")"); @@ -243,6 +254,13 @@ public class KeyguardServiceDelegate { } } + public void onScreenTurnedOn() { + if (mKeyguardService != null) { + if (DEBUG) Log.v(TAG, "onScreenTurnedOn()"); + mKeyguardService.onScreenTurnedOn(); + } + } + public void onStartedGoingToSleep(int why) { if (mKeyguardService != null) { mKeyguardService.onStartedGoingToSleep(why); @@ -322,7 +340,7 @@ public class KeyguardServiceDelegate { public void showScrim() { synchronized (mKeyguardState) { if (!mKeyguardState.deviceHasKeyguard) return; - mScrim.post(new Runnable() { + mScrimHandler.post(new Runnable() { @Override public void run() { mScrim.setVisibility(View.VISIBLE); @@ -332,7 +350,7 @@ public class KeyguardServiceDelegate { } public void hideScrim() { - mScrim.post(new Runnable() { + mScrimHandler.post(new Runnable() { @Override public void run() { mScrim.setVisibility(View.GONE); diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index 5810a4529bce..cd88b664e2f8 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -141,6 +141,24 @@ public class KeyguardServiceWrapper implements IKeyguardService { } } + @Override + public void onScreenTurnedOn() { + try { + mService.onScreenTurnedOn(); + } catch (RemoteException e) { + Slog.w(TAG , "Remote Exception", e); + } + } + + @Override + public void onScreenTurnedOff() { + try { + mService.onScreenTurnedOff(); + } catch (RemoteException e) { + Slog.w(TAG , "Remote Exception", e); + } + } + @Override // Binder interface public void setKeyguardEnabled(boolean enabled) { try { diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 88476cee65c1..b920f97ac839 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -30,6 +30,7 @@ import com.android.server.lights.LightsManager; import com.android.server.Watchdog; import android.Manifest; +import android.app.AppOpsManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; @@ -3319,8 +3320,14 @@ public final class PowerManagerService extends SystemService */ @Override // Binder call public void setStayOnSetting(int val) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.WRITE_SETTINGS, null); + int uid = Binder.getCallingUid(); + // if uid is of root's, we permit this operation straight away + if (uid != Process.ROOT_UID) { + if (!Settings.checkAndNoteWriteSettingsOperation(mContext, uid, + Settings.getPackageNameForUid(mContext, uid), true)) { + return; + } + } final long ident = Binder.clearCallingIdentity(); try { diff --git a/services/core/java/com/android/server/telecom/TelecomLoaderService.java b/services/core/java/com/android/server/telecom/TelecomLoaderService.java index c2ce572262da..f4bd61fa39cd 100644 --- a/services/core/java/com/android/server/telecom/TelecomLoaderService.java +++ b/services/core/java/com/android/server/telecom/TelecomLoaderService.java @@ -16,9 +16,11 @@ package com.android.server.telecom; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageManagerInternal; import android.database.ContentObserver; @@ -31,6 +33,9 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.provider.Settings; import android.telecom.DefaultDialerManager; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.telephony.CarrierConfigManager; import android.util.IntArray; import android.util.Slog; @@ -39,6 +44,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.telephony.SmsApplication; import com.android.server.LocalServices; import com.android.server.SystemService; +import com.android.server.pm.UserManagerService; /** * Starts the telecom component by binding to its ITelecomService implementation. Telecom is setup @@ -64,7 +70,8 @@ public class TelecomLoaderService extends SystemService { ServiceManager.addService(Context.TELECOM_SERVICE, service); synchronized (mLock) { - if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null) { + if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null + || mDefaultSimCallManagerRequests != null) { final PackageManagerInternal packageManagerInternal = LocalServices .getService(PackageManagerInternal.class); @@ -95,6 +102,23 @@ public class TelecomLoaderService extends SystemService { } } } + if (mDefaultSimCallManagerRequests != null) { + TelecomManager telecomManager = + (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); + PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(); + if (phoneAccount != null) { + final int requestCount = mDefaultSimCallManagerRequests.size(); + final String packageName = + phoneAccount.getComponentName().getPackageName(); + for (int i = requestCount - 1; i >= 0; i--) { + final int userId = mDefaultSimCallManagerRequests.get(i); + mDefaultSimCallManagerRequests.remove(i); + packageManagerInternal + .grantDefaultPermissionsToDefaultSimCallManager( + packageName, userId); + } + } + } } } } catch (RemoteException e) { @@ -122,6 +146,9 @@ public class TelecomLoaderService extends SystemService { @GuardedBy("mLock") private IntArray mDefaultDialerAppRequests; + @GuardedBy("mLock") + private IntArray mDefaultSimCallManagerRequests; + private final Context mContext; @GuardedBy("mLock") @@ -141,6 +168,7 @@ public class TelecomLoaderService extends SystemService { public void onBootPhase(int phase) { if (phase == PHASE_ACTIVITY_MANAGER_READY) { registerDefaultAppNotifier(); + registerCarrierConfigChangedReceiver(); connectToTelecom(); } } @@ -215,6 +243,30 @@ public class TelecomLoaderService extends SystemService { return null; } }); + + // Set a callback for the package manager to query the default sim call manager. + packageManagerInternal.setSimCallManagerPackagesProvider( + new PackageManagerInternal.PackagesProvider() { + @Override + public String[] getPackages(int userId) { + synchronized (mLock) { + if (mServiceConnection == null) { + if (mDefaultSimCallManagerRequests == null) { + mDefaultSimCallManagerRequests = new IntArray(); + } + mDefaultSimCallManagerRequests.add(userId); + return null; + } + } + TelecomManager telecomManager = + (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); + PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId); + if (phoneAccount != null) { + return new String[]{phoneAccount.getComponentName().getPackageName()}; + } + return null; + } + }); } private void registerDefaultAppNotifier() { @@ -245,6 +297,7 @@ public class TelecomLoaderService extends SystemService { packageManagerInternal.grantDefaultPermissionsToDefaultDialerApp( packageName, userId); } + updateSimCallManagerPermissions(packageManagerInternal, userId); } } }; @@ -254,4 +307,36 @@ public class TelecomLoaderService extends SystemService { mContext.getContentResolver().registerContentObserver(defaultDialerAppUri, false, contentObserver, UserHandle.USER_ALL); } + + + private void registerCarrierConfigChangedReceiver() { + final PackageManagerInternal packageManagerInternal = LocalServices.getService( + PackageManagerInternal.class); + BroadcastReceiver receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { + for (int userId : UserManagerService.getInstance().getUserIds()) { + updateSimCallManagerPermissions(packageManagerInternal, userId); + } + } + } + }; + + mContext.registerReceiverAsUser(receiver, UserHandle.ALL, + new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED), null, null); + } + + private void updateSimCallManagerPermissions(PackageManagerInternal packageManagerInternal, + int userId) { + TelecomManager telecomManager = + (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); + PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId); + if (phoneAccount != null) { + Slog.i(TAG, "updating sim call manager permissions for userId:" + userId); + String packageName = phoneAccount.getComponentName().getPackageName(); + packageManagerInternal.grantDefaultPermissionsToDefaultSimCallManager( + packageName, userId); + } + } } diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index a57463c21f48..7bd0635a814a 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -559,6 +559,7 @@ public class AppTransition implements Dump { set.addAnimation(clipAnimTB); set.addAnimation(translateY); set.addAnimation(alpha); + set.setZAdjustment(Animation.ZORDER_TOP); set.initialize(appWidth, appHeight, appWidth, appHeight); anim = set; } else { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d9828cc4f081..26e75bd30df1 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2658,6 +2658,16 @@ public class WindowManagerService extends IWindowManager.Stub return disabled; } + boolean isSecureLocked(WindowState w) { + if ((w.mAttrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { + return true; + } + if (isScreenCaptureDisabledLocked(UserHandle.getUserId(w.mOwnerUid))) { + return true; + } + return false; + } + /** * Set mScreenCaptureDisabled for specific user */ @@ -3169,6 +3179,9 @@ public class WindowManagerService extends IWindowManager.Stub boolean wallpaperMayMove = win.mViewVisibility != viewVisibility && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0; wallpaperMayMove |= (flagChanges & FLAG_SHOW_WALLPAPER) != 0; + if ((flagChanges & FLAG_SECURE) != 0 && winAnimator.mSurfaceControl != null) { + winAnimator.mSurfaceControl.setSecure(isSecureLocked(win)); + } win.mRelayoutCalled = true; final int oldVisibility = win.mViewVisibility; diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 3251a56d860e..3ac6bba8df3c 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -788,11 +788,7 @@ class WindowStateAnimator { int flags = SurfaceControl.HIDDEN; final WindowManager.LayoutParams attrs = w.mAttrs; - if ((attrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { - flags |= SurfaceControl.SECURE; - } - - if (mService.isScreenCaptureDisabledLocked(UserHandle.getUserId(mWin.mOwnerUid))) { + if (mService.isSecureLocked(w)) { flags |= SurfaceControl.SECURE; } @@ -1277,6 +1273,7 @@ class WindowStateAnimator { if (displayContent == null) { return; } + final DisplayInfo displayInfo = displayContent.getDisplayInfo(); // Need to recompute a new system decor rect each time. if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { @@ -1286,7 +1283,6 @@ class WindowStateAnimator { } else if (!w.isDefaultDisplay()) { // On a different display there is no system decor. Crop the window // by the screen boundaries. - final DisplayInfo displayInfo = displayContent.getDisplayInfo(); w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); w.mSystemDecorRect.intersect(-w.mCompatFrame.left, -w.mCompatFrame.top, displayInfo.logicalWidth - w.mCompatFrame.left, @@ -1308,9 +1304,11 @@ class WindowStateAnimator { applyDecorRect(w.mDecorFrame); } - // By default, the clip rect is the system decor if the transformation doesn't specify one. + final boolean fullscreen = w.isFullscreen(displayInfo.appWidth, displayInfo.appHeight); final Rect clipRect = mTmpClipRect; - clipRect.set((mHasClipRect) ? mClipRect : w.mSystemDecorRect); + // We use the clip rect as provided by the tranformation for non-fullscreen windows to + // avoid premature clipping with the system decor rect. + clipRect.set((mHasClipRect && !fullscreen) ? mClipRect : w.mSystemDecorRect); // Expand the clip rect for surface insets. final WindowManager.LayoutParams attrs = w.mAttrs; @@ -1319,6 +1317,13 @@ class WindowStateAnimator { clipRect.right += attrs.surfaceInsets.right; clipRect.bottom += attrs.surfaceInsets.bottom; + if (mHasClipRect && fullscreen) { + // We intersect the clip rect specified by the transformation with the expanded system + // decor rect to prevent artifacts from drawing during animation if the transformation + // clip rect extends outside the system decor rect. + clipRect.intersect(mClipRect); + } + // The clip rect was generated assuming (0,0) as the window origin, // so we need to translate to match the actual surface coordinates. clipRect.offset(attrs.surfaceInsets.left, attrs.surfaceInsets.top); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 5d05f3296fe0..cd2885b9fdd4 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -1277,11 +1277,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { && !hasUserSetupCompleted(userId); if (reqPolicy == DeviceAdminInfo.USES_POLICY_DEVICE_OWNER) { - if (ownsDevice || (userId == UserHandle.USER_OWNER && ownsInitialization)) { + if ((userId == UserHandle.USER_OWNER && (ownsDevice || ownsInitialization)) + || (ownsDevice && ownsProfile)) { return true; } } else if (reqPolicy == DeviceAdminInfo.USES_POLICY_PROFILE_OWNER) { - if (ownsDevice || ownsProfile || ownsInitialization) { + if ((userId == UserHandle.USER_OWNER && ownsDevice) || ownsProfile + || ownsInitialization) { return true; } } else { @@ -4140,6 +4142,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } mDeviceOwner.writeOwnerFile(); updateDeviceOwnerLocked(); + Intent intent = new Intent(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED); + + ident = Binder.clearCallingIdentity(); + try { + mContext.sendBroadcastAsUser(intent, UserHandle.OWNER); + } finally { + Binder.restoreCallingIdentity(ident); + } return true; } } @@ -4236,6 +4246,17 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { throw new IllegalArgumentException("Invalid component name " + initializer + " for device initializer"); } + boolean isInitializerSystemApp; + try { + isInitializerSystemApp = isSystemApp(AppGlobals.getPackageManager(), + initializer.getPackageName(), Binder.getCallingUserHandle().getIdentifier()); + } catch (RemoteException | IllegalArgumentException e) { + isInitializerSystemApp = false; + Slog.e(LOG_TAG, "Fail to check if device initialzer is system app.", e); + } + if (!isInitializerSystemApp) { + throw new IllegalArgumentException("Only system app can be set as device initializer."); + } synchronized (this) { enforceCanSetDeviceInitializer(who); @@ -6415,7 +6436,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final ApplicationInfo ai = AppGlobals.getPackageManager() .getApplicationInfo(packageName, 0, user.getIdentifier()); final int targetSdkVersion = ai == null ? 0 : ai.targetSdkVersion; - if (targetSdkVersion < android.os.Build.VERSION_CODES.MNC) { + if (targetSdkVersion < android.os.Build.VERSION_CODES.M) { return false; } final PackageManager packageManager = mContext.getPackageManager(); diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index cb9c6a7673b9..19d29f31cc66 100644 --- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -81,6 +81,7 @@ import android.test.suitebuilder.annotation.LargeTest; import android.util.Log; import android.util.LogPrinter; +import com.android.server.connectivity.NetworkAgentInfo; import com.android.server.connectivity.NetworkMonitor; import org.mockito.ArgumentCaptor; @@ -118,7 +119,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { private INetworkPolicyManager mPolicyService; private BroadcastInterceptingContext mServiceContext; - private ConnectivityService mService; + private WrappedConnectivityService mService; private ConnectivityManager mCm; private MockNetworkAgent mWiFiNetworkAgent; private MockNetworkAgent mCellNetworkAgent; @@ -148,6 +149,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { } private class MockNetworkAgent { + private final WrappedNetworkMonitor mWrappedNetworkMonitor; private final NetworkInfo mNetworkInfo; private final NetworkCapabilities mNetworkCapabilities; private final Thread mThread; @@ -172,6 +174,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { throw new UnsupportedOperationException("unimplemented network type"); } final ConditionVariable initComplete = new ConditionVariable(); + final ConditionVariable networkMonitorAvailable = mService.getNetworkMonitorCreatedCV(); mThread = new Thread() { public void run() { Looper.prepare(); @@ -186,6 +189,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { }; mThread.start(); waitFor(initComplete); + waitFor(networkMonitorAvailable); + mWrappedNetworkMonitor = mService.getLastCreatedWrappedNetworkMonitor(); } public void adjustScore(int change) { @@ -211,44 +216,46 @@ public class ConnectivityServiceTest extends AndroidTestCase { assertEquals(mNetworkInfo.getDetailedState(), DetailedState.IDLE); assertFalse(mNetworkCapabilities.hasCapability(NET_CAPABILITY_INTERNET)); - // To pretend network is validated, we transition it to the CONNECTED state without - // NET_CAPABILITY_INTERNET so NetworkMonitor doesn't bother trying to validate and - // just rubber stamps it as validated. Afterwards we add NET_CAPABILITY_INTERNET so - // the network can satisfy the default request. NetworkCallback callback = null; final ConditionVariable validatedCv = new ConditionVariable(); if (validated) { - // If we connect a network without INTERNET capability, it'll get reaped. - // Prevent the reaping by adding a NetworkRequest. + mWrappedNetworkMonitor.gen204ProbeResult = 204; NetworkRequest request = new NetworkRequest.Builder() .addTransportType(mNetworkCapabilities.getTransportTypes()[0]) .build(); callback = new NetworkCallback() { public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { - if (networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) { + if (network.equals(getNetwork()) && + networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) { validatedCv.open(); } } }; - mCm.requestNetwork(request, callback); - } else { - mNetworkCapabilities.addCapability(NET_CAPABILITY_INTERNET); - mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); + mCm.registerNetworkCallback(request, callback); } + addCapability(NET_CAPABILITY_INTERNET); connectWithoutInternet(); if (validated) { // Wait for network to validate. waitFor(validatedCv); - mNetworkCapabilities.addCapability(NET_CAPABILITY_INTERNET); - mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); + mWrappedNetworkMonitor.gen204ProbeResult = 500; } if (callback != null) mCm.unregisterNetworkCallback(callback); } + public void connectWithCaptivePortal() { + mWrappedNetworkMonitor.gen204ProbeResult = 200; + connect(false); + waitFor(new Criteria() { public boolean get() { + NetworkCapabilities caps = mCm.getNetworkCapabilities(getNetwork()); + return caps != null && caps.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL);} }); + mWrappedNetworkMonitor.gen204ProbeResult = 500; + } + public void disconnect() { mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null); mNetworkAgent.sendNetworkInfo(mNetworkInfo); @@ -261,14 +268,18 @@ public class ConnectivityServiceTest extends AndroidTestCase { public ConditionVariable getDisconnectedCV() { return mDisconnected; } + + public WrappedNetworkMonitor getWrappedNetworkMonitor() { + return mWrappedNetworkMonitor; + } } private static class MockNetworkFactory extends NetworkFactory { - final ConditionVariable mNetworkStartedCV = new ConditionVariable(); - final ConditionVariable mNetworkStoppedCV = new ConditionVariable(); - final ConditionVariable mNetworkRequestedCV = new ConditionVariable(); - final ConditionVariable mNetworkReleasedCV = new ConditionVariable(); - final AtomicBoolean mNetworkStarted = new AtomicBoolean(false); + private final ConditionVariable mNetworkStartedCV = new ConditionVariable(); + private final ConditionVariable mNetworkStoppedCV = new ConditionVariable(); + private final ConditionVariable mNetworkRequestedCV = new ConditionVariable(); + private final ConditionVariable mNetworkReleasedCV = new ConditionVariable(); + private final AtomicBoolean mNetworkStarted = new AtomicBoolean(false); public MockNetworkFactory(Looper looper, Context context, String logTag, NetworkCapabilities filter) { @@ -328,7 +339,26 @@ public class ConnectivityServiceTest extends AndroidTestCase { } } + // NetworkMonitor implementation allowing overriding of Internet connectivity probe result. + private class WrappedNetworkMonitor extends NetworkMonitor { + // HTTP response code fed back to NetworkMonitor for Internet connectivity probe. + public int gen204ProbeResult = 500; + + public WrappedNetworkMonitor(Context context, Handler handler, + NetworkAgentInfo networkAgentInfo, NetworkRequest defaultRequest) { + super(context, handler, networkAgentInfo, defaultRequest); + } + + @Override + protected int isCaptivePortal() { + return gen204ProbeResult; + } + } + private class WrappedConnectivityService extends ConnectivityService { + private final ConditionVariable mNetworkMonitorCreated = new ConditionVariable(); + private WrappedNetworkMonitor mLastCreatedNetworkMonitor; + public WrappedConnectivityService(Context context, INetworkManagementService netManager, INetworkStatsService statsService, INetworkPolicyManager policyManager) { super(context, netManager, statsService, policyManager); @@ -360,6 +390,25 @@ public class ConnectivityServiceTest extends AndroidTestCase { return netId; } } + + @Override + public NetworkMonitor createNetworkMonitor(Context context, Handler handler, + NetworkAgentInfo nai, NetworkRequest defaultRequest) { + final WrappedNetworkMonitor monitor = new WrappedNetworkMonitor(context, handler, nai, + defaultRequest); + mLastCreatedNetworkMonitor = monitor; + mNetworkMonitorCreated.open(); + return monitor; + } + + public WrappedNetworkMonitor getLastCreatedWrappedNetworkMonitor() { + return mLastCreatedNetworkMonitor; + } + + public ConditionVariable getNetworkMonitorCreatedCV() { + mNetworkMonitorCreated.close(); + return mNetworkMonitorCreated; + } } private interface Criteria { @@ -414,7 +463,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mService = new WrappedConnectivityService( mServiceContext, mNetManager, mStatsService, mPolicyService); mService.systemReady(); - mCm = new ConnectivityManager(mService); + mCm = new ConnectivityManager(getContext(), mService); } private int transportToLegacyType(int transport) { @@ -586,29 +635,29 @@ public class ConnectivityServiceTest extends AndroidTestCase { @LargeTest public void testUnlingeringDoesNotValidate() throws Exception { - // Test bringing up unvalidated cellular. - mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); + // Test bringing up unvalidated WiFi. + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); ConditionVariable cv = waitForConnectivityBroadcasts(1); - mCellNetworkAgent.connect(false); + mWiFiNetworkAgent.connect(false); waitFor(cv); - verifyActiveNetwork(TRANSPORT_CELLULAR); - assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( + verifyActiveNetwork(TRANSPORT_WIFI); + assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); - // Test bringing up validated WiFi. - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + // Test bringing up validated cellular. + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); cv = waitForConnectivityBroadcasts(2); - mWiFiNetworkAgent.connect(true); + mCellNetworkAgent.connect(true); waitFor(cv); - verifyActiveNetwork(TRANSPORT_WIFI); - assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( + verifyActiveNetwork(TRANSPORT_CELLULAR); + assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); - // Test WiFi disconnect. + // Test cellular disconnect. cv = waitForConnectivityBroadcasts(2); - mWiFiNetworkAgent.disconnect(); + mCellNetworkAgent.disconnect(); waitFor(cv); - verifyActiveNetwork(TRANSPORT_CELLULAR); + verifyActiveNetwork(TRANSPORT_WIFI); // Unlingering a network should not cause it to be marked as validated. - assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( + assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); } @@ -846,12 +895,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { cellCv = cellNetworkCallback.getConditionVariable(); wifiCv = wifiNetworkCallback.getConditionVariable(); - // Our method for faking successful validation generates an additional callback, so wait - // for broadcast instead. - cv = waitForConnectivityBroadcasts(1); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - waitFor(cv); waitFor(cellCv); assertEquals(CallbackState.AVAILABLE, cellNetworkCallback.getLastCallback()); assertEquals(CallbackState.NONE, wifiNetworkCallback.getLastCallback()); @@ -868,12 +913,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { cellCv = cellNetworkCallback.getConditionVariable(); wifiCv = wifiNetworkCallback.getConditionVariable(); - // Our method for faking successful validation generates an additional callback, so wait - // for broadcast instead. - cv = waitForConnectivityBroadcasts(1); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); - waitFor(cv); waitFor(wifiCv); assertEquals(CallbackState.AVAILABLE, wifiNetworkCallback.getLastCallback()); waitFor(cellCv); @@ -1075,6 +1116,63 @@ public class ConnectivityServiceTest extends AndroidTestCase { verifyActiveNetwork(TRANSPORT_CELLULAR); } + @LargeTest + public void testCaptivePortal() { + final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); + final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); + mCm.registerNetworkCallback(captivePortalRequest, captivePortalCallback); + + final TestNetworkCallback validatedCallback = new TestNetworkCallback(); + final NetworkRequest validatedRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_VALIDATED).build(); + mCm.registerNetworkCallback(validatedRequest, validatedCallback); + ConditionVariable validatedCv = validatedCallback.getConditionVariable(); + + // Bring up a network with a captive portal. + // Expect onAvailable callback of listen for NET_CAPABILITY_CAPTIVE_PORTAL. + ConditionVariable cv = captivePortalCallback.getConditionVariable(); + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connectWithCaptivePortal(); + waitFor(cv); + assertEquals(CallbackState.AVAILABLE, captivePortalCallback.getLastCallback()); + + // Take down network. + // Expect onLost callback. + cv = captivePortalCallback.getConditionVariable(); + mWiFiNetworkAgent.disconnect(); + waitFor(cv); + assertEquals(CallbackState.LOST, captivePortalCallback.getLastCallback()); + + // Bring up a network with a captive portal. + // Expect onAvailable callback of listen for NET_CAPABILITY_CAPTIVE_PORTAL. + cv = captivePortalCallback.getConditionVariable(); + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connectWithCaptivePortal(); + waitFor(cv); + assertEquals(CallbackState.AVAILABLE, captivePortalCallback.getLastCallback()); + + // Make captive portal disappear then revalidate. + // Expect onLost callback because network no longer provides NET_CAPABILITY_CAPTIVE_PORTAL. + cv = captivePortalCallback.getConditionVariable(); + mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204; + mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); + waitFor(cv); + assertEquals(CallbackState.LOST, captivePortalCallback.getLastCallback()); + + // Expect NET_CAPABILITY_VALIDATED onAvailable callback. + waitFor(validatedCv); + assertEquals(CallbackState.AVAILABLE, validatedCallback.getLastCallback()); + + // Break network connectivity. + // Expect NET_CAPABILITY_VALIDATED onLost callback. + validatedCv = validatedCallback.getConditionVariable(); + mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 500; + mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), false); + waitFor(validatedCv); + assertEquals(CallbackState.LOST, validatedCallback.getLastCallback()); + } + // @Override // public void tearDown() throws Exception { // super.tearDown(); diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 1787b9175b46..09e15a885bea 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -49,10 +49,8 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.server.FgThread; import java.io.File; -import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.PrintWriter; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -316,6 +314,9 @@ public class UsbDeviceManager { // Restore default functions. mCurrentFunctions = SystemProperties.get(USB_CONFIG_PROPERTY, UsbManager.USB_FUNCTION_NONE); + if (UsbManager.USB_FUNCTION_NONE.equals(mCurrentFunctions)) { + mCurrentFunctions = UsbManager.USB_FUNCTION_MTP; + } mCurrentFunctionsApplied = mCurrentFunctions.equals( SystemProperties.get(USB_STATE_PROPERTY)); mAdbEnabled = UsbManager.containsFunction(getDefaultFunctions(), @@ -400,6 +401,14 @@ public class UsbDeviceManager { return waitForState(config); } + private void setUsbDataUnlocked(boolean enable) { + if (DEBUG) Slog.d(TAG, "setUsbDataUnlocked: " + enable); + mUsbDataUnlocked = enable; + updateUsbNotification(); + updateUsbStateBroadcast(); + setEnabledFunctions(mCurrentFunctions, true); + } + private void setAdbEnabled(boolean enable) { if (DEBUG) Slog.d(TAG, "setAdbEnabled: " + enable); if (enable != mAdbEnabled) { @@ -471,7 +480,6 @@ public class UsbDeviceManager { } functions = applyAdbFunction(functions); functions = applyOemOverrideFunction(functions); - functions = applyUserRestrictions(functions); if (!mCurrentFunctions.equals(functions) || !mCurrentFunctionsApplied || forceRestart) { @@ -502,13 +510,9 @@ public class UsbDeviceManager { return functions; } - private String applyUserRestrictions(String functions) { + private boolean isUsbTransferAllowed() { UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - if (userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { - functions = UsbManager.removeFunction(functions, UsbManager.USB_FUNCTION_MTP); - functions = UsbManager.removeFunction(functions, UsbManager.USB_FUNCTION_PTP); - } - return functions; + return !userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER); } private void updateCurrentAccessory() { @@ -555,7 +559,7 @@ public class UsbDeviceManager { | Intent.FLAG_RECEIVER_FOREGROUND); intent.putExtra(UsbManager.USB_CONNECTED, mConnected); intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured); - intent.putExtra(UsbManager.USB_DATA_UNLOCKED, mUsbDataUnlocked); + intent.putExtra(UsbManager.USB_DATA_UNLOCKED, isUsbTransferAllowed() && mUsbDataUnlocked); if (mCurrentFunctions != null) { String[] functions = mCurrentFunctions.split(","); @@ -659,10 +663,7 @@ public class UsbDeviceManager { setEnabledFunctions(mCurrentFunctions, false); break; case MSG_SET_USB_DATA_UNLOCKED: - mUsbDataUnlocked = (msg.arg1 == 1); - updateUsbNotification(); - updateUsbStateBroadcast(); - setEnabledFunctions(mCurrentFunctions, true); + setUsbDataUnlocked(msg.arg1 == 1); break; case MSG_SYSTEM_READY: updateUsbNotification(); @@ -807,8 +808,12 @@ public class UsbDeviceManager { } private String getDefaultFunctions() { - return SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, - UsbManager.USB_FUNCTION_ADB); + String func = SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, + UsbManager.USB_FUNCTION_NONE); + if (UsbManager.USB_FUNCTION_NONE.equals(func)) { + func = UsbManager.USB_FUNCTION_MTP; + } + return func; } public void dump(IndentingPrintWriter pw) { @@ -817,6 +822,7 @@ public class UsbDeviceManager { pw.println(" mCurrentFunctionsApplied: " + mCurrentFunctionsApplied); pw.println(" mConnected: " + mConnected); pw.println(" mConfigured: " + mConfigured); + pw.println(" mUsbDataUnlocked: " + mUsbDataUnlocked); pw.println(" mCurrentAccessory: " + mCurrentAccessory); try { pw.println(" Kernel state: " @@ -864,11 +870,6 @@ public class UsbDeviceManager { mHandler.sendMessage(MSG_SET_USB_DATA_UNLOCKED, unlocked); } - public boolean isUsbDataUnlocked() { - if (DEBUG) Slog.d(TAG, "isUsbDataUnlocked() -> " + mHandler.mUsbDataUnlocked); - return mHandler.mUsbDataUnlocked; - } - private void readOemUsbOverrideConfig() { String[] configList = mContext.getResources().getStringArray( com.android.internal.R.array.config_oemUsbModeOverride); diff --git a/services/usb/java/com/android/server/usb/UsbMidiDevice.java b/services/usb/java/com/android/server/usb/UsbMidiDevice.java index 97bf5059bf9b..38ede87d2b85 100644 --- a/services/usb/java/com/android/server/usb/UsbMidiDevice.java +++ b/services/usb/java/com/android/server/usb/UsbMidiDevice.java @@ -128,7 +128,7 @@ public final class UsbMidiDevice implements Closeable { mReceiver = receiver; } } - + public static UsbMidiDevice create(Context context, Bundle properties, int card, int device) { // FIXME - support devices with different number of input and output ports int subDeviceCount = nativeGetSubdeviceCount(card, device); @@ -203,6 +203,8 @@ public final class UsbMidiDevice implements Closeable { byte[] buffer = new byte[BUFFER_SIZE]; try { while (true) { + // Record time of event immediately after waking. + long timestamp = System.nanoTime(); synchronized (mLock) { if (!mIsOpen) break; @@ -215,14 +217,14 @@ public final class UsbMidiDevice implements Closeable { } else if ((pfd.revents & OsConstants.POLLIN) != 0) { // clear readable flag pfd.revents = 0; - + if (index == mInputStreams.length - 1) { // last file descriptor is used only for unblocking Os.poll() break; } int count = mInputStreams[index].read(buffer); - outputReceivers[index].send(buffer, 0, count); + outputReceivers[index].send(buffer, 0, count, timestamp); } } } diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java index f93a2ef1adce..edd9201fe822 100644 --- a/services/usb/java/com/android/server/usb/UsbService.java +++ b/services/usb/java/com/android/server/usb/UsbService.java @@ -322,23 +322,10 @@ public class UsbService extends IUsbManager.Stub { @Override public void setUsbDataUnlocked(boolean unlocked) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); - // If attempt to change USB function while file transfer is restricted, ensure that - // usb data is always locked, and return. - UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - if (userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { - if (mDeviceManager != null) mDeviceManager.setUsbDataUnlocked(false); - return; - } mDeviceManager.setUsbDataUnlocked(unlocked); } @Override - public boolean isUsbDataUnlocked() { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); - return mDeviceManager.isUsbDataUnlocked(); - } - - @Override public void allowUsbDebugging(boolean alwaysAllow, String publicKey) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); mDeviceManager.allowUsbDebugging(alwaysAllow, publicKey); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index a4facc1cb4f9..28520be8b7dc 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -72,7 +72,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne public void onReceive(Context context, Intent intent) { if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { String reason = intent.getStringExtra("reason"); - if (!CLOSE_REASON_VOICE_INTERACTION.equals(reason)) { + if (!CLOSE_REASON_VOICE_INTERACTION.equals(reason) && !"dream".equals(reason)) { synchronized (mLock) { if (mActiveSession != null && mActiveSession.mSession != null) { try { diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java index 47a9fcd90ed6..04d6d98fe2b2 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java @@ -214,7 +214,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection { disabledContext |= getUserDisabledShowContextLocked(); boolean structureEnabled = isAssistDataAllowed && (disabledContext&VoiceInteractionSession.SHOW_WITH_ASSIST) == 0; - boolean screenshotEnabled = isAssistDataAllowed + boolean screenshotEnabled = isAssistDataAllowed && structureEnabled && (disabledContext&VoiceInteractionSession.SHOW_WITH_SCREENSHOT) == 0; mShowArgs = args; mShowFlags = flags; diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index bf78712295d2..d66395263afd 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -252,6 +252,29 @@ public abstract class Connection extends Conferenceable { // Next CAPABILITY value: 0x00400000 //********************************************************************************************** + /** + * Connection extra key used to store the last forwarded number associated with the current + * connection. Used to communicate to the user interface that the connection was forwarded via + * the specified number. + */ + public static final String EXTRA_LAST_FORWARDED_NUMBER = + "android.telecom.extra.LAST_FORWARDED_NUMBER"; + + /** + * Connection extra key used to store a child number associated with the current connection. + * Used to communicate to the user interface that the connection was received via + * a child address (i.e. phone number) associated with the {@link PhoneAccount}'s primary + * address. + */ + public static final String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; + + /** + * Connection extra key used to store the subject for an incoming call. The user interface can + * query this extra and display its contents for incoming calls. Will only be used if the + * {@link PhoneAccount} supports the capability {@link PhoneAccount#CAPABILITY_CALL_SUBJECT}. + */ + public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; + // Flag controlling whether PII is emitted into the logs private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG); diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index df6fa2e1b391..cdb0bf257baa 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -112,6 +112,15 @@ public final class PhoneAccount implements Parcelable { public static final int CAPABILITY_MULTI_USER = 0x20; /** + * Flag indicating that this {@code PhoneAccount} supports a subject for Calls. This means a + * caller is able to specify a short subject line for an outgoing call. A capable receiving + * device displays the call subject on the incoming call screen. + * <p> + * See {@link #getCapabilities} + */ + public static final int CAPABILITY_CALL_SUBJECT = 0x40; + + /** * URI scheme for telephone number URIs. */ public static final String SCHEME_TEL = "tel"; diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index a30e1c0dada7..067e7342cc28 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -177,6 +177,13 @@ public class TelecomManager { "android.telecom.extra.PHONE_ACCOUNT_HANDLE"; /** + * Optional extra for {@link android.content.Intent#ACTION_CALL} containing a string call + * subject which will be associated with an outgoing call. Should only be specified if the + * {@link PhoneAccount} supports the capability {@link PhoneAccount#CAPABILITY_CALL_SUBJECT}. + */ + public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; + + /** * The extra used by a {@link ConnectionService} to provide the handle of the caller that * has initiated a new incoming call. */ @@ -493,6 +500,26 @@ public class TelecomManager { } /** + * Returns the current SIM call manager for the specified user. Apps must be prepared for this + * method to return {@code null}, indicating that there currently exists no user-chosen default + * {@code PhoneAccount}. + * + * @return The phone account handle of the current sim call manager. + * + * @hide + */ + public PhoneAccountHandle getSimCallManager(int userId) { + try { + if (isServiceConnected()) { + return getTelecomService().getSimCallManagerForUser(userId); + } + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelecomService#getSimCallManagerForUser"); + } + return null; + } + + /** * Returns the current connection manager. Apps must be prepared for this method to return * {@code null}, indicating that there currently exists no user-chosen default * {@code PhoneAccount}. diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl index fb0f6dafee71..2e07759f09f1 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -93,6 +93,11 @@ interface ITelecomService { PhoneAccountHandle getSimCallManager(); /** + * @see TelecomServiceImpl#getSimCallManagerForUser + */ + PhoneAccountHandle getSimCallManagerForUser(int userId); + + /** * @see TelecomServiceImpl#registerPhoneAccount */ void registerPhoneAccount(in PhoneAccount metadata); diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl index 21c94c2608ad..70a8653135c8 100644 --- a/telephony/java/com/android/internal/telephony/ISms.aidl +++ b/telephony/java/com/android/internal/telephony/ISms.aidl @@ -149,10 +149,14 @@ interface ISms { * broadcast when the message is delivered to the recipient. The * raw pdu of the status report is in the extended data ("pdu"). * @param subId the subId on which the SMS has to be sent. + * @param persistMessageForNonDefaultSmsApp whether the sent message should + * be automatically persisted in the SMS db. It only affects messages sent + * by a non-default SMS app. Currently only the carrier app can set this + * parameter to false to skip auto message persistence. */ void sendTextForSubscriber(in int subId, String callingPkg, in String destAddr, in String scAddr, in String text, in PendingIntent sentIntent, - in PendingIntent deliveryIntent); + in PendingIntent deliveryIntent, in boolean persistMessageForNonDefaultSmsApp); /** * Send an SMS. Internal use only. @@ -219,11 +223,15 @@ interface ISms { * to the recipient. The raw pdu of the status report is in the * extended data ("pdu"). * @param subId the subId on which the SMS has to be sent. + * @param persistMessageForNonDefaultSmsApp whether the sent message should + * be automatically persisted in the SMS db. It only affects messages sent + * by a non-default SMS app. Currently only the carrier app can set this + * parameter to false to skip auto message persistence. */ void sendMultipartTextForSubscriber(in int subId, String callingPkg, in String destinationAddress, in String scAddress, in List<String> parts, in List<PendingIntent> sentIntents, - in List<PendingIntent> deliveryIntents); + in List<PendingIntent> deliveryIntents, in boolean persistMessageForNonDefaultSmsApp); /** * Enable reception of cell broadcast (SMS-CB) messages with the given diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 3df7bbc91e9b..1ff621a6cac9 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -181,6 +181,12 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public String getPermissionControllerPackageName() { + throw new UnsupportedOperationException(); + } + @Override public boolean addPermission(PermissionInfo info) { throw new UnsupportedOperationException(); diff --git a/tests/VoiceInteraction/res/layout/main.xml b/tests/VoiceInteraction/res/layout/main.xml index 0f968eb65996..a83d02c2c729 100644 --- a/tests/VoiceInteraction/res/layout/main.xml +++ b/tests/VoiceInteraction/res/layout/main.xml @@ -26,6 +26,12 @@ android:text="@string/start" /> + <CheckBox android:id="@+id/secure" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/secure" + /> + <com.android.test.voiceinteraction.AsyncStructure android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/tests/VoiceInteraction/res/layout/test_interaction.xml b/tests/VoiceInteraction/res/layout/test_interaction.xml index d1a7ad532abd..277117e3e157 100644 --- a/tests/VoiceInteraction/res/layout/test_interaction.xml +++ b/tests/VoiceInteraction/res/layout/test_interaction.xml @@ -39,6 +39,19 @@ android:layout_marginTop="16dp" android:orientation="horizontal"> + <Button android:id="@+id/airplane" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/launchAirplane" + /> + + </LinearLayout> + + <LinearLayout android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:orientation="horizontal"> + <Button android:id="@+id/complete" android:layout_width="wrap_content" android:layout_height="wrap_content" diff --git a/tests/VoiceInteraction/res/values/strings.xml b/tests/VoiceInteraction/res/values/strings.xml index ab39f99478b2..c665c23faa63 100644 --- a/tests/VoiceInteraction/res/values/strings.xml +++ b/tests/VoiceInteraction/res/values/strings.xml @@ -17,9 +17,11 @@ <resources> <string name="start">Start</string> + <string name="secure">Secure</string> <string name="tree">Tree</string> <string name="text">Text</string> <string name="asyncStructure">(Async structure goes here)</string> + <string name="launchAirplane">Launch airplane mode</string> <string name="confirm">Confirm</string> <string name="abort">Abort</string> <string name="complete">Complete</string> diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java index c0a67c189881..6e3694b345e9 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java @@ -72,6 +72,7 @@ public class MainInteractionSession extends VoiceInteractionSession VoiceInteractor.PickOptionRequest.Option[] mPendingOptions; CharSequence mPendingPrompt; Request mPendingRequest; + int mCurrentTask = -1; MainInteractionSession(Context context) { super(context); @@ -314,6 +315,27 @@ public class MainInteractionSession extends VoiceInteractionSession } @Override + public void onTaskStarted(Intent intent, int taskId) { + super.onTaskStarted(intent, taskId); + mCurrentTask = taskId; + } + + @Override + public void onTaskFinished(Intent intent, int taskId) { + super.onTaskFinished(intent, taskId); + if (mCurrentTask == taskId) { + mCurrentTask = -1; + } + } + + @Override + public void onLockscreenShown() { + if (mCurrentTask < 0) { + hide(); + } + } + + @Override public boolean[] onGetSupportedCommands(String[] commands) { boolean[] res = new boolean[commands.length]; for (int i=0; i<commands.length; i++) { diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java index e10d89f0c002..ada0e21e059a 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java @@ -21,6 +21,7 @@ import android.app.VoiceInteractor; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; +import android.provider.Settings; import android.service.voice.VoiceInteractionService; import android.util.Log; import android.view.View; @@ -39,6 +40,7 @@ public class TestInteractionActivity extends Activity implements View.OnClickLis VoiceInteractor mInteractor; VoiceInteractor.Request mCurrentRequest = null; TextView mLog; + Button mAirplaneButton; Button mAbortButton; Button mCompleteButton; Button mCommandButton; @@ -65,6 +67,8 @@ public class TestInteractionActivity extends Activity implements View.OnClickLis setContentView(R.layout.test_interaction); mLog = (TextView)findViewById(R.id.log); + mAirplaneButton = (Button)findViewById(R.id.airplane); + mAirplaneButton.setOnClickListener(this); mAbortButton = (Button)findViewById(R.id.abort); mAbortButton.setOnClickListener(this); mCompleteButton = (Button)findViewById(R.id.complete); @@ -122,7 +126,12 @@ public class TestInteractionActivity extends Activity implements View.OnClickLis @Override public void onClick(View v) { - if (v == mAbortButton) { + if (v == mAirplaneButton) { + Intent intent = new Intent(Settings.ACTION_VOICE_CONTROL_AIRPLANE_MODE); + intent.addCategory(Intent.CATEGORY_VOICE); + intent.putExtra(Settings.EXTRA_AIRPLANE_MODE_ENABLED, true); + startActivity(intent); + } else if (v == mAbortButton) { VoiceInteractor.AbortVoiceRequest req = new TestAbortVoice(); mInteractor.submitRequest(req, REQUEST_ABORT); } else if (v == mCompleteButton) { diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/VoiceInteractionMain.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/VoiceInteractionMain.java index ee75f2850304..87fa91a86a6b 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/VoiceInteractionMain.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/VoiceInteractionMain.java @@ -21,6 +21,8 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; +import android.view.WindowManager; +import android.widget.CheckBox; public class VoiceInteractionMain extends Activity { @@ -30,6 +32,7 @@ public class VoiceInteractionMain extends Activity { setContentView(R.layout.main); findViewById(R.id.start).setOnClickListener(mStartListener); + findViewById(R.id.secure).setOnClickListener(mSecureListener); } @Override @@ -52,4 +55,14 @@ public class VoiceInteractionMain extends Activity { showAssist(null); } }; + + View.OnClickListener mSecureListener = new View.OnClickListener() { + public void onClick(View v) { + if (((CheckBox)v).isChecked()) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); + } else { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); + } + } + }; } diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index e64fdf7f54b9..81642fa4392c 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -4466,6 +4466,37 @@ static int getMinSdkVersion(const Bundle* bundle) { return 0; } +static bool shouldGenerateVersionedResource(const sp<ResourceTable::ConfigList>& configList, + const ConfigDescription& sourceConfig, + const int sdkVersionToGenerate) { + assert(sdkVersionToGenerate > sourceConfig.sdkVersion); + const DefaultKeyedVector<ConfigDescription, sp<ResourceTable::Entry>>& entries + = configList->getEntries(); + ssize_t idx = entries.indexOfKey(sourceConfig); + + // The source config came from this list, so it should be here. + assert(idx >= 0); + + idx += 1; + if (static_cast<size_t>(idx) >= entries.size()) { + // This is the last configuration, so we should generate a versioned resource. + return true; + } + + const ConfigDescription& nextConfig = entries.keyAt(idx); + + // Build a configuration that is the same as the source config, + // but with the SDK level of the next config. If they are the same, + // then they only differ in SDK level. If the next configs SDK level is + // higher than the one we want to generate, we must generate it. + ConfigDescription tempConfig(sourceConfig); + tempConfig.sdkVersion = nextConfig.sdkVersion; + if (nextConfig == tempConfig) { + return sdkVersionToGenerate < nextConfig.sdkVersion; + } + return false; +} + /** * Modifies the entries in the resource table to account for compatibility * issues with older versions of Android. @@ -4574,6 +4605,11 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle) { for (size_t i = 0; i < sdkCount; i++) { const int sdkLevel = attributesToRemove.keyAt(i); + if (!shouldGenerateVersionedResource(c, config, sdkLevel)) { + // There is a style that will override this generated one. + continue; + } + // Duplicate the entry under the same configuration // but with sdkVersion == sdkLevel. ConfigDescription newConfig(config); @@ -4610,13 +4646,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle) { const size_t entriesToAddCount = entriesToAdd.size(); for (size_t i = 0; i < entriesToAddCount; i++) { - if (entries.indexOfKey(entriesToAdd[i].key) >= 0) { - // An entry already exists for this config. - // That means that any attributes that were - // defined in L in the original bag will be overriden - // anyways on L devices, so we do nothing. - continue; - } + assert(entries.indexOfKey(entriesToAdd[i].key) < 0); if (bundle->getVerbose()) { entriesToAdd[i].value->getPos() @@ -4662,8 +4692,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle, } sp<XMLNode> newRoot = NULL; - ConfigDescription newConfig(target->getGroupEntry().toParams()); - newConfig.sdkVersion = SDK_LOLLIPOP_MR1; + int sdkVersionToGenerate = SDK_LOLLIPOP_MR1; Vector<sp<XMLNode> > nodesToVisit; nodesToVisit.push(root); @@ -4689,9 +4718,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle, // Find the smallest sdk version that we need to synthesize for // and do that one. Subsequent versions will be processed on // the next pass. - if (sdkLevel < newConfig.sdkVersion) { - newConfig.sdkVersion = sdkLevel; - } + sdkVersionToGenerate = std::min(sdkLevel, sdkVersionToGenerate); if (bundle->getVerbose()) { SourcePos(node->getFilename(), node->getStartLineNumber()).printf( @@ -4721,8 +4748,10 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle, // Look to see if we already have an overriding v21 configuration. sp<ConfigList> cl = getConfigList(String16(mAssets->getPackage()), String16(target->getResourceType()), resourceName); - if (cl->getEntries().indexOfKey(newConfig) < 0) { + if (shouldGenerateVersionedResource(cl, config, sdkVersionToGenerate)) { // We don't have an overriding entry for v21, so we must duplicate this one. + ConfigDescription newConfig(config); + newConfig.sdkVersion = sdkVersionToGenerate; sp<AaptFile> newFile = new AaptFile(target->getSourceFile(), AaptGroupEntry(newConfig), target->getResourceType()); String8 resPath = String8::format("res/%s/%s", @@ -4760,7 +4789,8 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle, return NO_ERROR; } -void ResourceTable::getDensityVaryingResources(KeyedVector<Symbol, Vector<SymbolDefinition> >& resources) { +void ResourceTable::getDensityVaryingResources( + KeyedVector<Symbol, Vector<SymbolDefinition> >& resources) { const ConfigDescription nullConfig; const size_t packageCount = mOrderedPackages.size(); @@ -4771,19 +4801,23 @@ void ResourceTable::getDensityVaryingResources(KeyedVector<Symbol, Vector<Symbol const Vector<sp<ConfigList> >& configs = types[t]->getOrderedConfigs(); const size_t configCount = configs.size(); for (size_t c = 0; c < configCount; c++) { - const DefaultKeyedVector<ConfigDescription, sp<Entry> >& configEntries = configs[c]->getEntries(); + const DefaultKeyedVector<ConfigDescription, sp<Entry> >& configEntries + = configs[c]->getEntries(); const size_t configEntryCount = configEntries.size(); for (size_t ce = 0; ce < configEntryCount; ce++) { const ConfigDescription& config = configEntries.keyAt(ce); if (AaptConfig::isDensityOnly(config)) { // This configuration only varies with regards to density. - const Symbol symbol(mOrderedPackages[p]->getName(), + const Symbol symbol( + mOrderedPackages[p]->getName(), types[t]->getName(), configs[c]->getName(), - getResId(mOrderedPackages[p], types[t], configs[c]->getEntryIndex())); + getResId(mOrderedPackages[p], types[t], + configs[c]->getEntryIndex())); const sp<Entry>& entry = configEntries.valueAt(ce); - AaptUtil::appendValue(resources, symbol, SymbolDefinition(symbol, config, entry->getPos())); + AaptUtil::appendValue(resources, symbol, + SymbolDefinition(symbol, config, entry->getPos())); } } } diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java index 1105c7b0fb19..a503e50407ed 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java @@ -673,7 +673,7 @@ public final class Matrix_Delegate { return; } - System.arraycopy(d.mValues, 0, d.mValues, 0, MATRIX_SIZE); + System.arraycopy(d.mValues, 0, values, 0, MATRIX_SIZE); } @LayoutlibDelegate diff --git a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java index 776398fbb094..3c9a062719e2 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java @@ -21,6 +21,7 @@ import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; +import android.annotation.NonNull; import android.graphics.Path.Direction; import android.graphics.Path.FillType; @@ -30,6 +31,7 @@ import java.awt.geom.Arc2D; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; import java.awt.geom.GeneralPath; +import java.awt.geom.Path2D; import java.awt.geom.PathIterator; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -56,7 +58,7 @@ public final class Path_Delegate { // ---- delegate data ---- private FillType mFillType = FillType.WINDING; - private GeneralPath mPath = new GeneralPath(); + private Path2D mPath = new Path2D.Double(); private float mLastX = 0; private float mLastY = 0; @@ -486,8 +488,54 @@ public final class Path_Delegate { @LayoutlibDelegate /*package*/ static float[] native_approximate(long nPath, float error) { - Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, "Path.approximate() not supported", null); - return new float[0]; + Bridge.getLog().warning(LayoutLog.TAG_UNSUPPORTED, "Path.approximate() not fully supported", + null); + Path_Delegate pathDelegate = sManager.getDelegate(nPath); + if (pathDelegate == null) { + return null; + } + PathIterator pathIterator = pathDelegate.mPath.getPathIterator(null); + float[] tmp = new float[6]; + float[] coords = new float[6]; + boolean isFirstPoint = true; + while (!pathIterator.isDone()) { + int type = pathIterator.currentSegment(tmp); + switch (type) { + case PathIterator.SEG_MOVETO: + case PathIterator.SEG_LINETO: + store(tmp, coords, 1, isFirstPoint); + break; + case PathIterator.SEG_QUADTO: + store(tmp, coords, 2, isFirstPoint); + break; + case PathIterator.SEG_CUBICTO: + store(tmp, coords, 3, isFirstPoint); + break; + case PathIterator.SEG_CLOSE: + // No points returned. + } + isFirstPoint = false; + pathIterator.next(); + } + if (isFirstPoint) { + // No points found + return new float[0]; + } else { + return coords; + } + } + + private static void store(float[] src, float[] dst, int count, boolean isFirst) { + if (isFirst) { + dst[0] = 0; // fraction + dst[1] = src[0]; // abscissa + dst[2] = src[1]; // ordinate + } + if (count > 1 || !isFirst) { + dst[3] = 1; + dst[4] = src[2 * count - 2]; + dst[5] = src[2 * count - 1]; + } } // ---- Private helper methods ---- @@ -522,6 +570,7 @@ public final class Path_Delegate { throw new IllegalArgumentException(); } + @NonNull private static Direction getDirection(int direction) { for (Direction d : Direction.values()) { if (direction == d.nativeInt) { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java index 4a9f7187b29c..44a9aad55daa 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java @@ -30,6 +30,10 @@ import android.widget.TextView; */ public class MockView extends TextView { + public MockView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + public MockView(Context context, AttributeSet attrs, int defStyle) { this(context, attrs, defStyle, 0); } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index 90ef28cd0fc3..f04654eded0f 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -172,6 +172,11 @@ public class BridgePackageManager extends PackageManager { } @Override + public String getPermissionControllerPackageName() { + return null; + } + + @Override public boolean addPermission(PermissionInfo info) { return false; } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/DesignLibUtil.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/DesignLibUtil.java index 0426907b3a4c..aa873a6476ae 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/DesignLibUtil.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/DesignLibUtil.java @@ -18,14 +18,12 @@ package com.android.layoutlib.bridge.android.support; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; +import com.android.layoutlib.bridge.util.ReflectionUtils.ReflectionException; import android.annotation.NonNull; import android.annotation.Nullable; import android.view.View; -import java.lang.reflect.Method; - -import static com.android.layoutlib.bridge.util.ReflectionUtils.ReflectionException; import static com.android.layoutlib.bridge.util.ReflectionUtils.getMethod; import static com.android.layoutlib.bridge.util.ReflectionUtils.invoke; @@ -53,10 +51,7 @@ public class DesignLibUtil { return; } try { - Method setTitle = getMethod(view.getClass(), "setTitle", CharSequence.class); - if (setTitle != null) { - invoke(setTitle, view, title); - } + invoke(getMethod(view.getClass(), "setTitle", CharSequence.class), view, title); } catch (ReflectionException e) { Bridge.getLog().warning(LayoutLog.TAG_INFO, "Error occurred while trying to set title.", e); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java index d14c80b90890..d432120ccb6f 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java @@ -21,16 +21,13 @@ import com.android.ide.common.rendering.api.LayoutlibCallback; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.android.BridgeContext; import com.android.layoutlib.bridge.android.RenderParamsFlags; -import com.android.layoutlib.bridge.util.ReflectionUtils; +import com.android.layoutlib.bridge.util.ReflectionUtils.ReflectionException; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.view.View; -import java.lang.reflect.Method; - -import static com.android.layoutlib.bridge.util.ReflectionUtils.ReflectionException; import static com.android.layoutlib.bridge.util.ReflectionUtils.getCause; import static com.android.layoutlib.bridge.util.ReflectionUtils.getMethod; import static com.android.layoutlib.bridge.util.ReflectionUtils.invoke; @@ -98,8 +95,7 @@ public class RecyclerViewUtil { @Nullable private static Object getLayoutManager(View recyclerView) throws ReflectionException { - Method getLayoutManager = getMethod(recyclerView.getClass(), "getLayoutManager"); - return getLayoutManager != null ? invoke(getLayoutManager, recyclerView) : null; + return invoke(getMethod(recyclerView.getClass(), "getLayoutManager"), recyclerView); } @Nullable @@ -127,10 +123,7 @@ public class RecyclerViewUtil { private static void setProperty(@NonNull Object object, @NonNull Class<?> propertyClass, @Nullable Object propertyValue, @NonNull String propertySetter) throws ReflectionException { - Method setter = getMethod(object.getClass(), propertySetter, propertyClass); - if (setter != null) { - invoke(setter, object, propertyValue); - } + invoke(getMethod(object.getClass(), propertySetter, propertyClass), object, propertyValue); } /** diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/Config.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/Config.java index dc89d0c6546a..09937bc5ac38 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/Config.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/Config.java @@ -74,8 +74,8 @@ public class Config { } public static String getTime(int platformVersion) { - if (isGreaterOrEqual(platformVersion, LOLLIPOP_MR1)) { - return "5:10"; + if (isGreaterOrEqual(platformVersion, M)) { + return "6:00"; } if (platformVersion < GINGERBREAD) { return "2:20"; @@ -95,6 +95,9 @@ public class Config { if (platformVersion < LOLLIPOP_MR1) { return "5:00"; } + if (platformVersion < M) { + return "5:10"; + } // Should never happen. return "4:04"; } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java index 145a03a27274..b76ec1707fcc 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java @@ -16,6 +16,7 @@ package com.android.layoutlib.bridge.bars; +import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.StyleResourceValue; @@ -258,8 +259,21 @@ abstract class CustomBar extends LinearLayout { ResourceValue resource = renderResources.findItemInTheme(attr, true); // Form @color/bar to the #AARRGGBB resource = renderResources.resolveResValue(resource); - if (resource != null && ResourceType.COLOR.equals(resource.getResourceType())) { - return ResourceHelper.getColor(resource.getValue()); + if (resource != null) { + ResourceType type = resource.getResourceType(); + if (type == null || type == ResourceType.COLOR) { + // if no type is specified, the value may have been specified directly in the style + // file, rather than referencing a color resource value. + try { + return ResourceHelper.getColor(resource.getValue()); + } catch (NumberFormatException e) { + // Conversion failed. + Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT, + "Theme attribute @android:" + attr + + " does not reference a color, instead is '" + + resource.getValue() + "'.", resource); + } + } } return 0; } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java index 89d8319fc67d..c72c97930b26 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java @@ -45,6 +45,7 @@ import android.widget.RelativeLayout; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.widget.LinearLayout.VERTICAL; +import static com.android.layoutlib.bridge.impl.ResourceHelper.getBooleanThemeValue; /** * The Layout used to create the system decor. @@ -82,7 +83,7 @@ class Layout extends RelativeLayout { // Theme attributes used for configuring appearance of the system decor. private static final String ATTR_WINDOW_FLOATING = "windowIsFloating"; private static final String ATTR_WINDOW_BACKGROUND = "windowBackground"; - private static final String ATTR_WINDOW_FULL_SCREEN = "windowFullScreen"; + private static final String ATTR_WINDOW_FULL_SCREEN = "windowFullscreen"; private static final String ATTR_NAV_BAR_HEIGHT = "navigation_bar_height"; private static final String ATTR_NAV_BAR_WIDTH = "navigation_bar_width"; private static final String ATTR_STATUS_BAR_HEIGHT = "status_bar_height"; @@ -165,13 +166,13 @@ class Layout extends RelativeLayout { FrameLayout contentRoot = new FrameLayout(getContext()); LayoutParams params = createLayoutParams(MATCH_PARENT, MATCH_PARENT); int rule = mBuilder.isNavBarVertical() ? START_OF : ABOVE; - if (mBuilder.solidBars()) { + if (mBuilder.hasNavBar() && mBuilder.solidBars()) { params.addRule(rule, getId(ID_NAV_BAR)); } int below = -1; if (mBuilder.mActionBarSize <= 0 && mBuilder.mTitleBarSize > 0) { below = getId(ID_TITLE_BAR); - } else if (mBuilder.solidBars()) { + } else if (mBuilder.hasStatusBar() && mBuilder.solidBars()) { below = getId(ID_STATUS_BAR); } if (below != -1) { @@ -238,10 +239,10 @@ class Layout extends RelativeLayout { } LayoutParams layoutParams = createLayoutParams(MATCH_PARENT, MATCH_PARENT); int rule = mBuilder.isNavBarVertical() ? START_OF : ABOVE; - if (mBuilder.solidBars()) { + if (mBuilder.hasNavBar() && mBuilder.solidBars()) { layoutParams.addRule(rule, getId(ID_NAV_BAR)); } - if (mBuilder.solidBars()) { + if (mBuilder.hasStatusBar() && mBuilder.solidBars()) { layoutParams.addRule(BELOW, getId(ID_STATUS_BAR)); } actionBar.getRootView().setLayoutParams(layoutParams); @@ -254,7 +255,7 @@ class Layout extends RelativeLayout { int simulatedPlatformVersion) { TitleBar titleBar = new TitleBar(context, title, simulatedPlatformVersion); LayoutParams params = createLayoutParams(MATCH_PARENT, mBuilder.mTitleBarSize); - if (mBuilder.solidBars()) { + if (mBuilder.hasStatusBar() && mBuilder.solidBars()) { params.addRule(BELOW, getId(ID_STATUS_BAR)); } if (mBuilder.isNavBarVertical() && mBuilder.solidBars()) { @@ -325,16 +326,15 @@ class Layout extends RelativeLayout { mParams = params; mContext = context; mResources = mParams.getResources(); - mWindowIsFloating = ResourceHelper.getBooleanThemeValue(mResources, ATTR_WINDOW_FLOATING, true, true); + mWindowIsFloating = getBooleanThemeValue(mResources, ATTR_WINDOW_FLOATING, true, true); findBackground(); - findStatusBar(); - findActionBar(); - findNavBar(); - } - public boolean isNavBarVertical() { - return mNavBarOrientation == VERTICAL; + if (!mParams.isForceNoDecor()) { + findStatusBar(); + findActionBar(); + findNavBar(); + } } private void findBackground() { @@ -346,11 +346,11 @@ class Layout extends RelativeLayout { private void findStatusBar() { boolean windowFullScreen = - ResourceHelper.getBooleanThemeValue(mResources, ATTR_WINDOW_FULL_SCREEN, true, false); + getBooleanThemeValue(mResources, ATTR_WINDOW_FULL_SCREEN, true, false); if (!windowFullScreen && !mWindowIsFloating) { mStatusBarSize = getDimension(ATTR_STATUS_BAR_HEIGHT, true, DEFAULT_STATUS_BAR_HEIGHT); - mTranslucentStatus = ResourceHelper.getBooleanThemeValue(mResources, + mTranslucentStatus = getBooleanThemeValue(mResources, ATTR_WINDOW_TRANSLUCENT_STATUS, true, false); } } @@ -360,14 +360,14 @@ class Layout extends RelativeLayout { return; } // Check if an actionbar is needed - boolean windowActionBar = ResourceHelper.getBooleanThemeValue(mResources, ATTR_WINDOW_ACTION_BAR, + boolean windowActionBar = getBooleanThemeValue(mResources, ATTR_WINDOW_ACTION_BAR, !isThemeAppCompat(), true); if (windowActionBar) { mActionBarSize = getDimension(ATTR_ACTION_BAR_SIZE, true, DEFAULT_TITLE_BAR_HEIGHT); } else { // Maybe the gingerbread era title bar is needed boolean windowNoTitle = - ResourceHelper.getBooleanThemeValue(mResources, ATTR_WINDOW_NO_TITLE, true, false); + getBooleanThemeValue(mResources, ATTR_WINDOW_NO_TITLE, true, false); if (!windowNoTitle) { mTitleBarSize = getDimension(ATTR_WINDOW_TITLE_SIZE, true, DEFAULT_TITLE_BAR_HEIGHT); @@ -395,7 +395,7 @@ class Layout extends RelativeLayout { mNavBarOrientation = barOnBottom ? LinearLayout.HORIZONTAL : VERTICAL; mNavBarSize = getDimension(barOnBottom ? ATTR_NAV_BAR_HEIGHT : ATTR_NAV_BAR_WIDTH, true, DEFAULT_NAV_BAR_SIZE); - mTranslucentNav = ResourceHelper.getBooleanThemeValue(mResources, + mTranslucentNav = getBooleanThemeValue(mResources, ATTR_WINDOW_TRANSLUCENT_NAV, true, false); } } @@ -444,16 +444,27 @@ class Layout extends RelativeLayout { } /** - * Return if both status bar and nav bar are solid (content doesn't overlap with these - * bars). + * Return true if the status bar or nav bar are present, they are not translucent (i.e + * content doesn't overlap with them). */ private boolean solidBars() { - return hasNavBar() && !mTranslucentNav && !mTranslucentStatus && mStatusBarSize > 0; + return !(hasNavBar() && mTranslucentNav) && !(hasStatusBar() && mTranslucentStatus); } private boolean hasNavBar() { return Config.showOnScreenNavBar(mParams.getSimulatedPlatformVersion()) && hasSoftwareButtons() && mNavBarSize > 0; } + + private boolean hasStatusBar() { + return mStatusBarSize > 0; + } + + /** + * Return true if the nav bar is present and is vertical. + */ + private boolean isNavBarVertical() { + return hasNavBar() && mNavBarOrientation == VERTICAL; + } } } diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/array_check.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/array_check.png Binary files differindex 9a135684f33e..336f9d8b4798 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/array_check.png +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/array_check.png diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png Binary files differindex 92eb3e10148b..0c1621544870 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/expand_horz_layout.png diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java index b2909c94de8e..9ebeebd49c82 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java @@ -285,7 +285,7 @@ public class Main { ConfigGenerator.getEnumMap(attrs), getLayoutLog()); } - /** Text activity.xml */ + /** Test activity.xml */ @Test public void testActivity() throws ClassNotFoundException { renderAndVerify("activity.xml", "activity.png"); @@ -329,8 +329,8 @@ public class Main { .setNavigation(Navigation.NONAV); SessionParams params = getSessionParams(parser, customConfigGenerator, - layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", RenderingMode.V_SCROLL, - 22); + layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", false, + RenderingMode.V_SCROLL, 22); renderAndVerify(params, "expand_vert_layout.png"); @@ -342,8 +342,8 @@ public class Main { parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + "expand_horz_layout.xml"); params = getSessionParams(parser, customConfigGenerator, - layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", RenderingMode - .H_SCROLL, 22); + layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", false, + RenderingMode.H_SCROLL, 22); renderAndVerify(params, "expand_horz_layout.png"); } @@ -390,7 +390,7 @@ public class Main { // TODO: Set up action bar handler properly to test menu rendering. // Create session params. SessionParams params = getSessionParams(parser, ConfigGenerator.NEXUS_5, - layoutLibCallback, "Theme.Material.Light.DarkActionBar", RenderingMode.NORMAL, 22); + layoutLibCallback, "AppTheme", true, RenderingMode.NORMAL, 22); renderAndVerify(params, goldenFileName); } @@ -399,12 +399,12 @@ public class Main { */ private SessionParams getSessionParams(LayoutPullParser layoutParser, ConfigGenerator configGenerator, LayoutLibTestCallback layoutLibCallback, - String themeName, RenderingMode renderingMode, int targetSdk) { + String themeName, boolean isProjectTheme, RenderingMode renderingMode, int targetSdk) { FolderConfiguration config = configGenerator.getFolderConfig(); ResourceResolver resourceResolver = ResourceResolver.create(sProjectResources.getConfiguredResources(config), sFrameworkRepo.getConfiguredResources(config), - themeName, true); + themeName, isProjectTheme); return new SessionParams( layoutParser, diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java index 2951edb0e5ac..383168face86 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java @@ -119,6 +119,7 @@ public class Main { "android.icu.**", // needed by LayoutLib "android.annotation.NonNull", // annotations "android.annotation.Nullable", // annotations + "com.android.internal.transition.EpicenterTranslateClipReveal", }, excludeClasses, new String[] { diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index d915e5def69a..cf88df42f8d3 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -669,6 +669,7 @@ public class WifiManager { try { return mService.getConfiguredNetworks(); } catch (RemoteException e) { + Log.w(TAG, "Caught RemoteException trying to get configured networks: " + e); return null; } } @@ -1589,6 +1590,7 @@ public class WifiManager { try { return mService.buildWifiConfig(uriString, mimeType, data); } catch (RemoteException e) { + Log.w(TAG, "Caught RemoteException trying to build wifi config: " + e); return null; } } |