diff options
169 files changed, 1989 insertions, 596 deletions
diff --git a/api/current.txt b/api/current.txt index 924dcb20dad1..90dcec6f21f0 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5716,6 +5716,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"; @@ -26426,6 +26427,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"; @@ -26598,7 +26600,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"; @@ -26645,6 +26647,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; @@ -36376,6 +36379,7 @@ package android.view { field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0 field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1 field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA; + field public static final int DRAG_FLAG_OPAQUE = 512; // 0x200 field public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0 field public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000 field public static final int DRAWING_CACHE_QUALITY_LOW = 524288; // 0x80000 diff --git a/api/system-current.txt b/api/system-current.txt index 133e7eb7ae8d..a715313f0cc9 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5848,6 +5848,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"; @@ -28502,6 +28503,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"; @@ -28675,7 +28677,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"; @@ -28722,6 +28724,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; @@ -38686,6 +38689,7 @@ package android.view { field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0 field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1 field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA; + field public static final int DRAG_FLAG_OPAQUE = 512; // 0x200 field public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0 field public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000 field public static final int DRAWING_CACHE_QUALITY_LOW = 524288; // 0x80000 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/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 976830fc6cdd..862d2356ecda 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, diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 1fb0b2af3366..dbe91f97dfbf 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 { 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/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/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 33cbc9d8c737..b2b1727ff773 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -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 diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index ee0fc9110689..e08686c860fd 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); diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index bc24d675e777..03366455cda8 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -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/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index f659c022c1e6..20c216826531 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -193,6 +193,13 @@ public abstract class NetworkAgent extends Handler { */ public static final int CMD_SET_SIGNAL_STRENGTH_THRESHOLDS = BASE + 14; + /** + * 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 + 15; + 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); @@ -308,6 +315,10 @@ public abstract class NetworkAgent extends Handler { setSignalStrengthThresholds(intThresholds); break; } + case CMD_PREVENT_AUTOMATIC_RECONNECT: { + preventAutomaticReconnect(); + break; + } } } @@ -474,6 +485,15 @@ public abstract class NetworkAgent extends Handler { protected void setSignalStrengthThresholds(int[] thresholds) { } + /** + * 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 f988e0bae0f5..af2068cbe242 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -792,6 +792,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/net/VpnService.java b/core/java/android/net/VpnService.java index 2bb48b33f385..c6daa15e3d62 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -240,7 +240,7 @@ public class VpnService extends Service { * Adding an address implicitly allows traffic from that address family (i.e., IPv4 or IPv6) to * be routed over the VPN. @see Builder#allowFamily * - * @throws {@link IllegalArgumentException} if the address is invalid. + * @throws IllegalArgumentException if the address is invalid. * * @param address The IP address (IPv4 or IPv6) to assign to the VPN interface. * @param prefixLength The prefix length of the address. @@ -271,7 +271,7 @@ public class VpnService extends Service { * family from being routed. In other words, once an address family has been allowed, it stays * allowed for the rest of the VPN's session. @see Builder#allowFamily * - * @throws {@link IllegalArgumentException} if the address is invalid. + * @throws IllegalArgumentException if the address is invalid. * * @param address The IP address (IPv4 or IPv6) to assign to the VPN interface. * @param prefixLength The prefix length of the address. @@ -624,7 +624,7 @@ public class VpnService extends Service { * {@code packageName} must be the canonical name of a currently installed application. * {@link PackageManager.NameNotFoundException} is thrown if there's no such application. * - * @throws {@link PackageManager.NameNotFoundException} If the application isn't installed. + * @throws PackageManager.NameNotFoundException If the application isn't installed. * * @param packageName The full name (e.g.: "com.google.apps.contacts") of an application. * @@ -656,7 +656,7 @@ public class VpnService extends Service { * {@code packageName} must be the canonical name of a currently installed application. * {@link PackageManager.NameNotFoundException} is thrown if there's no such application. * - * @throws {@link PackageManager.NameNotFoundException} If the application isn't installed. + * @throws PackageManager.NameNotFoundException If the application isn't installed. * * @param packageName The full name (e.g.: "com.google.apps.contacts") of an application. * 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/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/provider/Settings.java b/core/java/android/provider/Settings.java index 61c98a1a9991..04f1e042a080 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#MNC} 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#MNC} 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#MNC} or later throws a {@code SecurityException}. */ @Deprecated public static final String @@ -8195,4 +8257,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 (!throwException) { + return context.checkCallingOrSelfPermission(permissionName) == + PackageManager.PERMISSION_GRANTED; + } + 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/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/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java index ac98fa94975c..05fa45fc3ff2 100644 --- a/core/java/android/view/DisplayListCanvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -147,25 +147,11 @@ public class DisplayListCanvas extends Canvas { private static native int nGetMaximumTextureWidth(); private static native int nGetMaximumTextureHeight(); - /** - * Returns the native OpenGLRenderer object. - */ - long getRenderer() { - return mNativeCanvasWrapper; - } - /////////////////////////////////////////////////////////////////////////// // Setup /////////////////////////////////////////////////////////////////////////// @Override - public void setHighContrastText(boolean highContrastText) { - nSetHighContrastText(mNativeCanvasWrapper, highContrastText); - } - - private static native void nSetHighContrastText(long renderer, boolean highContrastText); - - @Override public void insertReorderBarrier() { nInsertReorderBarrier(mNativeCanvasWrapper, true); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 8e5132244e83..6de9cc7abb9c 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3594,6 +3594,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public static final int DRAG_FLAG_GLOBAL = 1; /** + * Flag indicating that the drag shadow will be opaque. When + * {@link #startDrag(ClipData, DragShadowBuilder, Object, int)} is called + * with this flag set, the drag shadow will be opaque, otherwise, it will be semitransparent. + */ + public static final int DRAG_FLAG_OPAQUE = 1 << 9; + + /** * Vertical scroll factor cached by {@link #getVerticalScrollFactor}. */ private float mVerticalScrollFactor; diff --git a/core/java/android/widget/DateTimeView.java b/core/java/android/widget/DateTimeView.java index 0b5824ae56a7..dcb243760cd0 100644 --- a/core/java/android/widget/DateTimeView.java +++ b/core/java/android/widget/DateTimeView.java @@ -25,7 +25,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 +227,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 +257,11 @@ public class DateTimeView extends TextView { return result; } + static final Context getApplicationContextIfAvailable(Context context) { + final Context ac = context.getApplicationContext(); + return ac != null ? ac : context; + } + void register(Context context) { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_TICK); diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index b5e08ca5caa0..4b405014fed6 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -686,6 +686,7 @@ public class LinearLayout extends ViewGroup { int weightedMaxWidth = 0; boolean allFillParent = true; float totalWeight = 0; + int usedExcessSpace = 0; final int count = getVirtualChildCount(); @@ -730,14 +731,12 @@ public class LinearLayout extends ViewGroup { mTotalLength = Math.max(totalLength, totalLength + lp.topMargin + lp.bottomMargin); skippedMeasure = true; } else { - int oldHeight = Integer.MIN_VALUE; - - if (lp.height == 0 && lp.weight > 0) { + final boolean fillExcessSpace = lp.height == 0 && lp.weight > 0; + if (fillExcessSpace) { // heightMode is either UNSPECIFIED or AT_MOST, and this // child wanted to stretch to fill available space. // Translate that to WRAP_CONTENT so that it does not end up - // with a height of 0 - oldHeight = 0; + // with a height of 0. lp.height = LayoutParams.WRAP_CONTENT; } @@ -749,11 +748,12 @@ public class LinearLayout extends ViewGroup { child, i, widthMeasureSpec, 0, heightMeasureSpec, totalWeight == 0 ? mTotalLength : 0); - if (oldHeight != Integer.MIN_VALUE) { - lp.height = oldHeight; + final int childHeight = child.getMeasuredHeight(); + if (fillExcessSpace) { + usedExcessSpace += childHeight; + lp.height = 0; } - final int childHeight = child.getMeasuredHeight(); final int totalLength = mTotalLength; mTotalLength = Math.max(totalLength, totalLength + childHeight + lp.topMargin + lp.bottomMargin + getNextLocationOffset(child)); @@ -857,7 +857,7 @@ public class LinearLayout extends ViewGroup { // Either expand children with weight to take up available space or // shrink them if they extend beyond our current bounds. If we skipped // measurement on any children, we need to measure them now. - int delta = heightSize - mTotalLength; + final int delta = heightSize - mTotalLength + usedExcessSpace; if (skippedMeasure || delta != 0 && totalWeight > 0.0f) { float weightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight; @@ -874,34 +874,14 @@ public class LinearLayout extends ViewGroup { float childExtra = lp.weight; if (childExtra > 0) { - // Child said it could absorb extra space -- give him his share - int share = (int) (childExtra * delta / weightSum); - weightSum -= childExtra; - delta -= share; - + // Distribute excess space to child. + final int childHeight = Math.max(0, (int) (childExtra * delta / weightSum)); + final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight, + MeasureSpec.EXACTLY); final int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, - mPaddingLeft + mPaddingRight + - lp.leftMargin + lp.rightMargin, lp.width); - - // TODO: Use a field like lp.isMeasured to figure out if this - // child has been previously measured - if ((lp.height != 0) || (heightMode != MeasureSpec.EXACTLY)) { - // child was measured once already above... - // base new measurement on stored values - int childHeight = child.getMeasuredHeight() + share; - if (childHeight < 0) { - childHeight = 0; - } - - child.measure(childWidthMeasureSpec, - MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY)); - } else { - // child was skipped in the loop above. - // Measure for this first time here - child.measure(childWidthMeasureSpec, - MeasureSpec.makeMeasureSpec(share > 0 ? share : 0, - MeasureSpec.EXACTLY)); - } + mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin, + lp.width); + child.measure(childWidthMeasureSpec, childHeightMeasureSpec); // Child may now not fit in vertical dimension. childState = combineMeasuredStates(childState, child.getMeasuredState() @@ -1017,6 +997,7 @@ public class LinearLayout extends ViewGroup { int weightedMaxHeight = 0; boolean allFillParent = true; float totalWeight = 0; + int usedExcessSpace = 0; final int count = getVirtualChildCount(); @@ -1094,14 +1075,12 @@ public class LinearLayout extends ViewGroup { skippedMeasure = true; } } else { - int oldWidth = Integer.MIN_VALUE; - - if (lp.width == 0 && lp.weight > 0) { + final boolean fillExcessSpace = lp.width == 0 && lp.weight > 0; + if (fillExcessSpace) { // widthMode is either UNSPECIFIED or AT_MOST, and this - // child - // wanted to stretch to fill available space. Translate that to - // WRAP_CONTENT so that it does not end up with a width of 0 - oldWidth = 0; + // child wanted to stretch to fill available space. + // Translate that to WRAP_CONTENT so that it does not end up + // with a width of 0. lp.width = LayoutParams.WRAP_CONTENT; } @@ -1113,11 +1092,12 @@ public class LinearLayout extends ViewGroup { totalWeight == 0 ? mTotalLength : 0, heightMeasureSpec, 0); - if (oldWidth != Integer.MIN_VALUE) { - lp.width = oldWidth; + final int childWidth = child.getMeasuredWidth(); + if (fillExcessSpace) { + usedExcessSpace += childWidth; + lp.width = 0; } - final int childWidth = child.getMeasuredWidth(); if (isExactly) { mTotalLength += childWidth + lp.leftMargin + lp.rightMargin + getNextLocationOffset(child); @@ -1242,7 +1222,7 @@ public class LinearLayout extends ViewGroup { // Either expand children with weight to take up available space or // shrink them if they extend beyond our current bounds. If we skipped // measurement on any children, we need to measure them now. - int delta = widthSize - mTotalLength; + final int delta = widthSize - mTotalLength + usedExcessSpace; if (skippedMeasure || delta != 0 && totalWeight > 0.0f) { float weightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight; @@ -1265,34 +1245,13 @@ public class LinearLayout extends ViewGroup { float childExtra = lp.weight; if (childExtra > 0) { // Child said it could absorb extra space -- give him his share - int share = (int) (childExtra * delta / weightSum); - weightSum -= childExtra; - delta -= share; - - final int childHeightMeasureSpec = getChildMeasureSpec( - heightMeasureSpec, + final int childWidth = Math.max(0, (int) (childExtra * delta / weightSum)); + final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, + MeasureSpec.EXACTLY); + final int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin, lp.height); - - // TODO: Use a field like lp.isMeasured to figure out if this - // child has been previously measured - if ((lp.width != 0) || (widthMode != MeasureSpec.EXACTLY)) { - // child was measured once already above ... base new measurement - // on stored values - int childWidth = child.getMeasuredWidth() + share; - if (childWidth < 0) { - childWidth = 0; - } - - child.measure( - MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY), - childHeightMeasureSpec); - } else { - // child was skipped in the loop above. Measure for this first time here - child.measure(MeasureSpec.makeMeasureSpec( - share > 0 ? share : 0, MeasureSpec.EXACTLY), - childHeightMeasureSpec); - } + child.measure(childWidthMeasureSpec, childHeightMeasureSpec); // Child may now not fit in horizontal dimension. childState = combineMeasuredStates(childState, 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..d1583136c408 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 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 c037d81b1fa0..ce66eeb4eaa4 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/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/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/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp index 1f0145315fc1..43825adc7a80 100644 --- a/core/jni/android_graphics_Canvas.cpp +++ b/core/jni/android_graphics_Canvas.cpp @@ -69,6 +69,11 @@ static jint getHeight(JNIEnv*, jobject, jlong canvasHandle) { return static_cast<jint>(get_canvas(canvasHandle)->height()); } +static void setHighContrastText(JNIEnv*, jobject, jlong canvasHandle, jboolean highContrastText) { + Canvas* canvas = get_canvas(canvasHandle); + canvas->setHighContrastText(highContrastText); +} + static jint getSaveCount(JNIEnv*, jobject, jlong canvasHandle) { return static_cast<jint>(get_canvas(canvasHandle)->getSaveCount()); } @@ -430,6 +435,16 @@ static void drawBitmapMesh(JNIEnv* env, jobject, jlong canvasHandle, jobject jbi vertA.ptr(), colorA.ptr(), paint); } +static void simplifyPaint(int color, SkPaint* paint) { + paint->setColor(color); + paint->setShader(nullptr); + paint->setColorFilter(nullptr); + paint->setLooper(nullptr); + paint->setStrokeWidth(4 + 0.04 * paint->getTextSize()); + paint->setStrokeJoin(SkPaint::kRound_Join); + paint->setLooper(nullptr); +} + class DrawTextFunctor { public: DrawTextFunctor(const Layout& layout, Canvas* canvas, uint16_t* glyphs, float* pos, @@ -454,9 +469,32 @@ public: } size_t glyphCount = end - start; - canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, paint, x, y, - bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, - totalAdvance); + + if (CC_UNLIKELY(canvas->isHighContrastText())) { + // high contrast draw path + int color = paint.getColor(); + int channelSum = SkColorGetR(color) + SkColorGetG(color) + SkColorGetB(color); + bool darken = channelSum < (128 * 3); + + // outline + SkPaint outlinePaint(paint); + simplifyPaint(darken ? SK_ColorWHITE : SK_ColorBLACK, &outlinePaint); + outlinePaint.setStyle(SkPaint::kStrokeAndFill_Style); + canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, outlinePaint, x, y, + bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, totalAdvance); + + // inner + SkPaint innerPaint(paint); + simplifyPaint(darken ? SK_ColorBLACK : SK_ColorWHITE, &innerPaint); + innerPaint.setStyle(SkPaint::kFill_Style); + canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, innerPaint, x, y, + bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, totalAdvance); + } else { + // standard draw path + canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, paint, x, y, + bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, + totalAdvance); + } } private: const Layout& layout; @@ -679,6 +717,7 @@ static JNINativeMethod gMethods[] = { {"native_isOpaque","(J)Z", (void*) CanvasJNI::isOpaque}, {"native_getWidth","(J)I", (void*) CanvasJNI::getWidth}, {"native_getHeight","(J)I", (void*) CanvasJNI::getHeight}, + {"native_setHighContrastText","(JZ)V", (void*) CanvasJNI::setHighContrastText}, {"native_save","(JI)I", (void*) CanvasJNI::save}, {"native_saveLayer","(JFFFFJI)I", (void*) CanvasJNI::saveLayer}, {"native_saveLayerAlpha","(JFFFFII)I", (void*) CanvasJNI::saveLayerAlpha}, diff --git a/core/jni/android_view_DisplayListCanvas.cpp b/core/jni/android_view_DisplayListCanvas.cpp index 2c0e79046d73..2953db41f1a4 100644 --- a/core/jni/android_view_DisplayListCanvas.cpp +++ b/core/jni/android_view_DisplayListCanvas.cpp @@ -50,12 +50,6 @@ static struct { // Setup // ---------------------------------------------------------------------------- -static void android_view_DisplayListCanvas_setHighContrastText(JNIEnv* env, jobject clazz, - jlong rendererPtr, jboolean highContrastText) { - DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr); - renderer->setHighContrastText(highContrastText); -} - static void android_view_DisplayListCanvas_insertReorderBarrier(JNIEnv* env, jobject clazz, jlong rendererPtr, jboolean reorderEnable) { DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr); @@ -198,7 +192,6 @@ const char* const kClassPathName = "android/view/DisplayListCanvas"; static JNINativeMethod gMethods[] = { { "nIsAvailable", "()Z", (void*) android_view_DisplayListCanvas_isAvailable }, - { "nSetHighContrastText","(JZ)V", (void*) android_view_DisplayListCanvas_setHighContrastText }, { "nInsertReorderBarrier","(JZ)V", (void*) android_view_DisplayListCanvas_insertReorderBarrier }, { "nCallDrawGLFunction", "(JJ)V", (void*) android_view_DisplayListCanvas_callDrawGLFunction }, diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index 6e95be9efc3a..a3b370017a8e 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -484,13 +484,13 @@ static JNINativeMethod gMethods[] = { { "nSetProjectBackwards", "!(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards }, { "nSetProjectionReceiver","!(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver }, - { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect }, - { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath }, - { "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty }, - { "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone }, + { "nSetOutlineRoundRect", "!(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect }, + { "nSetOutlineConvexPath", "!(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath }, + { "nSetOutlineEmpty", "!(J)Z", (void*) android_view_RenderNode_setOutlineEmpty }, + { "nSetOutlineNone", "!(J)Z", (void*) android_view_RenderNode_setOutlineNone }, { "nHasShadow", "!(J)Z", (void*) android_view_RenderNode_hasShadow }, { "nSetClipToOutline", "!(JZ)Z", (void*) android_view_RenderNode_setClipToOutline }, - { "nSetRevealClip", "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip }, + { "nSetRevealClip", "!(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip }, { "nSetAlpha", "!(JF)Z", (void*) android_view_RenderNode_setAlpha }, { "nSetHasOverlappingRendering", "!(JZ)Z", diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4471af06d38c..d6d932ff75a1 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 --> <!-- ====================================================================== --> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index b404906c8770..ea88d1ebce0d 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Ongelukkig het <xliff:g id="APPLICATION">%1$s</xliff:g> gestop."</string> <string name="aerr_process" msgid="4507058997035697579">"Ongelukkig het die proses <xliff:g id="PROCESS">%1$s</xliff:g> gestop."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> reageer nie.\n\nWil jy dit sluit?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiwiteit <xliff:g id="ACTIVITY">%1$s</xliff:g> reageer nie.\n\nWil jy dit afsluit?"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 69cadfa994a9..9ff3f03f1b5b 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"መጥፎ ዕድል ሆኖ፣ <xliff:g id="APPLICATION">%1$s</xliff:g> አቁሞዋል፡፡"</string> <string name="aerr_process" msgid="4507058997035697579">"መጥፎ ዕድል ሆኖ፣ ይሄ ሂደት <xliff:g id="PROCESS">%1$s</xliff:g> ቆሞዋል፡፡"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ምላሽ እየሰጠ አይደለም።\n\n መዝጋት ይፈልጋሉ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"እንቅስቃሴ <xliff:g id="ACTIVITY">%1$s</xliff:g> ምላሽ እየሰጠ አይደለም።\n\n መዝጋት ይፈልጋሉ?"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index c3b32ccedaab..80d6cb4d6584 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> @@ -916,6 +917,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"للأسف، توقف <xliff:g id="APPLICATION">%1$s</xliff:g>."</string> <string name="aerr_process" msgid="4507058997035697579">"للأسف، توقفت العملية <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> لا يستجيب.\n\nهل تريد إغلاقه؟"</string> <string name="anr_activity_process" msgid="5776209883299089767">"النشاط <xliff:g id="ACTIVITY">%1$s</xliff:g> لا يستجيب.\n\nهل تريد إغلاقه؟"</string> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 6e09434894eb..f0567e3177ed 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Təəssüf ki, <xliff:g id="APPLICATION">%1$s</xliff:g> dayandı."</string> <string name="aerr_process" msgid="4507058997035697579">"Təəssüf ki, <xliff:g id="PROCESS">%1$s</xliff:g> prosesi dayandı."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> cavab vermir.\n\nOnu bağlamaq istəyirsiniz?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> aktivitisi cavab vermir. \n\nOnu bağlamaq istəyirsiniz?"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index d70b5f3fc0f2..5348f132f81b 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"За съжаление <xliff:g id="APPLICATION">%1$s</xliff:g> спря."</string> <string name="aerr_process" msgid="4507058997035697579">"За съжаление процесът <xliff:g id="PROCESS">%1$s</xliff:g> спря."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Приложението „<xliff:g id="APPLICATION">%2$s</xliff:g>“ не отговаря.\n\nИскате ли да го затворите?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Дейността „<xliff:g id="ACTIVITY">%1$s</xliff:g>“ не отговаря.\n\nИскате ли да я затворите?"</string> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 8f9c8b98526e..b08928d43b4a 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"দুর্ভাগ্যবশত, <xliff:g id="APPLICATION">%1$s</xliff:g> বন্ধ হয়েছে৷"</string> <string name="aerr_process" msgid="4507058997035697579">"দুর্ভাগ্যবশত, <xliff:g id="PROCESS">%1$s</xliff:g> প্রক্রিয়াটি বন্ধ হয়েছে৷"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> সাড়া দিচ্ছে না৷\n\nআপনি কি এটি বন্ধ করতে চান?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> কার্যকলাপ সাড়া দিচ্ছে না৷\n\nআপনি কি এটি বন্ধ করতে চান?"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 558c3f506eea..4e9591571df9 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> s\'ha aturat."</string> <string name="aerr_process" msgid="4507058997035697579">"El procés <xliff:g id="PROCESS">%1$s</xliff:g> s\'ha aturat."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> no respon.\n\nVols tancar-la?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'activitat <xliff:g id="ACTIVITY">%1$s</xliff:g> no respon.\n\nVols tancar-la?"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 632efa9a3942..77ae21600be1 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -436,6 +436,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -906,6 +908,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Aplikace <xliff:g id="APPLICATION">%1$s</xliff:g> bohužel přestala pracovat."</string> <string name="aerr_process" msgid="4507058997035697579">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> byl bohužel ukončen."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikace <xliff:g id="APPLICATION">%2$s</xliff:g> nereaguje.\n\nChcete ji ukončit?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivita <xliff:g id="ACTIVITY">%1$s</xliff:g> nereaguje.\n\nChcete ji ukončit?"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 08f5148553f0..9649fbfefd0a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Fingeraftryk <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Applikationen <xliff:g id="APPLICATION">%1$s</xliff:g> er desværre stoppet."</string> <string name="aerr_process" msgid="4507058997035697579">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> er desværre stoppet."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> svarer ikke.\n\nVil du lukke den?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> svarer ikke.\n\nVil du at lukke den?"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 74c0be365382..203a9485ddec 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"\"<xliff:g id="APPLICATION">%1$s</xliff:g>\" wurde beendet."</string> <string name="aerr_process" msgid="4507058997035697579">"Der Prozess \"<xliff:g id="PROCESS">%1$s</xliff:g>\" wurde beendet."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> reagiert nicht.\n\nMöchten Sie die App schließen?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivität \"<xliff:g id="ACTIVITY">%1$s</xliff:g>\" reagiert nicht.\n\nMöchten Sie sie beenden?"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 885cb1e79527..cdd246a319ab 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Δυστυχώς, η εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g> έχει σταματήσει."</string> <string name="aerr_process" msgid="4507058997035697579">"Δυστυχώς, η διαδικασία <xliff:g id="PROCESS">%1$s</xliff:g> έχει σταματήσει."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Η εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g> δεν ανταποκρίνεται.\n\nΘέλετε να την κλείσετε;"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Η δραστηριότητα <xliff:g id="ACTIVITY">%1$s</xliff:g> δεν ανταποκρίνεται.\n\nΘέλετε να την κλείσετε;"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 9b0616fab76b..8bb3cc643897 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Unfortunately, <xliff:g id="APPLICATION">%1$s</xliff:g> has stopped."</string> <string name="aerr_process" msgid="4507058997035697579">"Unfortunately, the process <xliff:g id="PROCESS">%1$s</xliff:g> has stopped."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 9b0616fab76b..8bb3cc643897 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Unfortunately, <xliff:g id="APPLICATION">%1$s</xliff:g> has stopped."</string> <string name="aerr_process" msgid="4507058997035697579">"Unfortunately, the process <xliff:g id="PROCESS">%1$s</xliff:g> has stopped."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 9b0616fab76b..8bb3cc643897 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Unfortunately, <xliff:g id="APPLICATION">%1$s</xliff:g> has stopped."</string> <string name="aerr_process" msgid="4507058997035697579">"Unfortunately, the process <xliff:g id="PROCESS">%1$s</xliff:g> has stopped."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index e7c9e22a94c2..5d0977874e28 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Lamentablemente, la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> se detuvo."</string> <string name="aerr_process" msgid="4507058997035697579">"Lamentablemente, el proceso <xliff:g id="PROCESS">%1$s</xliff:g> se detuvo."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> no responde.\n\n¿Deseas cerrarla?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"La actividad <xliff:g id="ACTIVITY">%1$s</xliff:g> no responde.\n\n¿Deseas cerrarla?"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 80afd2d3c1a6..b0b242f1f0dc 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Se ha detenido la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>."</string> <string name="aerr_process" msgid="4507058997035697579">"Se ha detenido el proceso <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"La aplicación <xliff:g id="APPLICATION">%2$s</xliff:g> no responde.\n\n¿Quieres cerrarla?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"La actividad <xliff:g id="ACTIVITY">%1$s</xliff:g> no responde.\n\n¿Quieres cerrarla?"</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index f8a875819eb2..ca1bb7f65174 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Kahjuks on rakendus <xliff:g id="APPLICATION">%1$s</xliff:g> peatunud."</string> <string name="aerr_process" msgid="4507058997035697579">"Kahjuks on protsess <xliff:g id="PROCESS">%1$s</xliff:g> peatunud."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ei vasta.\n\nKas soovite selle sulgeda?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Tegevus <xliff:g id="ACTIVITY">%1$s</xliff:g> ei vasta.\n\nKas soovite selle sulgeda?"</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index a519d221cc4c..81dfbe016c20 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Zoritxarrez, <xliff:g id="APPLICATION">%1$s</xliff:g> aplikazioa gelditu egin da."</string> <string name="aerr_process" msgid="4507058997035697579">"Zoritxarrez, <xliff:g id="PROCESS">%1$s</xliff:g> prozesua gelditu egin da."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> aplikazioak ez du erantzuten.\n\nItxi egin nahi duzu?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> jarduerak ez du erantzuten.\n\nItxi egin nahi duzu?"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 28e22604d310..345f16a63b4d 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"متأسفانه، <xliff:g id="APPLICATION">%1$s</xliff:g> متوقف شده است."</string> <string name="aerr_process" msgid="4507058997035697579">"متأسفانه، پردازش <xliff:g id="PROCESS">%1$s</xliff:g> متوقف شده است."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> پاسخ نمیدهد.\n\nآیا میخواهید آنرا ببندید؟"</string> <string name="anr_activity_process" msgid="5776209883299089767">"فعالیت <xliff:g id="ACTIVITY">%1$s</xliff:g> پاسخ نمیدهد.\n\nآیا میخواهید آن را ببندید؟"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 1cb9ff2b6337..368b8d2b003a 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> on pysähtynyt."</string> <string name="aerr_process" msgid="4507058997035697579">"Prosessi <xliff:g id="PROCESS">%1$s</xliff:g> on pysähtynyt."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ei vastaa.\n\nHaluatko sulkea sen?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Toiminto <xliff:g id="ACTIVITY">%1$s</xliff:g> ei vastaa.\n\nHaluatko sulkea sen?"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 39f620491f2b..eaf61621ab56 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"L\'application \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" s\'est arrêtée."</string> <string name="aerr_process" msgid="4507058997035697579">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est interrompu."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"L\'application <xliff:g id="APPLICATION">%2$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'activité <xliff:g id="ACTIVITY">%1$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter?"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 33f06ef14c7a..cab909969fe0 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"\"<xliff:g id="APPLICATION">%1$s</xliff:g>\" s\'est arrêté."</string> <string name="aerr_process" msgid="4507058997035697579">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est interrompu."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"L\'application <xliff:g id="APPLICATION">%2$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'activité <xliff:g id="ACTIVITY">%1$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter ?"</string> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 65217c72672c..4f20a7a8bcc4 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Detívose a aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>."</string> <string name="aerr_process" msgid="4507058997035697579">"Detívose o proceso <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> non responde.\n\nQueres pechala?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A actividade <xliff:g id="ACTIVITY">%1$s</xliff:g> non responde.\n\nQueres pechala?"</string> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 397e17a3c90d..76ca425c5ff0 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"કમનસીબે, <xliff:g id="APPLICATION">%1$s</xliff:g> બંધ થઈ ગયું છે."</string> <string name="aerr_process" msgid="4507058997035697579">"કમનસીબે, <xliff:g id="PROCESS">%1$s</xliff:g> પ્રક્રિયા રોકાઈ ગઈ છે."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> જવાબ આપતી નથી.\n\nશું તમે તેને બંધ કરવા માંગો છો?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> પ્રવૃત્તિ પ્રતિસાદ આપતી નથી.\n\nશું તમે તેને બંધ કરવા માંગો છો?"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index a400fd5e8ea6..5c965bdb13af 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"दुर्भाग्यवश, <xliff:g id="APPLICATION">%1$s</xliff:g> रुक गया है."</string> <string name="aerr_process" msgid="4507058997035697579">"दुर्भाग्यवश, <xliff:g id="PROCESS">%1$s</xliff:g> प्रक्रिया रुक गई है."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> प्रतिसाद नहीं दे रहा है.\n\nक्या आप इसे बंद करना चाहते हैं?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"गतिविधि <xliff:g id="ACTIVITY">%1$s</xliff:g> प्रतिसाद नहीं दे रही है.\n\nक्या आप इसे बंद करना चाहते हैं?"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 2baa1064710e..6f470c6c9b09 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -435,6 +435,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -901,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Nažalost, aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> prekinula je s radom."</string> <string name="aerr_process" msgid="4507058997035697579">"Nažalost, zaustavljen je proces <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikacija <xliff:g id="APPLICATION">%2$s</xliff:g> ne reagira.\n\nŽelite li je zatvoriti?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivnost <xliff:g id="ACTIVITY">%1$s</xliff:g> ne reagira.\n\nŽelite li je zatvoriti?"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index c96219841887..509b7258a1ff 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"A(z) <xliff:g id="APPLICATION">%1$s</xliff:g> alkalmazás sajnos leállt."</string> <string name="aerr_process" msgid="4507058997035697579">"Sajnos a <xliff:g id="PROCESS">%1$s</xliff:g> alkalmazás leállt."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"A(z) <xliff:g id="APPLICATION">%2$s</xliff:g> nem válaszol.\n\nSzeretné bezárni?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A(z) <xliff:g id="ACTIVITY">%1$s</xliff:g> tevékenység nem válaszol.\n\nSzeretné bezárni?"</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index a7b9b5bff491..83dfdcb3fb5e 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Մատնահետք <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամեցման կարգավորումները"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Թույլ է տալիս հավելվածին կարդալ համաժամեցման կարգավորումները հաշվի համար: Օրինակ` այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամեցված է հաշվի հետ:"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"համաժամեցումը փոխարկել միացվածի և անջատվածի"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Ցավոք, <xliff:g id="APPLICATION">%1$s</xliff:g>-ը ընդհատվել է:"</string> <string name="aerr_process" msgid="4507058997035697579">"Ցավոք, <xliff:g id="PROCESS">%1$s</xliff:g> գործընթացը դադարել է:"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>-ը չի արձագանքում:\n\nՑանկանու՞մ եք փակել այն:"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> գործողությունը չի պատասխանում:\n\nՑանկանու՞մ եք այն փակել:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index d8396b5c28f4..d1e843c8ef2e 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Sayangnya, <xliff:g id="APPLICATION">%1$s</xliff:g> telah berhenti."</string> <string name="aerr_process" msgid="4507058997035697579">"Sayangnya, proses <xliff:g id="PROCESS">%1$s</xliff:g> telah berhenti."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> tidak menanggapi.\n\nAnda ingin menutupnya?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivitas <xliff:g id="ACTIVITY">%1$s</xliff:g> tidak menanggapi.\n\nAnda ingin menutupnya?"</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index 344eb8337085..d0bcd5cb3688 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Fingur <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> lokaðist því miður."</string> <string name="aerr_process" msgid="4507058997035697579">"Forritið <xliff:g id="PROCESS">%1$s</xliff:g> lokaðist því miður."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> svarar ekki.\n\nViltu loka því?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aðgerðin <xliff:g id="ACTIVITY">%1$s</xliff:g> svarar ekki.\n\nViltu loka henni?"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 637b2fe403c1..0c5dcb5eddfc 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dito <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"L\'applicazione <xliff:g id="APPLICATION">%1$s</xliff:g> si è bloccata in modo anomalo."</string> <string name="aerr_process" msgid="4507058997035697579">"Il processo <xliff:g id="PROCESS">%1$s</xliff:g> si è interrotto."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> non risponde.\n\nVuoi chiuderla?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'attività <xliff:g id="ACTIVITY">%1$s</xliff:g> non risponde.\n\nVuoi chiuderla?"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 590f7e835227..ffd65deb943f 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -436,6 +436,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"אצבע <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"קרא את הגדרות הסינכרון"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"מאפשר לאפליקציה לקרוא את הגדרות הסנכרון של חשבון. לדוגמה, ניתן לגלות כך האם האפליקציה \'אנשים\' מסונכרן עם חשבון כלשהו."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"הפעלת וכיבוי סנכרון"</string> @@ -906,6 +908,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"לצערנו, פעולת <xliff:g id="APPLICATION">%1$s</xliff:g> הופסקה."</string> <string name="aerr_process" msgid="4507058997035697579">"לצערנו, התהליך <xliff:g id="PROCESS">%1$s</xliff:g> הופסק."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> אינו מגיב.\n\nתרצה לסגור אותו?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"הפעילות <xliff:g id="ACTIVITY">%1$s</xliff:g> אינה מגיבה.\n\nתרצה לסגור אותה?"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 05b1fd7f250d..454ae8817ca7 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"問題が発生したため、<xliff:g id="APPLICATION">%1$s</xliff:g>を終了します。"</string> <string name="aerr_process" msgid="4507058997035697579">"問題が発生したため、プロセス「<xliff:g id="PROCESS">%1$s</xliff:g>」を終了します。"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>は応答していません。\n\nこのアプリを終了しますか?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"操作「<xliff:g id="ACTIVITY">%1$s</xliff:g>」は応答していません。\n\nこの操作を終了しますか?"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 184b0e7dc08a..851100dd53af 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"თითი <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"სინქრონიზაციის პარამეტრების წაკითხვა"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"აპს შეეძლება, წაიკითხოს ანგარიშის სინქრონიზაციის პარამეტრები. მაგალითად, მას შეეძლება განსაზღვროს, არის თუ არა People აპი სინქრონიზებული ანგარიშთან."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"სინქრონიზაციის ჩართვა და გამორთვა"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"სამწუხაროდ, <xliff:g id="APPLICATION">%1$s</xliff:g> შეწყდა."</string> <string name="aerr_process" msgid="4507058997035697579">"სამწუხაროდ, პროცესი <xliff:g id="PROCESS">%1$s</xliff:g> შეწყდა."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> არ რეაგირებს.\n\nგსურთ, მისი დახურვა?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> აქტივობა არ რეაგირებს.\n\nგსურთ მისი დახურვა?"</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index c8fa7c215ec1..6fb9e0108169 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Өкінішке орай, <xliff:g id="APPLICATION">%1$s</xliff:g> тоқтап қалды."</string> <string name="aerr_process" msgid="4507058997035697579">"Өкінішке орай, <xliff:g id="PROCESS">%1$s</xliff:g> үрдісі тоқтап қалды."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> жауап бермей жатыр.\n\nОны жабу керек пе?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> әрекеті жауап бермей жатыр.\n\nОны жабу керек пе?"</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 97bd37530fab..2b577595786b 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> @@ -898,6 +899,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ដោយបរាជ័យ <xliff:g id="APPLICATION">%1$s</xliff:g> បានបញ្ឈប់។"</string> <string name="aerr_process" msgid="4507058997035697579">"ដោយបរាជ័យ ដំណើរការ <xliff:g id="PROCESS">%1$s</xliff:g> បានបញ្ឈប់។"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> មិនឆ្លើយតប។\n\nតើអ្នកចង់បិទវាឬ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"សកម្មភាព <xliff:g id="ACTIVITY">%1$s</xliff:g> មិនឆ្លើយតប។\n\nតើអ្នកចង់បិទវា?"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index d51e93e1ce04..14c8855c5f45 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ದುರದೃಷ್ಟವಶಾತ್, <xliff:g id="APPLICATION">%1$s</xliff:g> ಕೊನೆಗೊಂಡಿದೆ."</string> <string name="aerr_process" msgid="4507058997035697579">"ದುರದೃಷ್ಟವಶಾತ್, <xliff:g id="PROCESS">%1$s</xliff:g> ಪ್ರಕ್ರಿಯೆಯು ಕೊನೆಗೊಂಡಿದೆ."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ.\n\nನೀವು ಅದನ್ನು ಮುಚ್ಚಲು ಬಯಸುವಿರಾ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"ಚಟುವಟಿಕೆಯು <xliff:g id="ACTIVITY">%1$s</xliff:g> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ.\n\nನೀವು ಅದನ್ನು ಮುಚ್ಚಲು ಬಯಸುವಿರಾ?"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index b510bd3b79ce..19a5dacfd60b 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g>(이)가 중지되었습니다."</string> <string name="aerr_process" msgid="4507058997035697579">"<xliff:g id="PROCESS">%1$s</xliff:g> 프로세스가 중지되었습니다."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>이(가) 응답하지 않습니다.\n\n닫으시겠습니까?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g>이(가) 응답하지 않습니다.\n\n닫으시겠습니까?"</string> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index b6ea44e9bf66..1b6e428d2529 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -562,6 +562,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> манжасы"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <!-- no translation found for permlab_readSyncSettings (6201810008230503052) --> <skip /> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Колдонмого эсеп менен синхрондошуу тууралоолорун окуганга уруксат берет. Мисалы, Кишилер колдонмосу эсеп менен синхрондошкондугун аныктай алат."</string> @@ -1199,6 +1201,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Тилекке каршы, <xliff:g id="APPLICATION">%1$s</xliff:g> токтотулду."</string> <string name="aerr_process" msgid="4507058997035697579">"Тилекке каршы, <xliff:g id="PROCESS">%1$s</xliff:g> процесси токтотулду."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> жооп бербей жатат.\n\nЖабылсынбы?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> аракети жооп бербей жатат.\n\nЖабылсынбы?"</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 a5dbff51e551..3aee5de3eb23 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ຂໍອະໄພ, <xliff:g id="APPLICATION">%1$s</xliff:g> ຢຸດການເຮັດວຽກແລ້ວ."</string> <string name="aerr_process" msgid="4507058997035697579">"ຂໍອະໄພ, ໂປຣເຊສ <xliff:g id="PROCESS">%1$s</xliff:g> ໄດ້ຢຸດການເຮັດວຽກແລ້ວ."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ບໍ່ຕອບສະໜອງ. \n\nທ່ານຕ້ອງການປິດມັນບໍ່?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"ການເຮັດວຽກ <xliff:g id="ACTIVITY">%1$s</xliff:g> ບໍ່ຕອບສະໜອງ. \n\n ທ່ານຕ້ອງການທີ່ຈະປິດມັນບໍ່?"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 73159fe1f6cc..70bdcb8f6dea 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> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Deja, <xliff:g id="APPLICATION">%1$s</xliff:g> sustojo."</string> <string name="aerr_process" msgid="4507058997035697579">"Deja, <xliff:g id="PROCESS">%1$s</xliff:g> sustojo."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"„<xliff:g id="APPLICATION">%2$s</xliff:g>“ neatsako.\n\nAr norite ją uždaryti?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Veiksmas „<xliff:g id="ACTIVITY">%1$s</xliff:g>“ neatsako.\n\nAr norite jį uždaryti?"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index c58baafd66d5..1a3745f50792 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -435,6 +435,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. pirksts"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -901,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Diemžēl lietojumprogrammas <xliff:g id="APPLICATION">%1$s</xliff:g> darbība ir apturēta."</string> <string name="aerr_process" msgid="4507058997035697579">"Diemžēl process <xliff:g id="PROCESS">%1$s</xliff:g> ir apturēts."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Lietojumprogramma <xliff:g id="APPLICATION">%2$s</xliff:g> nereaģē.\n\nVai vēlaties to aizvērt?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Darbība <xliff:g id="ACTIVITY">%1$s</xliff:g> nereaģē.\n\nVai vēlaties to aizvērt?"</string> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index 127635c5c5e2..3408df7bda2f 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"За жал, <xliff:g id="APPLICATION">%1$s</xliff:g> запре."</string> <string name="aerr_process" msgid="4507058997035697579">"За жал, процесот <xliff:g id="PROCESS">%1$s</xliff:g> запре."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> не реагира.\n\nДали сакате да ја затворите?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Активноста <xliff:g id="ACTIVITY">%1$s</xliff:g> не реагира.\n\nДали сакате да ја затворите?"</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index fa597ccc7047..a615e3e1ca34 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"നിർഭാഗ്യവശാൽ, <xliff:g id="APPLICATION">%1$s</xliff:g> പ്രവർത്തനം നിർത്തി."</string> <string name="aerr_process" msgid="4507058997035697579">"നിർഭാഗ്യവശാൽ, <xliff:g id="PROCESS">%1$s</xliff:g> എന്ന പ്രോസസ്സ് നിർത്തി."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>, പ്രതികരിക്കുന്നില്ല.\n\nനിങ്ങൾക്കത് അടയ്ക്കണോ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> പ്രവർത്തനം പ്രതികരിക്കുന്നില്ല.\n\nനിങ്ങൾക്കത് അടയ്ക്കണോ?"</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 8bdacab13c3c..9aafcf1f32aa 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Харамсалтай, <xliff:g id="APPLICATION">%1$s</xliff:g> зогссон."</string> <string name="aerr_process" msgid="4507058997035697579">"Харамсалтай нь <xliff:g id="PROCESS">%1$s</xliff:g> процесс зогссон."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> хариу өгөхгүй байна.\n\nТа хаамаар байна уу?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> активити хариу өгөхгүй байна.\n\nТа энийг хаах уу?"</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index bffd1962cc2f..4a130eef0301 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"दुर्दैवाने, <xliff:g id="APPLICATION">%1$s</xliff:g> थांबला."</string> <string name="aerr_process" msgid="4507058997035697579">"दुर्दैवाने, प्रक्रिया <xliff:g id="PROCESS">%1$s</xliff:g> थांबली."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> प्रतिसाद देत नाही. \n\nआपण तो बंद करू इच्छिता?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> क्रियाकलाप प्रतिसाद देत नाही.\n\nआपण ती बंद करू इच्छिता?"</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index b4cc8b54fd0e..b951ba2dc4b3 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Malangnya, <xliff:g id="APPLICATION">%1$s</xliff:g> telah berhenti."</string> <string name="aerr_process" msgid="4507058997035697579">"Malangnya, proses <xliff:g id="PROCESS">%1$s</xliff:g> telah berhenti."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> tidak bertindak balas.\n\nAdakah anda mahu menutupnya?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviti <xliff:g id="ACTIVITY">%1$s</xliff:g> tidak bertindak balas. \n\n Adakah anda mahu menutupnya?"</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index e0ed55e5ec6e..46c2a457a994 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ဝမ်းနည်းစွာဖြင့်<xliff:g id="APPLICATION">%1$s</xliff:g>မှာ ရပ်ဆိုင်းသွားသည်။"</string> <string name="aerr_process" msgid="4507058997035697579">"ဝမ်းနည်းစွာဖြင့် လုပ်ဆောင်ချက်<xliff:g id="PROCESS">%1$s</xliff:g>မှာ ရပ်ဆိုင်းသွားသည်။"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> က မတုံ့ပြန်ပါ။ \n\n၎င်းကို သင် ပိတ်လိုပါသလား?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"လှုပ်ရှားမှု <xliff:g id="ACTIVITY">%1$s</xliff:g>က မတုံ့ပြန်ပါ။\n\n၎င်းကို သင် ပိတ်လိုပါသလား?"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 6caf26dc9643..67b9385f85dc 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> har dessverre stoppet."</string> <string name="aerr_process" msgid="4507058997035697579">"Prosessen <xliff:g id="PROCESS">%1$s</xliff:g> har dessverre stoppet."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> svarer ikke.\n\nVil du lukke appen?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> svarer ikke.\n\nVil du lukke den?"</string> @@ -950,7 +954,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 942a9879c0ec..496d4254ecaf 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> @@ -902,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"दुर्भाग्यवश, <xliff:g id="APPLICATION">%1$s</xliff:g> रोकिएको छ।"</string> <string name="aerr_process" msgid="4507058997035697579">"दुर्भाग्यवश, प्रक्रिया <xliff:g id="PROCESS">%1$s</xliff:g> बन्द भयो।"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>ले कार्य गरिरहेको छैन।\n\nके तपाईँ यसलाई बन्द गर्न चाहनु हुन्छ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"गतिविधि <xliff:g id="ACTIVITY">%1$s</xliff:g> ले प्रतिक्रिया देखाइरहेको छैन।\n\nके तपाईं यसलाई बन्द गर्न चाहनु हुन्छ?"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 8e4bd6dbce0d..e9c9ba2d87ab 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> is gestopt."</string> <string name="aerr_process" msgid="4507058997035697579">"Het proces <xliff:g id="PROCESS">%1$s</xliff:g> is gestopt."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> reageert niet.\n\nWilt u deze app sluiten?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activiteit <xliff:g id="ACTIVITY">%1$s</xliff:g> reageert niet.\n\nWilt u deze activiteit sluiten?"</string> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index 94c7a28426f6..faafe8599878 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ਅਫ਼਼ਸੋਸ ਨਾਲ, <xliff:g id="APPLICATION">%1$s</xliff:g> ਰੁਕ ਗਈ ਹੈ।"</string> <string name="aerr_process" msgid="4507058997035697579">"ਅਫ਼਼ਸੋਸ ਨਾਲ, ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROCESS">%1$s</xliff:g> ਰੁਕ ਗਈ ਹੈ।"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਿਹਾ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"ਗਤੀਵਿਧੀ <xliff:g id="ACTIVITY">%1$s</xliff:g> ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੀ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d17c1fa80936..070ba9d1c504 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> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Niestety, aplikacja <xliff:g id="APPLICATION">%1$s</xliff:g> została zatrzymana."</string> <string name="aerr_process" msgid="4507058997035697579">"Niestety, proces <xliff:g id="PROCESS">%1$s</xliff:g> został zatrzymany."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikacja <xliff:g id="APPLICATION">%2$s</xliff:g> nie reaguje.\n\nCzy chcesz ją zamknąć?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Działanie <xliff:g id="ACTIVITY">%1$s</xliff:g> nie odpowiada.\n\nCzy chcesz je zakończyć?"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 1b517a3d878a..41dd5e2a8dac 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"O <xliff:g id="APPLICATION">%1$s</xliff:g> parou."</string> <string name="aerr_process" msgid="4507058997035697579">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> parou."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> não está respondendo.\n\nDeseja fechá-lo?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> não está respondendo.\n\nDeseja fechá-la?"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 1390f4c3c69b..ff741f62c25c 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Lamentamos, o <xliff:g id="APPLICATION">%1$s</xliff:g> foi interrompido."</string> <string name="aerr_process" msgid="4507058997035697579">"Lamentamos, o processo <xliff:g id="PROCESS">%1$s</xliff:g> foi interrompido."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> não está a responder. \n\nPretende fechá-la?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> não está a responder. \n\n Pretende fechá-la?"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 1b517a3d878a..41dd5e2a8dac 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"O <xliff:g id="APPLICATION">%1$s</xliff:g> parou."</string> <string name="aerr_process" msgid="4507058997035697579">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> parou."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> não está respondendo.\n\nDeseja fechá-lo?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> não está respondendo.\n\nDeseja fechá-la?"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index b147a283a4b6..1da95b323797 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,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Degetul <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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 +497,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 +518,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"> @@ -901,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Din păcate, <xliff:g id="APPLICATION">%1$s</xliff:g> s-a oprit."</string> <string name="aerr_process" msgid="4507058997035697579">"Din păcate, procesul <xliff:g id="PROCESS">%1$s</xliff:g> s-a oprit."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplicaţia <xliff:g id="APPLICATION">%2$s</xliff:g> nu răspunde.\n\nDoriţi să o închideţi?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activitatea <xliff:g id="ACTIVITY">%1$s</xliff:g> nu răspunde.\n\nDoriţi să o închideţi?"</string> @@ -932,7 +936,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> @@ -1236,7 +1240,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> @@ -1276,7 +1280,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 b82d93f703b1..7d2dd4ee3b55 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -436,6 +436,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Палец <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Просмотр настроек синхронизации"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Приложение сможет просматривать настройки синхронизации аккаунта, например определять, включена ли синхронизация для приложения \"Контакты\"."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Включение/выключение синхронизации"</string> @@ -906,6 +908,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"В приложении \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" произошла ошибка."</string> <string name="aerr_process" msgid="4507058997035697579">"В приложении \"<xliff:g id="PROCESS">%1$s</xliff:g>\" произошла ошибка."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Приложение \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" не отвечает.\n\nЗакрыть его?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Приложение \"<xliff:g id="ACTIVITY">%1$s</xliff:g>\" не отвечает.\n\nЗакрыть его?"</string> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 3039925eb773..762b8e95c6c9 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> @@ -898,6 +899,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"අවාසනාවන්ත ලෙස <xliff:g id="APPLICATION">%1$s</xliff:g> නැවතී ඇත."</string> <string name="aerr_process" msgid="4507058997035697579">"අවාසනාවන්ත ලෙස, <xliff:g id="PROCESS">%1$s</xliff:g> ක්රියාවලිය නතර විණි."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ප්රතිචාර නොදක්වයි.\n\nඔබට එය නතර කිරීමට අවශ්යද?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ක්රියාකාරකම ප්රතිචාර නොදක්වයි.\n\nඑය වසා දැමීමට ඔබට අවශ්යද?"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index fd3a640ffd01..0d482e116b64 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> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Aplikácia <xliff:g id="APPLICATION">%1$s</xliff:g> bohužiaľ prestala pracovať."</string> <string name="aerr_process" msgid="4507058997035697579">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> bohužiaľ prestal pracovať."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikácia <xliff:g id="APPLICATION">%2$s</xliff:g> neodpovedá.\n\nChcete ju zavrieť?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivita <xliff:g id="ACTIVITY">%1$s</xliff:g> neodpovedá.\n\nChcete ju zavrieť?"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 017f96e2523c..bb143295ae18 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> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Žal se je aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> ustavila."</string> <string name="aerr_process" msgid="4507058997035697579">"Žal se je postopek <xliff:g id="PROCESS">%1$s</xliff:g> ustavil."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikacija <xliff:g id="APPLICATION">%2$s</xliff:g> se ne odziva.\n\nAli jo želite zapreti?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Dejavnost <xliff:g id="ACTIVITY">%1$s</xliff:g> se ne odziva.\n\nAli jo želite zapreti?"</string> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 89f5e5ed5b4d..d5c4e82de612 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Fatkeqësisht, <xliff:g id="APPLICATION">%1$s</xliff:g> ka ndaluar."</string> <string name="aerr_process" msgid="4507058997035697579">"Fatkeqësisht, procesi <xliff:g id="PROCESS">%1$s</xliff:g> ka ndaluar."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> nuk po përgjigjet.\n\nDëshiron ta mbyllësh?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviteti <xliff:g id="ACTIVITY">%1$s</xliff:g> nuk përgjigjet.\n\nDëshiron ta mbyllësh?"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index feb7eedcb7e4..a29faa3d88da 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -435,6 +435,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"читање подешавања синхронизације"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Дозвољава апликацији да чита подешавања синхронизације за налог. На пример, овако може да се утврди да ли је апликација Људи синхронизована са налогом."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"укључивање и искључивање синхронизације"</string> @@ -901,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Нажалост, апликација <xliff:g id="APPLICATION">%1$s</xliff:g> је престала с радом."</string> <string name="aerr_process" msgid="4507058997035697579">"Нажалост, процес <xliff:g id="PROCESS">%1$s</xliff:g> је заустављен."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> не реагује.\n\nДа ли желите да је затворите?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Активност <xliff:g id="ACTIVITY">%1$s</xliff:g> не рeагује.\n\nДа ли желите да је затворите?"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 3673e35d5636..4986d8241deb 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> har tyvärr stoppats."</string> <string name="aerr_process" msgid="4507058997035697579">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> har tyvärr stoppats."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> svarar inte.\n\nVill du stänga den?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> svarar inte.\n \nVill du stänga den?"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index f92b385273a1..0ce1e537e392 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> @@ -898,6 +899,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Kwa bahati mbaya, <xliff:g id="APPLICATION">%1$s</xliff:g> imeacha kufanya kazi."</string> <string name="aerr_process" msgid="4507058997035697579">"Kwa bahati mbaya, mchakato wa <xliff:g id="PROCESS">%1$s</xliff:g> umekoma."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> haifanyi kazi.\n\nUnataka kuifunga?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Shughuli ya <xliff:g id="ACTIVITY">%1$s</xliff:g> haifanyi kazi.\n\nJe, ungependa kuifunga?"</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 f92393c01868..c548188f996e 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"துரதிருஷ்டவசமாக, <xliff:g id="APPLICATION">%1$s</xliff:g> நிறுத்தப்பட்டது."</string> <string name="aerr_process" msgid="4507058997035697579">"துரதிருஷ்டவசமாக, <xliff:g id="PROCESS">%1$s</xliff:g> செயல்முறை நிறுத்தப்பட்டது."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> பதிலளிக்கவில்லை.\n\nஇதை மூட விருப்பமா?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> செயல்பாடு பதிலளிக்கவில்லை.\n\nஇதை மூடவா?"</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 5df96d4fd186..8dd6070a2555 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"దురదృష్టవశాత్తూ, <xliff:g id="APPLICATION">%1$s</xliff:g> ఆపివేయబడింది."</string> <string name="aerr_process" msgid="4507058997035697579">"దురదృష్టవశాత్తూ, ప్రక్రియ <xliff:g id="PROCESS">%1$s</xliff:g> ఆపివేయబడింది."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ప్రతిస్పందించలేదు.\n\nమీరు దీన్ని మూసివేయాలనుకుంటున్నారా?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> కార్యాచరణ ప్రతిస్పందించలేదు.\n\nమీరు దీన్ని మూసివేయాలనుకుంటున్నారా?"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index dc8936a979e0..8e51472261b7 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ขออภัย <xliff:g id="APPLICATION">%1$s</xliff:g> หยุดการทำงานแล้ว"</string> <string name="aerr_process" msgid="4507058997035697579">"ขออภัย กระบวนการ <xliff:g id="PROCESS">%1$s</xliff:g> หยุดการทำงานแล้ว"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ไม่ตอบสนอง\n\nคุณต้องการปิดหรือไม่"</string> <string name="anr_activity_process" msgid="5776209883299089767">"กิจกรรม <xliff:g id="ACTIVITY">%1$s</xliff:g> ไม่ตอบสนอง\n\nคุณต้องการปิดหรือไม่"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index c8e452af68e5..3a5f7d7277f2 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Sa kasamaang palad, huminto ang <xliff:g id="APPLICATION">%1$s</xliff:g>."</string> <string name="aerr_process" msgid="4507058997035697579">"Sa kasamaang palad, nahinto ang prosesong <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Hindi tumutugon ang <xliff:g id="APPLICATION">%2$s</xliff:g>.\n\nNais mo ba itong isara?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Hindi tumutugon ang aktibidad na <xliff:g id="ACTIVITY">%1$s</xliff:g>.\n\nNais mo ba itong isara?"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 30107cbbf2a4..eaf0d3e35e97 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. parmak"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Maalesef <xliff:g id="APPLICATION">%1$s</xliff:g> durdu."</string> <string name="aerr_process" msgid="4507058997035697579">"Maalesef <xliff:g id="PROCESS">%1$s</xliff:g> işlemi durdu."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> yanıt vermiyor.\n\nKapatmak ister misiniz?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> yanıt vermiyor.\n\nKapatmak ister misiniz?"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 8ce102b82938..70c366b4d560 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> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"На жаль, програма <xliff:g id="APPLICATION">%1$s</xliff:g> припинила роботу."</string> <string name="aerr_process" msgid="4507058997035697579">"На жаль, програма <xliff:g id="PROCESS">%1$s</xliff:g> припинила роботу."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Програма <xliff:g id="APPLICATION">%2$s</xliff:g> не відповідає.\n\nЗакрити її?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Дія <xliff:g id="ACTIVITY">%1$s</xliff:g> не відповідає.\n\nЗакінчити її?"</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index a1a08e383908..68b49f581dba 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"انگلی <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"مطابقت پذیری کی ترتیبات پڑھیں"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ایپ کو کسی اکاؤنٹ کیلئے مطابقت پذیری کی ترتیبات پڑھنے کی اجازت دیتا ہے۔ مثلا، یہ تعین کرسکتا ہے کہ آیا People ایپ کسی اکاؤنٹ کے ساتھ مطابقت پذیر ہے۔"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"مطابقت پذیری آن اور آف ٹوگل کریں"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"بدقسمتی سے، <xliff:g id="APPLICATION">%1$s</xliff:g> بند ہو گیا۔"</string> <string name="aerr_process" msgid="4507058997035697579">"بدقسمتی سے، کارروائی <xliff:g id="PROCESS">%1$s</xliff:g> بند ہو گئی۔"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> جواب نہیں دے رہی ہے۔ \n\nکیا آپ اسے بند کرنا چاہتے ہیں؟"</string> <string name="anr_activity_process" msgid="5776209883299089767">"سرگرمی <xliff:g id="ACTIVITY">%1$s</xliff:g> جواب نہیں دے رہی ہے۔ \n\nکیا آپ اسے بند کرنا چاہتے ہیں؟"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index dab2876d8a74..4d5573f32702 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,8 @@ <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> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <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 +675,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> @@ -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> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Baxtga qarshi, <xliff:g id="APPLICATION">%1$s</xliff:g> to‘xtatildi."</string> <string name="aerr_process" msgid="4507058997035697579">"Baxtga qarshi, <xliff:g id="PROCESS">%1$s</xliff:g> jarayoni to‘xtatildi."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> javob bermayapti.\n\nUni yopishni xohlaysizmi?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> harakati javob bermayapti.\n\nUni yopishni xohlaysizmi?"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 11d05de1909c..062b2104ac61 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Rất tiếc, <xliff:g id="APPLICATION">%1$s</xliff:g> đã dừng lại."</string> <string name="aerr_process" msgid="4507058997035697579">"Rất tiếc, quá trình <xliff:g id="PROCESS">%1$s</xliff:g> đã dừng lại."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> hiện không phản hồi.\n\nBạn có muốn đóng ứng dụng này không?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Hoạt động <xliff:g id="ACTIVITY">%1$s</xliff:g> không phản hồi.\n\nBạn có muốn đóng ứng dụng này không?"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 36eadaee44ad..72a77364c071 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"很抱歉,“<xliff:g id="APPLICATION">%1$s</xliff:g>”已停止运行。"</string> <string name="aerr_process" msgid="4507058997035697579">"抱歉,进程“<xliff:g id="PROCESS">%1$s</xliff:g>”已停止运行。"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>无响应。\n\n要将其关闭吗?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g>活动无响应。\n\n要将其关闭吗?"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index eaeb36dce29e..f3665486f6b8 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"抱歉,<xliff:g id="APPLICATION">%1$s</xliff:g>已停止操作。"</string> <string name="aerr_process" msgid="4507058997035697579">"很抱歉,處理程序 <xliff:g id="PROCESS">%1$s</xliff:g> 已停止。"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> 沒有回應。\n\n您要結束嗎?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"活動 <xliff:g id="ACTIVITY">%1$s</xliff:g> 沒有回應。\n\n您要結束嗎?"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 34bde57123fd..e296fa5f16c8 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"很抱歉,<xliff:g id="APPLICATION">%1$s</xliff:g>已停止運作。"</string> <string name="aerr_process" msgid="4507058997035697579">"很抱歉,處理程序 <xliff:g id="PROCESS">%1$s</xliff:g> 已停止。"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> 沒有回應。\n\n您要結束嗎?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> 活動沒有回應。\n\n您要結束嗎?"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index f9eaea46186c..e5ef6950f9db 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> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Ngeshwa, <xliff:g id="APPLICATION">%1$s</xliff:g> kumile."</string> <string name="aerr_process" msgid="4507058997035697579">"Ngeshwa, uhlelo <xliff:g id="PROCESS">%1$s</xliff:g> luvele lwama."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ayiphenduli.\n\nIngabe ufuna ukuyivala?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Uhlelo <xliff:g id="ACTIVITY">%1$s</xliff:g> aluphenduli.\n\nIngabe ufuna ukuluvala?"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 9260964f2f8e..aa15b5a2bbd9 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1479,7 +1479,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/strings.xml b/core/res/res/values/strings.xml index 198cc1af2b67..7cdad4b1b110 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 091868b34e40..5303d5fcbebe 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2294,6 +2294,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/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 73caf683ff3c..7bcc7f903964 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -215,7 +215,9 @@ public class Canvas { } /** @hide */ - public void setHighContrastText(boolean highContrastText) {} + public void setHighContrastText(boolean highContrastText) { + native_setHighContrastText(mNativeCanvasWrapper, highContrastText); + } /** @hide */ public void insertReorderBarrier() {} @@ -1974,6 +1976,7 @@ public class Canvas { private static native void native_setBitmap(long canvasHandle, Bitmap bitmap); private static native boolean native_isOpaque(long canvasHandle); + private static native void native_setHighContrastText(long renderer, boolean highContrastText); private static native int native_getWidth(long canvasHandle); private static native int native_getHeight(long canvasHandle); diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 62aabb13858d..4f9af7f83fb1 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -47,7 +47,7 @@ namespace android { -#ifdef HAVE_WINSOCK +#if defined(_WIN32) #undef nhtol #undef htonl #define ntohl(x) ( ((x) << 24) | (((x) >> 24) & 255) | (((x) << 8) & 0xff0000) | (((x) >> 8) & 0xff00) ) diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h index 116bc56bfe4d..a0b87f9cadb6 100644 --- a/libs/hwui/Canvas.h +++ b/libs/hwui/Canvas.h @@ -62,6 +62,9 @@ public: virtual int width() = 0; virtual int height() = 0; + virtual void setHighContrastText(bool highContrastText) = 0; + virtual bool isHighContrastText() = 0; + // ---------------------------------------------------------------------------- // Canvas state operations // ---------------------------------------------------------------------------- diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp index 74189aabbc87..c48b070819a4 100644 --- a/libs/hwui/DisplayListCanvas.cpp +++ b/libs/hwui/DisplayListCanvas.cpp @@ -437,16 +437,6 @@ void DisplayListCanvas::drawPosText(const uint16_t* text, const float* positions addDrawOp(op); } -static void simplifyPaint(int color, SkPaint* paint) { - paint->setColor(color); - paint->setShader(nullptr); - paint->setColorFilter(nullptr); - paint->setLooper(nullptr); - paint->setStrokeWidth(4 + 0.04 * paint->getTextSize()); - paint->setStrokeJoin(SkPaint::kRound_Join); - paint->setLooper(nullptr); -} - void DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions, int count, const SkPaint& paint, float x, float y, float boundsLeft, float boundsTop, float boundsRight, float boundsBottom, @@ -459,31 +449,9 @@ void DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions, positions = refBuffer<float>(positions, count * 2); Rect bounds(boundsLeft, boundsTop, boundsRight, boundsBottom); - if (CC_UNLIKELY(mHighContrastText)) { - // high contrast draw path - int color = paint.getColor(); - int channelSum = SkColorGetR(color) + SkColorGetG(color) + SkColorGetB(color); - bool darken = channelSum < (128 * 3); - - // outline - SkPaint* outlinePaint = copyPaint(&paint); - simplifyPaint(darken ? SK_ColorWHITE : SK_ColorBLACK, outlinePaint); - outlinePaint->setStyle(SkPaint::kStrokeAndFill_Style); - addDrawOp(new (alloc()) DrawTextOp(text, bytesCount, count, - x, y, positions, outlinePaint, totalAdvance, bounds)); // bounds? - - // inner - SkPaint* innerPaint = copyPaint(&paint); - simplifyPaint(darken ? SK_ColorBLACK : SK_ColorWHITE, innerPaint); - innerPaint->setStyle(SkPaint::kFill_Style); - addDrawOp(new (alloc()) DrawTextOp(text, bytesCount, count, - x, y, positions, innerPaint, totalAdvance, bounds)); - } else { - // standard draw path - DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, - x, y, positions, refPaint(&paint), totalAdvance, bounds); - addDrawOp(op); - } + DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, + x, y, positions, refPaint(&paint), totalAdvance, bounds); + addDrawOp(op); } void DisplayListCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) { diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h index 28954d1bba70..f3f5713bbc3f 100644 --- a/libs/hwui/DisplayListCanvas.h +++ b/libs/hwui/DisplayListCanvas.h @@ -101,10 +101,6 @@ public: // TODO: rename for consistency void callDrawGLFunction(Functor* functor); - void setHighContrastText(bool highContrastText) { - mHighContrastText = highContrastText; - } - // ---------------------------------------------------------------------------- // CanvasStateClient interface // ---------------------------------------------------------------------------- @@ -125,6 +121,11 @@ public: virtual int width() override { return mState.getWidth(); } virtual int height() override { return mState.getHeight(); } + virtual void setHighContrastText(bool highContrastText) override { + mHighContrastText = highContrastText; + } + virtual bool isHighContrastText() override { return mHighContrastText; } + // ---------------------------------------------------------------------------- // android/graphics/Canvas state operations // ---------------------------------------------------------------------------- @@ -304,16 +305,6 @@ private: return cachedPaint; } - inline SkPaint* copyPaint(const SkPaint* paint) { - if (!paint) return nullptr; - - SkPaint* returnPaint = new SkPaint(*paint); - std::unique_ptr<const SkPaint> copy(returnPaint); - mDisplayListData->paints.push_back(std::move(copy)); - - return returnPaint; - } - inline const SkRegion* refRegion(const SkRegion* region) { if (!region) { return region; diff --git a/libs/hwui/Outline.h b/libs/hwui/Outline.h index c98932cf095e..8d4d4f085f98 100644 --- a/libs/hwui/Outline.h +++ b/libs/hwui/Outline.h @@ -33,13 +33,29 @@ public: , mAlpha(0.0f) {} void setRoundRect(int left, int top, int right, int bottom, float radius, float alpha) { + mAlpha = alpha; + if (mType == kOutlineType_RoundRect + && left == mBounds.left + && right == mBounds.right + && top == mBounds.top + && bottom == mBounds.bottom + && radius == mRadius) { + // nothing to change, don't do any work + return; + } + mType = kOutlineType_RoundRect; mBounds.set(left, top, right, bottom); mRadius = radius; + + // update mPath to reflect new outline mPath.reset(); - mPath.addRoundRect(SkRect::MakeLTRB(left, top, right, bottom), - radius, radius); - mAlpha = alpha; + if (MathUtils::isPositive(radius)) { + mPath.addRoundRect(SkRect::MakeLTRB(left, top, right, bottom), + radius, radius); + } else { + mPath.addRect(left, top, right, bottom); + } } void setConvexPath(const SkPath* outline, float alpha) { diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 971b53aaf198..77079b7bb788 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -55,6 +55,11 @@ public: virtual int width() override; virtual int height() override; + virtual void setHighContrastText(bool highContrastText) override { + mHighContrastText = highContrastText; + } + virtual bool isHighContrastText() override { return mHighContrastText; } + virtual int getSaveCount() const override; virtual int save(SkCanvas::SaveFlags flags) override; virtual void restore() override; @@ -135,6 +140,8 @@ private: SkCanvas::SaveFlags saveFlags; }; + bool mHighContrastText = false; + void recordPartialSave(SkCanvas::SaveFlags flags); void saveClipsForFrame(SkTArray<SkClipStack::Element>& clips, int frameSaveCount); void applyClips(const SkTArray<SkClipStack::Element>& clips); diff --git a/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java b/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java index a725dfd04438..a962abdbc918 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java +++ b/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java @@ -16,6 +16,7 @@ package com.android.documentsui; +import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkState; @@ -26,9 +27,12 @@ import android.util.Log; import android.util.SparseBooleanArray; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; +import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import com.android.internal.util.Preconditions; + import com.google.common.annotations.VisibleForTesting; import java.util.ArrayList; @@ -43,9 +47,11 @@ public final class MultiSelectManager { private static final boolean DEBUG = false; private final Selection mSelection = new Selection(); + // Only created when selection is cleared. private Selection mIntermediateSelection; + private Ranger mRanger; private final List<MultiSelectManager.Callback> mCallbacks = new ArrayList<>(1); private Adapter<?> mAdapter; @@ -213,6 +219,8 @@ public final class MultiSelectManager { * Clears the selection. */ public void clearSelection() { + mRanger = null; + if (mSelection.isEmpty()) { return; } @@ -238,7 +246,7 @@ public final class MultiSelectManager { return false; } - return onSingleTapUp(mHelper.findEventPosition(e)); + return onSingleTapUp(mHelper.findEventPosition(e), e.getMetaState()); } /** @@ -246,11 +254,12 @@ public final class MultiSelectManager { * can be mocked. * * @param position + * @param metaState as returned from {@link MotionEvent#getMetaState()}. * @return true if the event was consumed. * @hide */ @VisibleForTesting - boolean onSingleTapUp(int position) { + boolean onSingleTapUp(int position, int metaState) { if (mSelection.isEmpty()) { return false; } @@ -261,10 +270,18 @@ public final class MultiSelectManager { return true; } - toggleSelection(position); + if (isShiftPressed(metaState) && mRanger != null) { + mRanger.snapSelection(position); + } else { + toggleSelection(position); + } return true; } + private static boolean isShiftPressed(int metaState) { + return (metaState & KeyEvent.META_SHIFT_ON) != 0; + } + private void onLongPress(MotionEvent e) { if (DEBUG) Log.d(TAG, "Handling long press event."); @@ -273,7 +290,7 @@ public final class MultiSelectManager { if (DEBUG) Log.i(TAG, "View is null. Cannot handle tap event."); } - toggleSelection(position); + onLongPress(position); } /** @@ -292,22 +309,87 @@ public final class MultiSelectManager { toggleSelection(position); } - private void toggleSelection(int position) { + /** + * Toggles the selection state at position. If an item does end up selected + * a new Ranger (range selection manager) at that point is created. + * + * @param position + * @return True if state changed. + */ + private boolean toggleSelection(int position) { // Position may be special "no position" during certain // transitional phases. If so, skip handling of the event. if (position == RecyclerView.NO_POSITION) { if (DEBUG) Log.d(TAG, "Ignoring toggle for element with no position."); - return; + return false; } - if (DEBUG) Log.d(TAG, "Handling long press on view: " + position); - boolean nextState = !mSelection.contains(position); - if (notifyBeforeItemStateChange(position, nextState)) { - boolean selected = mSelection.flip(position); - notifyItemStateChanged(position, selected); - if (DEBUG) Log.d(TAG, "Selection after long press: " + mSelection); + if (mSelection.contains(position)) { + return attemptDeselect(position); + } else { + boolean selected = attemptSelect(position); + // Here we're already in selection mode. In that case + // When a simple click/tap (without SHIFT) creates causes + // an item to be selected. + // By recreating Ranger at this point, we allow the user to create + // multiple separate contiguous ranges with SHIFT+Click & Click. + if (selected) { + mRanger = new Ranger(position); + } + return selected; + } + } + + /** + * Try to select all elements in range. Not that callbacks can cancel selection + * of specific items, so some or even all items may not reflect the desired + * state after the update is complete. + * + * @param begin inclusive + * @param end inclusive + * @param selected + */ + private void updateRange(int begin, int end, boolean selected) { + checkState(end >= begin); + if (DEBUG) Log.i(TAG, String.format("Updating range begin=%d, end=%d, selected=%b.", begin, end, selected)); + for (int i = begin; i <= end; i++) { + if (selected) { + attemptSelect(i); + } else { + attemptDeselect(i); + } + } + } + + /** + * @param position + * @return True if the update was applied. + */ + private boolean attemptSelect(int position) { + if (notifyBeforeItemStateChange(position, true)) { + mSelection.add(position); + notifyItemStateChanged(position, true); + if (DEBUG) Log.d(TAG, "Selection after select: " + mSelection); + return true; + } else { + if (DEBUG) Log.d(TAG, "Select cancelled by listener."); + return false; + } + } + + /** + * @param position + * @return True if the update was applied. + */ + private boolean attemptDeselect(int position) { + if (notifyBeforeItemStateChange(position, false)) { + mSelection.remove(position); + notifyItemStateChanged(position, false); + if (DEBUG) Log.d(TAG, "Selection after deselect: " + mSelection); + return true; } else { - Log.i(TAG, "Selection change cancelled by listener."); + if (DEBUG) Log.d(TAG, "Select cancelled by listener."); + return false; } } @@ -336,6 +418,106 @@ public final class MultiSelectManager { } /** + * Class providing support for managing range selections. + */ + private final class Ranger { + private static final int UNDEFINED = -1; + + final int mBegin; + int mEnd = UNDEFINED; + + public Ranger(int begin) { + if (DEBUG) Log.d(TAG, String.format("New Ranger(%d) created.", begin)); + mBegin = begin; + } + + void snapSelection(int position) { + checkState(mRanger != null); + checkArgument(position != RecyclerView.NO_POSITION); + + if (mEnd == UNDEFINED || mEnd == mBegin) { + // Reset mEnd so it can be established in establishRange. + mEnd = UNDEFINED; + establishRange(position); + } else { + reviseRange(position); + } + } + + private void establishRange(int position) { + checkState(mRanger.mEnd == UNDEFINED); + + if (position == mBegin) { + mEnd = position; + } + + if (position > mBegin) { + updateRange(mBegin + 1, position, true); + } else if (position < mBegin) { + updateRange(position, mBegin - 1, true); + } + + mEnd = position; + } + + private void reviseRange(int position) { + checkState(mEnd != UNDEFINED); + checkState(mBegin != mEnd); + + if (position == mEnd) { + if (DEBUG) Log.i(TAG, "Skipping no-op revision click on mEndRange."); + } + + if (mEnd > mBegin) { + reviseAscendingRange(position); + } else if (mEnd < mBegin) { + reviseDescendingRange(position); + } + // the "else" case is covered by checkState at beginning of method. + + mEnd = position; + } + + /** + * Updates an existing ascending seleciton. + * @param position + */ + private void reviseAscendingRange(int position) { + // Reducing or reversing the range.... + if (position < mEnd) { + if (position < mBegin) { + updateRange(mBegin + 1, mEnd, false); + updateRange(position, mBegin -1, true); + } else { + updateRange(position + 1, mEnd, false); + } + } + + // Extending the range... + else if (position > mEnd) { + updateRange(mEnd + 1, position, true); + } + } + + private void reviseDescendingRange(int position) { + // Reducing or reversing the range.... + if (position > mEnd) { + if (position > mBegin) { + updateRange(mEnd, mBegin - 1, false); + updateRange(mBegin + 1, position, true); + } else { + updateRange(mEnd, position - 1, false); + } + } + + // Extending the range... + else if (position < mEnd) { + updateRange(position, mEnd - 1, true); + } + } + } + + /** * Object representing the current selection. Provides read only access * public access, and private write access. */ diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManagerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManagerTest.java index 20fb07eaedf5..aabec9abcaab 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManagerTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManagerTest.java @@ -19,6 +19,7 @@ package com.android.documentsui; import static org.junit.Assert.*; import android.support.v7.widget.RecyclerView; +import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -78,34 +79,92 @@ public class MultiSelectManagerTest { @Test public void singleTapUp_DoesNotSelectBeforeLongPress() { - mManager.onSingleTapUp(99); + mManager.onSingleTapUp(99, 0); assertSelection(); } @Test public void singleTapUp_UnselectsSelectedItem() { mManager.onLongPress(7); - mManager.onSingleTapUp(7); + mManager.onSingleTapUp(7, 0); assertSelection(); } @Test public void singleTapUp_NoPositionClearsSelection() { mManager.onLongPress(7); - mManager.onSingleTapUp(11); - mManager.onSingleTapUp(RecyclerView.NO_POSITION); + mManager.onSingleTapUp(11, 0); + mManager.onSingleTapUp(RecyclerView.NO_POSITION, 0); assertSelection(); } @Test public void singleTapUp_ExtendsSelection() { mManager.onLongPress(99); - mManager.onSingleTapUp(7); - mManager.onSingleTapUp(13); - mManager.onSingleTapUp(129899); + mManager.onSingleTapUp(7, 0); + mManager.onSingleTapUp(13, 0); + mManager.onSingleTapUp(129899, 0); assertSelection(7, 99, 13, 129899); } + @Test + public void singleTapUp_ShiftCreatesRangeSelection() { + mManager.onLongPress(7); + mManager.onSingleTapUp(17, KeyEvent.META_SHIFT_ON); + assertRangeSelection(7, 17); + } + + @Test + public void singleTapUp_ShiftCreatesRangeSeletion_Backwards() { + mManager.onLongPress(17); + mManager.onSingleTapUp(7, KeyEvent.META_SHIFT_ON); + assertRangeSelection(7, 17); + } + + @Test + public void singleTapUp_SecondShiftClickExtendsSelection() { + mManager.onLongPress(7); + mManager.onSingleTapUp(11, KeyEvent.META_SHIFT_ON); + mManager.onSingleTapUp(17, KeyEvent.META_SHIFT_ON); + assertRangeSelection(7, 17); + } + + @Test + public void singleTapUp_MultipleContiguousRangesSelected() { + mManager.onLongPress(7); + mManager.onSingleTapUp(11, KeyEvent.META_SHIFT_ON); + mManager.onSingleTapUp(20, 0); + mManager.onSingleTapUp(25, KeyEvent.META_SHIFT_ON); + assertRangeSelected(7, 11); + assertRangeSelected(20, 25); + assertSelectionSize(11); + } + + @Test + public void singleTapUp_ShiftReducesSelectionRange_FromPreviousShiftClick() { + mManager.onLongPress(7); + mManager.onSingleTapUp(17, KeyEvent.META_SHIFT_ON); + mManager.onSingleTapUp(10, KeyEvent.META_SHIFT_ON); + assertRangeSelection(7, 10); + } + + @Test + public void singleTapUp_ShiftReducesSelectionRange_FromPreviousShiftClick_Backwards() { + mManager.onLongPress(17); + mManager.onSingleTapUp(7, KeyEvent.META_SHIFT_ON); + mManager.onSingleTapUp(14, KeyEvent.META_SHIFT_ON); + assertRangeSelection(14, 17); + } + + + @Test + public void singleTapUp_ShiftReversesSelectionDirection() { + mManager.onLongPress(7); + mManager.onSingleTapUp(17, KeyEvent.META_SHIFT_ON); + mManager.onSingleTapUp(0, KeyEvent.META_SHIFT_ON); + assertRangeSelection(0, 7); + } + private void assertSelected(int... expected) { for (int i = 0; i < expected.length; i++) { Selection selection = mManager.getSelection(); @@ -120,9 +179,20 @@ public class MultiSelectManagerTest { assertSelected(expected); } + private void assertRangeSelected(int begin, int end) { + for (int i = begin; i <= end; i++) { + assertSelected(i); + } + } + + private void assertRangeSelection(int begin, int end) { + assertSelectionSize(end - begin + 1); + assertRangeSelected(begin, end); + } + private void assertSelectionSize(int expected) { Selection selection = mManager.getSelection(); - assertEquals(expected, selection.size()); + assertEquals(selection.toString(), expected, selection.size()); } private static final class EventHelper implements RecyclerViewHelper { diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/UnitTests.java b/packages/DocumentsUI/tests/src/com/android/documentsui/UnitTests.java new file mode 100644 index 000000000000..4ffe799119ec --- /dev/null +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/UnitTests.java @@ -0,0 +1,45 @@ +/* + * 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. + */ + +package com.android.documentsui; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ + MultiSelectManager_SelectionTest.class, + MultiSelectManagerTest.class +}) + +/** + * This test suite can be run using the "art" runtime (which can be built + * via the `build-art-host` target.) You'll also need to "mma -j32" the + * DocumentsUI package to ensure all deps are built. + * + * <p>Once the dependencies have been built, the tests can be executed as follows: + * + * <pre> + * CP=$OUT/system/framework/framework.jar:\ + * $OUT/system/framework/core-junit.jar:\ + * $OUT/system/app/DocumentsUI/DocumentsUI.apk:\ + * $OUT/data/app/DocumentsUITests/DocumentsUITests.apk + * + * art -cp $CP org.junit.runner.JUnitCore com.android.documentsui.UnitTests + * </pre> + */ +public class UnitTests {} 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 14c8a2cec89b..41b1059222fa 100644 --- a/packages/Keyguard/res/values/strings.xml +++ b/packages/Keyguard/res/values/strings.xml @@ -109,7 +109,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/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 29aca54d8cca..3670683b23f2 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -381,9 +381,7 @@ 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) { diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index ad18dd95608f..b86b2e2fb2b5 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -28,61 +28,62 @@ import java.io.IOException; @SmallTest public class MtpDocumentsProviderTest extends AndroidTestCase { - public void testOpenAndCloseDevice() throws Exception { - final ContentResolver resolver = new ContentResolver(); - final MtpDocumentsProvider provider = new MtpDocumentsProvider(); - final MtpManagerMock mtpManager = new MtpManagerMock(getContext()); - mtpManager.addValidDevice(0); - provider.onCreateForTesting(mtpManager, resolver); + private ContentResolver mResolver; + private MtpDocumentsProvider mProvider; + private MtpManagerMock mMtpManager; + + @Override + public void setUp() { + mResolver = new ContentResolver(); + mMtpManager = new MtpManagerMock(getContext()); + mProvider = new MtpDocumentsProvider(); + mProvider.onCreateForTesting(mMtpManager, mResolver); + } - assertEquals(0, resolver.changeCount); + public void testOpenAndCloseDevice() throws Exception { + mMtpManager.addValidDevice(0); + assertEquals(0, mResolver.changeCount); - provider.openDevice(0); - assertEquals(1, resolver.changeCount); + mProvider.openDevice(0); + assertEquals(1, mResolver.changeCount); - provider.closeDevice(0); - assertEquals(2, resolver.changeCount); + mProvider.closeDevice(0); + assertEquals(2, mResolver.changeCount); int exceptionCounter = 0; try { - provider.openDevice(1); + mProvider.openDevice(1); } catch (IOException error) { exceptionCounter++; } - assertEquals(2, resolver.changeCount); + assertEquals(2, mResolver.changeCount); try { - provider.closeDevice(1); + mProvider.closeDevice(1); } catch (IOException error) { exceptionCounter++; } - assertEquals(2, resolver.changeCount); + assertEquals(2, mResolver.changeCount); assertEquals(2, exceptionCounter); } public void testCloseAllDevices() throws IOException { - final ContentResolver resolver = new ContentResolver(); - final MtpDocumentsProvider provider = new MtpDocumentsProvider(); - final MtpManagerMock mtpManager = new MtpManagerMock(getContext()); - mtpManager.addValidDevice(0); - provider.onCreateForTesting(mtpManager, resolver); + mMtpManager.addValidDevice(0); + mProvider.onCreateForTesting(mMtpManager, mResolver); - provider.closeAllDevices(); - assertEquals(0, resolver.changeCount); + mProvider.closeAllDevices(); + assertEquals(0, mResolver.changeCount); - provider.openDevice(0); - assertEquals(1, resolver.changeCount); + mProvider.openDevice(0); + assertEquals(1, mResolver.changeCount); - provider.closeAllDevices(); - assertEquals(2, resolver.changeCount); + mProvider.closeAllDevices(); + assertEquals(2, mResolver.changeCount); } public void testQueryRoots() throws Exception { - final ContentResolver resolver = new ContentResolver(); - final MtpDocumentsProvider provider = new MtpDocumentsProvider(); - final MtpManagerMock mtpManager = new MtpManagerMock(getContext()); - mtpManager.addValidDevice(0); - mtpManager.addValidDevice(1); - mtpManager.setRoots(0, new MtpRoot[] { + mMtpManager.addValidDevice(0); + mMtpManager.addValidDevice(1); + mMtpManager.setRoots(0, new MtpRoot[] { new MtpRoot( 1 /* storageId */, "Storage A" /* volume description */, @@ -90,7 +91,7 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { 2048 /* total space */, "" /* no volume identifier */) }); - mtpManager.setRoots(1, new MtpRoot[] { + mMtpManager.setRoots(1, new MtpRoot[] { new MtpRoot( 1 /* storageId */, "Storage B" /* volume description */, @@ -98,12 +99,12 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { 4096 /* total space */, "Identifier B" /* no volume identifier */) }); - provider.onCreateForTesting(mtpManager, resolver); - assertEquals(0, provider.queryRoots(null).getCount()); + mProvider.onCreateForTesting(mMtpManager, mResolver); + assertEquals(0, mProvider.queryRoots(null).getCount()); { - provider.openDevice(0); - final Cursor cursor = provider.queryRoots(null); + mProvider.openDevice(0); + final Cursor cursor = mProvider.queryRoots(null); assertEquals(1, cursor.getCount()); cursor.moveToNext(); assertEquals("0:1", cursor.getString(0)); @@ -116,8 +117,8 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { } { - provider.openDevice(1); - final Cursor cursor = provider.queryRoots(null); + mProvider.openDevice(1); + final Cursor cursor = mProvider.queryRoots(null); assertEquals(2, cursor.getCount()); cursor.moveToNext(); cursor.moveToNext(); @@ -131,20 +132,17 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { } { - provider.closeAllDevices(); - final Cursor cursor = provider.queryRoots(null); + mProvider.closeAllDevices(); + final Cursor cursor = mProvider.queryRoots(null); assertEquals(0, cursor.getCount()); } } public void testQueryRoots_error() throws IOException { - final ContentResolver resolver = new ContentResolver(); - final MtpDocumentsProvider provider = new MtpDocumentsProvider(); - final MtpManagerMock mtpManager = new MtpManagerMock(getContext()); - mtpManager.addValidDevice(0); - mtpManager.addValidDevice(1); + mMtpManager.addValidDevice(0); + mMtpManager.addValidDevice(1); // Not set roots for device 0 so that MtpManagerMock#getRoots throws IOException. - mtpManager.setRoots(1, new MtpRoot[] { + mMtpManager.setRoots(1, new MtpRoot[] { new MtpRoot( 1 /* storageId */, "Storage B" /* volume description */, @@ -152,11 +150,11 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { 4096 /* total space */, "Identifier B" /* no volume identifier */) }); - provider.onCreateForTesting(mtpManager, resolver); + mProvider.onCreateForTesting(mMtpManager, mResolver); { - provider.openDevice(0); - provider.openDevice(1); - final Cursor cursor = provider.queryRoots(null); + mProvider.openDevice(0); + mProvider.openDevice(1); + final Cursor cursor = mProvider.queryRoots(null); assertEquals(1, cursor.getCount()); cursor.moveToNext(); assertEquals("1:1", cursor.getString(0)); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 2a6825225a8e..3e9b12266733 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -643,11 +643,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 +768,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 +894,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 +945,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 +1079,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) { 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/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 6729711af8bb..e3194d6085c7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1335,14 +1335,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); } } @@ -1369,7 +1375,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) { @@ -2084,15 +2091,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/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 81ab4db46197..cf945bc0e859 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -626,6 +626,7 @@ public class NotificationPanelView extends PanelView implements && shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, h)) { mQsTracking = true; onQsExpansionStarted(); + notifyExpandingFinished(); mInitialHeightOnTouch = mQsExpansionHeight; mInitialTouchY = y; mInitialTouchX = x; @@ -825,9 +826,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 +969,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; 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/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 8b92de14c205..445d8ad8709e 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2171,6 +2171,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); mKeepaliveTracker.handleStopAllKeepalives(nai, ConnectivityManager.PacketKeepalive.ERROR_INVALID_NETWORK); @@ -2288,7 +2292,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())) { @@ -2419,14 +2423,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); } } @@ -3870,10 +3870,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; } @@ -4269,8 +4269,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."); @@ -4281,7 +4282,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. @@ -4324,6 +4325,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. @@ -4342,41 +4374,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. @@ -4795,4 +4827,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 f2115aaa8f79..9427b61978df 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/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 0904bfd0e365..755d7a0d9ff5 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -17222,8 +17222,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"); } @@ -17237,6 +17236,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/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 686c0cd584c6..b1ac7ee0a8b3 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -3205,10 +3205,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--; } } } 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/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index d83858a712e2..00292793256c 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/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java index 0d1d1ea4830c..62783714e03e 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) { @@ -699,7 +732,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 +749,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 +814,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 b2ddc2f4072b..92f70ff872d8 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -296,7 +296,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; @@ -3193,6 +3193,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. @@ -3626,8 +3633,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; } @@ -16517,6 +16522,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); @@ -16538,6 +16550,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 b25fc873a974..16571ea5eaca 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3143,6 +3143,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(); @@ -5494,7 +5498,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(); @@ -5516,7 +5519,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); @@ -5585,6 +5587,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { synchronized (mLock) { mScreenOnEarly = false; mScreenOnFully = false; + mKeyguardDrawComplete = false; mWindowManagerDrawComplete = false; mScreenOnListener = null; updateOrientationListenerLp(); @@ -5604,6 +5607,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { synchronized (mLock) { mScreenOnEarly = true; mScreenOnFully = false; + mKeyguardDrawComplete = false; mWindowManagerDrawComplete = false; mScreenOnListener = screenOnListener; 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 8e3ee333a941..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) { @@ -337,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); @@ -347,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/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/Session.java b/services/core/java/com/android/server/wm/Session.java index a8ba0f9ce6d8..75bb10ab1dfe 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -334,7 +334,6 @@ final class Session extends IWindowSession.Stub try { surfaceControl.setPosition(touchX - thumbCenterX, touchY - thumbCenterY); - surfaceControl.setAlpha(.7071f); surfaceControl.setLayer(mService.mDragState.getDragLayerLw()); surfaceControl.setLayerStack(display.getLayerStack()); surfaceControl.show(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5dab1ae72729..2647244b1e44 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7482,9 +7482,14 @@ public class WindowManagerService extends IWindowManager.Stub // TODO(multi-display): support other displays final DisplayContent displayContent = getDefaultDisplayContentLocked(); final Display display = displayContent.getDisplay(); + SurfaceControl surface = new SurfaceControl(session, "drag surface", width, height, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); surface.setLayerStack(display.getLayerStack()); + if ((flags & View.DRAG_FLAG_OPAQUE) == 0) { + surface.setAlpha(.7071f); + } + if (SHOW_TRANSACTIONS) Slog.i(TAG, " DRAG " + surface + ": CREATE"); outSurface.copyFrom(surface); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 5d05f3296fe0..d9afa005bc98 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -4140,6 +4140,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; } } diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index cb9c6a7673b9..3618e1a91cb5 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 { @@ -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/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index a30e1c0dada7..3b59f27dd72a 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -493,6 +493,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/tools/aapt/CrunchCache.cpp b/tools/aapt/CrunchCache.cpp index 6c39d1d7753c..0d574cf127dd 100644 --- a/tools/aapt/CrunchCache.cpp +++ b/tools/aapt/CrunchCache.cpp @@ -5,6 +5,7 @@ // This file defines functions laid out and documented in // CrunchCache.h +#include <utils/Compat.h> #include <utils/Vector.h> #include <utils/String8.h> diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp index f832c605376c..bcf0d5e53c07 100644 --- a/tools/aapt/Main.cpp +++ b/tools/aapt/Main.cpp @@ -6,6 +6,7 @@ #include "Main.h" #include "Bundle.h" +#include <utils/Compat.h> #include <utils/Log.h> #include <utils/threads.h> #include <utils/List.h> diff --git a/tools/aidl/aidl.cpp b/tools/aidl/aidl.cpp index e31b03c07e9a..368e73d05f18 100644 --- a/tools/aidl/aidl.cpp +++ b/tools/aidl/aidl.cpp @@ -1,6 +1,7 @@ #include "aidl_language.h" #include "options.h" +#include "os.h" #include "search_path.h" #include "Type.h" #include "generate_java.h" @@ -177,7 +178,7 @@ check_filename(const char* filename, const char* package, buffer_type* name) char cwd[MAXPATHLEN]; bool valid = false; -#ifdef HAVE_WINDOWS_PATHS +#ifdef _WIN32 if (isalpha(filename[0]) && filename[1] == ':' && filename[2] == OS_PATH_SEPARATOR) { #else @@ -217,7 +218,7 @@ check_filename(const char* filename, const char* package, buffer_type* name) if (valid) { p = fn.c_str() + (len - expected.length()); -#ifdef HAVE_WINDOWS_PATHS +#ifdef _WIN32 if (OS_PATH_SEPARATOR != '/') { // Input filename under cygwin most likely has / separators // whereas the expected string uses \\ separators. Adjust diff --git a/tools/aidl/os.h b/tools/aidl/os.h new file mode 100644 index 000000000000..79d2c35eea3d --- /dev/null +++ b/tools/aidl/os.h @@ -0,0 +1,26 @@ +/* + * Copyright 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. + */ + +#ifndef _FRAMEWORKS_BASE_TOOLS_AIDL_OS_SEP_H_ +#define _FRAMEWORKS_BASE_TOOLS_AIDL_OS_SEP_H_ + +#if defined(_WIN32) +#define OS_PATH_SEPARATOR '\\' +#else +#define OS_PATH_SEPARATOR '/' +#endif + +#endif diff --git a/tools/aidl/search_path.cpp b/tools/aidl/search_path.cpp index ffb6cb2932e4..29dbe260c4f1 100644 --- a/tools/aidl/search_path.cpp +++ b/tools/aidl/search_path.cpp @@ -1,6 +1,7 @@ #include <unistd.h> #include "search_path.h" #include "options.h" +#include "os.h" #include <string.h> #ifdef HAVE_MS_C_RUNTIME 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; } |