Merge "Fixed a crash with HUN notifications"
diff --git a/Android.mk b/Android.mk
index d7e8e4e..bd8b16a 100644
--- a/Android.mk
+++ b/Android.mk
@@ -74,6 +74,7 @@
core/java/android/app/IBackupAgent.aidl \
core/java/android/app/IInstrumentationWatcher.aidl \
core/java/android/app/INotificationManager.aidl \
+ core/java/android/app/INotificationManagerCallback.aidl \
core/java/android/app/IProcessObserver.aidl \
core/java/android/app/ISearchManager.aidl \
core/java/android/app/ISearchManagerCallback.aidl \
@@ -112,6 +113,7 @@
core/java/android/bluetooth/IBluetoothManagerCallback.aidl \
core/java/android/bluetooth/IBluetoothPbap.aidl \
core/java/android/bluetooth/IBluetoothMap.aidl \
+ core/java/android/bluetooth/IBluetoothSap.aidl \
core/java/android/bluetooth/IBluetoothStateChangeCallback.aidl \
core/java/android/bluetooth/IBluetoothHeadsetClient.aidl \
core/java/android/bluetooth/IBluetoothGatt.aidl \
@@ -207,6 +209,7 @@
core/java/android/os/IUserManager.aidl \
core/java/android/os/IVibratorService.aidl \
core/java/android/security/IKeystoreService.aidl \
+ core/java/android/service/carrier/ICarrierConfigService.aidl \
core/java/android/service/carrier/ICarrierMessagingCallback.aidl \
core/java/android/service/carrier/ICarrierMessagingService.aidl \
core/java/android/service/gatekeeper/IGateKeeperService.aidl \
@@ -388,15 +391,16 @@
telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl \
telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl \
telephony/java/com/android/ims/ImsConfigListener.aidl \
+ telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl \
+ telephony/java/com/android/internal/telephony/IMms.aidl \
+ telephony/java/com/android/internal/telephony/IOnSubscriptionsChangedListener.aidl \
telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl \
telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl \
+ telephony/java/com/android/internal/telephony/ISms.aidl \
+ telephony/java/com/android/internal/telephony/ISub.aidl \
telephony/java/com/android/internal/telephony/ITelephony.aidl \
telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl \
- telephony/java/com/android/internal/telephony/IOnSubscriptionsChangedListener.aidl \
- telephony/java/com/android/internal/telephony/ISms.aidl \
telephony/java/com/android/internal/telephony/IWapPushManager.aidl \
- telephony/java/com/android/internal/telephony/ISub.aidl \
- telephony/java/com/android/internal/telephony/IMms.aidl \
wifi/java/android/net/wifi/IWifiManager.aidl \
wifi/java/android/net/wifi/passpoint/IWifiPasspointManager.aidl \
wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl \
@@ -547,6 +551,7 @@
frameworks/base/core/java/android/view/textservice/SpellCheckerInfo.aidl \
frameworks/base/core/java/android/view/textservice/SentenceSuggestionsInfo.aidl \
frameworks/base/core/java/android/view/textservice/SuggestionsInfo.aidl \
+ frameworks/base/core/java/android/service/carrier/CarrierIdentifier.aidl \
frameworks/base/core/java/android/service/carrier/MessagePdu.aidl \
frameworks/base/core/java/android/service/notification/StatusBarNotification.aidl \
frameworks/base/core/java/android/service/chooser/ChooserTarget.aidl \
@@ -555,6 +560,7 @@
frameworks/base/core/java/android/app/AssistStructure.aidl \
frameworks/base/core/java/android/app/AssistContent.aidl \
frameworks/base/core/java/android/app/Notification.aidl \
+ frameworks/base/core/java/android/app/NotificationManager.aidl \
frameworks/base/core/java/android/app/WallpaperInfo.aidl \
frameworks/base/core/java/android/app/AppOpsManager.aidl \
frameworks/base/core/java/android/app/ActivityManager.aidl \
diff --git a/api/current.txt b/api/current.txt
index 8ae6b47..bd9fd3e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -20,6 +20,7 @@
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
+ field public static final java.lang.String BIND_CARRIER_CONFIG_SERVICE = "android.permission.BIND_CARRIER_CONFIG_SERVICE";
field public static final java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
field public static final java.lang.String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
field public static final java.lang.String BIND_DEVICE_ADMIN = "android.permission.BIND_DEVICE_ADMIN";
@@ -155,7 +156,6 @@
field public static final java.lang.String WRITE_PROFILE = "android.permission.WRITE_PROFILE";
field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
field public static final java.lang.String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
- field public static final java.lang.String WRITE_SMS = "android.permission.WRITE_SMS";
field public static final deprecated java.lang.String WRITE_SOCIAL_STREAM = "android.permission.WRITE_SOCIAL_STREAM";
field public static final java.lang.String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS";
field public static final java.lang.String WRITE_USER_DICTIONARY = "android.permission.WRITE_USER_DICTIONARY";
@@ -793,6 +793,7 @@
field public static final int layout_x = 16843135; // 0x101017f
field public static final int layout_y = 16843136; // 0x1010180
field public static final int left = 16843181; // 0x10101ad
+ field public static final int leftIndents = 16844016; // 0x10104f0
field public static final int letterSpacing = 16843958; // 0x10104b6
field public static final int lineSpacingExtra = 16843287; // 0x1010217
field public static final int lineSpacingMultiplier = 16843288; // 0x1010218
@@ -815,6 +816,7 @@
field public static final int listSeparatorTextViewStyle = 16843272; // 0x1010208
field public static final int listViewStyle = 16842868; // 0x1010074
field public static final int listViewWhiteStyle = 16842869; // 0x1010075
+ field public static final int lockTaskMode = 16844015; // 0x10104ef
field public static final int logo = 16843454; // 0x10102be
field public static final int longClickable = 16842982; // 0x10100e6
field public static final int loopViews = 16843527; // 0x1010307
@@ -1020,6 +1022,7 @@
field public static final int reversible = 16843851; // 0x101044b
field public static final int revisionCode = 16843989; // 0x10104d5
field public static final int right = 16843183; // 0x10101af
+ field public static final int rightIndents = 16844017; // 0x10104f1
field public static final int ringtonePreferenceStyle = 16842899; // 0x1010093
field public static final int ringtoneType = 16843257; // 0x10101f9
field public static final int rotation = 16843558; // 0x1010326
@@ -1095,7 +1098,8 @@
field public static final int showAsAction = 16843481; // 0x10102d9
field public static final int showDefault = 16843258; // 0x10101fa
field public static final int showDividers = 16843561; // 0x1010329
- field public static final int showOnLockScreen = 16843721; // 0x10103c9
+ field public static final int showForAllUsers = 16844018; // 0x10104f2
+ field public static final deprecated int showOnLockScreen = 16843721; // 0x10103c9
field public static final int showSilent = 16843259; // 0x10101fb
field public static final int showText = 16843949; // 0x10104ad
field public static final deprecated int showWeekNumber = 16843582; // 0x101033e
@@ -1975,6 +1979,7 @@
field public static final int TextAppearance_Material_Widget_ActionMode_Title = 16974355; // 0x1030213
field public static final int TextAppearance_Material_Widget_ActionMode_Title_Inverse = 16974356; // 0x1030214
field public static final int TextAppearance_Material_Widget_Button = 16974357; // 0x1030215
+ field public static final int TextAppearance_Material_Widget_Button_Inverse = 16974565; // 0x10302e5
field public static final int TextAppearance_Material_Widget_DropDownHint = 16974358; // 0x1030216
field public static final int TextAppearance_Material_Widget_DropDownItem = 16974359; // 0x1030217
field public static final int TextAppearance_Material_Widget_EditText = 16974360; // 0x1030218
@@ -2020,6 +2025,7 @@
field public static final int ThemeOverlay_Material_Dark = 16974411; // 0x103024b
field public static final int ThemeOverlay_Material_Dark_ActionBar = 16974412; // 0x103024c
field public static final int ThemeOverlay_Material_Dialog = 16974564; // 0x10302e4
+ field public static final int ThemeOverlay_Material_Dialog_Alert = 16974566; // 0x10302e6
field public static final int ThemeOverlay_Material_Light = 16974410; // 0x103024a
field public static final int Theme_Black = 16973832; // 0x1030008
field public static final int Theme_Black_NoTitleBar = 16973833; // 0x1030009
@@ -3630,12 +3636,15 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RecentTaskInfo> CREATOR;
field public int affiliatedTaskId;
+ field public android.content.ComponentName baseActivity;
field public android.content.Intent baseIntent;
field public java.lang.CharSequence description;
field public int id;
+ field public int numActivities;
field public android.content.ComponentName origActivity;
field public int persistentId;
field public android.app.ActivityManager.TaskDescription taskDescription;
+ field public android.content.ComponentName topActivity;
}
public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable {
@@ -5107,8 +5116,44 @@
method public void cancel(int);
method public void cancel(java.lang.String, int);
method public void cancelAll();
+ method public android.app.NotificationManager.Policy getNotificationPolicy(android.app.NotificationManager.Policy.Token);
+ method public boolean isNotificationPolicyTokenValid(android.app.NotificationManager.Policy.Token);
method public void notify(int, android.app.Notification);
method public void notify(java.lang.String, int, android.app.Notification);
+ method public void requestNotificationPolicyToken(android.app.NotificationManager.Policy.Token.RequestCallback, android.os.Handler);
+ method public void setNotificationPolicy(android.app.NotificationManager.Policy.Token, android.app.NotificationManager.Policy);
+ field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED";
+ }
+
+ public static class NotificationManager.Policy implements android.os.Parcelable {
+ ctor public NotificationManager.Policy(int, int);
+ method public int describeContents();
+ method public static java.lang.String priorityCategoriesToString(int);
+ method public static java.lang.String prioritySendersToString(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.NotificationManager.Policy> CREATOR;
+ field public static final int PRIORITY_CATEGORY_CALLS = 8; // 0x8
+ field public static final int PRIORITY_CATEGORY_EVENTS = 2; // 0x2
+ field public static final int PRIORITY_CATEGORY_MESSAGES = 4; // 0x4
+ field public static final int PRIORITY_CATEGORY_REMINDERS = 1; // 0x1
+ field public static final int PRIORITY_CATEGORY_REPEAT_CALLERS = 16; // 0x10
+ field public static final int PRIORITY_SENDERS_ANY = 0; // 0x0
+ field public static final int PRIORITY_SENDERS_CONTACTS = 1; // 0x1
+ field public static final int PRIORITY_SENDERS_STARRED = 2; // 0x2
+ field public final int priorityCategories;
+ field public final int prioritySenders;
+ }
+
+ public static class NotificationManager.Policy.Token implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.NotificationManager.Policy.Token> CREATOR;
+ }
+
+ public static abstract class NotificationManager.Policy.Token.RequestCallback {
+ ctor public NotificationManager.Policy.Token.RequestCallback();
+ method public abstract void onTokenDenied();
+ method public abstract void onTokenGranted(android.app.NotificationManager.Policy.Token);
}
public final class PendingIntent implements android.os.Parcelable {
@@ -5769,12 +5814,14 @@
field public static final java.lang.String EXTRA_PROVISIONING_BT_MAC_ADDRESS = "android.app.extra.PROVISIONING_BT_MAC_ADDRESS";
field public static final java.lang.String EXTRA_PROVISIONING_BT_USE_PROXY = "android.app.extra.PROVISIONING_BT_USE_PROXY";
field public static final java.lang.String EXTRA_PROVISIONING_BT_UUID = "android.app.extra.PROVISIONING_BT_UUID";
+ field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
field public static final deprecated java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME";
+ field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM";
@@ -6912,6 +6959,7 @@
field public static final int GATT_SERVER = 8; // 0x8
field public static final int HEADSET = 1; // 0x1
field public static final int HEALTH = 3; // 0x3
+ field public static final int SAP = 10; // 0xa
field public static final int STATE_CONNECTED = 2; // 0x2
field public static final int STATE_CONNECTING = 1; // 0x1
field public static final int STATE_DISCONNECTED = 0; // 0x0
@@ -6923,6 +6971,25 @@
method public abstract void onServiceDisconnected(int);
}
+ public final class BluetoothSap implements android.bluetooth.BluetoothProfile {
+ method public synchronized void close();
+ method public boolean connect(android.bluetooth.BluetoothDevice);
+ method public boolean disconnect(android.bluetooth.BluetoothDevice);
+ method public android.bluetooth.BluetoothDevice getClient();
+ method public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
+ method public int getConnectionState(android.bluetooth.BluetoothDevice);
+ method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
+ method public int getPriority(android.bluetooth.BluetoothDevice);
+ method public int getState();
+ method public boolean isConnected(android.bluetooth.BluetoothDevice);
+ method public boolean setPriority(android.bluetooth.BluetoothDevice, int);
+ field public static final java.lang.String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED";
+ field public static final int RESULT_CANCELED = 2; // 0x2
+ field public static final int RESULT_FAILURE = 0; // 0x0
+ field public static final int RESULT_SUCCESS = 1; // 0x1
+ field public static final int STATE_ERROR = -1; // 0xffffffff
+ }
+
public final class BluetoothServerSocket implements java.io.Closeable {
method public android.bluetooth.BluetoothSocket accept() throws java.io.IOException;
method public android.bluetooth.BluetoothSocket accept(int) throws java.io.IOException;
@@ -6932,10 +6999,16 @@
public final class BluetoothSocket implements java.io.Closeable {
method public void close() throws java.io.IOException;
method public void connect() throws java.io.IOException;
+ method public int getConnectionType();
method public java.io.InputStream getInputStream() throws java.io.IOException;
+ method public int getMaxReceivePacketSize();
+ method public int getMaxTransmitPacketSize();
method public java.io.OutputStream getOutputStream() throws java.io.IOException;
method public android.bluetooth.BluetoothDevice getRemoteDevice();
method public boolean isConnected();
+ field public static final int TYPE_L2CAP = 3; // 0x3
+ field public static final int TYPE_RFCOMM = 1; // 0x1
+ field public static final int TYPE_SCO = 2; // 0x2
}
}
@@ -7675,6 +7748,7 @@
field public static final java.lang.String BLUETOOTH_SERVICE = "bluetooth";
field public static final java.lang.String CAMERA_SERVICE = "camera";
field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
+ field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
@@ -13105,6 +13179,7 @@
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> DEPTH_DEPTH_IS_EXCLUSIVE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> EDGE_AVAILABLE_EDGE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> FLASH_INFO_AVAILABLE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
@@ -13333,6 +13408,7 @@
field public static final int HOT_PIXEL_MODE_HIGH_QUALITY = 2; // 0x2
field public static final int HOT_PIXEL_MODE_OFF = 0; // 0x0
field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_FULL = 1; // 0x1
+ field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_HIGH_RESOLUTION = 3; // 0x3
field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY = 2; // 0x2
field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0; // 0x0
field public static final int LENS_FACING_BACK = 1; // 0x1
@@ -13351,6 +13427,7 @@
field public static final int NOISE_REDUCTION_MODE_OFF = 0; // 0x0
field public static final int REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE = 0; // 0x0
field public static final int REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE = 6; // 0x6
+ field public static final int REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT = 8; // 0x8
field public static final int REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING = 2; // 0x2
field public static final int REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR = 1; // 0x1
field public static final int REQUEST_AVAILABLE_CAPABILITIES_OPAQUE_REPROCESSING = 4; // 0x4
@@ -13770,6 +13847,8 @@
public class FingerprintManager {
method public void authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject, android.os.CancellationSignal, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, int);
+ method public boolean hasEnrolledFingerprints();
+ method public boolean isHardwareDetected();
field public static final int FINGERPRINT_ACQUIRED_GOOD = 0; // 0x0
field public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
field public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; // 0x2
@@ -13800,6 +13879,8 @@
}
public static class FingerprintManager.CryptoObject {
+ ctor public FingerprintManager.CryptoObject(java.security.Signature);
+ ctor public FingerprintManager.CryptoObject(javax.crypto.Cipher);
method public javax.crypto.Cipher getCipher();
method public java.security.Signature getSignature();
}
@@ -14834,9 +14915,12 @@
method public int getSampleRate();
method public int getState();
method public int read(byte[], int, int);
+ method public int read(byte[], int, int, int);
method public int read(short[], int, int);
+ method public int read(short[], int, int, int);
method public int read(float[], int, int, int);
method public int read(java.nio.ByteBuffer, int);
+ method public int read(java.nio.ByteBuffer, int, int);
method public void release();
method public int setNotificationMarkerPosition(int);
method public int setPositionNotificationPeriod(int);
@@ -14896,6 +14980,7 @@
method public int getPlaybackHeadPosition();
method public int getPlaybackRate();
method public int getPositionNotificationPeriod();
+ method public android.media.AudioDeviceInfo getPreferredOutputDevice();
method public int getSampleRate();
method public int getState();
method public int getStreamType();
@@ -14912,12 +14997,15 @@
method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler);
method public int setPlaybackRate(int);
method public int setPositionNotificationPeriod(int);
+ method public boolean setPreferredOutputDevice(android.media.AudioDeviceInfo);
method protected deprecated void setState(int);
method public deprecated int setStereoVolume(float, float);
method public int setVolume(float);
method public void stop() throws java.lang.IllegalStateException;
method public int write(byte[], int, int);
+ method public int write(byte[], int, int, int);
method public int write(short[], int, int);
+ method public int write(short[], int, int, int);
method public int write(float[], int, int, int);
method public int write(java.nio.ByteBuffer, int, int);
field public static final int ERROR = -1; // 0xffffffff
@@ -15495,6 +15583,11 @@
ctor public MediaCryptoException(java.lang.String);
}
+ public abstract interface MediaDataSource implements java.io.Closeable {
+ method public abstract long getSize();
+ method public abstract int readAt(long, byte[], int);
+ }
+
public class MediaDescription implements android.os.Parcelable {
method public int describeContents();
method public java.lang.CharSequence getDescription();
@@ -15630,6 +15723,7 @@
method public final void release();
method public void seekTo(long, int);
method public void selectTrack(int);
+ method public final void setDataSource(android.media.MediaDataSource) throws java.io.IOException, java.lang.IllegalArgumentException;
method public final void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException;
method public final void setDataSource(java.lang.String, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException;
method public final void setDataSource(java.lang.String) throws java.io.IOException;
@@ -15809,6 +15903,7 @@
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.lang.IllegalArgumentException;
method public void setDataSource(java.io.FileDescriptor) throws java.lang.IllegalArgumentException;
method public void setDataSource(android.content.Context, android.net.Uri) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
+ method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException;
field public static final int METADATA_KEY_ALBUM = 1; // 0x1
field public static final int METADATA_KEY_ALBUMARTIST = 13; // 0xd
field public static final int METADATA_KEY_ARTIST = 2; // 0x2
@@ -15893,6 +15988,7 @@
method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDisplay(android.view.SurfaceHolder);
method public void setLooping(boolean);
method public void setNextMediaPlayer(android.media.MediaPlayer);
@@ -15902,6 +15998,7 @@
method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener);
method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);
method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener);
+ method public void setOnTimedMetaDataListener(android.media.MediaPlayer.OnTimedMetaDataListener);
method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener);
method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener);
method public void setPlaybackRate(float, int);
@@ -15959,6 +16056,10 @@
method public abstract void onSeekComplete(android.media.MediaPlayer);
}
+ public static abstract interface MediaPlayer.OnTimedMetaDataListener {
+ method public abstract void onTimedMetaData(android.media.MediaPlayer, android.media.TimedMetaData);
+ }
+
public static abstract interface MediaPlayer.OnTimedTextListener {
method public abstract void onTimedText(android.media.MediaPlayer, android.media.TimedText);
}
@@ -15974,6 +16075,7 @@
method public int getTrackType();
method public void writeToParcel(android.os.Parcel, int);
field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
+ field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5
field public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; // 0x4
field public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; // 0x3
field public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; // 0x0
@@ -16215,7 +16317,7 @@
public final class MediaSync {
ctor public MediaSync();
- method public void configureAudioTrack(android.media.AudioTrack, int);
+ method public void configureAudioTrack(android.media.AudioTrack);
method public void configureSurface(android.view.Surface);
method public final android.view.Surface createInputSurface();
method public boolean getTimestamp(android.media.MediaTimestamp);
@@ -16448,6 +16550,11 @@
field public static final int OPTIONS_RECYCLE_INPUT = 2; // 0x2
}
+ public class TimedMetaData {
+ method public byte[] getRawData();
+ method public long getTimeUs();
+ }
+
public final class TimedText {
method public android.graphics.Rect getBounds();
method public java.lang.String getText();
@@ -18065,6 +18172,7 @@
public class ConnectivityManager {
method public void addDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
method public boolean bindProcessToNetwork(android.net.Network);
+ method public android.net.Network getActiveNetwork();
method public android.net.NetworkInfo getActiveNetworkInfo();
method public android.net.NetworkInfo[] getAllNetworkInfo();
method public android.net.Network[] getAllNetworks();
@@ -18083,7 +18191,8 @@
method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void releaseNetworkRequest(android.app.PendingIntent);
method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
- method public void reportBadNetwork(android.net.Network);
+ method public deprecated void reportBadNetwork(android.net.Network);
+ method public void reportNetworkConnectivity(android.net.Network, boolean);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated boolean requestRouteToHost(int, int);
@@ -19599,6 +19708,7 @@
public final class NfcEvent {
field public final android.nfc.NfcAdapter nfcAdapter;
+ field public final byte peerLlcpVersion;
}
public final class NfcManager {
@@ -22762,6 +22872,8 @@
method public static long getNativeHeapFreeSize();
method public static long getNativeHeapSize();
method public static long getPss();
+ method public static java.lang.String getRuntimeStat(java.lang.String);
+ method public static java.util.Map<java.lang.String, java.lang.String> getRuntimeStats();
method public static deprecated int getThreadAllocCount();
method public static deprecated int getThreadAllocSize();
method public static deprecated int getThreadExternalAllocCount();
@@ -23559,6 +23671,7 @@
method public android.os.Bundle getUserRestrictions();
method public android.os.Bundle getUserRestrictions(android.os.UserHandle);
method public boolean hasUserRestriction(java.lang.String);
+ method public boolean isSystemUser();
method public boolean isUserAGoat();
method public boolean isUserRunning(android.os.UserHandle);
method public boolean isUserRunningOrStopping(android.os.UserHandle);
@@ -27259,7 +27372,6 @@
method public static android.renderscript.AllocationAdapter create1D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter create2D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter createTyped(android.renderscript.RenderScript, android.renderscript.Allocation, android.renderscript.Type);
- method public void setArray(int, int);
method public void setFace(android.renderscript.Type.CubemapFace);
method public void setLOD(int);
method public void setX(int);
@@ -27920,6 +28032,62 @@
method public void setLUT(android.renderscript.Allocation);
}
+ public final class ScriptIntrinsicBLAS extends android.renderscript.ScriptIntrinsic {
+ method public void BNNM(android.renderscript.Allocation, int, android.renderscript.Allocation, int, android.renderscript.Allocation, int, int);
+ method public void CGEMM(int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Float2, android.renderscript.Allocation);
+ method public void CHEMM(int, int, float, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void CHER2K(int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void CHERK(int, int, float, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void CSYMM(int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Float2, android.renderscript.Allocation);
+ method public void CSYR2K(int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Float2, android.renderscript.Allocation);
+ method public void CSYRK(int, int, float, float, android.renderscript.Allocation, float, float, android.renderscript.Allocation);
+ method public void CTRMM(int, int, int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void CTRSM(int, int, int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void DGEMM(int, int, double, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void DSYMM(int, int, double, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void DSYR2K(int, int, double, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void DSYRK(int, int, double, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void DTRMM(int, int, int, int, double, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void DTRSM(int, int, int, int, double, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void SGEMM(int, int, float, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void SSYMM(int, int, float, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void SSYR2K(int, int, float, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void SSYRK(int, int, float, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void STRMM(int, int, int, int, float, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void STRSM(int, int, int, int, float, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void ZGEMM(int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Double2, android.renderscript.Allocation);
+ method public void ZHEMM(int, int, double, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void ZHER2K(int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void ZHERK(int, int, double, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void ZSYMM(int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Double2, android.renderscript.Allocation);
+ method public void ZSYR2K(int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Double2, android.renderscript.Allocation);
+ method public void ZSYRK(int, int, double, double, android.renderscript.Allocation, double, double, android.renderscript.Allocation);
+ method public void ZTRMM(int, int, int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void ZTRSM(int, int, int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public static android.renderscript.ScriptIntrinsicBLAS create(android.renderscript.RenderScript);
+ field public static final int CONJ_TRANSPOSE = 113; // 0x71
+ field public static final int LEFT = 141; // 0x8d
+ field public static final int LOWER = 122; // 0x7a
+ field public static final int NON_UNIT = 131; // 0x83
+ field public static final int NO_TRANSPOSE = 111; // 0x6f
+ field public static final int RIGHT = 142; // 0x8e
+ field public static final int TRANSPOSE = 112; // 0x70
+ field public static final int UNIT = 132; // 0x84
+ field public static final int UPPER = 121; // 0x79
+ }
+
+ public static abstract class ScriptIntrinsicBLAS.Diag implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract class ScriptIntrinsicBLAS.Side implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract class ScriptIntrinsicBLAS.Transpose implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract class ScriptIntrinsicBLAS.Uplo implements java.lang.annotation.Annotation {
+ }
+
public class ScriptIntrinsicBlend extends android.renderscript.ScriptIntrinsic {
method public static android.renderscript.ScriptIntrinsicBlend create(android.renderscript.RenderScript, android.renderscript.Element);
method public void forEachAdd(android.renderscript.Allocation, android.renderscript.Allocation);
@@ -28082,8 +28250,6 @@
method public static android.renderscript.Type createX(android.renderscript.RenderScript, android.renderscript.Element, int);
method public static android.renderscript.Type createXY(android.renderscript.RenderScript, android.renderscript.Element, int, int);
method public static android.renderscript.Type createXYZ(android.renderscript.RenderScript, android.renderscript.Element, int, int, int);
- method public int getArray(int);
- method public int getArrayCount();
method public int getCount();
method public android.renderscript.Element getElement();
method public int getX();
@@ -28097,7 +28263,6 @@
public static class Type.Builder {
ctor public Type.Builder(android.renderscript.RenderScript, android.renderscript.Element);
method public android.renderscript.Type create();
- method public android.renderscript.Type.Builder setArray(int, int);
method public android.renderscript.Type.Builder setFaces(boolean);
method public android.renderscript.Type.Builder setMipmaps(boolean);
method public android.renderscript.Type.Builder setX(int);
@@ -28333,6 +28498,7 @@
public static abstract class KeyStoreKeyProperties.Origin {
field public static final int GENERATED = 1; // 0x1
field public static final int IMPORTED = 2; // 0x2
+ field public static final int UNKNOWN = 4; // 0x4
}
public static abstract class KeyStoreKeyProperties.OriginEnum implements java.lang.annotation.Annotation {
@@ -28431,6 +28597,26 @@
package android.service.carrier {
+ public abstract class CarrierConfigService extends android.app.Service {
+ ctor public CarrierConfigService();
+ method public final android.os.IBinder onBind(android.content.Intent);
+ method public abstract android.os.Bundle onLoadConfig(android.service.carrier.CarrierIdentifier);
+ field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierConfigService";
+ }
+
+ public class CarrierIdentifier implements android.os.Parcelable {
+ ctor public CarrierIdentifier(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public int describeContents();
+ method public java.lang.String getGid1();
+ method public java.lang.String getGid2();
+ method public java.lang.String getImsi();
+ method public java.lang.String getMcc();
+ method public java.lang.String getMnc();
+ method public java.lang.String getSpn();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.carrier.CarrierIdentifier> CREATOR;
+ }
+
public abstract class CarrierMessagingService extends android.app.Service {
ctor public CarrierMessagingService();
method public android.os.IBinder onBind(android.content.Intent);
@@ -28602,6 +28788,7 @@
method public final int getCurrentInterruptionFilter();
method public final int getCurrentListenerHints();
method public android.service.notification.NotificationListenerService.RankingMap getCurrentRanking();
+ method public final android.app.NotificationManager.Policy.Token getNotificationPolicyToken();
method public android.os.IBinder onBind(android.content.Intent);
method public void onInterruptionFilterChanged(int);
method public void onListenerConnected();
@@ -29803,7 +29990,6 @@
}
public final class Call {
- method public void addListener(android.telecom.Call.Listener);
method public void answer(int);
method public void conference(android.telecom.Call);
method public void disconnect();
@@ -29820,12 +30006,13 @@
method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean);
method public void playDtmfTone(char);
method public void postDialContinue(boolean);
+ method public void registerCallback(android.telecom.Call.Callback);
method public void reject(boolean, java.lang.String);
- method public void removeListener(android.telecom.Call.Listener);
method public void splitFromConference();
method public void stopDtmfTone();
method public void swapConference();
method public void unhold();
+ method public void unregisterCallback(android.telecom.Call.Callback);
field public static final java.lang.String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
field public static final int STATE_ACTIVE = 4; // 0x4
field public static final int STATE_CONNECTING = 9; // 0x9
@@ -29838,6 +30025,19 @@
field public static final int STATE_RINGING = 2; // 0x2
}
+ public static abstract class Call.Callback {
+ ctor public Call.Callback();
+ method public void onCallDestroyed(android.telecom.Call);
+ method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>);
+ method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
+ method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
+ method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details);
+ method public void onParentChanged(android.telecom.Call, android.telecom.Call);
+ method public void onPostDialWait(android.telecom.Call, java.lang.String);
+ method public void onStateChanged(android.telecom.Call, int);
+ method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
+ }
+
public static class Call.Details {
method public static boolean can(int, int);
method public boolean can(int);
@@ -29876,19 +30076,6 @@
field public static final int CAPABILITY_WIFI = 65536; // 0x10000
}
- public static abstract class Call.Listener {
- ctor public Call.Listener();
- method public void onCallDestroyed(android.telecom.Call);
- method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>);
- method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
- method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
- method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details);
- method public void onParentChanged(android.telecom.Call, android.telecom.Call);
- method public void onPostDialWait(android.telecom.Call, java.lang.String);
- method public void onStateChanged(android.telecom.Call, int);
- method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
- }
-
public class CallProperties {
ctor public CallProperties();
field public static final int CONFERENCE = 1; // 0x1
@@ -29917,7 +30104,7 @@
field public static final android.os.Parcelable.Creator<android.telecom.CameraCapabilities> CREATOR;
}
- public abstract class Conference implements android.telecom.IConferenceable {
+ public abstract class Conference implements android.telecom.Conferenceable {
ctor public Conference(android.telecom.PhoneAccountHandle);
method public final boolean addConnection(android.telecom.Connection);
method public final void destroy();
@@ -29951,7 +30138,10 @@
field public static final long CONNECT_TIME_NOT_SPECIFIED = 0L; // 0x0L
}
- public abstract class Connection implements android.telecom.IConferenceable {
+ public abstract interface Conferenceable {
+ }
+
+ public abstract class Connection implements android.telecom.Conferenceable {
ctor public Connection();
method public static java.lang.String capabilitiesToString(int);
method public static android.telecom.Connection createCanceledConnection();
@@ -29964,7 +30154,7 @@
method public final java.lang.String getCallerDisplayName();
method public final int getCallerDisplayNamePresentation();
method public final android.telecom.Conference getConference();
- method public final java.util.List<android.telecom.IConferenceable> getConferenceables();
+ method public final java.util.List<android.telecom.Conferenceable> getConferenceables();
method public final int getConnectionCapabilities();
method public final android.telecom.DisconnectCause getDisconnectCause();
method public final int getState();
@@ -29988,7 +30178,7 @@
method public final void setAudioModeIsVoip(boolean);
method public final void setCallerDisplayName(java.lang.String, int);
method public final void setConferenceableConnections(java.util.List<android.telecom.Connection>);
- method public final void setConferenceables(java.util.List<android.telecom.IConferenceable>);
+ method public final void setConferenceables(java.util.List<android.telecom.Conferenceable>);
method public final void setConnectionCapabilities(int);
method public final void setConnectionService(android.telecom.ConnectionService);
method public final void setDialing();
@@ -30116,20 +30306,25 @@
field public static final android.os.Parcelable.Creator<android.telecom.GatewayInfo> CREATOR;
}
- public abstract interface IConferenceable {
- }
-
public abstract class InCallService extends android.app.Service {
ctor public InCallService();
- method public final android.telecom.Phone getPhone();
+ method public final boolean canAddCall();
+ method public final android.telecom.AudioState getAudioState();
+ method public final java.util.List<android.telecom.Call> getCalls();
+ method public void onAudioStateChanged(android.telecom.AudioState);
method public android.os.IBinder onBind(android.content.Intent);
- method public void onPhoneCreated(android.telecom.Phone);
- method public void onPhoneDestroyed(android.telecom.Phone);
+ method public void onBringToForeground(boolean);
+ method public void onCallAdded(android.telecom.Call);
+ method public void onCallRemoved(android.telecom.Call);
+ method public void onCanAddCallChanged(boolean);
+ method public final void setAudioRoute(int);
+ method public final void setMuted(boolean);
field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.InCallService";
}
public static abstract class InCallService.VideoCall {
ctor public InCallService.VideoCall();
+ method public abstract void registerCallback(android.telecom.InCallService.VideoCall.Callback);
method public abstract void requestCallDataUsage();
method public abstract void requestCameraCapabilities();
method public abstract void sendSessionModifyRequest(android.telecom.VideoProfile);
@@ -30139,12 +30334,11 @@
method public abstract void setDisplaySurface(android.view.Surface);
method public abstract void setPauseImage(java.lang.String);
method public abstract void setPreviewSurface(android.view.Surface);
- method public abstract void setVideoCallListener(android.telecom.InCallService.VideoCall.Listener);
method public abstract void setZoom(float);
}
- public static abstract class InCallService.VideoCall.Listener {
- ctor public InCallService.VideoCall.Listener();
+ public static abstract class InCallService.VideoCall.Callback {
+ ctor public InCallService.VideoCall.Callback();
method public abstract void onCallDataUsageChanged(long);
method public abstract void onCallSessionEvent(int);
method public abstract void onCameraCapabilitiesChanged(android.telecom.CameraCapabilities);
@@ -30154,25 +30348,6 @@
method public abstract void onVideoQualityChanged(int);
}
- public final class Phone {
- method public final void addListener(android.telecom.Phone.Listener);
- method public final boolean canAddCall();
- method public final android.telecom.AudioState getAudioState();
- method public final java.util.List<android.telecom.Call> getCalls();
- method public final void removeListener(android.telecom.Phone.Listener);
- method public final void setAudioRoute(int);
- method public final void setMuted(boolean);
- }
-
- public static abstract class Phone.Listener {
- ctor public Phone.Listener();
- method public void onAudioStateChanged(android.telecom.Phone, android.telecom.AudioState);
- method public void onBringToForeground(android.telecom.Phone, boolean);
- method public void onCallAdded(android.telecom.Phone, android.telecom.Call);
- method public void onCallRemoved(android.telecom.Phone, android.telecom.Call);
- method public void onCanAddCallChanged(android.telecom.Phone, boolean);
- }
-
public class PhoneAccount implements android.os.Parcelable {
method public static android.telecom.PhoneAccount.Builder builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
method public android.graphics.drawable.Drawable createIconDrawable(android.content.Context);
@@ -30331,10 +30506,9 @@
method public java.lang.String getLine1Number(android.telecom.PhoneAccountHandle);
method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle);
method public android.telecom.PhoneAccountHandle getSimCallManager();
- method public android.telecom.PhoneAccountHandle getUserSelectedOutgoingPhoneAccount();
+ method public java.lang.String getVoiceMailNumber(android.telecom.PhoneAccountHandle);
method public boolean handleMmi(java.lang.String);
method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle);
- method public boolean hasVoiceMailNumber(android.telecom.PhoneAccountHandle);
method public boolean isInCall();
method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String);
method public void registerPhoneAccount(android.telecom.PhoneAccount);
@@ -30396,6 +30570,18 @@
package android.telephony {
+ public class CarrierConfigManager {
+ method public android.os.Bundle getConfig();
+ method public android.os.Bundle getConfigForSubId(int);
+ method public void reloadCarrierConfigForSubId(int);
+ field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
+ field public static final java.lang.String BOOL_CARRIER_VOLTE_AVAILABLE = "bool_carrier_volte_available";
+ field public static final java.lang.String BOOL_CARRIER_VOLTE_PROVISIONED = "bool_carrier_volte_provisioned";
+ field public static final java.lang.String BOOL_CARRIER_VOLTE_TTY_SUPPORTED = "bool_carrier_volte_tty_supported";
+ field public static final java.lang.String BOOL_SHOW_APN_SETTING_CDMA = "bool_show_apn_setting_cdma";
+ field public static final java.lang.String INT_VOLTE_REPLACEMENT_RAT = "int_volte_replacement_rat";
+ }
+
public final class CellIdentityCdma implements android.os.Parcelable {
method public int describeContents();
method public int getBasestationId();
@@ -30903,6 +31089,7 @@
method public boolean isVoiceCapable();
method public boolean isWorldPhone();
method public void listen(android.telephony.PhoneStateListener, int);
+ method public void notifyCarrierNetworkChange(boolean);
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String);
method public boolean setOperatorBrandOverride(java.lang.String);
@@ -34400,6 +34587,7 @@
method public boolean onTouchEvent(android.view.MotionEvent);
method public void setIsLongpressEnabled(boolean);
method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
+ method public void setOnStylusButtonPressListener(android.view.GestureDetector.OnStylusButtonPressListener);
}
public static abstract interface GestureDetector.OnDoubleTapListener {
@@ -34417,7 +34605,11 @@
method public abstract boolean onSingleTapUp(android.view.MotionEvent);
}
- public static class GestureDetector.SimpleOnGestureListener implements android.view.GestureDetector.OnDoubleTapListener android.view.GestureDetector.OnGestureListener {
+ public static abstract interface GestureDetector.OnStylusButtonPressListener {
+ method public abstract boolean onStylusButtonPress(android.view.MotionEvent);
+ }
+
+ public static class GestureDetector.SimpleOnGestureListener implements android.view.GestureDetector.OnDoubleTapListener android.view.GestureDetector.OnGestureListener android.view.GestureDetector.OnStylusButtonPressListener {
ctor public GestureDetector.SimpleOnGestureListener();
method public boolean onDoubleTap(android.view.MotionEvent);
method public boolean onDoubleTapEvent(android.view.MotionEvent);
@@ -34428,6 +34620,7 @@
method public void onShowPress(android.view.MotionEvent);
method public boolean onSingleTapConfirmed(android.view.MotionEvent);
method public boolean onSingleTapUp(android.view.MotionEvent);
+ method public boolean onStylusButtonPress(android.view.MotionEvent);
}
public class Gravity {
@@ -41188,6 +41381,7 @@
method public int getInputType();
method public final android.text.method.KeyListener getKeyListener();
method public final android.text.Layout getLayout();
+ method public int[] getLeftIndents();
method public float getLetterSpacing();
method public int getLineBounds(int, android.graphics.Rect);
method public int getLineCount();
@@ -41210,6 +41404,7 @@
method public android.text.TextPaint getPaint();
method public int getPaintFlags();
method public java.lang.String getPrivateImeOptions();
+ method public int[] getRightIndents();
method public int getSelectionEnd();
method public int getSelectionStart();
method public int getShadowColor();
@@ -41287,6 +41482,7 @@
method public void setImeActionLabel(java.lang.CharSequence, int);
method public void setImeOptions(int);
method public void setIncludeFontPadding(boolean);
+ method public void setIndents(int[], int[]);
method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public void setInputType(int);
method public void setKeyListener(android.text.method.KeyListener);
diff --git a/api/system-current.txt b/api/system-current.txt
index fb44b61..836f3a0 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -28,6 +28,7 @@
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
+ field public static final java.lang.String BIND_CARRIER_CONFIG_SERVICE = "android.permission.BIND_CARRIER_CONFIG_SERVICE";
field public static final java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
field public static final java.lang.String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
field public static final java.lang.String BIND_CONDITION_PROVIDER_SERVICE = "android.permission.BIND_CONDITION_PROVIDER_SERVICE";
@@ -227,7 +228,6 @@
field public static final java.lang.String WRITE_PROFILE = "android.permission.WRITE_PROFILE";
field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
field public static final java.lang.String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
- field public static final java.lang.String WRITE_SMS = "android.permission.WRITE_SMS";
field public static final deprecated java.lang.String WRITE_SOCIAL_STREAM = "android.permission.WRITE_SOCIAL_STREAM";
field public static final java.lang.String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS";
field public static final java.lang.String WRITE_USER_DICTIONARY = "android.permission.WRITE_USER_DICTIONARY";
@@ -866,6 +866,7 @@
field public static final int layout_x = 16843135; // 0x101017f
field public static final int layout_y = 16843136; // 0x1010180
field public static final int left = 16843181; // 0x10101ad
+ field public static final int leftIndents = 16844016; // 0x10104f0
field public static final int letterSpacing = 16843958; // 0x10104b6
field public static final int lineSpacingExtra = 16843287; // 0x1010217
field public static final int lineSpacingMultiplier = 16843288; // 0x1010218
@@ -888,6 +889,7 @@
field public static final int listSeparatorTextViewStyle = 16843272; // 0x1010208
field public static final int listViewStyle = 16842868; // 0x1010074
field public static final int listViewWhiteStyle = 16842869; // 0x1010075
+ field public static final int lockTaskMode = 16844015; // 0x10104ef
field public static final int logo = 16843454; // 0x10102be
field public static final int longClickable = 16842982; // 0x10100e6
field public static final int loopViews = 16843527; // 0x1010307
@@ -1093,6 +1095,7 @@
field public static final int reversible = 16843851; // 0x101044b
field public static final int revisionCode = 16843989; // 0x10104d5
field public static final int right = 16843183; // 0x10101af
+ field public static final int rightIndents = 16844017; // 0x10104f1
field public static final int ringtonePreferenceStyle = 16842899; // 0x1010093
field public static final int ringtoneType = 16843257; // 0x10101f9
field public static final int rotation = 16843558; // 0x1010326
@@ -1172,7 +1175,8 @@
field public static final int showAsAction = 16843481; // 0x10102d9
field public static final int showDefault = 16843258; // 0x10101fa
field public static final int showDividers = 16843561; // 0x1010329
- field public static final int showOnLockScreen = 16843721; // 0x10103c9
+ field public static final int showForAllUsers = 16844018; // 0x10104f2
+ field public static final deprecated int showOnLockScreen = 16843721; // 0x10103c9
field public static final int showSilent = 16843259; // 0x10101fb
field public static final int showText = 16843949; // 0x10104ad
field public static final deprecated int showWeekNumber = 16843582; // 0x101033e
@@ -2054,6 +2058,7 @@
field public static final int TextAppearance_Material_Widget_ActionMode_Title = 16974355; // 0x1030213
field public static final int TextAppearance_Material_Widget_ActionMode_Title_Inverse = 16974356; // 0x1030214
field public static final int TextAppearance_Material_Widget_Button = 16974357; // 0x1030215
+ field public static final int TextAppearance_Material_Widget_Button_Inverse = 16974565; // 0x10302e5
field public static final int TextAppearance_Material_Widget_DropDownHint = 16974358; // 0x1030216
field public static final int TextAppearance_Material_Widget_DropDownItem = 16974359; // 0x1030217
field public static final int TextAppearance_Material_Widget_EditText = 16974360; // 0x1030218
@@ -2099,6 +2104,7 @@
field public static final int ThemeOverlay_Material_Dark = 16974411; // 0x103024b
field public static final int ThemeOverlay_Material_Dark_ActionBar = 16974412; // 0x103024c
field public static final int ThemeOverlay_Material_Dialog = 16974564; // 0x10302e4
+ field public static final int ThemeOverlay_Material_Dialog_Alert = 16974566; // 0x10302e6
field public static final int ThemeOverlay_Material_Light = 16974410; // 0x103024a
field public static final int Theme_Black = 16973832; // 0x1030008
field public static final int Theme_Black_NoTitleBar = 16973833; // 0x1030009
@@ -3719,12 +3725,15 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RecentTaskInfo> CREATOR;
field public int affiliatedTaskId;
+ field public android.content.ComponentName baseActivity;
field public android.content.Intent baseIntent;
field public java.lang.CharSequence description;
field public int id;
+ field public int numActivities;
field public android.content.ComponentName origActivity;
field public int persistentId;
field public android.app.ActivityManager.TaskDescription taskDescription;
+ field public android.content.ComponentName topActivity;
}
public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable {
@@ -5198,8 +5207,44 @@
method public void cancel(int);
method public void cancel(java.lang.String, int);
method public void cancelAll();
+ method public android.app.NotificationManager.Policy getNotificationPolicy(android.app.NotificationManager.Policy.Token);
+ method public boolean isNotificationPolicyTokenValid(android.app.NotificationManager.Policy.Token);
method public void notify(int, android.app.Notification);
method public void notify(java.lang.String, int, android.app.Notification);
+ method public void requestNotificationPolicyToken(android.app.NotificationManager.Policy.Token.RequestCallback, android.os.Handler);
+ method public void setNotificationPolicy(android.app.NotificationManager.Policy.Token, android.app.NotificationManager.Policy);
+ field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED";
+ }
+
+ public static class NotificationManager.Policy implements android.os.Parcelable {
+ ctor public NotificationManager.Policy(int, int);
+ method public int describeContents();
+ method public static java.lang.String priorityCategoriesToString(int);
+ method public static java.lang.String prioritySendersToString(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.NotificationManager.Policy> CREATOR;
+ field public static final int PRIORITY_CATEGORY_CALLS = 8; // 0x8
+ field public static final int PRIORITY_CATEGORY_EVENTS = 2; // 0x2
+ field public static final int PRIORITY_CATEGORY_MESSAGES = 4; // 0x4
+ field public static final int PRIORITY_CATEGORY_REMINDERS = 1; // 0x1
+ field public static final int PRIORITY_CATEGORY_REPEAT_CALLERS = 16; // 0x10
+ field public static final int PRIORITY_SENDERS_ANY = 0; // 0x0
+ field public static final int PRIORITY_SENDERS_CONTACTS = 1; // 0x1
+ field public static final int PRIORITY_SENDERS_STARRED = 2; // 0x2
+ field public final int priorityCategories;
+ field public final int prioritySenders;
+ }
+
+ public static class NotificationManager.Policy.Token implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.NotificationManager.Policy.Token> CREATOR;
+ }
+
+ public static abstract class NotificationManager.Policy.Token.RequestCallback {
+ ctor public NotificationManager.Policy.Token.RequestCallback();
+ method public abstract void onTokenDenied();
+ method public abstract void onTokenGranted(android.app.NotificationManager.Policy.Token);
}
public final class PendingIntent implements android.os.Parcelable {
@@ -5878,12 +5923,14 @@
field public static final java.lang.String EXTRA_PROVISIONING_BT_MAC_ADDRESS = "android.app.extra.PROVISIONING_BT_MAC_ADDRESS";
field public static final java.lang.String EXTRA_PROVISIONING_BT_USE_PROXY = "android.app.extra.PROVISIONING_BT_USE_PROXY";
field public static final java.lang.String EXTRA_PROVISIONING_BT_UUID = "android.app.extra.PROVISIONING_BT_UUID";
+ field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION";
field public static final deprecated java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME";
+ field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE";
field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM";
@@ -7103,6 +7150,7 @@
field public static final int GATT_SERVER = 8; // 0x8
field public static final int HEADSET = 1; // 0x1
field public static final int HEALTH = 3; // 0x3
+ field public static final int SAP = 10; // 0xa
field public static final int STATE_CONNECTED = 2; // 0x2
field public static final int STATE_CONNECTING = 1; // 0x1
field public static final int STATE_DISCONNECTED = 0; // 0x0
@@ -7114,6 +7162,25 @@
method public abstract void onServiceDisconnected(int);
}
+ public final class BluetoothSap implements android.bluetooth.BluetoothProfile {
+ method public synchronized void close();
+ method public boolean connect(android.bluetooth.BluetoothDevice);
+ method public boolean disconnect(android.bluetooth.BluetoothDevice);
+ method public android.bluetooth.BluetoothDevice getClient();
+ method public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
+ method public int getConnectionState(android.bluetooth.BluetoothDevice);
+ method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
+ method public int getPriority(android.bluetooth.BluetoothDevice);
+ method public int getState();
+ method public boolean isConnected(android.bluetooth.BluetoothDevice);
+ method public boolean setPriority(android.bluetooth.BluetoothDevice, int);
+ field public static final java.lang.String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED";
+ field public static final int RESULT_CANCELED = 2; // 0x2
+ field public static final int RESULT_FAILURE = 0; // 0x0
+ field public static final int RESULT_SUCCESS = 1; // 0x1
+ field public static final int STATE_ERROR = -1; // 0xffffffff
+ }
+
public final class BluetoothServerSocket implements java.io.Closeable {
method public android.bluetooth.BluetoothSocket accept() throws java.io.IOException;
method public android.bluetooth.BluetoothSocket accept(int) throws java.io.IOException;
@@ -7123,10 +7190,16 @@
public final class BluetoothSocket implements java.io.Closeable {
method public void close() throws java.io.IOException;
method public void connect() throws java.io.IOException;
+ method public int getConnectionType();
method public java.io.InputStream getInputStream() throws java.io.IOException;
+ method public int getMaxReceivePacketSize();
+ method public int getMaxTransmitPacketSize();
method public java.io.OutputStream getOutputStream() throws java.io.IOException;
method public android.bluetooth.BluetoothDevice getRemoteDevice();
method public boolean isConnected();
+ field public static final int TYPE_L2CAP = 3; // 0x3
+ field public static final int TYPE_RFCOMM = 1; // 0x1
+ field public static final int TYPE_SCO = 2; // 0x2
}
}
@@ -7891,6 +7964,7 @@
field public static final java.lang.String BLUETOOTH_SERVICE = "bluetooth";
field public static final java.lang.String CAMERA_SERVICE = "camera";
field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
+ field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
@@ -13401,6 +13475,7 @@
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> DEPTH_DEPTH_IS_EXCLUSIVE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> EDGE_AVAILABLE_EDGE_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> FLASH_INFO_AVAILABLE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
@@ -13629,6 +13704,7 @@
field public static final int HOT_PIXEL_MODE_HIGH_QUALITY = 2; // 0x2
field public static final int HOT_PIXEL_MODE_OFF = 0; // 0x0
field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_FULL = 1; // 0x1
+ field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_HIGH_RESOLUTION = 3; // 0x3
field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY = 2; // 0x2
field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0; // 0x0
field public static final int LENS_FACING_BACK = 1; // 0x1
@@ -13647,6 +13723,7 @@
field public static final int NOISE_REDUCTION_MODE_OFF = 0; // 0x0
field public static final int REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE = 0; // 0x0
field public static final int REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE = 6; // 0x6
+ field public static final int REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT = 8; // 0x8
field public static final int REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING = 2; // 0x2
field public static final int REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR = 1; // 0x1
field public static final int REQUEST_AVAILABLE_CAPABILITIES_OPAQUE_REPROCESSING = 4; // 0x4
@@ -14066,6 +14143,8 @@
public class FingerprintManager {
method public void authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject, android.os.CancellationSignal, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, int);
+ method public boolean hasEnrolledFingerprints();
+ method public boolean isHardwareDetected();
field public static final int FINGERPRINT_ACQUIRED_GOOD = 0; // 0x0
field public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
field public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; // 0x2
@@ -14096,6 +14175,8 @@
}
public static class FingerprintManager.CryptoObject {
+ ctor public FingerprintManager.CryptoObject(java.security.Signature);
+ ctor public FingerprintManager.CryptoObject(javax.crypto.Cipher);
method public javax.crypto.Cipher getCipher();
method public java.security.Signature getSignature();
}
@@ -16044,9 +16125,12 @@
method public int getSampleRate();
method public int getState();
method public int read(byte[], int, int);
+ method public int read(byte[], int, int, int);
method public int read(short[], int, int);
+ method public int read(short[], int, int, int);
method public int read(float[], int, int, int);
method public int read(java.nio.ByteBuffer, int);
+ method public int read(java.nio.ByteBuffer, int, int);
method public void release();
method public int setNotificationMarkerPosition(int);
method public int setPositionNotificationPeriod(int);
@@ -16108,6 +16192,7 @@
method public int getPlaybackHeadPosition();
method public int getPlaybackRate();
method public int getPositionNotificationPeriod();
+ method public android.media.AudioDeviceInfo getPreferredOutputDevice();
method public int getSampleRate();
method public int getState();
method public int getStreamType();
@@ -16124,12 +16209,15 @@
method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler);
method public int setPlaybackRate(int);
method public int setPositionNotificationPeriod(int);
+ method public boolean setPreferredOutputDevice(android.media.AudioDeviceInfo);
method protected deprecated void setState(int);
method public deprecated int setStereoVolume(float, float);
method public int setVolume(float);
method public void stop() throws java.lang.IllegalStateException;
method public int write(byte[], int, int);
+ method public int write(byte[], int, int, int);
method public int write(short[], int, int);
+ method public int write(short[], int, int, int);
method public int write(float[], int, int, int);
method public int write(java.nio.ByteBuffer, int, int);
field public static final int ERROR = -1; // 0xffffffff
@@ -16707,6 +16795,11 @@
ctor public MediaCryptoException(java.lang.String);
}
+ public abstract interface MediaDataSource implements java.io.Closeable {
+ method public abstract long getSize();
+ method public abstract int readAt(long, byte[], int);
+ }
+
public class MediaDescription implements android.os.Parcelable {
method public int describeContents();
method public java.lang.CharSequence getDescription();
@@ -16843,6 +16936,7 @@
method public final void release();
method public void seekTo(long, int);
method public void selectTrack(int);
+ method public final void setDataSource(android.media.MediaDataSource) throws java.io.IOException, java.lang.IllegalArgumentException;
method public final void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException;
method public final void setDataSource(java.lang.String, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException;
method public final void setDataSource(java.lang.String) throws java.io.IOException;
@@ -17022,6 +17116,7 @@
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.lang.IllegalArgumentException;
method public void setDataSource(java.io.FileDescriptor) throws java.lang.IllegalArgumentException;
method public void setDataSource(android.content.Context, android.net.Uri) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
+ method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException;
field public static final int METADATA_KEY_ALBUM = 1; // 0x1
field public static final int METADATA_KEY_ALBUMARTIST = 13; // 0xd
field public static final int METADATA_KEY_ARTIST = 2; // 0x2
@@ -17106,6 +17201,7 @@
method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setDataSource(android.media.MediaDataSource) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDisplay(android.view.SurfaceHolder);
method public void setLooping(boolean);
method public void setNextMediaPlayer(android.media.MediaPlayer);
@@ -17115,6 +17211,7 @@
method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener);
method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);
method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener);
+ method public void setOnTimedMetaDataListener(android.media.MediaPlayer.OnTimedMetaDataListener);
method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener);
method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener);
method public void setPlaybackRate(float, int);
@@ -17172,6 +17269,10 @@
method public abstract void onSeekComplete(android.media.MediaPlayer);
}
+ public static abstract interface MediaPlayer.OnTimedMetaDataListener {
+ method public abstract void onTimedMetaData(android.media.MediaPlayer, android.media.TimedMetaData);
+ }
+
public static abstract interface MediaPlayer.OnTimedTextListener {
method public abstract void onTimedText(android.media.MediaPlayer, android.media.TimedText);
}
@@ -17187,6 +17288,7 @@
method public int getTrackType();
method public void writeToParcel(android.os.Parcel, int);
field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
+ field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5
field public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; // 0x4
field public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; // 0x3
field public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; // 0x0
@@ -17430,7 +17532,7 @@
public final class MediaSync {
ctor public MediaSync();
- method public void configureAudioTrack(android.media.AudioTrack, int);
+ method public void configureAudioTrack(android.media.AudioTrack);
method public void configureSurface(android.view.Surface);
method public final android.view.Surface createInputSurface();
method public boolean getTimestamp(android.media.MediaTimestamp);
@@ -17663,6 +17765,11 @@
field public static final int OPTIONS_RECYCLE_INPUT = 2; // 0x2
}
+ public class TimedMetaData {
+ method public byte[] getRawData();
+ method public long getTimeUs();
+ }
+
public final class TimedText {
method public android.graphics.Rect getBounds();
method public java.lang.String getText();
@@ -19523,6 +19630,7 @@
public class ConnectivityManager {
method public void addDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
method public boolean bindProcessToNetwork(android.net.Network);
+ method public android.net.Network getActiveNetwork();
method public android.net.NetworkInfo getActiveNetworkInfo();
method public android.net.NetworkInfo[] getAllNetworkInfo();
method public android.net.Network[] getAllNetworks();
@@ -19541,7 +19649,8 @@
method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void releaseNetworkRequest(android.app.PendingIntent);
method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
- method public void reportBadNetwork(android.net.Network);
+ method public deprecated void reportBadNetwork(android.net.Network);
+ method public void reportNetworkConnectivity(android.net.Network, boolean);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated boolean requestRouteToHost(int, int);
@@ -21487,6 +21596,7 @@
public final class NfcEvent {
field public final android.nfc.NfcAdapter nfcAdapter;
+ field public final byte peerLlcpVersion;
}
public final class NfcManager {
@@ -24650,6 +24760,8 @@
method public static long getNativeHeapFreeSize();
method public static long getNativeHeapSize();
method public static long getPss();
+ method public static java.lang.String getRuntimeStat(java.lang.String);
+ method public static java.util.Map<java.lang.String, java.lang.String> getRuntimeStats();
method public static deprecated int getThreadAllocCount();
method public static deprecated int getThreadAllocSize();
method public static deprecated int getThreadExternalAllocCount();
@@ -25459,6 +25571,7 @@
method public android.os.Bundle getUserRestrictions(android.os.UserHandle);
method public boolean hasUserRestriction(java.lang.String);
method public boolean isManagedProfile();
+ method public boolean isSystemUser();
method public boolean isUserAGoat();
method public boolean isUserRunning(android.os.UserHandle);
method public boolean isUserRunningOrStopping(android.os.UserHandle);
@@ -29262,7 +29375,6 @@
method public static android.renderscript.AllocationAdapter create1D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter create2D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter createTyped(android.renderscript.RenderScript, android.renderscript.Allocation, android.renderscript.Type);
- method public void setArray(int, int);
method public void setFace(android.renderscript.Type.CubemapFace);
method public void setLOD(int);
method public void setX(int);
@@ -29923,6 +30035,62 @@
method public void setLUT(android.renderscript.Allocation);
}
+ public final class ScriptIntrinsicBLAS extends android.renderscript.ScriptIntrinsic {
+ method public void BNNM(android.renderscript.Allocation, int, android.renderscript.Allocation, int, android.renderscript.Allocation, int, int);
+ method public void CGEMM(int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Float2, android.renderscript.Allocation);
+ method public void CHEMM(int, int, float, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void CHER2K(int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void CHERK(int, int, float, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void CSYMM(int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Float2, android.renderscript.Allocation);
+ method public void CSYR2K(int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Float2, android.renderscript.Allocation);
+ method public void CSYRK(int, int, float, float, android.renderscript.Allocation, float, float, android.renderscript.Allocation);
+ method public void CTRMM(int, int, int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void CTRSM(int, int, int, int, android.renderscript.Float2, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void DGEMM(int, int, double, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void DSYMM(int, int, double, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void DSYR2K(int, int, double, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void DSYRK(int, int, double, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void DTRMM(int, int, int, int, double, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void DTRSM(int, int, int, int, double, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void SGEMM(int, int, float, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void SSYMM(int, int, float, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void SSYR2K(int, int, float, android.renderscript.Allocation, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void SSYRK(int, int, float, android.renderscript.Allocation, float, android.renderscript.Allocation);
+ method public void STRMM(int, int, int, int, float, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void STRSM(int, int, int, int, float, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void ZGEMM(int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Double2, android.renderscript.Allocation);
+ method public void ZHEMM(int, int, double, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void ZHER2K(int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void ZHERK(int, int, double, android.renderscript.Allocation, double, android.renderscript.Allocation);
+ method public void ZSYMM(int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Double2, android.renderscript.Allocation);
+ method public void ZSYR2K(int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.Double2, android.renderscript.Allocation);
+ method public void ZSYRK(int, int, double, double, android.renderscript.Allocation, double, double, android.renderscript.Allocation);
+ method public void ZTRMM(int, int, int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public void ZTRSM(int, int, int, int, android.renderscript.Double2, android.renderscript.Allocation, android.renderscript.Allocation);
+ method public static android.renderscript.ScriptIntrinsicBLAS create(android.renderscript.RenderScript);
+ field public static final int CONJ_TRANSPOSE = 113; // 0x71
+ field public static final int LEFT = 141; // 0x8d
+ field public static final int LOWER = 122; // 0x7a
+ field public static final int NON_UNIT = 131; // 0x83
+ field public static final int NO_TRANSPOSE = 111; // 0x6f
+ field public static final int RIGHT = 142; // 0x8e
+ field public static final int TRANSPOSE = 112; // 0x70
+ field public static final int UNIT = 132; // 0x84
+ field public static final int UPPER = 121; // 0x79
+ }
+
+ public static abstract class ScriptIntrinsicBLAS.Diag implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract class ScriptIntrinsicBLAS.Side implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract class ScriptIntrinsicBLAS.Transpose implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract class ScriptIntrinsicBLAS.Uplo implements java.lang.annotation.Annotation {
+ }
+
public class ScriptIntrinsicBlend extends android.renderscript.ScriptIntrinsic {
method public static android.renderscript.ScriptIntrinsicBlend create(android.renderscript.RenderScript, android.renderscript.Element);
method public void forEachAdd(android.renderscript.Allocation, android.renderscript.Allocation);
@@ -30085,8 +30253,6 @@
method public static android.renderscript.Type createX(android.renderscript.RenderScript, android.renderscript.Element, int);
method public static android.renderscript.Type createXY(android.renderscript.RenderScript, android.renderscript.Element, int, int);
method public static android.renderscript.Type createXYZ(android.renderscript.RenderScript, android.renderscript.Element, int, int, int);
- method public int getArray(int);
- method public int getArrayCount();
method public int getCount();
method public android.renderscript.Element getElement();
method public int getX();
@@ -30100,7 +30266,6 @@
public static class Type.Builder {
ctor public Type.Builder(android.renderscript.RenderScript, android.renderscript.Element);
method public android.renderscript.Type create();
- method public android.renderscript.Type.Builder setArray(int, int);
method public android.renderscript.Type.Builder setFaces(boolean);
method public android.renderscript.Type.Builder setMipmaps(boolean);
method public android.renderscript.Type.Builder setX(int);
@@ -30336,6 +30501,7 @@
public static abstract class KeyStoreKeyProperties.Origin {
field public static final int GENERATED = 1; // 0x1
field public static final int IMPORTED = 2; // 0x2
+ field public static final int UNKNOWN = 4; // 0x4
}
public static abstract class KeyStoreKeyProperties.OriginEnum implements java.lang.annotation.Annotation {
@@ -30434,6 +30600,26 @@
package android.service.carrier {
+ public abstract class CarrierConfigService extends android.app.Service {
+ ctor public CarrierConfigService();
+ method public final android.os.IBinder onBind(android.content.Intent);
+ method public abstract android.os.Bundle onLoadConfig(android.service.carrier.CarrierIdentifier);
+ field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierConfigService";
+ }
+
+ public class CarrierIdentifier implements android.os.Parcelable {
+ ctor public CarrierIdentifier(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public int describeContents();
+ method public java.lang.String getGid1();
+ method public java.lang.String getGid2();
+ method public java.lang.String getImsi();
+ method public java.lang.String getMcc();
+ method public java.lang.String getMnc();
+ method public java.lang.String getSpn();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.carrier.CarrierIdentifier> CREATOR;
+ }
+
public abstract class CarrierMessagingService extends android.app.Service {
ctor public CarrierMessagingService();
method public android.os.IBinder onBind(android.content.Intent);
@@ -30645,6 +30831,7 @@
method public final int getCurrentInterruptionFilter();
method public final int getCurrentListenerHints();
method public android.service.notification.NotificationListenerService.RankingMap getCurrentRanking();
+ method public final android.app.NotificationManager.Policy.Token getNotificationPolicyToken();
method public android.os.IBinder onBind(android.content.Intent);
method public void onInterruptionFilterChanged(int);
method public void onListenerConnected();
@@ -30778,7 +30965,8 @@
public class TrustAgentService extends android.app.Service {
ctor public TrustAgentService();
- method public final void grantTrust(java.lang.CharSequence, long, boolean);
+ method public final deprecated void grantTrust(java.lang.CharSequence, long, boolean);
+ method public final void grantTrust(java.lang.CharSequence, long, int);
method public final android.os.IBinder onBind(android.content.Intent);
method public boolean onConfigure(java.util.List<android.os.PersistableBundle>);
method public void onDeviceLocked();
@@ -30787,6 +30975,8 @@
method public void onUnlockAttempt(boolean);
method public final void revokeTrust();
method public final void setManagingTrust(boolean);
+ field public static final int FLAG_GRANT_TRUST_DISMISS_KEYGUARD = 2; // 0x2
+ field public static final int FLAG_GRANT_TRUST_INITIATED_BY_USER = 1; // 0x1
field public static final java.lang.String SERVICE_INTERFACE = "android.service.trust.TrustAgentService";
field public static final java.lang.String TRUST_AGENT_META_DATA = "android.service.trust.trustagent";
}
@@ -31903,7 +32093,7 @@
}
public final class Call {
- method public void addListener(android.telecom.Call.Listener);
+ method public deprecated void addListener(android.telecom.Call.Listener);
method public void answer(int);
method public void conference(android.telecom.Call);
method public void disconnect();
@@ -31920,12 +32110,14 @@
method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean);
method public void playDtmfTone(char);
method public void postDialContinue(boolean);
+ method public void registerCallback(android.telecom.Call.Callback);
method public void reject(boolean, java.lang.String);
- method public void removeListener(android.telecom.Call.Listener);
+ method public deprecated void removeListener(android.telecom.Call.Listener);
method public void splitFromConference();
method public void stopDtmfTone();
method public void swapConference();
method public void unhold();
+ method public void unregisterCallback(android.telecom.Call.Callback);
field public static final java.lang.String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
field public static final int STATE_ACTIVE = 4; // 0x4
field public static final int STATE_CONNECTING = 9; // 0x9
@@ -31938,6 +32130,19 @@
field public static final int STATE_RINGING = 2; // 0x2
}
+ public static abstract class Call.Callback {
+ ctor public Call.Callback();
+ method public void onCallDestroyed(android.telecom.Call);
+ method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>);
+ method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
+ method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
+ method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details);
+ method public void onParentChanged(android.telecom.Call, android.telecom.Call);
+ method public void onPostDialWait(android.telecom.Call, java.lang.String);
+ method public void onStateChanged(android.telecom.Call, int);
+ method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
+ }
+
public static class Call.Details {
method public static boolean can(int, int);
method public boolean can(int);
@@ -31976,17 +32181,8 @@
field public static final int CAPABILITY_WIFI = 65536; // 0x10000
}
- public static abstract class Call.Listener {
+ public static abstract deprecated class Call.Listener extends android.telecom.Call.Callback {
ctor public Call.Listener();
- method public void onCallDestroyed(android.telecom.Call);
- method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>);
- method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
- method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
- method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details);
- method public void onParentChanged(android.telecom.Call, android.telecom.Call);
- method public void onPostDialWait(android.telecom.Call, java.lang.String);
- method public void onStateChanged(android.telecom.Call, int);
- method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
}
public class CallProperties {
@@ -32017,7 +32213,7 @@
field public static final android.os.Parcelable.Creator<android.telecom.CameraCapabilities> CREATOR;
}
- public abstract class Conference implements android.telecom.IConferenceable {
+ public abstract class Conference implements android.telecom.Conferenceable {
ctor public Conference(android.telecom.PhoneAccountHandle);
method public final boolean addConnection(android.telecom.Connection);
method public final void destroy();
@@ -32051,7 +32247,10 @@
field public static final long CONNECT_TIME_NOT_SPECIFIED = 0L; // 0x0L
}
- public abstract class Connection implements android.telecom.IConferenceable {
+ public abstract interface Conferenceable {
+ }
+
+ public abstract class Connection implements android.telecom.Conferenceable {
ctor public Connection();
method public static java.lang.String capabilitiesToString(int);
method public static android.telecom.Connection createCanceledConnection();
@@ -32064,7 +32263,7 @@
method public final java.lang.String getCallerDisplayName();
method public final int getCallerDisplayNamePresentation();
method public final android.telecom.Conference getConference();
- method public final java.util.List<android.telecom.IConferenceable> getConferenceables();
+ method public final java.util.List<android.telecom.Conferenceable> getConferenceables();
method public final int getConnectionCapabilities();
method public final android.telecom.DisconnectCause getDisconnectCause();
method public final int getState();
@@ -32088,7 +32287,7 @@
method public final void setAudioModeIsVoip(boolean);
method public final void setCallerDisplayName(java.lang.String, int);
method public final void setConferenceableConnections(java.util.List<android.telecom.Connection>);
- method public final void setConferenceables(java.util.List<android.telecom.IConferenceable>);
+ method public final void setConferenceables(java.util.List<android.telecom.Conferenceable>);
method public final void setConnectionCapabilities(int);
method public final void setConnectionService(android.telecom.ConnectionService);
method public final void setDialing();
@@ -32216,20 +32415,28 @@
field public static final android.os.Parcelable.Creator<android.telecom.GatewayInfo> CREATOR;
}
- public abstract interface IConferenceable {
- }
-
public abstract class InCallService extends android.app.Service {
ctor public InCallService();
- method public final android.telecom.Phone getPhone();
+ method public final boolean canAddCall();
+ method public final android.telecom.AudioState getAudioState();
+ method public final java.util.List<android.telecom.Call> getCalls();
+ method public deprecated android.telecom.Phone getPhone();
+ method public void onAudioStateChanged(android.telecom.AudioState);
method public android.os.IBinder onBind(android.content.Intent);
- method public void onPhoneCreated(android.telecom.Phone);
- method public void onPhoneDestroyed(android.telecom.Phone);
+ method public void onBringToForeground(boolean);
+ method public void onCallAdded(android.telecom.Call);
+ method public void onCallRemoved(android.telecom.Call);
+ method public void onCanAddCallChanged(boolean);
+ method public deprecated void onPhoneCreated(android.telecom.Phone);
+ method public deprecated void onPhoneDestroyed(android.telecom.Phone);
+ method public final void setAudioRoute(int);
+ method public final void setMuted(boolean);
field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.InCallService";
}
public static abstract class InCallService.VideoCall {
ctor public InCallService.VideoCall();
+ method public abstract void registerCallback(android.telecom.InCallService.VideoCall.Callback);
method public abstract void requestCallDataUsage();
method public abstract void requestCameraCapabilities();
method public abstract void sendSessionModifyRequest(android.telecom.VideoProfile);
@@ -32239,12 +32446,11 @@
method public abstract void setDisplaySurface(android.view.Surface);
method public abstract void setPauseImage(java.lang.String);
method public abstract void setPreviewSurface(android.view.Surface);
- method public abstract void setVideoCallListener(android.telecom.InCallService.VideoCall.Listener);
method public abstract void setZoom(float);
}
- public static abstract class InCallService.VideoCall.Listener {
- ctor public InCallService.VideoCall.Listener();
+ public static abstract class InCallService.VideoCall.Callback {
+ ctor public InCallService.VideoCall.Callback();
method public abstract void onCallDataUsageChanged(long);
method public abstract void onCallSessionEvent(int);
method public abstract void onCameraCapabilitiesChanged(android.telecom.CameraCapabilities);
@@ -32254,7 +32460,7 @@
method public abstract void onVideoQualityChanged(int);
}
- public final class Phone {
+ public final deprecated class Phone {
method public final void addListener(android.telecom.Phone.Listener);
method public final boolean canAddCall();
method public final android.telecom.AudioState getAudioState();
@@ -32446,10 +32652,9 @@
method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsSupportingScheme(java.lang.String);
method public java.util.List<android.telecom.PhoneAccountHandle> getRegisteredConnectionManagers();
method public android.telecom.PhoneAccountHandle getSimCallManager();
- method public android.telecom.PhoneAccountHandle getUserSelectedOutgoingPhoneAccount();
+ method public java.lang.String getVoiceMailNumber(android.telecom.PhoneAccountHandle);
method public boolean handleMmi(java.lang.String);
method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle);
- method public boolean hasVoiceMailNumber(android.telecom.PhoneAccountHandle);
method public boolean isInCall();
method public boolean isRinging();
method public boolean isTtySupported();
@@ -32516,6 +32721,20 @@
package android.telephony {
+ public class CarrierConfigManager {
+ method public android.os.Bundle getConfig();
+ method public android.os.Bundle getConfigForSubId(int);
+ method public static android.os.Bundle getDefaultConfig();
+ method public void reloadCarrierConfigForSubId(int);
+ method public void updateConfigForPhoneId(int, java.lang.String);
+ field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
+ field public static final java.lang.String BOOL_CARRIER_VOLTE_AVAILABLE = "bool_carrier_volte_available";
+ field public static final java.lang.String BOOL_CARRIER_VOLTE_PROVISIONED = "bool_carrier_volte_provisioned";
+ field public static final java.lang.String BOOL_CARRIER_VOLTE_TTY_SUPPORTED = "bool_carrier_volte_tty_supported";
+ field public static final java.lang.String BOOL_SHOW_APN_SETTING_CDMA = "bool_show_apn_setting_cdma";
+ field public static final java.lang.String INT_VOLTE_REPLACEMENT_RAT = "int_volte_replacement_rat";
+ }
+
public final class CellIdentityCdma implements android.os.Parcelable {
method public int describeContents();
method public int getBasestationId();
@@ -32993,6 +33212,7 @@
method public java.util.List<android.telephony.CellInfo> getAllCellInfo();
method public int getCallState();
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
+ method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
method public java.lang.String getCdmaMdn();
method public java.lang.String getCdmaMdn(int);
method public java.lang.String getCdmaMin();
@@ -33050,6 +33270,7 @@
method public boolean isWorldPhone();
method public void listen(android.telephony.PhoneStateListener, int);
method public boolean needsOtaServiceProvisioning();
+ method public void notifyCarrierNetworkChange(boolean);
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
method public void setDataEnabled(boolean);
method public void setDataEnabled(int, boolean);
@@ -36565,6 +36786,7 @@
method public boolean onTouchEvent(android.view.MotionEvent);
method public void setIsLongpressEnabled(boolean);
method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
+ method public void setOnStylusButtonPressListener(android.view.GestureDetector.OnStylusButtonPressListener);
}
public static abstract interface GestureDetector.OnDoubleTapListener {
@@ -36582,7 +36804,11 @@
method public abstract boolean onSingleTapUp(android.view.MotionEvent);
}
- public static class GestureDetector.SimpleOnGestureListener implements android.view.GestureDetector.OnDoubleTapListener android.view.GestureDetector.OnGestureListener {
+ public static abstract interface GestureDetector.OnStylusButtonPressListener {
+ method public abstract boolean onStylusButtonPress(android.view.MotionEvent);
+ }
+
+ public static class GestureDetector.SimpleOnGestureListener implements android.view.GestureDetector.OnDoubleTapListener android.view.GestureDetector.OnGestureListener android.view.GestureDetector.OnStylusButtonPressListener {
ctor public GestureDetector.SimpleOnGestureListener();
method public boolean onDoubleTap(android.view.MotionEvent);
method public boolean onDoubleTapEvent(android.view.MotionEvent);
@@ -36593,6 +36819,7 @@
method public void onShowPress(android.view.MotionEvent);
method public boolean onSingleTapConfirmed(android.view.MotionEvent);
method public boolean onSingleTapUp(android.view.MotionEvent);
+ method public boolean onStylusButtonPress(android.view.MotionEvent);
}
public class Gravity {
@@ -43655,6 +43882,7 @@
method public int getInputType();
method public final android.text.method.KeyListener getKeyListener();
method public final android.text.Layout getLayout();
+ method public int[] getLeftIndents();
method public float getLetterSpacing();
method public int getLineBounds(int, android.graphics.Rect);
method public int getLineCount();
@@ -43677,6 +43905,7 @@
method public android.text.TextPaint getPaint();
method public int getPaintFlags();
method public java.lang.String getPrivateImeOptions();
+ method public int[] getRightIndents();
method public int getSelectionEnd();
method public int getSelectionStart();
method public int getShadowColor();
@@ -43754,6 +43983,7 @@
method public void setImeActionLabel(java.lang.CharSequence, int);
method public void setImeOptions(int);
method public void setIncludeFontPadding(boolean);
+ method public void setIndents(int[], int[]);
method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public void setInputType(int);
method public void setKeyListener(android.text.method.KeyListener);
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index fa28143..8ba2a5a 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -857,6 +857,11 @@
"Error: Activity not started, voice control not allowed for: "
+ intent);
break;
+ case ActivityManager.START_NOT_CURRENT_USER_ACTIVITY:
+ out.println(
+ "Error: Not allowed to start background user activity"
+ + " that shouldn't be displayed for all users.");
+ break;
default:
out.println(
"Error: Activity not started, unknown error code " + res);
diff --git a/cmds/app_process/Android.mk b/cmds/app_process/Android.mk
index dd5e0ea..ce6d7b5 100644
--- a/cmds/app_process/Android.mk
+++ b/cmds/app_process/Android.mk
@@ -56,6 +56,7 @@
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)/asan
LOCAL_MODULE_STEM := app_process
LOCAL_ADDRESS_SANITIZER := true
+LOCAL_CLANG := true
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index b43c462..d5cc8cc 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -1691,9 +1691,13 @@
showUsage();
return 1;
}
+ String volumeUuid = nextArg();
+ if ("internal".equals(volumeUuid)) {
+ volumeUuid = null;
+ }
ClearDataObserver obs = new ClearDataObserver();
try {
- mPm.freeStorageAndNotify(sizeVal, obs);
+ mPm.freeStorageAndNotify(volumeUuid, sizeVal, obs);
synchronized (obs) {
while (!obs.finished) {
try {
@@ -1884,7 +1888,7 @@
System.err.println(" pm set-install-location [0/auto] [1/internal] [2/external]");
System.err.println(" pm get-install-location");
System.err.println(" pm set-permission-enforced PERMISSION [true|false]");
- System.err.println(" pm trim-caches DESIRED_FREE_SPACE");
+ System.err.println(" pm trim-caches DESIRED_FREE_SPACE [internal|UUID]");
System.err.println(" pm create-user [--profileOf USER_ID] [--managed] USER_NAME");
System.err.println(" pm remove-user USER_ID");
System.err.println(" pm get-max-users");
diff --git a/cmds/wm/src/com/android/commands/wm/Wm.java b/cmds/wm/src/com/android/commands/wm/Wm.java
index 815a0ac..64f023f 100644
--- a/cmds/wm/src/com/android/commands/wm/Wm.java
+++ b/cmds/wm/src/com/android/commands/wm/Wm.java
@@ -24,6 +24,7 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.AndroidException;
+import android.util.DisplayMetrics;
import android.view.Display;
import android.view.IWindowManager;
import com.android.internal.os.BaseCommand;
@@ -45,21 +46,27 @@
(new Wm()).run(args);
}
+ @Override
public void onShowUsage(PrintStream out) {
out.println(
"usage: wm [subcommand] [options]\n" +
- " wm size [reset|WxH]\n" +
+ " wm size [reset|WxH|WdpxHdp]\n" +
" wm density [reset|DENSITY]\n" +
" wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM]\n" +
+ " wm scaling [off|auto]\n" +
"\n" +
"wm size: return or override display size.\n" +
+ " width and height in pixels unless suffixed with 'dp'.\n" +
"\n" +
"wm density: override display density.\n" +
"\n" +
- "wm overscan: set overscan area for display.\n"
+ "wm overscan: set overscan area for display.\n" +
+ "\n" +
+ "wm scaling: set display scaling mode.\n"
);
}
+ @Override
public void onRun() throws Exception {
mWm = IWindowManager.Stub.asInterface(ServiceManager.checkService(
Context.WINDOW_SERVICE));
@@ -76,6 +83,8 @@
runDisplayDensity();
} else if (op.equals("overscan")) {
runDisplayOverscan();
+ } else if (op.equals("scaling")) {
+ runDisplayScaling();
} else {
showError("Error: unknown command '" + op + "'");
return;
@@ -85,6 +94,7 @@
private void runDisplaySize() throws Exception {
String size = nextArg();
int w, h;
+ boolean scale = true;
if (size == null) {
Point initialSize = new Point();
Point baseSize = new Point();
@@ -109,8 +119,8 @@
String wstr = size.substring(0, div);
String hstr = size.substring(div+1);
try {
- w = Integer.parseInt(wstr);
- h = Integer.parseInt(hstr);
+ w = parseDimension(wstr);
+ h = parseDimension(hstr);
} catch (NumberFormatException e) {
System.err.println("Error: bad number " + e);
return;
@@ -193,4 +203,32 @@
} catch (RemoteException e) {
}
}
+
+ private void runDisplayScaling() throws Exception {
+ String scalingStr = nextArgRequired();
+ if ("auto".equals(scalingStr)) {
+ mWm.setForcedDisplayScalingMode(Display.DEFAULT_DISPLAY, 0);
+ } else if ("off".equals(scalingStr)) {
+ mWm.setForcedDisplayScalingMode(Display.DEFAULT_DISPLAY, 1);
+ } else {
+ System.err.println("Error: scaling must be 'auto' or 'off'");
+ }
+ }
+
+ private int parseDimension(String s) throws NumberFormatException {
+ if (s.endsWith("px")) {
+ return Integer.parseInt(s.substring(0, s.length() - 2));
+ }
+ if (s.endsWith("dp")) {
+ int density;
+ try {
+ density = mWm.getBaseDisplayDensity(Display.DEFAULT_DISPLAY);
+ } catch (RemoteException e) {
+ density = DisplayMetrics.DENSITY_DEFAULT;
+ }
+ return Integer.parseInt(s.substring(0, s.length() - 2)) * density /
+ DisplayMetrics.DENSITY_DEFAULT;
+ }
+ return Integer.parseInt(s);
+ }
}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 6cf6481..4ccde1c 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -6434,18 +6434,22 @@
* Request to put this Activity in a mode where the user is locked to the
* current task.
*
- * This will prevent the user from launching other apps, going to settings,
- * or reaching the home screen.
+ * This will prevent the user from launching other apps, going to settings, or reaching the
+ * home screen. This does not include those apps whose {@link android.R.attr#lockTaskMode}
+ * values permit launching while locked.
*
- * If {@link DevicePolicyManager#isLockTaskPermitted(String)} returns true
- * for this component then the app will go directly into Lock Task mode. The user
- * will not be able to exit this mode until {@link Activity#stopLockTask()} is called.
+ * If {@link DevicePolicyManager#isLockTaskPermitted(String)} returns true or
+ * lockTaskMode=lockTaskModeAlways for this component then the app will go directly into
+ * Lock Task mode. The user will not be able to exit this mode until
+ * {@link Activity#stopLockTask()} is called.
*
* If {@link DevicePolicyManager#isLockTaskPermitted(String)} returns false
* then the system will prompt the user with a dialog requesting permission to enter
* this mode. When entered through this method the user can exit at any time through
* an action described by the request dialog. Calling stopLockTask will also exit the
* mode.
+ *
+ * @see android.R.attr#lockTaskMode
*/
public void startLockTask() {
try {
@@ -6462,6 +6466,14 @@
* startLockTask previously.
*
* This will allow the user to exit this app and move onto other activities.
+ * <p>Note: This method should only be called when the activity is user-facing. That is,
+ * between onResume() and onPause().
+ * <p>Note: If there are other tasks below this one that are also locked then calling this
+ * method will immediately finish this task and resume the previous locked one, remaining in
+ * lockTask mode.
+ *
+ * @see android.R.attr#lockTaskMode
+ * @see ActivityManager#getLockTaskModeState()
*/
public void stopLockTask() {
try {
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 51ececc..576a046 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -86,6 +86,13 @@
public static final String META_HOME_ALTERNATE = "android.app.home.alternate";
/**
+ * Result for IActivityManager.startActivity: trying to start a background user
+ * activity that shouldn't be displayed for all users.
+ * @hide
+ */
+ public static final int START_NOT_CURRENT_USER_ACTIVITY = -8;
+
+ /**
* Result for IActivityManager.startActivity: trying to start an activity under voice
* control when that activity does not support the VOICE category.
* @hide
@@ -862,6 +869,23 @@
*/
public int affiliatedTaskColor;
+ /**
+ * The component launched as the first activity in the task.
+ * This can be considered the "application" of this task.
+ */
+ public ComponentName baseActivity;
+
+ /**
+ * The activity component at the top of the history stack of the task.
+ * This is what the user is currently doing.
+ */
+ public ComponentName topActivity;
+
+ /**
+ * Number of activities in this task.
+ */
+ public int numActivities;
+
public RecentTaskInfo() {
}
@@ -895,6 +919,9 @@
dest.writeLong(lastActiveTime);
dest.writeInt(affiliatedTaskId);
dest.writeInt(affiliatedTaskColor);
+ ComponentName.writeToParcel(baseActivity, dest);
+ ComponentName.writeToParcel(topActivity, dest);
+ dest.writeInt(numActivities);
}
public void readFromParcel(Parcel source) {
@@ -911,6 +938,9 @@
lastActiveTime = source.readLong();
affiliatedTaskId = source.readInt();
affiliatedTaskColor = source.readInt();
+ baseActivity = ComponentName.readFromParcel(source);
+ topActivity = ComponentName.readFromParcel(source);
+ numActivities = source.readInt();
}
public static final Creator<RecentTaskInfo> CREATOR
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 256d87d..add7af2 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -93,15 +93,20 @@
}
static boolean sSystemReady = false;
+ static public void broadcastStickyIntent(Intent intent, String permission, int userId) {
+ broadcastStickyIntent(intent, permission, AppOpsManager.OP_NONE, userId);
+ }
+
/**
* Convenience for sending a sticky broadcast. For internal use only.
* If you don't care about permission, use null.
*/
- static public void broadcastStickyIntent(Intent intent, String permission, int userId) {
+ static public void broadcastStickyIntent(Intent intent, String permission, int appOp,
+ int userId) {
try {
getDefault().broadcastIntent(
null, intent, null, null, Activity.RESULT_OK, null, null,
- null /*permission*/, AppOpsManager.OP_NONE, false, true, userId);
+ null /*permission*/, appOp, false, true, userId);
} catch (RemoteException ex) {
}
}
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 381c20c..223d528 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -16,6 +16,7 @@
package android.app;
+import android.Manifest;
import android.annotation.SystemApi;
import android.app.usage.UsageStatsManager;
import android.content.Context;
@@ -212,8 +213,12 @@
public static final int OP_ASSIST_STRUCTURE = 49;
/** @hide Received a screenshot from assist. */
public static final int OP_ASSIST_SCREENSHOT = 50;
+ /** @hide Read the phone state. */
+ public static final int OP_READ_PHONE_STATE = 51;
+ /** @hide Add voicemail messages to the voicemail content provider. */
+ public static final int OP_ADD_VOICEMAIL = 52;
/** @hide */
- public static final int _NUM_OP = 51;
+ public static final int _NUM_OP = 53;
/** Access to coarse location information. */
public static final String OPSTR_COARSE_LOCATION =
@@ -294,6 +299,8 @@
OP_WRITE_WALLPAPER,
OP_ASSIST_STRUCTURE,
OP_ASSIST_SCREENSHOT,
+ OP_READ_PHONE_STATE,
+ OP_ADD_VOICEMAIL
};
/**
@@ -352,6 +359,8 @@
null,
null,
null,
+ null,
+ null
};
/**
@@ -409,7 +418,9 @@
"ACTIVATE_VPN",
"WRITE_WALLPAPER",
"ASSIST_STRUCTURE",
- "ASSIST_SCREENSHOT"
+ "ASSIST_SCREENSHOT",
+ "OP_READ_PHONE_STATE",
+ "ADD_VOICEMAIL"
};
/**
@@ -432,14 +443,14 @@
null, // neighboring cells shares the coarse location perm
android.Manifest.permission.CALL_PHONE,
android.Manifest.permission.READ_SMS,
- android.Manifest.permission.WRITE_SMS,
+ null, // no permission required for writing sms
android.Manifest.permission.RECEIVE_SMS,
android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST,
android.Manifest.permission.RECEIVE_MMS,
android.Manifest.permission.RECEIVE_WAP_PUSH,
android.Manifest.permission.SEND_SMS,
android.Manifest.permission.READ_SMS,
- android.Manifest.permission.WRITE_SMS,
+ null, // no permission required for writing icc sms
android.Manifest.permission.WRITE_SETTINGS,
android.Manifest.permission.SYSTEM_ALERT_WINDOW,
android.Manifest.permission.ACCESS_NOTIFICATIONS,
@@ -468,6 +479,8 @@
null, // no permission for supporting wallpaper
null, // no permission for receiving assist structure
null, // no permission for receiving assist screenshot
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.ADD_VOICEMAIL
};
/**
@@ -527,6 +540,8 @@
UserManager.DISALLOW_WALLPAPER, // WRITE_WALLPAPER
null, // ASSIST_STRUCTURE
null, // ASSIST_SCREENSHOT
+ null, // READ_PHONE_STATE
+ null // ADD_VOICEMAIL
};
/**
@@ -585,6 +600,8 @@
false, //WALLPAPER
false, //ASSIST_STRUCTURE
false, //ASSIST_SCREENSHOT
+ false, //READ_PHONE_STATE
+ false //ADD_VOICEMAIL
};
/**
@@ -642,6 +659,8 @@
AppOpsManager.MODE_ALLOWED,
AppOpsManager.MODE_ALLOWED,
AppOpsManager.MODE_ALLOWED,
+ AppOpsManager.MODE_ALLOWED,
+ AppOpsManager.MODE_ALLOWED
};
/**
@@ -703,6 +722,8 @@
false,
false,
false,
+ false,
+ false
};
private static HashMap<String, Integer> sOpStrToOp = new HashMap<String, Integer>();
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index fe6e4f3..dfe7e18 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -67,6 +67,8 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
import android.util.ArrayMap;
import android.util.Log;
import android.view.Display;
@@ -1427,6 +1429,61 @@
}
@Override
+ public @NonNull VolumeInfo getApplicationCurrentVolume(ApplicationInfo app) {
+ final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ if (app.isInternal()) {
+ return Preconditions.checkNotNull(
+ storage.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL));
+ } else if (app.isExternalAsec()) {
+ final List<VolumeInfo> vols = storage.getVolumes();
+ for (VolumeInfo vol : vols) {
+ if ((vol.getType() == VolumeInfo.TYPE_PUBLIC) && vol.isPrimary()) {
+ return vol;
+ }
+ }
+ throw new IllegalStateException("Failed to find primary public volume");
+ } else {
+ return Preconditions.checkNotNull(storage.findVolumeByUuid(app.volumeUuid));
+ }
+ }
+
+ @Override
+ public @NonNull List<VolumeInfo> getApplicationCandidateVolumes(ApplicationInfo app) {
+ final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final List<VolumeInfo> vols = storage.getVolumes();
+ final List<VolumeInfo> candidates = new ArrayList<>();
+ for (VolumeInfo vol : vols) {
+ if (isCandidateVolume(app, vol)) {
+ candidates.add(vol);
+ }
+ }
+ return candidates;
+ }
+
+ private static boolean isCandidateVolume(ApplicationInfo app, VolumeInfo vol) {
+ // Private internal is always an option
+ if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.getId())) {
+ return true;
+ }
+
+ // System apps and apps demanding internal storage can't be moved
+ // anywhere else
+ if (app.isSystemApp()
+ || app.installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
+ return false;
+ }
+
+ // Moving into an ASEC on public primary is only an option when app is
+ // internal, or already in ASEC
+ if ((vol.getType() == VolumeInfo.TYPE_PUBLIC) && vol.isPrimary()) {
+ return app.isInternal() || app.isExternalAsec();
+ }
+
+ // Otherwise we can move to any private volume
+ return (vol.getType() == VolumeInfo.TYPE_PRIVATE);
+ }
+
+ @Override
public String getInstallerPackageName(String packageName) {
try {
return mPM.getInstallerPackageName(packageName);
@@ -1463,19 +1520,21 @@
// Should never happen!
}
}
+
@Override
- public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) {
+ public void freeStorageAndNotify(String volumeUuid, long idealStorageSize,
+ IPackageDataObserver observer) {
try {
- mPM.freeStorageAndNotify(idealStorageSize, observer);
+ mPM.freeStorageAndNotify(volumeUuid, idealStorageSize, observer);
} catch (RemoteException e) {
// Should never happen!
}
}
@Override
- public void freeStorage(long freeStorageSize, IntentSender pi) {
+ public void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi) {
try {
- mPM.freeStorage(freeStorageSize, pi);
+ mPM.freeStorage(volumeUuid, freeStorageSize, pi);
} catch (RemoteException e) {
// Should never happen!
}
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 4ccd69f..81a78f6 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -860,13 +860,19 @@
@Override
public void sendBroadcastAsUser(Intent intent, UserHandle user,
String receiverPermission) {
+ sendBroadcastAsUser(intent, user, receiverPermission, AppOpsManager.OP_NONE);
+ }
+
+ @Override
+ public void sendBroadcastAsUser(Intent intent, UserHandle user,
+ String receiverPermission, int appOp) {
String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
try {
intent.prepareToLeaveProcess();
ActivityManagerNative.getDefault().broadcastIntent(
- mMainThread.getApplicationThread(), intent, resolvedType, null,
- Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, false, false,
- user.getIdentifier());
+ mMainThread.getApplicationThread(), intent, resolvedType, null,
+ Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false,
+ user.getIdentifier());
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index e2230da..913159a 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -17,8 +17,10 @@
package android.app;
+import android.app.INotificationManagerCallback;
import android.app.ITransientNotification;
import android.app.Notification;
+import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
@@ -71,6 +73,7 @@
void requestInterruptionFilterFromListener(in INotificationListener token, int interruptionFilter);
int getInterruptionFilterFromListener(in INotificationListener token);
void setOnNotificationPostedTrimFromListener(in INotificationListener token, int trim);
+ NotificationManager.Policy.Token getPolicyTokenFromListener(in INotificationListener listener);
ComponentName getEffectsSuppressor();
boolean matchesCallFilter(in Bundle extras);
@@ -82,4 +85,8 @@
oneway void setZenMode(int mode, in Uri conditionId, String reason);
oneway void notifyConditions(String pkg, in IConditionProvider provider, in Condition[] conditions);
oneway void requestZenModeConditions(in IConditionListener callback, int relevance);
+ oneway void requestNotificationPolicyToken(String pkg, in INotificationManagerCallback callback);
+ boolean isNotificationPolicyTokenValid(String pkg, in NotificationManager.Policy.Token token);
+ NotificationManager.Policy getNotificationPolicy(in NotificationManager.Policy.Token token);
+ void setNotificationPolicy(in NotificationManager.Policy.Token token, in NotificationManager.Policy policy);
}
diff --git a/packages/SystemUI/res/drawable/ic_audio_phone.xml b/core/java/android/app/INotificationManagerCallback.aidl
similarity index 65%
copy from packages/SystemUI/res/drawable/ic_audio_phone.xml
copy to core/java/android/app/INotificationManagerCallback.aidl
index 64147f2b..b9414ca 100644
--- a/packages/SystemUI/res/drawable/ic_audio_phone.xml
+++ b/core/java/android/app/INotificationManagerCallback.aidl
@@ -1,7 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2014, The Android Open Source Project
+/**
+ * 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.
@@ -15,9 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
--->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@*android:drawable/ic_audio_phone_am_alpha"
- android:autoMirrored="true"
- android:tint="#ffffffff" />
\ No newline at end of file
+package android.app;
+
+import android.app.NotificationManager;
+
+/** @hide */
+oneway interface INotificationManagerCallback {
+ void onPolicyToken(in NotificationManager.Policy.Token token);
+}
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index fc96464..b77dec5 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -1797,6 +1797,10 @@
case ActivityManager.START_NOT_VOICE_COMPATIBLE:
throw new SecurityException(
"Starting under voice control not allowed for: " + intent);
+ case ActivityManager.START_NOT_CURRENT_USER_ACTIVITY:
+ throw new SecurityException(
+ "Not allowed to start background user activity that shouldn't be"
+ + " displayed for all users.");
default:
throw new AndroidRuntimeException("Unknown error code "
+ res + " when starting " + intent);
diff --git a/packages/SystemUI/res/drawable/ic_audio_phone.xml b/core/java/android/app/NotificationManager.aidl
similarity index 65%
copy from packages/SystemUI/res/drawable/ic_audio_phone.xml
copy to core/java/android/app/NotificationManager.aidl
index 64147f2b..8380b8d 100644
--- a/packages/SystemUI/res/drawable/ic_audio_phone.xml
+++ b/core/java/android/app/NotificationManager.aidl
@@ -1,7 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2014, The Android Open Source Project
+/**
+ * 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.
@@ -15,9 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
--->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@*android:drawable/ic_audio_phone_am_alpha"
- android:autoMirrored="true"
- android:tint="#ffffffff" />
\ No newline at end of file
+package android.app;
+
+parcelable NotificationManager.Policy;
+parcelable NotificationManager.Policy.Token;
\ No newline at end of file
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index fa61e18..7133dce 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -16,14 +16,19 @@
package android.app;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.app.Notification.Builder;
+import android.app.NotificationManager.Policy.Token;
import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
@@ -33,6 +38,8 @@
import android.service.notification.ZenModeConfig;
import android.util.Log;
+import java.util.Objects;
+
/**
* Class to notify the user of events that happen. This is how you tell
* the user that something has happened in the background. {@more}
@@ -89,6 +96,14 @@
public static final String ACTION_EFFECTS_SUPPRESSOR_CHANGED
= "android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED";
+ /**
+ * Intent that is broadcast when the state of getNotificationPolicy() changes.
+ * This broadcast is only sent to registered receivers.
+ */
+ @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_NOTIFICATION_POLICY_CHANGED
+ = "android.app.action.NOTIFICATION_POLICY_CHANGED";
+
private static INotificationManager sService;
/** @hide */
@@ -338,5 +353,293 @@
return null;
}
+ /**
+ * Requests a notification policy token for the calling package.
+ *
+ * @param callback required, used to receive the granted token or the deny signal.
+ * @param handler The handler used when receiving the result.
+ * If null, the current thread is used.
+ */
+ public void requestNotificationPolicyToken(@NonNull final Policy.Token.RequestCallback callback,
+ @Nullable Handler handler) {
+ checkRequired("callback", callback);
+ final Handler h = handler != null ? handler : new Handler();
+ INotificationManager service = getService();
+ try {
+ service.requestNotificationPolicyToken(mContext.getOpPackageName(),
+ new INotificationManagerCallback.Stub() {
+ @Override
+ public void onPolicyToken(final Token token) throws RemoteException {
+ h.post(new Runnable() {
+ @Override
+ public void run() {
+ if (token != null) {
+ callback.onTokenGranted(token);
+ } else {
+ callback.onTokenDenied();
+ }
+ }
+ });
+ }
+ });
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Checks a given notification policy token.
+ *
+ * Returns true if the token is still valid for managing policy.
+ */
+ public boolean isNotificationPolicyTokenValid(@NonNull Policy.Token token) {
+ if (token == null) return false;
+ INotificationManager service = getService();
+ try {
+ return service.isNotificationPolicyTokenValid(mContext.getOpPackageName(), token);
+ } catch (RemoteException e) {
+ }
+ return false;
+ }
+
+ /**
+ * Gets the current notification policy.
+ *
+ * @param token A valid notification policy token is required to access the current policy.
+ */
+ public Policy getNotificationPolicy(@NonNull Policy.Token token) {
+ checkRequired("token", token);
+ INotificationManager service = getService();
+ try {
+ return service.getNotificationPolicy(token);
+ } catch (RemoteException e) {
+ }
+ return null;
+ }
+
+ /**
+ * Sets the current notification policy.
+ *
+ * @param token A valid notification policy token is required to modify the current policy.
+ * @param policy The new desired policy.
+ */
+ public void setNotificationPolicy(@NonNull Policy.Token token, @NonNull Policy policy) {
+ checkRequired("token", token);
+ checkRequired("policy", policy);
+ INotificationManager service = getService();
+ try {
+ service.setNotificationPolicy(token, policy);
+ } catch (RemoteException e) {
+ }
+ }
+
private Context mContext;
+
+ private static void checkRequired(String name, Object value) {
+ if (value == null) {
+ throw new IllegalArgumentException(name + " is required");
+ }
+ }
+
+ /**
+ * Notification policy configuration. Represents user-preferences for notification
+ * filtering and prioritization.
+ */
+ public static class Policy implements android.os.Parcelable {
+ /** Reminder notifications are prioritized. */
+ public static final int PRIORITY_CATEGORY_REMINDERS = 1 << 0;
+ /** Event notifications are prioritized. */
+ public static final int PRIORITY_CATEGORY_EVENTS = 1 << 1;
+ /** Message notifications are prioritized. */
+ public static final int PRIORITY_CATEGORY_MESSAGES = 1 << 2;
+ /** Calls are prioritized. */
+ public static final int PRIORITY_CATEGORY_CALLS = 1 << 3;
+ /** Calls from repeat callers are prioritized. */
+ public static final int PRIORITY_CATEGORY_REPEAT_CALLERS = 1 << 4;
+
+ private static final int[] ALL_PRIORITY_CATEGORIES = {
+ PRIORITY_CATEGORY_REMINDERS,
+ PRIORITY_CATEGORY_EVENTS,
+ PRIORITY_CATEGORY_MESSAGES,
+ PRIORITY_CATEGORY_CALLS,
+ PRIORITY_CATEGORY_REPEAT_CALLERS,
+ };
+
+ /** Any sender is prioritized. */
+ public static final int PRIORITY_SENDERS_ANY = 0;
+ /** Saved contacts are prioritized. */
+ public static final int PRIORITY_SENDERS_CONTACTS = 1;
+ /** Only starred contacts are prioritized. */
+ public static final int PRIORITY_SENDERS_STARRED = 2;
+
+ /** Notification categories to prioritize. Bitmask of PRIORITY_CATEGORY_* constants. */
+ public final int priorityCategories;
+
+ /** Notification senders to prioritize. One of:
+ * PRIORITY_SENDERS_ANY, PRIORITY_SENDERS_CONTACTS, PRIORITY_SENDERS_STARRED */
+ public final int prioritySenders;
+
+ public Policy(int priorityCategories, int prioritySenders) {
+ this.priorityCategories = priorityCategories;
+ this.prioritySenders = prioritySenders;
+ }
+
+ /** @hide */
+ public Policy(Parcel source) {
+ this(source.readInt(), source.readInt());
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(priorityCategories);
+ dest.writeInt(prioritySenders);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(priorityCategories, prioritySenders);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof Policy)) return false;
+ if (o == this) return true;
+ final Policy other = (Policy) o;
+ return other.priorityCategories == priorityCategories
+ && other.prioritySenders == prioritySenders;
+ }
+
+ @Override
+ public String toString() {
+ return "NotificationManager.Policy["
+ + "priorityCategories=" + priorityCategoriesToString(priorityCategories)
+ + ",prioritySenders=" + prioritySendersToString(prioritySenders)
+ + "]";
+ }
+
+ public static String priorityCategoriesToString(int priorityCategories) {
+ if (priorityCategories == 0) return "";
+ final StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < ALL_PRIORITY_CATEGORIES.length; i++) {
+ final int priorityCategory = ALL_PRIORITY_CATEGORIES[i];
+ if ((priorityCategories & priorityCategory) != 0) {
+ if (sb.length() > 0) sb.append(',');
+ sb.append(priorityCategoryToString(priorityCategory));
+ }
+ priorityCategories &= ~priorityCategory;
+ }
+ if (priorityCategories != 0) {
+ if (sb.length() > 0) sb.append(',');
+ sb.append("PRIORITY_CATEGORY_UNKNOWN_").append(priorityCategories);
+ }
+ return sb.toString();
+ }
+
+ private static String priorityCategoryToString(int priorityCategory) {
+ switch (priorityCategory) {
+ case PRIORITY_CATEGORY_REMINDERS: return "PRIORITY_CATEGORY_REMINDERS";
+ case PRIORITY_CATEGORY_EVENTS: return "PRIORITY_CATEGORY_EVENTS";
+ case PRIORITY_CATEGORY_MESSAGES: return "PRIORITY_CATEGORY_MESSAGES";
+ case PRIORITY_CATEGORY_CALLS: return "PRIORITY_CATEGORY_CALLS";
+ case PRIORITY_CATEGORY_REPEAT_CALLERS: return "PRIORITY_CATEGORY_REPEAT_CALLERS";
+ default: return "PRIORITY_CATEGORY_UNKNOWN_" + priorityCategory;
+ }
+ }
+
+ public static String prioritySendersToString(int prioritySenders) {
+ switch (prioritySenders) {
+ case PRIORITY_SENDERS_ANY: return "PRIORITY_SENDERS_ANY";
+ case PRIORITY_SENDERS_CONTACTS: return "PRIORITY_SENDERS_CONTACTS";
+ case PRIORITY_SENDERS_STARRED: return "PRIORITY_SENDERS_STARRED";
+ default: return "PRIORITY_SENDERS_UNKNOWN_" + prioritySenders;
+ }
+ }
+
+ public static final Parcelable.Creator<Policy> CREATOR = new Parcelable.Creator<Policy>() {
+ @Override
+ public Policy createFromParcel(Parcel in) {
+ return new Policy(in);
+ }
+
+ @Override
+ public Policy[] newArray(int size) {
+ return new Policy[size];
+ }
+ };
+
+ /**
+ * Represents a client-specific token required to manage notification policy.
+ */
+ public static class Token implements Parcelable {
+ private final IBinder mBinder;
+
+ /** @hide */
+ public Token(IBinder binder) {
+ if (binder == null) throw new IllegalArgumentException("Binder required for token");
+ mBinder = binder;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mBinder);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof Token)) return false;
+ if (o == this) return true;
+ final Token other = (Token) o;
+ return Objects.equals(other.mBinder, mBinder);
+ }
+
+ @Override
+ public String toString() {
+ return String.format("NotificationManager.Token[0x%08x]",
+ System.identityHashCode(mBinder));
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeStrongBinder(mBinder);
+ }
+
+ public static final Parcelable.Creator<Token> CREATOR
+ = new Parcelable.Creator<Token>() {
+ @Override
+ public Token createFromParcel(Parcel in) {
+ return new Token(in.readStrongBinder());
+ }
+
+ @Override
+ public Token[] newArray(int size) {
+ return new Token[size];
+ }
+ };
+
+ /** Callback for receiving the result of a token request. */
+ public static abstract class RequestCallback {
+ /**
+ * Received if the request was granted for this package.
+ *
+ * @param token can be used to manage notification policy.
+ */
+ public abstract void onTokenGranted(Policy.Token token);
+
+ /**
+ * Received if the request was denied for this package.
+ */
+ public abstract void onTokenDenied();
+ }
+ }
+ }
+
}
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index c719a0e..b1a5d21 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -643,6 +643,10 @@
@Override
public ActionMode startActionModeForChild(
View child, ActionMode.Callback callback, int type) {
+ // Disable Primary Action Modes in the SearchBar, as they overlap.
+ if (type != ActionMode.TYPE_PRIMARY) {
+ return super.startActionModeForChild(child, callback, type);
+ }
return null;
}
}
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 4ede5b1..46da025 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -105,6 +105,7 @@
import android.service.persistentdata.IPersistentDataBlockService;
import android.service.persistentdata.PersistentDataBlockManager;
import android.telecom.TelecomManager;
+import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -331,10 +332,10 @@
}});
registerService(Context.NETWORK_POLICY_SERVICE, NetworkPolicyManager.class,
- new StaticServiceFetcher<NetworkPolicyManager>() {
+ new CachedServiceFetcher<NetworkPolicyManager>() {
@Override
- public NetworkPolicyManager createService() {
- return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
+ public NetworkPolicyManager createService(ContextImpl ctx) {
+ return new NetworkPolicyManager(ctx, INetworkPolicyManager.Stub.asInterface(
ServiceManager.getService(Context.NETWORK_POLICY_SERVICE)));
}});
@@ -420,6 +421,13 @@
return new SubscriptionManager(ctx.getOuterContext());
}});
+ registerService(Context.CARRIER_CONFIG_SERVICE, CarrierConfigManager.class,
+ new CachedServiceFetcher<CarrierConfigManager>() {
+ @Override
+ public CarrierConfigManager createService(ContextImpl ctx) {
+ return new CarrierConfigManager();
+ }});
+
registerService(Context.TELECOM_SERVICE, TelecomManager.class,
new CachedServiceFetcher<TelecomManager>() {
@Override
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 44760ce..0ea237a 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -364,9 +364,12 @@
/**
* A String extra holding the URL-safe base64 encoded SHA-1 checksum of the file at download
- * location specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. If
- * this doesn't match the file at the download location an error will be shown to the user and
- * the user will be asked to factory reset the device.
+ * location specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
+ *
+ * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM} should be
+ * present. The provided checksum should match the checksum of the file at the download
+ * location. If the checksum doesn't match an error will be shown to the user and the user will
+ * be asked to factory reset the device.
*
* <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
* provisioning via an NFC bump.
@@ -375,6 +378,26 @@
= "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM";
/**
+ * A String extra holding the URL-safe base64 encoded SHA-1 checksum of any certificate of the
+ * android package archive at the download location specified in {@link
+ * #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
+ *
+ * <p>The certificates of an android package archive can be obtained using
+ * {@link android.content.pm.PackageManager#getPackageArchiveInfo} with flag
+ * {@link android.content.pm.PackageManager#GET_SIGNATURES}.
+ *
+ * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM} should be
+ * present. The provided checksum should match the checksum of any certificate of the file at
+ * the download location. If the checksum does not match an error will be shown to the user and
+ * the user will be asked to factory reset the device.
+ *
+ * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
+ * provisioning via an NFC bump.
+ */
+ public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM
+ = "android.app.extra.PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM";
+
+ /**
* Broadcast Action: This broadcast is sent to indicate that provisioning of a managed profile
* has completed successfully.
*
@@ -449,9 +472,12 @@
/**
* A String extra holding the URL-safe base64 encoded SHA-1 checksum of the file at download
* location specified in
- * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}. If this doesn't
- * match the file at the download location an error will be shown to the user and the user will
- * be asked to factory reset the device.
+ * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}.
+ *
+ * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM}
+ * should be present. The provided checksum should match the checksum of the file at the
+ * download location. If the checksum doesn't match an error will be shown to the user and the
+ * user will be asked to factory reset the device.
*
* <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC_V2} that starts device owner
* provisioning via an NFC bump.
@@ -460,6 +486,26 @@
= "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM";
/**
+ * A String extra holding the URL-safe base64 encoded SHA-1 checksum of any certificate of the
+ * android package archive at the download location specified in {@link
+ * #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}.
+ *
+ * <p>The certificates of an android package archive can be obtained using
+ * {@link android.content.pm.PackageManager#getPackageArchiveInfo} with flag
+ * {@link android.content.pm.PackageManager#GET_SIGNATURES}.
+ *
+ * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM}
+ * should be present. The provided checksum should match the checksum of any certificate of the
+ * file at the download location. If the checksum doesn't match an error will be shown to the
+ * user and the user will be asked to factory reset the device.
+ *
+ * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC_V2} that starts device owner
+ * provisioning via an NFC bump.
+ */
+ public static final String EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM
+ = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM";
+
+ /**
* A String extra holding the MAC address of the Bluetooth device to connect to with status
* updates during provisioning.
*
diff --git a/core/java/android/app/trust/ITrustListener.aidl b/core/java/android/app/trust/ITrustListener.aidl
index d80f58c..506dd12 100644
--- a/core/java/android/app/trust/ITrustListener.aidl
+++ b/core/java/android/app/trust/ITrustListener.aidl
@@ -22,6 +22,6 @@
* {@hide}
*/
oneway interface ITrustListener {
- void onTrustChanged(boolean enabled, int userId, boolean initiatedByUser);
+ void onTrustChanged(boolean enabled, int userId, int flags);
void onTrustManagedChanged(boolean managed, int userId);
}
\ No newline at end of file
diff --git a/core/java/android/app/trust/TrustManager.java b/core/java/android/app/trust/TrustManager.java
index 705a144..b5c5317 100644
--- a/core/java/android/app/trust/TrustManager.java
+++ b/core/java/android/app/trust/TrustManager.java
@@ -34,7 +34,7 @@
private static final int MSG_TRUST_MANAGED_CHANGED = 2;
private static final String TAG = "TrustManager";
- private static final String DATA_INITIATED_BY_USER = "initiatedByUser";
+ private static final String DATA_FLAGS = "initiatedByUser";
private final ITrustManager mService;
private final ArrayMap<TrustListener, ITrustListener> mTrustListeners;
@@ -109,11 +109,11 @@
try {
ITrustListener.Stub iTrustListener = new ITrustListener.Stub() {
@Override
- public void onTrustChanged(boolean enabled, int userId, boolean initiatedByUser) {
+ public void onTrustChanged(boolean enabled, int userId, int flags) {
Message m = mHandler.obtainMessage(MSG_TRUST_CHANGED, (enabled ? 1 : 0), userId,
trustListener);
- if (initiatedByUser) {
- m.getData().putBoolean(DATA_INITIATED_BY_USER, initiatedByUser);
+ if (flags != 0) {
+ m.getData().putInt(DATA_FLAGS, flags);
}
m.sendToTarget();
}
@@ -156,11 +156,8 @@
public void handleMessage(Message msg) {
switch(msg.what) {
case MSG_TRUST_CHANGED:
- boolean initiatedByUser = msg.peekData() != null &&
- msg.peekData().getBoolean(DATA_INITIATED_BY_USER);
- ((TrustListener)msg.obj).onTrustChanged(
- msg.arg1 != 0, msg.arg2, initiatedByUser);
-
+ int flags = msg.peekData() != null ? msg.peekData().getInt(DATA_FLAGS) : 0;
+ ((TrustListener)msg.obj).onTrustChanged(msg.arg1 != 0, msg.arg2, flags);
break;
case MSG_TRUST_MANAGED_CHANGED:
((TrustListener)msg.obj).onTrustManagedChanged(msg.arg1 != 0, msg.arg2);
@@ -174,10 +171,11 @@
* Reports that the trust state has changed.
* @param enabled if true, the system believes the environment to be trusted.
* @param userId the user, for which the trust changed.
- * @param initiatedByUser indicates that the user has explicitly initiated an action that
- * proves the user is about to use the device.
+ * @param flags flags specified by the trust agent when granting trust. See
+ * {@link android.service.trust.TrustAgentService#grantTrust(CharSequence, long, int)
+ * TrustAgentService.grantTrust(CharSequence, long, int)}.
*/
- void onTrustChanged(boolean enabled, int userId, boolean initiatedByUser);
+ void onTrustChanged(boolean enabled, int userId, int flags);
/**
* Reports that whether trust is managed has changed
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 2b3cf34..2418e82 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -1,5 +1,6 @@
/*
- * Copyright (C) 2009-2014 The Android Open Source Project
+ * Copyright (C) 2009-2015 The Android Open Source Project
+ * Copyright (C) 2015 Samsung LSI
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,6 +32,9 @@
import android.os.ParcelUuid;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.app.ActivityThread;
+import android.os.SystemProperties;
+import android.os.Binder;
import android.util.Log;
import android.util.Pair;
@@ -152,6 +156,24 @@
public static final int STATE_TURNING_OFF = 13;
/**
+ * Indicates the local Bluetooth adapter is turning Bluetooth LE mode on.
+ * @hide
+ */
+ public static final int STATE_BLE_TURNING_ON = 14;
+
+ /**
+ * Indicates the local Bluetooth adapter is in LE only mode.
+ * @hide
+ */
+ public static final int STATE_BLE_ON = 15;
+
+ /**
+ * Indicates the local Bluetooth adapter is turning off LE only mode.
+ * @hide
+ */
+ public static final int STATE_BLE_TURNING_OFF = 16;
+
+ /**
* Activity Action: Show a system activity that requests discoverable mode.
* This activity will also request the user to turn on Bluetooth if it
* is not currently enabled.
@@ -362,6 +384,39 @@
public static final String EXTRA_PREVIOUS_CONNECTION_STATE =
"android.bluetooth.adapter.extra.PREVIOUS_CONNECTION_STATE";
+ /**
+ * Broadcast Action: The Bluetooth adapter state has changed in LE only mode.
+ * @hide
+ */
+ public static final String ACTION_BLE_STATE_CHANGED =
+ "anrdoid.bluetooth.adapter.action.BLE_STATE_CHANGED";
+
+ /**
+ * Broadcast Action: The notifys Bluetooth ACL connected event. This will be
+ * by BLE Always on enabled application to know the ACL_CONNECTED event
+ * when Bluetooth state in STATE_BLE_ON. This denotes GATT connection
+ * as Bluetooth LE is the only feature available in STATE_BLE_ON
+ *
+ * This is counterpart of {@link BluetoothDevice#ACTION_ACL_CONNECTED} which
+ * works in Bluetooth state STATE_ON
+ * @hide
+ */
+ public static final String ACTION_BLE_ACL_CONNECTED =
+ "android.bluetooth.adapter.action.BLE_ACL_CONNECTED";
+
+ /**
+ * Broadcast Action: The notifys Bluetooth ACL connected event. This will be
+ * by BLE Always on enabled application to know the ACL_DISCONNECTED event
+ * when Bluetooth state in STATE_BLE_ON. This denotes GATT disconnection as Bluetooth
+ * LE is the only feature available in STATE_BLE_ON
+ *
+ * This is counterpart of {@link BluetoothDevice#ACTION_ACL_DISCONNECTED} which
+ * works in Bluetooth state STATE_ON
+ * @hide
+ */
+ public static final String ACTION_BLE_ACL_DISCONNECTED =
+ "android.bluetooth.adapter.action.BLE_ACL_DISCONNECTED";
+
/** The profile is in disconnected state */
public static final int STATE_DISCONNECTED = 0;
/** The profile is in connecting state */
@@ -373,6 +428,19 @@
/** @hide */
public static final String BLUETOOTH_MANAGER_SERVICE = "bluetooth_manager";
+ private final IBinder mToken;
+
+
+ /** When creating a ServerSocket using listenUsingRfcommOn() or
+ * listenUsingL2capOn() use SOCKET_CHANNEL_AUTO_STATIC to create
+ * a ServerSocket that auto assigns a channel number to the first
+ * bluetooth socket.
+ * The channel number assigned to this first Bluetooth Socket will
+ * be stored in the ServerSocket, and reused for subsequent Bluetooth
+ * sockets.
+ * @hide */
+ public static final int SOCKET_CHANNEL_AUTO_STATIC_NO_SDP = -2;
+
private static final int ADDRESS_LENGTH = 17;
@@ -431,6 +499,7 @@
} catch (RemoteException e) {Log.e(TAG, "", e);}
mManagerService = managerService;
mLeScanClients = new HashMap<LeScanCallback, ScanCallback>();
+ mToken = new Binder();
}
/**
@@ -477,11 +546,9 @@
* on this device before calling this method.
*/
public BluetoothLeAdvertiser getBluetoothLeAdvertiser() {
- if (getState() != STATE_ON) {
- return null;
- }
+ if (!getLeAccess()) return null;
if (!isMultipleAdvertisementSupported() && !isPeripheralModeSupported()) {
- Log.e(TAG, "bluetooth le advertising not supported");
+ Log.e(TAG, "Bluetooth LE advertising not supported");
return null;
}
synchronized(mLock) {
@@ -496,9 +563,7 @@
* Returns a {@link BluetoothLeScanner} object for Bluetooth LE scan operations.
*/
public BluetoothLeScanner getBluetoothLeScanner() {
- if (getState() != STATE_ON) {
- return null;
- }
+ if (!getLeAccess()) return null;
synchronized(mLock) {
if (sBluetoothLeScanner == null) {
sBluetoothLeScanner = new BluetoothLeScanner(mManagerService);
@@ -516,7 +581,6 @@
* @return true if the local adapter is turned on
*/
public boolean isEnabled() {
-
try {
synchronized(mManagerCallback) {
if (mService != null) return mService.isEnabled();
@@ -526,6 +590,178 @@
}
/**
+ * Return true if Bluetooth LE(Always BLE On feature) is currently
+ * enabled and ready for use
+ * <p>This returns true if current state is either STATE_ON or STATE_BLE_ON
+ *
+ * @return true if the local Bluetooth LE adapter is turned on
+ * @hide
+ */
+ public boolean isLeEnabled() {
+ final int state = getLeState();
+ if (state == BluetoothAdapter.STATE_ON) {
+ if (DBG) Log.d (TAG, "STATE_ON");
+ } else if (state == BluetoothAdapter.STATE_BLE_ON) {
+ if (DBG) Log.d (TAG, "STATE_BLE_ON");
+ } else {
+ if (DBG) Log.d (TAG, "STATE_OFF");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Performs action based on user action to turn BT ON
+ * or OFF if BT is in BLE_ON state
+ */
+ private void notifyUserAction(boolean enable) {
+ if (mService == null) {
+ Log.e(TAG, "mService is null");
+ return;
+ }
+
+ try {
+ if (enable) {
+ mService.onLeServiceUp(); //NA:TODO implementation pending
+ } else {
+ mService.onBrEdrDown(); //NA:TODO implementation pending
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ }
+
+ /**
+ * Returns true if LE only mode is enabled, that is apps
+ * have authorization to turn only BT ON and the calling
+ * app has privilage to do so
+ */
+ private boolean isLEAlwaysOnEnabled() {
+ boolean ret = false;
+ if (SystemProperties.getBoolean("ro.bluetooth.blealwayson", true) == true) {
+ Log.v(TAG, "LE always on mode is enabled");
+ // TODO: System API authorization check
+ ret = true;
+ } else {
+ Log.v(TAG, "LE always on mode is disabled");
+ ret = false;
+ }
+ return ret;
+ }
+
+ /**
+ * Turns off Bluetooth LE which was earlier turned on by calling EnableBLE().
+ *
+ * <p> If the internal Adapter state is STATE_BLE_ON, this would trigger the transition
+ * to STATE_OFF and completely shut-down Bluetooth
+ *
+ * <p> If the Adapter state is STATE_ON, This would unregister the existance of
+ * special Bluetooth LE application and hence the further turning off of Bluetooth
+ * from UI would ensure the complete turn-off of Bluetooth rather than staying back
+ * BLE only state
+ *
+ * <p>This is an asynchronous call: it will return immediately, and
+ * clients should listen for {@link #ACTION_BLE_STATE_CHANGED}
+ * to be notified of subsequent adapter state changes If this call returns
+ * true, then the adapter state will immediately transition from {@link
+ * #STATE_ON} to {@link #STATE_TURNING_OFF}, and some time
+ * later transition to either {@link #STATE_BLE_ON} or {@link
+ * #STATE_OFF} based on the existance of the further Always BLE ON enabled applications
+ * If this call returns false then there was an
+ * immediate problem that will prevent the QAdapter from being turned off -
+ * such as the QAadapter already being turned off.
+ *
+ * @return true to indicate success, or false on
+ * immediate error
+ * @hide
+ */
+ public boolean disableBLE() {
+ if (isLEAlwaysOnEnabled() != true) return false;
+
+ int state = getLeState();
+ if (state == BluetoothAdapter.STATE_ON) {
+ if (DBG) Log.d (TAG, "STATE_ON: shouldn't disable");
+ try {
+ mManagerService.updateBleAppCount(mToken, false);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ return true;
+
+ } else if (state == BluetoothAdapter.STATE_BLE_ON) {
+ if (DBG) Log.d (TAG, "STATE_BLE_ON");
+ int bleAppCnt = 0;
+ try {
+ bleAppCnt = mManagerService.updateBleAppCount(mToken, false);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ if (bleAppCnt == 0) {
+ // Disable only if there are no other clients
+ notifyUserAction(false);
+ }
+ return true;
+ }
+
+ if (DBG) Log.d (TAG, "STATE_OFF: Already disabled");
+ return false;
+ }
+
+ /**
+ * Special Applications who want to only turn on Bluetooth Low Energy (BLE) would
+ * EnableBLE, EnableBLE brings-up Bluetooth so that application can access
+ * only LE related feature (Bluetooth GATT layers interfaces using the respective class)
+ * EnableBLE in turn registers the existance of a special App which wants to
+ * turn on Bluetooth Low enrgy part without making it visible at the settings UI
+ * as Bluetooth ON.
+ * <p>Invoking EnableBLE when Bluetooth is already in ON state, would just registers
+ * the existance of special Application and doesn't do anything to current BT state.
+ * when user turn OFF Bluetooth from UI, if there is an existance of special app, Bluetooth
+ * would stay in BLE_ON state so that LE features are still acessible to the special
+ * Applications.
+ *
+ * <p>This is an asynchronous call: it will return immediately, and
+ * clients should listen for {@link #ACTION_BLE_STATE_CHANGED}
+ * to be notified of subsequent adapter state changes. If this call returns
+ * true, then the adapter state will immediately transition from {@link
+ * #STATE_OFF} to {@link #STATE_BLE_TURNING_ON}, and some time
+ * later transition to either {@link #STATE_OFF} or {@link
+ * #STATE_BLE_ON}. If this call returns false then there was an
+ * immediate problem that will prevent the adapter from being turned on -
+ * such as Airplane mode, or the adapter is already turned on.
+ * (@link #ACTION_BLE_STATE_CHANGED) returns the Bluetooth Adapter's various
+ * states, It includes all the classic Bluetooth Adapter states along with
+ * internal BLE only states
+ *
+ * @return true to indicate Bluetooth LE start-up has begun, or false on
+ * immediate error
+ * @hide
+ */
+ public boolean enableBLE() {
+ if (isLEAlwaysOnEnabled() != true) return false;
+
+ if (isLeEnabled() == true) {
+ if (DBG) Log.d(TAG, "enableBLE(): BT is already enabled..!");
+ try {
+ mManagerService.updateBleAppCount(mToken, true);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ return true;
+ }
+
+ try {
+ if (DBG) Log.d(TAG, "Calling enableBLE");
+ mManagerService.updateBleAppCount(mToken, true);
+ return mManagerService.enable();
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+
+ return false;
+ }
+
+ /**
* Get the current state of the local Bluetooth adapter.
* <p>Possible return values are
* {@link #STATE_OFF},
@@ -543,6 +779,13 @@
{
int state= mService.getState();
if (VDBG) Log.d(TAG, "" + hashCode() + ": getState(). Returning " + state);
+ //consider all internal states as OFF
+ if (state == BluetoothAdapter.STATE_BLE_ON
+ || state == BluetoothAdapter.STATE_BLE_TURNING_ON
+ || state == BluetoothAdapter.STATE_BLE_TURNING_OFF) {
+ if (VDBG) Log.d(TAG, "Consider internal state as OFF");
+ state = BluetoothAdapter.STATE_OFF;
+ }
return state;
}
// TODO(BT) there might be a small gap during STATE_TURNING_ON that
@@ -554,6 +797,49 @@
}
/**
+ * Get the current state of the local Bluetooth adapter
+ * <p>This returns current internal state of Adapter including LE ON/OFF
+ *
+ * <p>Possible return values are
+ * {@link #STATE_OFF},
+ * {@link #STATE_BLE_TURNING_ON},
+ * {@link #STATE_BLE_ON},
+ * {@link #STATE_TURNING_ON},
+ * {@link #STATE_ON},
+ * {@link #STATE_TURNING_OFF},
+ * {@link #STATE_BLE_TURNING_OFF}.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
+ *
+ * @return current state of Bluetooth adapter
+ * @hide
+ */
+ public int getLeState() {
+ try {
+ synchronized(mManagerCallback) {
+ if (mService != null)
+ {
+ int state= mService.getState();
+ if (VDBG) Log.d(TAG,"getLeState() returning " + state);
+ return state;
+ }
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ return BluetoothAdapter.STATE_OFF;
+ }
+
+ boolean getLeAccess() {
+ if(getLeState() == STATE_ON)
+ return true;
+
+ else if (getLeState() == STATE_BLE_ON)
+ return true; // TODO: FILTER SYSTEM APPS HERE <--
+
+ return false;
+ }
+
+ /**
* Turn on the local Bluetooth adapter—do not use without explicit
* user action to turn on Bluetooth.
* <p>This powers on the underlying Bluetooth hardware, and starts all
@@ -581,10 +867,23 @@
* immediate error
*/
public boolean enable() {
+ int state = STATE_OFF;
if (isEnabled() == true){
if (DBG) Log.d(TAG, "enable(): BT is already enabled..!");
return true;
}
+ //Use service interface to get the exact state
+ if (mService != null) {
+ try {
+ state = mService.getState();
+ } catch (RemoteException e) {Log.e(TAG, "", e);}
+ }
+
+ if (state == BluetoothAdapter.STATE_BLE_ON) {
+ Log.e(TAG, "BT is in BLE_ON State");
+ notifyUserAction(true);
+ return true;
+ }
try {
return mManagerService.enable();
} catch (RemoteException e) {Log.e(TAG, "", e);}
@@ -1141,6 +1440,9 @@
BluetoothServerSocket socket = new BluetoothServerSocket(
BluetoothSocket.TYPE_RFCOMM, true, true, channel);
int errno = socket.mSocket.bindListen();
+ if(channel == SOCKET_CHANNEL_AUTO_STATIC_NO_SDP) {
+ socket.setChannel(socket.mSocket.getPort());
+ }
if (errno != 0) {
//TODO(BT): Throw the same exception error code
// that the previous code was using.
@@ -1275,6 +1577,9 @@
BluetoothServerSocket socket = new BluetoothServerSocket(
BluetoothSocket.TYPE_RFCOMM, false, false, port);
int errno = socket.mSocket.bindListen();
+ if(port == SOCKET_CHANNEL_AUTO_STATIC_NO_SDP) {
+ socket.setChannel(socket.mSocket.getPort());
+ }
if (errno != 0) {
//TODO(BT): Throw the same exception error code
// that the previous code was using.
@@ -1297,6 +1602,9 @@
BluetoothServerSocket socket = new BluetoothServerSocket(
BluetoothSocket.TYPE_RFCOMM, false, true, port);
int errno = socket.mSocket.bindListen();
+ if(port == SOCKET_CHANNEL_AUTO_STATIC_NO_SDP) {
+ socket.setChannel(socket.mSocket.getPort());
+ }
if (errno < 0) {
//TODO(BT): Throw the same exception error code
// that the previous code was using.
@@ -1327,6 +1635,30 @@
}
/**
+ * Construct an encrypted, authenticated, L2CAP server socket.
+ * Call #accept to retrieve connections to this socket.
+ * @return An L2CAP BluetoothServerSocket
+ * @throws IOException On error, for example Bluetooth not available, or
+ * insufficient permissions.
+ * @hide
+ */
+ public BluetoothServerSocket listenUsingL2capOn(int port) throws IOException {
+ BluetoothServerSocket socket = new BluetoothServerSocket(
+ BluetoothSocket.TYPE_L2CAP, true, true, port);
+ int errno = socket.mSocket.bindListen();
+ if(port == SOCKET_CHANNEL_AUTO_STATIC_NO_SDP) {
+ socket.setChannel(socket.mSocket.getPort());
+ }
+ if (errno != 0) {
+ //TODO(BT): Throw the same exception error code
+ // that the previous code was using.
+ //socket.mSocket.throwErrnoNative(errno);
+ throw new IOException("Error: " + errno);
+ }
+ return socket;
+ }
+
+ /**
* Read the local Out of Band Pairing Data
* <p>Requires {@link android.Manifest.permission#BLUETOOTH}
*
@@ -1405,6 +1737,9 @@
} else if (profile == BluetoothProfile.HEADSET_CLIENT) {
BluetoothHeadsetClient headsetClient = new BluetoothHeadsetClient(context, listener);
return true;
+ } else if (profile == BluetoothProfile.SAP) {
+ BluetoothSap sap = new BluetoothSap(context, listener);
+ return true;
} else {
return false;
}
@@ -1469,6 +1804,10 @@
BluetoothHeadsetClient headsetClient = (BluetoothHeadsetClient)proxy;
headsetClient.close();
break;
+ case BluetoothProfile.SAP:
+ BluetoothSap sap = (BluetoothSap)proxy;
+ sap.close();
+ break;
}
}
@@ -1512,6 +1851,10 @@
}
}
}
+
+ public void onBrEdrDown() {
+ if (VDBG) Log.i(TAG, "on QBrEdrDown: ");
+ }
};
/**
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index bb0d0a3..bfc374fb 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -302,6 +302,12 @@
*/
public static final int DEVICE_TYPE_DUAL = 3;
+
+ /** @hide */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_SDP_RECORD =
+ "android.bluetooth.device.action.SDP_RECORD";
+
/**
* Broadcast Action: This intent is used to broadcast the {@link UUID}
* wrapped as a {@link android.os.ParcelUuid} of the remote device after it
@@ -376,6 +382,9 @@
/**@hide*/
public static final int REQUEST_TYPE_MESSAGE_ACCESS = 3;
+ /**@hide*/
+ public static final int REQUEST_TYPE_SIM_ACCESS = 4;
+
/**
* Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REQUEST} intents,
* Contains package name to return reply intent to.
@@ -526,6 +535,13 @@
*/
public static final String EXTRA_UUID = "android.bluetooth.device.extra.UUID";
+ /** @hide */
+ public static final String EXTRA_SDP_RECORD =
+ "android.bluetooth.device.extra.SDP_RECORD";
+
+ /** @hide */
+ public static final String EXTRA_SDP_SEARCH_STATUS =
+ "android.bluetooth.device.extra.SDP_SEARCH_STATUS";
/**
* For {@link #getPhonebookAccessPermission}, {@link #setPhonebookAccessPermission},
* {@link #getMessageAccessPermission} and {@link #setMessageAccessPermission}.
@@ -593,7 +609,9 @@
public void onBluetoothServiceUp(IBluetooth bluetoothService)
throws RemoteException {
synchronized (BluetoothDevice.class) {
- sService = bluetoothService;
+ if (sService == null) {
+ sService = bluetoothService;
+ }
}
}
@@ -603,6 +621,11 @@
sService = null;
}
}
+
+ public void onBrEdrDown()
+ {
+ if (DBG) Log.d(TAG, "onBrEdrDown: reached BLE ON state");
+ }
};
/**
* Create a new BluetoothDevice
@@ -1017,7 +1040,7 @@
* or null on error
*/
public ParcelUuid[] getUuids() {
- if (sService == null) {
+ if (sService == null || isBluetoothEnabled() == false) {
Log.e(TAG, "BT not enabled. Cannot get remote device Uuids");
return null;
}
@@ -1044,7 +1067,7 @@
*/
public boolean fetchUuidsWithSdp() {
IBluetooth service = sService;
- if (service == null) {
+ if (service == null || isBluetoothEnabled() == false) {
Log.e(TAG, "BT not enabled. Cannot fetchUuidsWithSdp");
return false;
}
@@ -1054,28 +1077,38 @@
return false;
}
+ /**
+ * Perform a service discovery on the remote device to get the SDP records associated
+ * with the specified UUID.
+ *
+ * <p>This API is asynchronous and {@link #ACTION_SDP_RECORD} intent is sent,
+ * with the SDP records found on the remote end. If there is an error
+ * in getting the SDP records or if the process takes a long time,
+ * {@link #ACTION_SDP_RECORD} intent is sent with an status value in
+ * {@link #EXTRA_SDP_SEARCH_STATUS} different from 0.
+ * Detailed status error codes can be found by members of the Bluetooth package in
+ * the AbstractionLayer class.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH}.
+ * The SDP record data will be stored in the intent as {@link #EXTRA_SDP_RECORD}.
+ * The object type will match one of the SdpXxxRecord types, depending on the UUID searched
+ * for.
+ *
+ * @return False if the sanity check fails, True if the process
+ * of initiating an ACL connection to the remote device
+ * was started.
+ */
/** @hide */
- public boolean fetchMasInstances() {
+ public boolean sdpSearch(ParcelUuid uuid) {
if (sService == null) {
- Log.e(TAG, "BT not enabled. Cannot query remote device for MAS instances");
+ Log.e(TAG, "BT not enabled. Cannot query remote device sdp records");
return false;
}
try {
- return sService.fetchRemoteMasInstances(this);
+ return sService.sdpSearch(this,uuid);
} catch (RemoteException e) {Log.e(TAG, "", e);}
return false;
}
- /** @hide */
- public int getServiceChannel(ParcelUuid uuid) {
- //TODO(BT)
- /*
- try {
- return sService.getRemoteServiceChannel(this, uuid);
- } catch (RemoteException e) {Log.e(TAG, "", e);}*/
- return BluetoothDevice.ERROR;
- }
-
/**
* Set the pin during pairing when the pairing method is {@link #PAIRING_VARIANT_PIN}
* <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}.
@@ -1154,6 +1187,15 @@
return false;
}
+ boolean isBluetoothEnabled() {
+ boolean ret = false;
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ if (adapter != null && adapter.isEnabled() == true) {
+ ret = true;
+ }
+ return ret;
+ }
+
/**
* Requires {@link android.Manifest.permission#BLUETOOTH}.
* @return Whether the phonebook access is allowed to this device. Can be
@@ -1231,6 +1273,44 @@
}
/**
+ * Requires {@link android.Manifest.permission#BLUETOOTH}.
+ * @return Whether the Sim access is allowed to this device. Can be
+ * {@link #ACCESS_UNKNOWN}, {@link #ACCESS_ALLOWED} or {@link #ACCESS_REJECTED}.
+ * @hide
+ */
+ public int getSimAccessPermission() {
+ if (sService == null) {
+ return ACCESS_UNKNOWN;
+ }
+ try {
+ return sService.getSimAccessPermission(this);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ return ACCESS_UNKNOWN;
+ }
+
+ /**
+ * Sets whether the Sim access is allowed to this device.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED}.
+ * @param value Can be {@link #ACCESS_UNKNOWN}, {@link #ACCESS_ALLOWED} or
+ * {@link #ACCESS_REJECTED}.
+ * @return Whether the value has been successfully set.
+ * @hide
+ */
+ public boolean setSimAccessPermission(int value) {
+ if (sService == null) {
+ return false;
+ }
+ try {
+ return sService.setSimAccessPermission(this, value);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ return false;
+ }
+
+ /**
* Create an RFCOMM {@link BluetoothSocket} ready to start a secure
* outgoing connection to this remote device on given channel.
* <p>The remote device will be authenticated and communication on this
@@ -1256,11 +1336,45 @@
* @hide
*/
public BluetoothSocket createRfcommSocket(int channel) throws IOException {
+ if (isBluetoothEnabled() == false) {
+ Log.e(TAG, "Bluetooth is not enabled");
+ throw new IOException();
+ }
return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, true, true, this, channel,
null);
}
/**
+ * Create an L2cap {@link BluetoothSocket} ready to start a secure
+ * outgoing connection to this remote device on given channel.
+ * <p>The remote device will be authenticated and communication on this
+ * socket will be encrypted.
+ * <p> Use this socket only if an authenticated socket link is possible.
+ * Authentication refers to the authentication of the link key to
+ * prevent man-in-the-middle type of attacks.
+ * For example, for Bluetooth 2.1 devices, if any of the devices does not
+ * have an input and output capability or just has the ability to
+ * display a numeric key, a secure socket connection is not possible.
+ * In such a case, use {#link createInsecureRfcommSocket}.
+ * For more details, refer to the Security Model section 5.2 (vol 3) of
+ * Bluetooth Core Specification version 2.1 + EDR.
+ * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing
+ * connection.
+ * <p>Valid L2CAP PSM channels are in range 1 to 2^16.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
+ *
+ * @param channel L2cap PSM/channel to connect to
+ * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection
+ * @throws IOException on error, for example Bluetooth not available, or
+ * insufficient permissions
+ * @hide
+ */
+ public BluetoothSocket createL2capSocket(int channel) throws IOException {
+ return new BluetoothSocket(BluetoothSocket.TYPE_L2CAP, -1, true, true, this, channel,
+ null);
+ }
+
+ /**
* Create an RFCOMM {@link BluetoothSocket} ready to start a secure
* outgoing connection to this remote device using SDP lookup of uuid.
* <p>This is designed to be used with {@link
@@ -1292,6 +1406,11 @@
* insufficient permissions
*/
public BluetoothSocket createRfcommSocketToServiceRecord(UUID uuid) throws IOException {
+ if (isBluetoothEnabled() == false) {
+ Log.e(TAG, "Bluetooth is not enabled");
+ throw new IOException();
+ }
+
return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, true, true, this, -1,
new ParcelUuid(uuid));
}
@@ -1325,6 +1444,10 @@
* insufficient permissions
*/
public BluetoothSocket createInsecureRfcommSocketToServiceRecord(UUID uuid) throws IOException {
+ if (isBluetoothEnabled() == false) {
+ Log.e(TAG, "Bluetooth is not enabled");
+ throw new IOException();
+ }
return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, false, false, this, -1,
new ParcelUuid(uuid));
}
@@ -1344,6 +1467,11 @@
* @hide
*/
public BluetoothSocket createInsecureRfcommSocket(int port) throws IOException {
+
+ if (isBluetoothEnabled() == false) {
+ Log.e(TAG, "Bluetooth is not enabled");
+ throw new IOException();
+ }
return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, false, false, this, port,
null);
}
@@ -1359,6 +1487,11 @@
* @hide
*/
public BluetoothSocket createScoSocket() throws IOException {
+
+ if (isBluetoothEnabled() == false) {
+ Log.e(TAG, "Bluetooth is not enabled");
+ throw new IOException();
+ }
return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1, null);
}
diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java
index 1367405..eecb073 100644
--- a/core/java/android/bluetooth/BluetoothProfile.java
+++ b/core/java/android/bluetooth/BluetoothProfile.java
@@ -103,17 +103,23 @@
*/
public static final int MAP = 9;
+ /*
+ * SAP Profile
+ * @hide
+ */
+ public static final int SAP = 10;
+
/**
* A2DP Sink Profile
* @hide
*/
- public static final int A2DP_SINK = 10;
+ public static final int A2DP_SINK = 11;
/**
* AVRCP Controller Profile
* @hide
*/
- public static final int AVRCP_CONTROLLER = 11;
+ public static final int AVRCP_CONTROLLER = 12;
/**
* Headset Client - HFP HF Role
diff --git a/core/java/android/bluetooth/BluetoothSap.java b/core/java/android/bluetooth/BluetoothSap.java
new file mode 100644
index 0000000..7b4c6f9
--- /dev/null
+++ b/core/java/android/bluetooth/BluetoothSap.java
@@ -0,0 +1,383 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.RemoteException;
+import android.os.IBinder;
+import android.os.ServiceManager;
+import android.util.Log;
+
+
+public final class BluetoothSap implements BluetoothProfile {
+
+ private static final String TAG = "BluetoothSap";
+ private static final boolean DBG = true;
+ private static final boolean VDBG = false;
+
+ public static final String ACTION_CONNECTION_STATE_CHANGED =
+ "android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED";
+
+ private IBluetoothSap mService;
+ private final Context mContext;
+ private ServiceListener mServiceListener;
+ private BluetoothAdapter mAdapter;
+
+ /** There was an error trying to obtain the state */
+ public static final int STATE_ERROR = -1;
+
+ public static final int RESULT_FAILURE = 0;
+ public static final int RESULT_SUCCESS = 1;
+ /** Connection canceled before completion. */
+ public static final int RESULT_CANCELED = 2;
+
+ final private IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
+ new IBluetoothStateChangeCallback.Stub() {
+ public void onBluetoothStateChange(boolean up) {
+ if (DBG) Log.d(TAG, "onBluetoothStateChange: up=" + up);
+ if (!up) {
+ if (VDBG) Log.d(TAG,"Unbinding service...");
+ synchronized (mConnection) {
+ try {
+ mService = null;
+ mContext.unbindService(mConnection);
+ } catch (Exception re) {
+ Log.e(TAG,"",re);
+ }
+ }
+ } else {
+ synchronized (mConnection) {
+ try {
+ if (mService == null) {
+ if (VDBG) Log.d(TAG,"Binding service...");
+ doBind();
+ }
+ } catch (Exception re) {
+ Log.e(TAG,"",re);
+ }
+ }
+ }
+ }
+ };
+
+ /**
+ * Create a BluetoothSap proxy object.
+ */
+ /*package*/ BluetoothSap(Context context, ServiceListener l) {
+ if (DBG) Log.d(TAG, "Create BluetoothSap proxy object");
+ mContext = context;
+ mServiceListener = l;
+ mAdapter = BluetoothAdapter.getDefaultAdapter();
+ IBluetoothManager mgr = mAdapter.getBluetoothManager();
+ if (mgr != null) {
+ try {
+ mgr.registerStateChangeCallback(mBluetoothStateChangeCallback);
+ } catch (RemoteException e) {
+ Log.e(TAG,"",e);
+ }
+ }
+ doBind();
+ }
+
+ boolean doBind() {
+ Intent intent = new Intent(IBluetoothMap.class.getName());
+ ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);
+ intent.setComponent(comp);
+ if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0,
+ android.os.Process.myUserHandle())) {
+ Log.e(TAG, "Could not bind to Bluetooth SAP Service with " + intent);
+ return false;
+ }
+ return true;
+ }
+
+ protected void finalize() throws Throwable {
+ try {
+ close();
+ } finally {
+ super.finalize();
+ }
+ }
+
+ /**
+ * Close the connection to the backing service.
+ * Other public functions of BluetoothSap will return default error
+ * results once close() has been called. Multiple invocations of close()
+ * are ok.
+ */
+ public synchronized void close() {
+ IBluetoothManager mgr = mAdapter.getBluetoothManager();
+ if (mgr != null) {
+ try {
+ mgr.unregisterStateChangeCallback(mBluetoothStateChangeCallback);
+ } catch (Exception e) {
+ Log.e(TAG,"",e);
+ }
+ }
+
+ synchronized (mConnection) {
+ if (mService != null) {
+ try {
+ mService = null;
+ mContext.unbindService(mConnection);
+ } catch (Exception re) {
+ Log.e(TAG,"",re);
+ }
+ }
+ }
+ mServiceListener = null;
+ }
+
+ /**
+ * Get the current state of the BluetoothSap service.
+ * @return One of the STATE_ return codes, or STATE_ERROR if this proxy
+ * object is currently not connected to the Sap service.
+ */
+ public int getState() {
+ if (VDBG) log("getState()");
+ if (mService != null) {
+ try {
+ return mService.getState();
+ } catch (RemoteException e) {Log.e(TAG, e.toString());}
+ } else {
+ Log.w(TAG, "Proxy not attached to service");
+ if (DBG) log(Log.getStackTraceString(new Throwable()));
+ }
+ return BluetoothSap.STATE_ERROR;
+ }
+
+ /**
+ * Get the currently connected remote Bluetooth device (PCE).
+ * @return The remote Bluetooth device, or null if not in connected or
+ * connecting state, or if this proxy object is not connected to
+ * the Sap service.
+ */
+ public BluetoothDevice getClient() {
+ if (VDBG) log("getClient()");
+ if (mService != null) {
+ try {
+ return mService.getClient();
+ } catch (RemoteException e) {Log.e(TAG, e.toString());}
+ } else {
+ Log.w(TAG, "Proxy not attached to service");
+ if (DBG) log(Log.getStackTraceString(new Throwable()));
+ }
+ return null;
+ }
+
+ /**
+ * Returns true if the specified Bluetooth device is connected.
+ * Returns false if not connected, or if this proxy object is not
+ * currently connected to the Sap service.
+ */
+ public boolean isConnected(BluetoothDevice device) {
+ if (VDBG) log("isConnected(" + device + ")");
+ if (mService != null) {
+ try {
+ return mService.isConnected(device);
+ } catch (RemoteException e) {Log.e(TAG, e.toString());}
+ } else {
+ Log.w(TAG, "Proxy not attached to service");
+ if (DBG) log(Log.getStackTraceString(new Throwable()));
+ }
+ return false;
+ }
+
+ /**
+ * Initiate connection. Initiation of outgoing connections is not
+ * supported for SAP server.
+ */
+ public boolean connect(BluetoothDevice device) {
+ if (DBG) log("connect(" + device + ")" + "not supported for SAPS");
+ return false;
+ }
+
+ /**
+ * Initiate disconnect.
+ *
+ * @param device Remote Bluetooth Device
+ * @return false on error,
+ * true otherwise
+ */
+ public boolean disconnect(BluetoothDevice device) {
+ if (DBG) log("disconnect(" + device + ")");
+ if (mService != null && isEnabled() &&
+ isValidDevice(device)) {
+ try {
+ return mService.disconnect(device);
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return false;
+ }
+ }
+ if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ return false;
+ }
+
+ /**
+ * Get the list of connected devices. Currently at most one.
+ *
+ * @return list of connected devices
+ */
+ public List<BluetoothDevice> getConnectedDevices() {
+ if (DBG) log("getConnectedDevices()");
+ if (mService != null && isEnabled()) {
+ try {
+ return mService.getConnectedDevices();
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return new ArrayList<BluetoothDevice>();
+ }
+ }
+ if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ return new ArrayList<BluetoothDevice>();
+ }
+
+ /**
+ * Get the list of devices matching specified states. Currently at most one.
+ *
+ * @return list of matching devices
+ */
+ public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
+ if (DBG) log("getDevicesMatchingStates()");
+ if (mService != null && isEnabled()) {
+ try {
+ return mService.getDevicesMatchingConnectionStates(states);
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return new ArrayList<BluetoothDevice>();
+ }
+ }
+ if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ return new ArrayList<BluetoothDevice>();
+ }
+
+ /**
+ * Get connection state of device
+ *
+ * @return device connection state
+ */
+ public int getConnectionState(BluetoothDevice device) {
+ if (DBG) log("getConnectionState(" + device + ")");
+ if (mService != null && isEnabled() &&
+ isValidDevice(device)) {
+ try {
+ return mService.getConnectionState(device);
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return BluetoothProfile.STATE_DISCONNECTED;
+ }
+ }
+ if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ return BluetoothProfile.STATE_DISCONNECTED;
+ }
+
+ /**
+ * Set priority of the profile
+ *
+ * <p> The device should already be paired.
+ *
+ * @param device Paired bluetooth device
+ * @param priority
+ * @return true if priority is set, false on error
+ */
+ public boolean setPriority(BluetoothDevice device, int priority) {
+ if (DBG) log("setPriority(" + device + ", " + priority + ")");
+ if (mService != null && isEnabled() &&
+ isValidDevice(device)) {
+ if (priority != BluetoothProfile.PRIORITY_OFF &&
+ priority != BluetoothProfile.PRIORITY_ON) {
+ return false;
+ }
+ try {
+ return mService.setPriority(device, priority);
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return false;
+ }
+ }
+ if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ return false;
+ }
+
+ /**
+ * Get the priority of the profile.
+ *
+ * @param device Bluetooth device
+ * @return priority of the device
+ */
+ public int getPriority(BluetoothDevice device) {
+ if (VDBG) log("getPriority(" + device + ")");
+ if (mService != null && isEnabled() &&
+ isValidDevice(device)) {
+ try {
+ return mService.getPriority(device);
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return PRIORITY_OFF;
+ }
+ }
+ if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ return PRIORITY_OFF;
+ }
+
+ private ServiceConnection mConnection = new ServiceConnection() {
+ public void onServiceConnected(ComponentName className, IBinder service) {
+ if (DBG) log("Proxy object connected");
+ mService = IBluetoothSap.Stub.asInterface(service);
+ if (mServiceListener != null) {
+ mServiceListener.onServiceConnected(BluetoothProfile.SAP, BluetoothSap.this);
+ }
+ }
+ public void onServiceDisconnected(ComponentName className) {
+ if (DBG) log("Proxy object disconnected");
+ mService = null;
+ if (mServiceListener != null) {
+ mServiceListener.onServiceDisconnected(BluetoothProfile.SAP);
+ }
+ }
+ };
+
+ private static void log(String msg) {
+ Log.d(TAG, msg);
+ }
+
+ private boolean isEnabled() {
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+
+ if (adapter != null && adapter.getState() == BluetoothAdapter.STATE_ON)
+ return true;
+ log("Bluetooth is Not enabled");
+ return false;
+ }
+
+ private boolean isValidDevice(BluetoothDevice device) {
+ if (device == null)
+ return false;
+
+ if (BluetoothAdapter.checkBluetoothAddress(device.getAddress()))
+ return true;
+ return false;
+ }
+
+}
diff --git a/core/java/android/bluetooth/BluetoothServerSocket.java b/core/java/android/bluetooth/BluetoothServerSocket.java
index bc56e55..21024a6 100644
--- a/core/java/android/bluetooth/BluetoothServerSocket.java
+++ b/core/java/android/bluetooth/BluetoothServerSocket.java
@@ -18,6 +18,7 @@
import android.os.Handler;
import android.os.ParcelUuid;
+import android.util.Log;
import java.io.Closeable;
import java.io.IOException;
@@ -66,10 +67,11 @@
*/
public final class BluetoothServerSocket implements Closeable {
+ private static final String TAG = "BluetoothServerSocket";
/*package*/ final BluetoothSocket mSocket;
private Handler mHandler;
private int mMessage;
- private final int mChannel;
+ private int mChannel;
/**
* Construct a socket for incoming connections.
@@ -84,6 +86,9 @@
throws IOException {
mChannel = port;
mSocket = new BluetoothSocket(type, -1, auth, encrypt, null, port, null);
+ if(port == BluetoothAdapter.SOCKET_CHANNEL_AUTO_STATIC_NO_SDP) {
+ mSocket.setExcludeSdp(true);
+ }
}
/**
@@ -98,6 +103,7 @@
/*package*/ BluetoothServerSocket(int type, boolean auth, boolean encrypt, ParcelUuid uuid)
throws IOException {
mSocket = new BluetoothSocket(type, -1, auth, encrypt, null, -1, uuid);
+ // TODO: This is the same as mChannel = -1 - is this intentional?
mChannel = mSocket.getPort();
}
@@ -153,6 +159,7 @@
/*package*/ void setServiceName(String ServiceName) {
mSocket.setServiceName(ServiceName);
}
+
/**
* Returns the channel on which this socket is bound.
* @hide
@@ -160,4 +167,47 @@
public int getChannel() {
return mChannel;
}
+
+ /**
+ * Sets the channel on which future sockets are bound.
+ * Currently used only when a channel is auto generated.
+ */
+ /*package*/ void setChannel(int newChannel) {
+ /* TODO: From a design/architecture perspective this is wrong.
+ * The bind operation should be conducted through this class
+ * and the resulting port should be kept in mChannel, and
+ * not set from BluetoothAdapter. */
+ if(mSocket != null) {
+ if(mSocket.getPort() != newChannel) {
+ Log.w(TAG,"The port set is different that the underlying port. mSocket.getPort(): "
+ + mSocket.getPort() + " requested newChannel: " + newChannel);
+ }
+ }
+ mChannel = newChannel;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("ServerSocket: Type: ");
+ switch(mSocket.getConnectionType()) {
+ case BluetoothSocket.TYPE_RFCOMM:
+ {
+ sb.append("TYPE_RFCOMM");
+ break;
+ }
+ case BluetoothSocket.TYPE_L2CAP:
+ {
+ sb.append("TYPE_L2CAP");
+ break;
+ }
+ case BluetoothSocket.TYPE_SCO:
+ {
+ sb.append("TYPE_SCO");
+ break;
+ }
+ }
+ sb.append(" Channel: ").append(mChannel);
+ return sb.toString();
+ }
}
diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java
index 36997e5..5702d11 100644
--- a/core/java/android/bluetooth/BluetoothSocket.java
+++ b/core/java/android/bluetooth/BluetoothSocket.java
@@ -21,6 +21,7 @@
import android.os.RemoteException;
import android.util.Log;
+import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -29,6 +30,8 @@
import java.util.Locale;
import java.util.UUID;
import android.net.LocalSocket;
+
+import java.nio.Buffer;
import java.nio.ByteOrder;
import java.nio.ByteBuffer;
/**
@@ -86,17 +89,19 @@
/** @hide */
public static final int MAX_RFCOMM_CHANNEL = 30;
+ /*package*/ static final int MAX_L2CAP_PACKAGE_SIZE = 0xFFFF;
/** Keep TYPE_ fields in sync with BluetoothSocket.cpp */
- /*package*/ static final int TYPE_RFCOMM = 1;
- /*package*/ static final int TYPE_SCO = 2;
- /*package*/ static final int TYPE_L2CAP = 3;
+ public static final int TYPE_RFCOMM = 1;
+ public static final int TYPE_SCO = 2;
+ public static final int TYPE_L2CAP = 3;
/*package*/ static final int EBADFD = 77;
/*package*/ static final int EADDRINUSE = 98;
/*package*/ static final int SEC_FLAG_ENCRYPT = 1;
/*package*/ static final int SEC_FLAG_AUTH = 1 << 1;
+ /*package*/ static final int BTSOCK_FLAG_NO_SDP = 1 << 2;
private final int mType; /* one of TYPE_RFCOMM etc */
private BluetoothDevice mDevice; /* remote device */
@@ -106,6 +111,7 @@
private final BluetoothInputStream mInputStream;
private final BluetoothOutputStream mOutputStream;
private final ParcelUuid mUuid;
+ private boolean mExcludeSdp = false;
private ParcelFileDescriptor mPfd;
private LocalSocket mSocket;
private InputStream mSocketIS;
@@ -115,7 +121,11 @@
private String mServiceName;
private static int PROXY_CONNECTION_TIMEOUT = 5000;
- private static int SOCK_SIGNAL_SIZE = 16;
+ private static int SOCK_SIGNAL_SIZE = 20;
+
+ private ByteBuffer mL2capBuffer = null;
+ private int mMaxTxPacketSize = 0; // The l2cap maximum packet size supported by the peer.
+ private int mMaxRxPacketSize = 0; // The l2cap maximum packet size that can be received.
private enum SocketState {
INIT,
@@ -144,12 +154,14 @@
*/
/*package*/ BluetoothSocket(int type, int fd, boolean auth, boolean encrypt,
BluetoothDevice device, int port, ParcelUuid uuid) throws IOException {
- if (type == BluetoothSocket.TYPE_RFCOMM && uuid == null && fd == -1) {
+ if (VDBG) Log.d(TAG, "Creating new BluetoothSocket of type: " + type);
+ if (type == BluetoothSocket.TYPE_RFCOMM && uuid == null && fd == -1
+ && port != BluetoothAdapter.SOCKET_CHANNEL_AUTO_STATIC_NO_SDP) {
if (port < 1 || port > MAX_RFCOMM_CHANNEL) {
throw new IOException("Invalid RFCOMM channel: " + port);
}
}
- if(uuid != null)
+ if (uuid != null)
mUuid = uuid;
else mUuid = new ParcelUuid(new UUID(0, 0));
mType = type;
@@ -172,6 +184,7 @@
mOutputStream = new BluetoothOutputStream(this);
}
private BluetoothSocket(BluetoothSocket s) {
+ if (VDBG) Log.d(TAG, "Creating new Private BluetoothSocket of type: " + s.mType);
mUuid = s.mUuid;
mType = s.mType;
mAuth = s.mAuth;
@@ -179,7 +192,11 @@
mPort = s.mPort;
mInputStream = new BluetoothInputStream(this);
mOutputStream = new BluetoothOutputStream(this);
+ mMaxRxPacketSize = s.mMaxRxPacketSize;
+ mMaxTxPacketSize = s.mMaxTxPacketSize;
+
mServiceName = s.mServiceName;
+ mExcludeSdp = s.mExcludeSdp;
}
private BluetoothSocket acceptSocket(String RemoteAddr) throws IOException {
BluetoothSocket as = new BluetoothSocket(this);
@@ -229,6 +246,8 @@
flags |= SEC_FLAG_AUTH;
if(mEncrypt)
flags |= SEC_FLAG_ENCRYPT;
+ if(mExcludeSdp)
+ flags |= BTSOCK_FLAG_NO_SDP;
return flags;
}
@@ -298,7 +317,8 @@
try {
if (mSocketState == SocketState.CLOSED) throw new IOException("socket closed");
- IBluetooth bluetoothProxy = BluetoothAdapter.getDefaultAdapter().getBluetoothService(null);
+ IBluetooth bluetoothProxy =
+ BluetoothAdapter.getDefaultAdapter().getBluetoothService(null);
if (bluetoothProxy == null) throw new IOException("Bluetooth is off");
mPfd = bluetoothProxy.connectSocket(mDevice, mType,
mUuid, mPort, getSecurityFlags());
@@ -370,7 +390,7 @@
mSocketState = SocketState.LISTENING;
}
if (DBG) Log.d(TAG, "channel: " + channel);
- if (mPort == -1) {
+ if (mPort <= -1) {
mPort = channel;
} // else ASSERT(mPort == channel)
ret = 0;
@@ -391,7 +411,8 @@
/*package*/ BluetoothSocket accept(int timeout) throws IOException {
BluetoothSocket acceptedSocket;
- if (mSocketState != SocketState.LISTENING) throw new IOException("bt socket is not in listen state");
+ if (mSocketState != SocketState.LISTENING)
+ throw new IOException("bt socket is not in listen state");
if(timeout > 0) {
Log.d(TAG, "accept() set timeout (ms):" + timeout);
mSocket.setSoTimeout(timeout);
@@ -427,27 +448,80 @@
}
/*package*/ int read(byte[] b, int offset, int length) throws IOException {
- if (mSocketIS == null) throw new IOException("read is called on null InputStream");
+ int ret = 0;
if (VDBG) Log.d(TAG, "read in: " + mSocketIS + " len: " + length);
- int ret = mSocketIS.read(b, offset, length);
- if(ret < 0)
+ if(mType == TYPE_L2CAP)
+ {
+ int bytesToRead = length;
+ if (VDBG) Log.v(TAG, "l2cap: read(): offset: " + offset + " length:" + length
+ + "mL2capBuffer= " + mL2capBuffer);
+ if (mL2capBuffer == null) {
+ createL2capRxBuffer();
+ }
+ if (mL2capBuffer.remaining() == 0) {
+ if (VDBG) Log.v(TAG, "l2cap buffer empty, refilling...");
+ if (fillL2capRxBuffer() == -1) {
+ return -1;
+ }
+ }
+ if (bytesToRead > mL2capBuffer.remaining()) {
+ bytesToRead = mL2capBuffer.remaining();
+ }
+ if(VDBG) Log.v(TAG, "get(): offset: " + offset
+ + " bytesToRead: " + bytesToRead);
+ mL2capBuffer.get(b, offset, bytesToRead);
+ ret = bytesToRead;
+ }else {
+ if (VDBG) Log.v(TAG, "default: read(): offset: " + offset + " length:" + length);
+ ret = mSocketIS.read(b, offset, length);
+ }
+ if (ret < 0)
throw new IOException("bt socket closed, read return: " + ret);
if (VDBG) Log.d(TAG, "read out: " + mSocketIS + " ret: " + ret);
return ret;
}
/*package*/ int write(byte[] b, int offset, int length) throws IOException {
- if (mSocketOS == null) throw new IOException("write is called on null OutputStream");
- if (VDBG) Log.d(TAG, "write: " + mSocketOS + " length: " + length);
- mSocketOS.write(b, offset, length);
- // There is no good way to confirm since the entire process is asynchronous anyway
- if (VDBG) Log.d(TAG, "write out: " + mSocketOS + " length: " + length);
- return length;
+
+ //TODO: Since bindings can exist between the SDU size and the
+ // protocol, we might need to throw an exception instead of just
+ // splitting the write into multiple smaller writes.
+ // Rfcomm uses dynamic allocation, and should not have any bindings
+ // to the actual message length.
+ if (VDBG) Log.d(TAG, "write: " + mSocketOS + " length: " + length);
+ if (mType == TYPE_L2CAP) {
+ if(length <= mMaxTxPacketSize) {
+ mSocketOS.write(b, offset, length);
+ } else {
+ int tmpOffset = offset;
+ int tmpLength = mMaxTxPacketSize;
+ int endIndex = offset + length;
+ boolean done = false;
+ if(DBG) Log.w(TAG, "WARNING: Write buffer larger than L2CAP packet size!\n"
+ + "Packet will be divided into SDU packets of size "
+ + mMaxTxPacketSize);
+ do{
+ mSocketOS.write(b, tmpOffset, tmpLength);
+ tmpOffset += mMaxTxPacketSize;
+ if((tmpOffset + mMaxTxPacketSize) > endIndex) {
+ tmpLength = endIndex - tmpOffset;
+ done = true;
+ }
+ } while(!done);
+
+ }
+ } else {
+ mSocketOS.write(b, offset, length);
+ }
+ // There is no good way to confirm since the entire process is asynchronous anyway
+ if (VDBG) Log.d(TAG, "write out: " + mSocketOS + " length: " + length);
+ return length;
}
@Override
public void close() throws IOException {
- if (DBG) Log.d(TAG, "close() in, this: " + this + ", channel: " + mPort + ", state: " + mSocketState);
+ if (DBG) Log.d(TAG, "close() in, this: " + this + ", channel: " + mPort + ", state: "
+ + mSocketState);
if(mSocketState == SocketState.CLOSED)
return;
else
@@ -457,8 +531,9 @@
if(mSocketState == SocketState.CLOSED)
return;
mSocketState = SocketState.CLOSED;
- if (DBG) Log.d(TAG, "close() this: " + this + ", channel: " + mPort + ", mSocketIS: " + mSocketIS +
- ", mSocketOS: " + mSocketOS + "mSocket: " + mSocket);
+ if (DBG) Log.d(TAG, "close() this: " + this + ", channel: " + mPort +
+ ", mSocketIS: " + mSocketIS + ", mSocketOS: " + mSocketOS +
+ "mSocket: " + mSocket);
if(mSocket != null) {
if (DBG) Log.d(TAG, "Closing mSocket: " + mSocket);
mSocket.shutdownInput();
@@ -480,6 +555,47 @@
/*package */ int getPort() {
return mPort;
}
+
+ /**
+ * Get the maximum supported Transmit packet size for the underlying transport.
+ * Use this to optimize the writes done to the output socket, to avoid sending
+ * half full packets.
+ * @return the maximum supported Transmit packet size for the underlying transport.
+ */
+ public int getMaxTransmitPacketSize(){
+ return mMaxTxPacketSize;
+ }
+
+ /**
+ * Get the maximum supported Receive packet size for the underlying transport.
+ * Use this to optimize the reads done on the input stream, as any call to read
+ * will return a maximum of this amount of bytes - or for some transports a
+ * multiple of this value.
+ * @return the maximum supported Receive packet size for the underlying transport.
+ */
+ public int getMaxReceivePacketSize(){
+ return mMaxRxPacketSize;
+ }
+
+ /**
+ * Get the type of the underlying connection
+ * @return one of TYPE_
+ */
+ public int getConnectionType() {
+ return mType;
+ }
+
+ /**
+ * Change if a SDP entry should be automatically created.
+ * Must be called before calling .bind, for the call to have any effect.
+ * @param mExcludeSdp <li>TRUE - do not auto generate SDP record.
+ * <li>FALSE - default - auto generate SPP SDP record.
+ * @hide
+ */
+ public void setExcludeSdp(boolean excludeSdp) {
+ this.mExcludeSdp = excludeSdp;
+ }
+
private String convertAddr(final byte[] addr) {
return String.format(Locale.US, "%02X:%02X:%02X:%02X:%02X:%02X",
addr[0] , addr[1], addr[2], addr[3] , addr[4], addr[5]);
@@ -487,8 +603,10 @@
private String waitSocketSignal(InputStream is) throws IOException {
byte [] sig = new byte[SOCK_SIGNAL_SIZE];
int ret = readAll(is, sig);
- if (VDBG) Log.d(TAG, "waitSocketSignal read 16 bytes signal ret: " + ret);
+ if (VDBG) Log.d(TAG, "waitSocketSignal read " + SOCK_SIGNAL_SIZE +
+ " bytes signal ret: " + ret);
ByteBuffer bb = ByteBuffer.wrap(sig);
+ /* the struct in native is decorated with __attribute__((packed)), hence this is possible */
bb.order(ByteOrder.nativeOrder());
int size = bb.getShort();
if(size != SOCK_SIGNAL_SIZE)
@@ -497,19 +615,36 @@
bb.get(addr);
int channel = bb.getInt();
int status = bb.getInt();
+ mMaxTxPacketSize = (bb.getShort() & 0xffff); // Convert to unsigned value
+ mMaxRxPacketSize = (bb.getShort() & 0xffff); // Convert to unsigned value
String RemoteAddr = convertAddr(addr);
if (VDBG) Log.d(TAG, "waitSocketSignal: sig size: " + size + ", remote addr: "
- + RemoteAddr + ", channel: " + channel + ", status: " + status);
+ + RemoteAddr + ", channel: " + channel + ", status: " + status
+ + " MaxRxPktSize: " + mMaxRxPacketSize + " MaxTxPktSize: " + mMaxTxPacketSize);
if(status != 0)
throw new IOException("Connection failure, status: " + status);
return RemoteAddr;
}
+
+ private void createL2capRxBuffer(){
+ if(mType == TYPE_L2CAP) {
+ // Allocate the buffer to use for reads.
+ if(VDBG) Log.v(TAG, " Creating mL2capBuffer: mMaxPacketSize: " + mMaxRxPacketSize);
+ mL2capBuffer = ByteBuffer.wrap(new byte[mMaxRxPacketSize]);
+ if(VDBG) Log.v(TAG, "mL2capBuffer.remaining()" + mL2capBuffer.remaining());
+ mL2capBuffer.limit(0); // Ensure we do a real read at the first read-request
+ if(VDBG) Log.v(TAG, "mL2capBuffer.remaining() after limit(0):" +
+ mL2capBuffer.remaining());
+ }
+ }
+
private int readAll(InputStream is, byte[] b) throws IOException {
int left = b.length;
while(left > 0) {
int ret = is.read(b, b.length - left, left);
if(ret <= 0)
- throw new IOException("read failed, socket might closed or timeout, read ret: " + ret);
+ throw new IOException("read failed, socket might closed or timeout, read ret: "
+ + ret);
left -= ret;
if(left != 0)
Log.w(TAG, "readAll() looping, read partial size: " + (b.length - left) +
@@ -526,4 +661,18 @@
bb.order(ByteOrder.nativeOrder());
return bb.getInt();
}
+
+ private int fillL2capRxBuffer() throws IOException {
+ mL2capBuffer.rewind();
+ int ret = mSocketIS.read(mL2capBuffer.array());
+ if(ret == -1) {
+ // reached end of stream - return -1
+ mL2capBuffer.limit(0);
+ return -1;
+ }
+ mL2capBuffer.limit(ret);
+ return ret;
+ }
+
+
}
diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java
index 194a53e..2ded4c8 100644
--- a/core/java/android/bluetooth/BluetoothUuid.java
+++ b/core/java/android/bluetooth/BluetoothUuid.java
@@ -76,7 +76,9 @@
ParcelUuid.fromString("00001133-0000-1000-8000-00805F9B34FB");
public static final ParcelUuid MAS =
ParcelUuid.fromString("00001132-0000-1000-8000-00805F9B34FB");
-
+ public static final ParcelUuid SAP =
+ ParcelUuid.fromString("0000112D-0000-1000-8000-00805F9B34FB");
+
public static final ParcelUuid BASE_UUID =
ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB");
@@ -89,7 +91,7 @@
public static final ParcelUuid[] RESERVED_UUIDS = {
AudioSink, AudioSource, AdvAudioDist, HSP, Handsfree, AvrcpController, AvrcpTarget,
- ObexObjectPush, PANU, NAP, MAP, MNS, MAS};
+ ObexObjectPush, PANU, NAP, MAP, MNS, MAS, SAP};
public static boolean isAudioSource(ParcelUuid uuid) {
return uuid.equals(AudioSource);
@@ -143,6 +145,9 @@
public static boolean isMas(ParcelUuid uuid) {
return uuid.equals(MAS);
}
+ public static boolean isSap(ParcelUuid uuid) {
+ return uuid.equals(SAP);
+ }
/**
* Returns true if ParcelUuid is present in uuidArray
diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl
index 299f4c8..f6001bf 100644
--- a/core/java/android/bluetooth/IBluetooth.aidl
+++ b/core/java/android/bluetooth/IBluetooth.aidl
@@ -68,7 +68,7 @@
int getRemoteClass(in BluetoothDevice device);
ParcelUuid[] getRemoteUuids(in BluetoothDevice device);
boolean fetchRemoteUuids(in BluetoothDevice device);
- boolean fetchRemoteMasInstances(in BluetoothDevice device);
+ boolean sdpSearch(in BluetoothDevice device, in ParcelUuid uuid);
boolean setPin(in BluetoothDevice device, boolean accept, int len, in byte[] pinCode);
boolean setPasskey(in BluetoothDevice device, boolean accept, int len, in byte[]
@@ -79,6 +79,8 @@
boolean setPhonebookAccessPermission(in BluetoothDevice device, int value);
int getMessageAccessPermission(in BluetoothDevice device);
boolean setMessageAccessPermission(in BluetoothDevice device, int value);
+ int getSimAccessPermission(in BluetoothDevice device);
+ boolean setSimAccessPermission(in BluetoothDevice device, int value);
void sendConnectionStateChange(in BluetoothDevice device, int profile, int state, int prevState);
@@ -102,4 +104,6 @@
// for dumpsys support
String dump();
+ void onLeServiceUp();
+ void onBrEdrDown();
}
diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl
index 7070bae..4ca57f8 100644
--- a/core/java/android/bluetooth/IBluetoothGatt.aidl
+++ b/core/java/android/bluetooth/IBluetoothGatt.aidl
@@ -101,4 +101,6 @@
in int srvcInstanceId, in ParcelUuid srvcId,
in int charInstanceId, in ParcelUuid charId,
in boolean confirm, in byte[] value);
+ void disconnectAll();
+ void unregAll();
}
diff --git a/core/java/android/bluetooth/IBluetoothManager.aidl b/core/java/android/bluetooth/IBluetoothManager.aidl
index 7411d3f..8d1ce99 100644
--- a/core/java/android/bluetooth/IBluetoothManager.aidl
+++ b/core/java/android/bluetooth/IBluetoothManager.aidl
@@ -44,4 +44,6 @@
String getAddress();
String getName();
+ int updateBleAppCount(IBinder b, boolean enable);
+ boolean isBleAppPresent();
}
diff --git a/core/java/android/bluetooth/IBluetoothManagerCallback.aidl b/core/java/android/bluetooth/IBluetoothManagerCallback.aidl
index 9551086..1385daf 100644
--- a/core/java/android/bluetooth/IBluetoothManagerCallback.aidl
+++ b/core/java/android/bluetooth/IBluetoothManagerCallback.aidl
@@ -26,4 +26,5 @@
interface IBluetoothManagerCallback {
void onBluetoothServiceUp(in IBluetooth bluetoothService);
void onBluetoothServiceDown();
-}
\ No newline at end of file
+ void onBrEdrDown();
+}
diff --git a/core/java/android/bluetooth/IBluetoothSap.aidl b/core/java/android/bluetooth/IBluetoothSap.aidl
new file mode 100644
index 0000000..8970639
--- /dev/null
+++ b/core/java/android/bluetooth/IBluetoothSap.aidl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+
+/**
+ * System private API for Bluetooth SAP service
+ *
+ * {@hide}
+ */
+interface IBluetoothSap {
+ int getState();
+ BluetoothDevice getClient();
+ boolean connect(in BluetoothDevice device);
+ boolean disconnect(in BluetoothDevice device);
+ boolean isConnected(in BluetoothDevice device);
+ List<BluetoothDevice> getConnectedDevices();
+ List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states);
+ int getConnectionState(in BluetoothDevice device);
+ boolean setPriority(in BluetoothDevice device, int priority);
+ int getPriority(in BluetoothDevice device);
+}
diff --git a/core/java/android/bluetooth/SdpMasRecord.java b/core/java/android/bluetooth/SdpMasRecord.java
new file mode 100644
index 0000000..fa164c0
--- /dev/null
+++ b/core/java/android/bluetooth/SdpMasRecord.java
@@ -0,0 +1,147 @@
+/*
+* Copyright (C) 2015 Samsung System LSI
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package android.bluetooth;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/** @hide */
+public class SdpMasRecord implements Parcelable {
+ private final int mMasInstanceId;
+ private final int mL2capPsm;
+ private final int mRfcommChannelNumber;
+ private final int mProfileVersion;
+ private final int mSupportedFeatures;
+ private final int mSupportedMessageTypes;
+ private final String mServiceName;
+ public static final class MessageType {
+ public static final int EMAIL = 0x01;
+ public static final int SMS_GSM = 0x02;
+ public static final int SMS_CDMA = 0x04;
+ public static final int MMS = 0x08;
+ }
+
+ public SdpMasRecord(int mas_instance_id,
+ int l2cap_psm,
+ int rfcomm_channel_number,
+ int profile_version,
+ int supported_features,
+ int supported_message_types,
+ String service_name){
+ this.mMasInstanceId = mas_instance_id;
+ this.mL2capPsm = l2cap_psm;
+ this.mRfcommChannelNumber = rfcomm_channel_number;
+ this.mProfileVersion = profile_version;
+ this.mSupportedFeatures = supported_features;
+ this.mSupportedMessageTypes = supported_message_types;
+ this.mServiceName = service_name;
+ }
+
+ public SdpMasRecord(Parcel in){
+ this.mMasInstanceId = in.readInt();
+ this.mL2capPsm = in.readInt();
+ this.mRfcommChannelNumber = in.readInt();
+ this.mProfileVersion = in.readInt();
+ this.mSupportedFeatures = in.readInt();
+ this.mSupportedMessageTypes = in.readInt();
+ this.mServiceName = in.readString();
+ }
+ @Override
+ public int describeContents() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getMasInstanceId() {
+ return mMasInstanceId;
+ }
+
+ public int getL2capPsm() {
+ return mL2capPsm;
+ }
+
+ public int getRfcommCannelNumber() {
+ return mRfcommChannelNumber;
+ }
+
+ public int getProfileVersion() {
+ return mProfileVersion;
+ }
+
+ public int getSupportedFeatures() {
+ return mSupportedFeatures;
+ }
+
+ public int getSupportedMessageTypes() {
+ return mSupportedMessageTypes;
+ }
+
+ public boolean msgSupported(int msg) {
+ return (mSupportedMessageTypes & msg) != 0;
+ }
+
+ public String getServiceName() {
+ return mServiceName;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+
+ dest.writeInt(this.mMasInstanceId);
+ dest.writeInt(this.mL2capPsm);
+ dest.writeInt(this.mRfcommChannelNumber);
+ dest.writeInt(this.mProfileVersion);
+ dest.writeInt(this.mSupportedFeatures);
+ dest.writeInt(this.mSupportedMessageTypes);
+ dest.writeString(this.mServiceName);
+
+ }
+ @Override
+ public String toString(){
+ String ret = "Bluetooth MAS SDP Record:\n";
+
+ if(mMasInstanceId != -1){
+ ret += "Mas Instance Id: " + mMasInstanceId + "\n";
+ }
+ if(mRfcommChannelNumber != -1){
+ ret += "RFCOMM Chan Number: " + mRfcommChannelNumber + "\n";
+ }
+ if(mL2capPsm != -1){
+ ret += "L2CAP PSM: " + mL2capPsm + "\n";
+ }
+ if(mServiceName != null){
+ ret += "Service Name: " + mServiceName + "\n";
+ }
+ if(mProfileVersion != -1){
+ ret += "Profile version: " + mProfileVersion + "\n";
+ }
+ if(mSupportedMessageTypes != -1){
+ ret += "Supported msg types: " + mSupportedMessageTypes + "\n";
+ }
+ if(mSupportedFeatures != -1){
+ ret += "Supported features: " + mSupportedFeatures + "\n";
+ }
+ return ret;
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public SdpMasRecord createFromParcel(Parcel in) {
+ return new SdpMasRecord(in);
+ }
+ public SdpRecord[] newArray(int size) {
+ return new SdpRecord[size];
+ }
+ };
+}
diff --git a/core/java/android/bluetooth/SdpMnsRecord.java b/core/java/android/bluetooth/SdpMnsRecord.java
new file mode 100644
index 0000000..c02bb5a
--- /dev/null
+++ b/core/java/android/bluetooth/SdpMnsRecord.java
@@ -0,0 +1,112 @@
+/*
+* Copyright (C) 2015 Samsung System LSI
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package android.bluetooth;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/** @hide */
+public class SdpMnsRecord implements Parcelable {
+ private final int mL2capPsm;
+ private final int mRfcommChannelNumber;
+ private final int mSupportedFeatures;
+ private final int mProfileVersion;
+ private final String mServiceName;
+
+ public SdpMnsRecord(int l2cap_psm,
+ int rfcomm_channel_number,
+ int profile_version,
+ int supported_features,
+ String service_name){
+ this.mL2capPsm = l2cap_psm;
+ this.mRfcommChannelNumber = rfcomm_channel_number;
+ this.mSupportedFeatures = supported_features;
+ this.mServiceName = service_name;
+ this.mProfileVersion = profile_version;
+ }
+
+ public SdpMnsRecord(Parcel in){
+ this.mRfcommChannelNumber = in.readInt();
+ this.mL2capPsm = in.readInt();
+ this.mServiceName = in.readString();
+ this.mSupportedFeatures = in.readInt();
+ this.mProfileVersion = in.readInt();
+ }
+ @Override
+ public int describeContents() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+
+ public int getL2capPsm() {
+ return mL2capPsm;
+ }
+
+ public int getRfcommChannelNumber() {
+ return mRfcommChannelNumber;
+ }
+
+ public int getSupportedFeatures() {
+ return mSupportedFeatures;
+ }
+
+ public String getServiceName() {
+ return mServiceName;
+ }
+
+ public int getProfileVersion() {
+ return mProfileVersion;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mRfcommChannelNumber);
+ dest.writeInt(mL2capPsm);
+ dest.writeString(mServiceName);
+ dest.writeInt(mSupportedFeatures);
+ dest.writeInt(mProfileVersion);
+ }
+
+ public String toString(){
+ String ret = "Bluetooth MNS SDP Record:\n";
+
+ if(mRfcommChannelNumber != -1){
+ ret += "RFCOMM Chan Number: " + mRfcommChannelNumber + "\n";
+ }
+ if(mL2capPsm != -1){
+ ret += "L2CAP PSM: " + mL2capPsm + "\n";
+ }
+ if(mServiceName != null){
+ ret += "Service Name: " + mServiceName + "\n";
+ }
+ if(mSupportedFeatures != -1){
+ ret += "Supported features: " + mSupportedFeatures + "\n";
+ }
+ if(mProfileVersion != -1){
+ ret += "Profile_version: " + mProfileVersion+"\n";
+ }
+ return ret;
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public SdpMnsRecord createFromParcel(Parcel in) {
+ return new SdpMnsRecord(in);
+ }
+ public SdpMnsRecord[] newArray(int size) {
+ return new SdpMnsRecord[size];
+ }
+ };
+}
diff --git a/core/java/android/bluetooth/SdpOppOpsRecord.java b/core/java/android/bluetooth/SdpOppOpsRecord.java
new file mode 100644
index 0000000..e0e4007
--- /dev/null
+++ b/core/java/android/bluetooth/SdpOppOpsRecord.java
@@ -0,0 +1,118 @@
+/*
+* Copyright (C) 2015 Samsung System LSI
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package android.bluetooth;
+
+import java.util.Arrays;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Data representation of a Object Push Profile Server side SDP record.
+ */
+/** @hide */
+public class SdpOppOpsRecord implements Parcelable {
+
+ private final String mServiceName;
+ private final int mRfcommChannel;
+ private final int mL2capPsm;
+ private final int mProfileVersion;
+ private final byte[] mFormatsList;
+
+ public SdpOppOpsRecord(String serviceName, int rfcommChannel,
+ int l2capPsm, int version, byte[] formatsList) {
+ super();
+ this.mServiceName = serviceName;
+ this.mRfcommChannel = rfcommChannel;
+ this.mL2capPsm = l2capPsm;
+ this.mProfileVersion = version;
+ this.mFormatsList = formatsList;
+ }
+
+ public String getServiceName() {
+ return mServiceName;
+ }
+
+ public int getRfcommChannel() {
+ return mRfcommChannel;
+ }
+
+ public int getL2capPsm() {
+ return mL2capPsm;
+ }
+
+ public int getProfileVersion() {
+ return mProfileVersion;
+ }
+
+ public byte[] getFormatsList() {
+ return mFormatsList;
+ }
+
+ @Override
+ public int describeContents() {
+ /* No special objects */
+ return 0;
+ }
+
+ public SdpOppOpsRecord(Parcel in){
+ this.mRfcommChannel = in.readInt();
+ this.mL2capPsm = in.readInt();
+ this.mProfileVersion = in.readInt();
+ this.mServiceName = in.readString();
+ int arrayLength = in.readInt();
+ if(arrayLength > 0) {
+ byte[] bytes = new byte[arrayLength];
+ in.readByteArray(bytes);
+ this.mFormatsList = bytes;
+ } else {
+ this.mFormatsList = null;
+ }
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mRfcommChannel);
+ dest.writeInt(mL2capPsm);
+ dest.writeInt(mProfileVersion);
+ dest.writeString(mServiceName);
+ if(mFormatsList!= null && mFormatsList.length > 0) {
+ dest.writeInt(mFormatsList.length);
+ dest.writeByteArray(mFormatsList);
+ } else {
+ dest.writeInt(0);
+ }
+ }
+
+ public String toString(){
+ StringBuilder sb = new StringBuilder("Bluetooth OPP Server SDP Record:\n");
+ sb.append(" RFCOMM Chan Number: ").append(mRfcommChannel);
+ sb.append("\n L2CAP PSM: ").append(mL2capPsm);
+ sb.append("\n Profile version: ").append(mProfileVersion);
+ sb.append("\n Service Name: ").append(mServiceName);
+ sb.append("\n Formats List: ").append(Arrays.toString(mFormatsList));
+ return sb.toString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public SdpOppOpsRecord createFromParcel(Parcel in) {
+ return new SdpOppOpsRecord(in);
+ }
+ public SdpOppOpsRecord[] newArray(int size) {
+ return new SdpOppOpsRecord[size];
+ }
+ };
+
+}
diff --git a/core/java/android/bluetooth/SdpPseRecord.java b/core/java/android/bluetooth/SdpPseRecord.java
new file mode 100644
index 0000000..2c159cc
--- /dev/null
+++ b/core/java/android/bluetooth/SdpPseRecord.java
@@ -0,0 +1,125 @@
+/*
+* Copyright (C) 2015 Samsung System LSI
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package android.bluetooth;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/** @hide */
+public class SdpPseRecord implements Parcelable {
+ private final int mL2capPsm;
+ private final int mRfcommChannelNumber;
+ private final int mProfileVersion;
+ private final int mSupportedFeatures;
+ private final int mSupportedRepositories;
+ private final String mServiceName;
+
+ public SdpPseRecord(int l2cap_psm,
+ int rfcomm_channel_number,
+ int profile_version,
+ int supported_features,
+ int supported_repositories,
+ String service_name){
+ this.mL2capPsm = l2cap_psm;
+ this.mRfcommChannelNumber = rfcomm_channel_number;
+ this.mProfileVersion = profile_version;
+ this.mSupportedFeatures = supported_features;
+ this.mSupportedRepositories = supported_repositories;
+ this.mServiceName = service_name;
+ }
+
+ public SdpPseRecord(Parcel in){
+ this.mRfcommChannelNumber = in.readInt();
+ this.mL2capPsm = in.readInt();
+ this.mProfileVersion = in.readInt();
+ this.mSupportedFeatures = in.readInt();
+ this.mSupportedRepositories = in.readInt();
+ this.mServiceName = in.readString();
+ }
+ @Override
+ public int describeContents() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getL2capPsm() {
+ return mL2capPsm;
+ }
+
+ public int getRfcommChannelNumber() {
+ return mRfcommChannelNumber;
+ }
+
+ public int getSupportedFeatures() {
+ return mSupportedFeatures;
+ }
+
+ public String getServiceName() {
+ return mServiceName;
+ }
+
+ public int getProfileVersion() {
+ return mProfileVersion;
+ }
+
+ public int getSupportedRepositories() {
+ return mSupportedRepositories;
+ }
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mRfcommChannelNumber);
+ dest.writeInt(mL2capPsm);
+ dest.writeInt(mProfileVersion);
+ dest.writeInt(mSupportedFeatures);
+ dest.writeInt(mSupportedRepositories);
+ dest.writeString(mServiceName);
+
+ }
+
+ public String toString(){
+ String ret = "Bluetooth MNS SDP Record:\n";
+
+ if(mRfcommChannelNumber != -1){
+ ret += "RFCOMM Chan Number: " + mRfcommChannelNumber + "\n";
+ }
+ if(mL2capPsm != -1){
+ ret += "L2CAP PSM: " + mL2capPsm + "\n";
+ }
+ if(mProfileVersion != -1){
+ ret += "profile version: " + mProfileVersion + "\n";
+ }
+ if(mServiceName != null){
+ ret += "Service Name: " + mServiceName + "\n";
+ }
+ if(mSupportedFeatures != -1){
+ ret += "Supported features: " + mSupportedFeatures + "\n";
+ }
+ if(mSupportedRepositories != -1){
+ ret += "Supported repositories: " + mSupportedRepositories + "\n";
+ }
+
+ return ret;
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public SdpPseRecord createFromParcel(Parcel in) {
+ return new SdpPseRecord(in);
+ }
+ public SdpPseRecord[] newArray(int size) {
+ return new SdpPseRecord[size];
+ }
+ };
+}
diff --git a/core/java/android/bluetooth/SdpRecord.java b/core/java/android/bluetooth/SdpRecord.java
new file mode 100644
index 0000000..6f1065e
--- /dev/null
+++ b/core/java/android/bluetooth/SdpRecord.java
@@ -0,0 +1,76 @@
+/*
+* Copyright (C) 2015 Samsung System LSI
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package android.bluetooth;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Arrays;
+
+/** @hide */
+public class SdpRecord implements Parcelable{
+
+ private final byte[] mRawData;
+ private final int mRawSize;
+
+ @Override
+ public String toString() {
+ return "BluetoothSdpRecord [rawData=" + Arrays.toString(mRawData)
+ + ", rawSize=" + mRawSize + "]";
+ }
+
+ public SdpRecord(int size_record, byte[] record){
+ this.mRawData = record;
+ this.mRawSize = size_record;
+ }
+
+ public SdpRecord(Parcel in){
+ this.mRawSize = in.readInt();
+ this.mRawData = new byte[mRawSize];
+ in.readByteArray(this.mRawData);
+
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(this.mRawSize);
+ dest.writeByteArray(this.mRawData);
+
+
+ }
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public SdpRecord createFromParcel(Parcel in) {
+ return new SdpRecord(in);
+ }
+
+ public SdpRecord[] newArray(int size) {
+ return new SdpRecord[size];
+ }
+ };
+
+ public byte[] getRawData() {
+ return mRawData;
+ }
+
+ public int getRawSize() {
+ return mRawSize;
+ }
+}
diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java
index b6bcfb8..3078951 100644
--- a/core/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -409,8 +409,8 @@
List <ScanFilter> filterList) {
final int callbackType = settings.getCallbackType();
// If onlost/onfound is requested, a non-empty filter is expected
- if ((callbackType & ScanSettings.CALLBACK_TYPE_FIRST_MATCH
- | ScanSettings.CALLBACK_TYPE_MATCH_LOST) != 0) {
+ if ((callbackType & (ScanSettings.CALLBACK_TYPE_FIRST_MATCH
+ | ScanSettings.CALLBACK_TYPE_MATCH_LOST)) != 0) {
if (filterList == null) {
return false;
}
diff --git a/core/java/android/bluetooth/le/BluetoothLeUtils.java b/core/java/android/bluetooth/le/BluetoothLeUtils.java
index 4916bd9..c40256b 100644
--- a/core/java/android/bluetooth/le/BluetoothLeUtils.java
+++ b/core/java/android/bluetooth/le/BluetoothLeUtils.java
@@ -132,7 +132,7 @@
* {@link BluetoothAdapter#STATE_ON}.
*/
static void checkAdapterStateOn(BluetoothAdapter adapter) {
- if (adapter == null || adapter.getState() != BluetoothAdapter.STATE_ON) {
+ if (adapter == null || !adapter.isLeEnabled()) {//adapter.getState() != BluetoothAdapter.STATE_ON) {
throw new IllegalStateException("BT Adapter is not turned ON");
}
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 0cbf960..3bf3f85 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -1608,6 +1608,28 @@
public abstract void sendBroadcastAsUser(Intent intent, UserHandle user,
@Nullable String receiverPermission);
+
+ /**
+ * Version of {@link #sendBroadcast(Intent, String)} that allows you to specify the
+ * user the broadcast will be sent to. This is not available to applications
+ * that are not pre-installed on the system image. Using it requires holding
+ * the INTERACT_ACROSS_USERS permission.
+ *
+ * @param intent The Intent to broadcast; all receivers matching this
+ * Intent will receive the broadcast.
+ * @param user UserHandle to send the intent to.
+ * @param receiverPermission (optional) String naming a permission that
+ * a receiver must hold in order to receive your broadcast.
+ * If null, no permission is required.
+ * @param appOp The app op associated with the broadcast.
+ *
+ * @see #sendBroadcast(Intent, String)
+ *
+ * @hide
+ */
+ public abstract void sendBroadcastAsUser(Intent intent, UserHandle user,
+ @Nullable String receiverPermission, int appOp);
+
/**
* Version of
* {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)}
@@ -2193,6 +2215,7 @@
MEDIA_ROUTER_SERVICE,
TELEPHONY_SERVICE,
TELEPHONY_SUBSCRIPTION_SERVICE,
+ CARRIER_CONFIG_SERVICE,
TELECOM_SERVICE,
CLIPBOARD_SERVICE,
INPUT_METHOD_SERVICE,
@@ -2338,6 +2361,8 @@
* @see android.telephony.TelephonyManager
* @see #TELEPHONY_SUBSCRIPTION_SERVICE
* @see android.telephony.SubscriptionManager
+ * @see #CARRIER_CONFIG_SERVICE
+ * @see android.telephony.CarrierConfigManager
* @see #INPUT_METHOD_SERVICE
* @see android.view.inputmethod.InputMethodManager
* @see #UI_MODE_SERVICE
@@ -2755,6 +2780,16 @@
/**
* Use with {@link #getSystemService} to retrieve a
+ * {@link android.telephony.CarrierConfigManager} for reading carrier configuration values.
+ *
+ * @see #getSystemService
+ * @see android.telephony.CarrierConfigManager
+ */
+ public static final String CARRIER_CONFIG_SERVICE = "carrier_config";
+
+ /**
+ * Use with {@link #getSystemService} to retrieve a
+ * {@link android.text.ClipboardManager} for accessing and modifying
* {@link android.content.ClipboardManager} for accessing and modifying
* the contents of the global clipboard.
*
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 92f0079..fb9e194 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -444,6 +444,13 @@
mBase.sendBroadcastAsUser(intent, user, receiverPermission);
}
+ /** @hide */
+ @Override
+ public void sendBroadcastAsUser(Intent intent, UserHandle user,
+ String receiverPermission, int appOp) {
+ mBase.sendBroadcastAsUser(intent, user, receiverPermission, appOp);
+ }
+
@Override
public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 4723c0d..16f6b1e 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -223,11 +223,12 @@
*/
public static final int FLAG_HARDWARE_ACCELERATED = 0x0200;
/**
- * Value for {@link #flags}: true when the application can be displayed over the lockscreen
- * and consequently over all users' windows.
+ * Value for {@link #flags}: true when the application can be displayed for all users
+ * regardless of if the user of the application is the current user. Set from the
+ * {@link android.R.attr#showForAllUsers} attribute.
* @hide
*/
- public static final int FLAG_SHOW_ON_LOCK_SCREEN = 0x0400;
+ public static final int FLAG_SHOW_FOR_ALL_USERS = 0x0400;
/**
* Bit in {@link #flags} corresponding to an immersive activity
* that wishes not to be interrupted by notifications.
@@ -609,7 +610,7 @@
* attribute.
*/
public int configChanges;
-
+
/**
* The desired soft input mode for this activity's main window.
* Set from the {@link android.R.attr#windowSoftInputMode} attribute
@@ -648,6 +649,37 @@
*/
public boolean resizeable;
+ /** @hide */
+ public static final int LOCK_TASK_LAUNCH_MODE_DEFAULT = 0;
+ /** @hide */
+ public static final int LOCK_TASK_LAUNCH_MODE_NEVER = 1;
+ /** @hide */
+ public static final int LOCK_TASK_LAUNCH_MODE_ALWAYS = 2;
+ /** @hide */
+ public static final int LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED = 3;
+
+ /** @hide */
+ public static final String lockTaskLaunchModeToString(int lockTaskLaunchMode) {
+ switch (lockTaskLaunchMode) {
+ case LOCK_TASK_LAUNCH_MODE_DEFAULT:
+ return "LOCK_TASK_LAUNCH_MODE_DEFAULT";
+ case LOCK_TASK_LAUNCH_MODE_NEVER:
+ return "LOCK_TASK_LAUNCH_MODE_NEVER";
+ case LOCK_TASK_LAUNCH_MODE_ALWAYS:
+ return "LOCK_TASK_LAUNCH_MODE_ALWAYS";
+ case LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED:
+ return "LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED";
+ default:
+ return "unknown=" + lockTaskLaunchMode;
+ }
+ }
+ /**
+ * Value indicating if the activity is to be locked at startup. Takes on the values from
+ * {@link android.R.attr#lockTaskMode}.
+ * @hide
+ */
+ public int lockTaskLaunchMode;
+
public ActivityInfo() {
}
@@ -665,13 +697,15 @@
uiOptions = orig.uiOptions;
parentActivityName = orig.parentActivityName;
maxRecents = orig.maxRecents;
+ resizeable = orig.resizeable;
+ lockTaskLaunchMode = orig.lockTaskLaunchMode;
}
-
+
/**
* Return the theme resource identifier to use for this activity. If
* the activity defines a theme, that is used; else, the application
* theme is used.
- *
+ *
* @return The theme associated with this activity.
*/
public final int getThemeResource() {
@@ -709,7 +743,8 @@
if (uiOptions != 0) {
pw.println(prefix + " uiOptions=0x" + Integer.toHexString(uiOptions));
}
- pw.println(prefix + "resizeable=" + resizeable);
+ pw.println(prefix + "resizeable=" + resizeable + " lockTaskLaunchMode="
+ + lockTaskLaunchModeToString(lockTaskLaunchMode));
super.dumpBack(pw, prefix);
}
@@ -739,6 +774,7 @@
dest.writeInt(persistableMode);
dest.writeInt(maxRecents);
dest.writeInt(resizeable ? 1 : 0);
+ dest.writeInt(lockTaskLaunchMode);
}
public static final Parcelable.Creator<ActivityInfo> CREATOR
@@ -767,5 +803,6 @@
persistableMode = source.readInt();
maxRecents = source.readInt();
resizeable = (source.readInt() == 1);
+ lockTaskLaunchMode = source.readInt();
}
}
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 5bdb7bb..e2701ee 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -21,6 +21,7 @@
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import android.util.Printer;
import com.android.internal.util.ArrayUtils;
@@ -338,8 +339,8 @@
* (e.g., HTTP rather than HTTPS; WebSockets rather than WebSockets Secure; XMPP, IMAP, STMP
* without STARTTLS or TLS). If {@code false}, the app declares that it does not intend to use
* cleartext network traffic, in which case platform components (e.g., HTTP stacks,
- * {@code WebView}, {@code MediaPlayer}) will refuse app's requests to use cleartext traffic.
- * Third-party libraries are encouraged to honor this flag as well.
+ * {@code WebView}, {@code DownloadManager}, {@code MediaPlayer}) will refuse app's requests to
+ * use cleartext traffic. Third-party libraries are encouraged to honor this flag as well.
*/
public static final int FLAG_USES_CLEARTEXT_TRAFFIC = 1<<27;
@@ -937,6 +938,17 @@
return (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
}
+ /** @hide */
+ public boolean isInternal() {
+ return (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0;
+ }
+
+ /** @hide */
+ public boolean isExternalAsec() {
+ return TextUtils.isEmpty(volumeUuid)
+ && (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0;
+ }
+
/**
* @hide
*/
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index c2580c0..447c668 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -328,7 +328,7 @@
* @param observer call back used to notify when
* the operation is completed
*/
- void freeStorageAndNotify(in long freeStorageSize,
+ void freeStorageAndNotify(in String volumeUuid, in long freeStorageSize,
IPackageDataObserver observer);
/**
@@ -352,7 +352,7 @@
* notify when the operation is completed.May be null
* to indicate that no call back is desired.
*/
- void freeStorage(in long freeStorageSize,
+ void freeStorage(in String volumeUuid, in long freeStorageSize,
in IntentSender pi);
/**
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 8844ea8..a0cec50 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -20,6 +20,7 @@
import android.annotation.DrawableRes;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.StringRes;
@@ -3797,7 +3798,13 @@
* @hide
*/
// @SystemApi
- public abstract void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer);
+ public void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer) {
+ freeStorageAndNotify(null, freeStorageSize, observer);
+ }
+
+ /** {@hide} */
+ public abstract void freeStorageAndNotify(String volumeUuid, long freeStorageSize,
+ IPackageDataObserver observer);
/**
* Free storage by deleting LRU sorted list of cache files across
@@ -3822,7 +3829,12 @@
*
* @hide
*/
- public abstract void freeStorage(long freeStorageSize, IntentSender pi);
+ public void freeStorage(long freeStorageSize, IntentSender pi) {
+ freeStorage(null, freeStorageSize, pi);
+ }
+
+ /** {@hide} */
+ public abstract void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi);
/**
* Retrieve the size information for a package.
@@ -4162,6 +4174,12 @@
public abstract void movePackageAndData(String packageName, String volumeUuid,
IPackageMoveObserver observer);
+ /** {@hide} */
+ public abstract @Nullable VolumeInfo getApplicationCurrentVolume(ApplicationInfo app);
+
+ /** {@hide} */
+ public abstract @NonNull List<VolumeInfo> getApplicationCandidateVolumes(ApplicationInfo app);
+
/**
* Returns the device identity that verifiers can use to associate their scheme to a particular
* device. This should not be used by anything other than a package verifier.
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 7464cab..fed9261 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -3099,8 +3099,9 @@
a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
}
- if (sa.getBoolean(R.styleable.AndroidManifestActivity_showOnLockScreen, false)) {
- a.info.flags |= ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN;
+ if (sa.getBoolean(R.styleable.AndroidManifestActivity_showOnLockScreen, false)
+ || sa.getBoolean(R.styleable.AndroidManifestActivity_showForAllUsers, false)) {
+ a.info.flags |= ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
}
if (sa.getBoolean(R.styleable.AndroidManifestActivity_immersive, false)) {
@@ -3159,6 +3160,9 @@
R.styleable.AndroidManifestActivity_screenOrientation,
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
+
+ a.info.lockTaskLaunchMode =
+ sa.getInt(R.styleable.AndroidManifestActivity_lockTaskMode, 0);
} else {
a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
a.info.configChanges = 0;
diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java
index 88fa339..7ad3a68 100644
--- a/core/java/android/hardware/SystemSensorManager.java
+++ b/core/java/android/hardware/SystemSensorManager.java
@@ -26,6 +26,7 @@
import android.util.SparseIntArray;
import dalvik.system.CloseGuard;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -224,8 +225,8 @@
* the queues and the listeners.
*/
private static abstract class BaseEventQueue {
- private native long nativeInitBaseEventQueue(BaseEventQueue eventQ, MessageQueue msgQ,
- float[] scratch, String packageName);
+ private native long nativeInitBaseEventQueue(WeakReference<BaseEventQueue> eventQWeak,
+ MessageQueue msgQ, float[] scratch, String packageName);
private static native int nativeEnableSensor(long eventQ, int handle, int rateUs,
int maxBatchReportLatencyUs);
private static native int nativeDisableSensor(long eventQ, int handle);
@@ -240,7 +241,8 @@
protected final SystemSensorManager mManager;
BaseEventQueue(Looper looper, SystemSensorManager manager) {
- nSensorEventQueue = nativeInitBaseEventQueue(this, looper.getQueue(), mScratch,
+ nSensorEventQueue = nativeInitBaseEventQueue(new WeakReference<BaseEventQueue>(this),
+ looper.getQueue(), mScratch,
manager.mPackageName);
mCloseGuard.open("dispose");
mManager = manager;
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 8f7aed4..87a1ca9 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -1030,12 +1030,13 @@
* point, <code>z_s = 1</code>, and <code>w_s</code> is a measurement of disparity
* (depth) in pixel coordinates.</p>
* <p><b>Units</b>:
- * Pixels in the android.sensor.activeArraySize coordinate
+ * Pixels in the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} coordinate
* system.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#LENS_POSE_ROTATION
* @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<float[]> LENS_INTRINSIC_CALIBRATION =
@@ -1330,6 +1331,7 @@
* <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS READ_SENSOR_SETTINGS}</li>
* <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE BURST_CAPTURE}</li>
* <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING YUV_REPROCESSING}</li>
+ * <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT DEPTH_OUTPUT}</li>
* </ul></p>
* <p>This key is available on all devices.</p>
*
@@ -1342,6 +1344,7 @@
* @see #REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS
* @see #REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE
* @see #REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING
+ * @see #REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT
*/
@PublicKey
public static final Key<int[]> REQUEST_AVAILABLE_CAPABILITIES =
@@ -2542,11 +2545,23 @@
* post-processing, arbitrary cropping regions, and has relaxed performance constraints.</p>
* <p>Each higher level supports everything the lower level supports
* in this order: FULL <code>></code> LIMITED <code>></code> LEGACY.</p>
+ * <p>A HIGH_RESOLUTION device is equivalent to a FULL device, except that:</p>
+ * <ul>
+ * <li>At least one output resolution of 8 megapixels or higher in uncompressed YUV is
+ * supported at <code>>=</code> 20 fps.</li>
+ * <li>Maximum-size (sensor resolution) uncompressed YUV is supported at <code>>=</code> 10
+ * fps.</li>
+ * <li>For devices that list the RAW capability and support either RAW10 or RAW12 output,
+ * maximum-resolution RAW10 or RAW12 capture will operate at least at the rate of
+ * maximum-resolution YUV capture, and at least one supported output resolution of
+ * 8 megapixels or higher in RAW10 or RAW12 is supported <code>>=</code> 20 fps.</li>
+ * </ul>
* <p><b>Possible values:</b>
* <ul>
* <li>{@link #INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED LIMITED}</li>
* <li>{@link #INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL}</li>
* <li>{@link #INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY}</li>
+ * <li>{@link #INFO_SUPPORTED_HARDWARE_LEVEL_HIGH_RESOLUTION HIGH_RESOLUTION}</li>
* </ul></p>
* <p>This key is available on all devices.</p>
*
@@ -2564,6 +2579,7 @@
* @see #INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED
* @see #INFO_SUPPORTED_HARDWARE_LEVEL_FULL
* @see #INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
+ * @see #INFO_SUPPORTED_HARDWARE_LEVEL_HIGH_RESOLUTION
*/
@PublicKey
public static final Key<Integer> INFO_SUPPORTED_HARDWARE_LEVEL =
@@ -2694,6 +2710,29 @@
public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS =
new Key<android.hardware.camera2.params.StreamConfigurationDuration[]>("android.depth.availableDepthStallDurations", android.hardware.camera2.params.StreamConfigurationDuration[].class);
+ /**
+ * <p>Indicates whether a capture request may target both a
+ * DEPTH16 / DEPTH_POINT_CLOUD output, and normal color outputs (such as
+ * YUV_420_888, JPEG, or RAW) simultaneously.</p>
+ * <p>If TRUE, including both depth and color outputs in a single
+ * capture request is not supported. An application must interleave color
+ * and depth requests. If FALSE, a single request can target both types
+ * of output.</p>
+ * <p>Typically, this restriction exists on camera devices that
+ * need to emit a specific pattern or wavelength of light to
+ * measure depth values, which causes the color image to be
+ * corrupted during depth measurement.</p>
+ * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Limited capability</b> -
+ * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
+ * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
+ *
+ * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
+ */
+ @PublicKey
+ public static final Key<Boolean> DEPTH_DEPTH_IS_EXCLUSIVE =
+ new Key<Boolean>("android.depth.depthIsExclusive", boolean.class);
+
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 4a5bd08..e3f1d73 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -303,10 +303,13 @@
* <p>The minimal set of capabilities that every camera
* device (regardless of {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel})
* supports.</p>
- * <p>This capability is listed by all devices, and
+ * <p>This capability is listed by all normal devices, and
* indicates that the camera device has a feature set
* that's comparable to the baseline requirements for the
* older android.hardware.Camera API.</p>
+ * <p>Devices with the DEPTH_OUTPUT capability might not list this
+ * capability, indicating that they support only depth measurement,
+ * not standard color output.</p>
*
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
* @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
@@ -545,6 +548,11 @@
* {@link CameraCharacteristics#CONTROL_AWB_LOCK_AVAILABLE android.control.awbLockAvailable} are also guaranteed
* to be <code>true</code> so burst capture with these two locks ON
* yields consistent image output.</p>
+ * <p>On a camera device that reports the HIGH_RESOLUTION hardware
+ * level, meaning the device supports very large capture sizes,
+ * BURST_CAPTURE means that at least 8-megapixel images can be
+ * captured at <code>>=</code> 20 fps, and maximum-resolution images can be
+ * captured at <code>>=</code> 10 fps.</p>
*
* @see CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES
* @see CameraCharacteristics#CONTROL_AE_LOCK_AVAILABLE
@@ -596,6 +604,42 @@
*/
public static final int REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING = 7;
+ /**
+ * <p>The camera device can produce depth measurements from its field of view.</p>
+ * <p>This capability requires the camera device to support the following:</p>
+ * <ul>
+ * <li>DEPTH16 is supported as an output format.</li>
+ * <li>DEPTH_POINT_CLOUD is optionally supported as an output format.</li>
+ * <li>This camera device, and all camera devices with the same android.lens.info.facing,
+ * will list the following calibration entries in both CameraCharacteristics and
+ * CaptureResults:<ul>
+ * <li>{@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}</li>
+ * <li>{@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation}</li>
+ * <li>android.lens.intrinsicCalibration</li>
+ * <li>android.lens.radialDistortion</li>
+ * </ul>
+ * </li>
+ * <li>The {@link CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE android.depth.depthIsExclusive} entry is listed by this device.</li>
+ * <li>A LIMITED camera with only the DEPTH_OUTPUT capability does not have to support
+ * normal YUV_420_888, JPEG, and PRIV-format outputs. It only has to support the DEPTH16
+ * format.</li>
+ * </ul>
+ * <p>Generally, depth output operates at a slower frame rate than standard color capture,
+ * so the DEPTH16 and DEPTH_POINT_CLOUD formats will commonly have a stall duration that
+ * should be accounted for (see
+ * android.hardware.camera2.StreamConfigurationMap#getOutputStallDuration). On a device
+ * that supports both depth and color-based output, to enable smooth preview, using a
+ * repeating burst is recommended, where a depth-output target is only included once
+ * every N frames, where N is the ratio between preview output rate and depth output
+ * rate, including depth stall time.</p>
+ *
+ * @see CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE
+ * @see CameraCharacteristics#LENS_POSE_ROTATION
+ * @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
+ */
+ public static final int REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT = 8;
+
//
// Enumeration values for CameraCharacteristics#SCALER_CROPPING_TYPE
//
@@ -808,6 +852,13 @@
*/
public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY = 2;
+ /**
+ * <p>This camera device is capable of supporting advanced imaging applications at full rate,
+ * and additional high-resolution outputs at lower rates.</p>
+ * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
+ */
+ public static final int INFO_SUPPORTED_HARDWARE_LEVEL_HIGH_RESOLUTION = 3;
+
//
// Enumeration values for CameraCharacteristics#SYNC_MAX_LATENCY
//
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 4134d28..ef5d75c 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -2628,12 +2628,13 @@
* point, <code>z_s = 1</code>, and <code>w_s</code> is a measurement of disparity
* (depth) in pixel coordinates.</p>
* <p><b>Units</b>:
- * Pixels in the android.sensor.activeArraySize coordinate
+ * Pixels in the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} coordinate
* system.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#LENS_POSE_ROTATION
* @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<float[]> LENS_INTRINSIC_CALIBRATION =
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index b757a9a..0d7b261 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -199,12 +199,12 @@
*/
public static class CryptoObject {
- CryptoObject(Signature signature) {
+ public CryptoObject(Signature signature) {
mSignature = signature;
mCipher = null;
}
- CryptoObject(Cipher cipher) {
+ public CryptoObject(Cipher cipher) {
mCipher = cipher;
mSignature = null;
}
@@ -535,9 +535,9 @@
*
* @hide
*/
- public List<Fingerprint> getEnrolledFingerprints() {
+ public List<Fingerprint> getEnrolledFingerprints(int userId) {
if (mService != null) try {
- return mService.getEnrolledFingerprints(getCurrentUserId());
+ return mService.getEnrolledFingerprints(userId);
} catch (RemoteException e) {
Log.v(TAG, "Remote exception in getEnrolledFingerprints: ", e);
}
@@ -545,11 +545,34 @@
}
/**
- * Determine if fingerprint hardware is present and functional.
- * @return true if hardware is present and functional, false otherwise.
+ * Obtain the list of enrolled fingerprints templates.
+ * @return list of current fingerprint items
*
* @hide
*/
+ public List<Fingerprint> getEnrolledFingerprints() {
+ return getEnrolledFingerprints(UserHandle.myUserId());
+ }
+
+ /**
+ * Determine if there is at least one fingerprint enrolled.
+ *
+ * @return true if at least one fingerprint is enrolled, false otherwise
+ */
+ public boolean hasEnrolledFingerprints() {
+ if (mService != null) try {
+ return mService.hasEnrolledFingerprints(UserHandle.myUserId());
+ } catch (RemoteException e) {
+ Log.v(TAG, "Remote exception in getEnrolledFingerprints: ", e);
+ }
+ return false;
+ }
+
+ /**
+ * Determine if fingerprint hardware is present and functional.
+ *
+ * @return true if hardware is present and functional, false otherwise.
+ */
public boolean isHardwareDetected() {
if (mService != null) {
try {
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 6fe72d5..51a0e4c 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -54,6 +54,9 @@
// Get a pre-enrollment authentication token
long preEnroll(IBinder token);
+ // Determine if a user has at least one enrolled fingerprint
+ boolean hasEnrolledFingerprints(int groupId);
+
// Gets the number of hardware devices
// int getHardwareDeviceCount();
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 55e39b1..e75f337 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -40,7 +40,6 @@
import android.util.ArrayMap;
import android.util.Log;
-import com.android.internal.net.VpnConfig;
import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.util.Protocol;
@@ -611,6 +610,27 @@
}
/**
+ * Returns a {@link Network} object corresponding to the currently active
+ * default data network. In the event that the current active default data
+ * network disconnects, the returned {@code Network} object will no longer
+ * be usable. This will return {@code null} when there is no default
+ * network.
+ *
+ * @return a {@link Network} object for the current default network or
+ * {@code null} if no default network is currently active
+ *
+ * <p>This method requires the caller to hold the permission
+ * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
+ */
+ public Network getActiveNetwork() {
+ try {
+ return mService.getActiveNetwork();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
* Returns details about the currently active default data network
* for a given uid. This is for internal use only to avoid spying
* other apps.
@@ -831,48 +851,6 @@
}
/**
- * Tells each network type to set its radio power state as directed.
- *
- * @param turnOn a boolean, {@code true} to turn the radios on,
- * {@code false} to turn them off.
- * @return a boolean, {@code true} indicating success. All network types
- * will be tried, even if some fail.
- *
- * <p>This method requires the caller to hold the permission
- * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
- * {@hide}
- */
-// TODO - check for any callers and remove
-// public boolean setRadios(boolean turnOn) {
-// try {
-// return mService.setRadios(turnOn);
-// } catch (RemoteException e) {
-// return false;
-// }
-// }
-
- /**
- * Tells a given networkType to set its radio power state as directed.
- *
- * @param networkType the int networkType of interest.
- * @param turnOn a boolean, {@code true} to turn the radio on,
- * {@code} false to turn it off.
- * @return a boolean, {@code true} indicating success.
- *
- * <p>This method requires the caller to hold the permission
- * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
- * {@hide}
- */
-// TODO - check for any callers and remove
-// public boolean setRadio(int networkType, boolean turnOn) {
-// try {
-// return mService.setRadio(networkType, turnOn);
-// } catch (RemoteException e) {
-// return false;
-// }
-// }
-
- /**
* Tells the underlying networking system that the caller wants to
* begin using the named feature. The interpretation of {@code feature}
* is completely up to each networking implementation.
@@ -1738,10 +1716,33 @@
*
* @param network The {@link Network} the application was attempting to use
* or {@code null} to indicate the current default network.
+ * @deprecated Use {@link #reportNetworkConnectivity} which allows reporting both
+ * working and non-working connectivity.
*/
public void reportBadNetwork(Network network) {
try {
- mService.reportBadNetwork(network);
+ // One of these will be ignored because it matches system's current state.
+ // The other will trigger the necessary reevaluation.
+ mService.reportNetworkConnectivity(network, true);
+ mService.reportNetworkConnectivity(network, false);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Report to the framework whether a network has working connectivity.
+ * This provides a hint to the system that a particular network is providing
+ * working connectivity or not. In response the framework may re-evaluate
+ * the network's connectivity and might take further action thereafter.
+ *
+ * @param network The {@link Network} the application was attempting to use
+ * or {@code null} to indicate the current default network.
+ * @param hasConnectivity {@code true} if the application was able to successfully access the
+ * Internet using {@code network} or {@code false} if not.
+ */
+ public void reportNetworkConnectivity(Network network, boolean hasConnectivity) {
+ try {
+ mService.reportNetworkConnectivity(network, hasConnectivity);
} catch (RemoteException e) {
}
}
@@ -1978,12 +1979,18 @@
} catch (RemoteException e) { }
}
- /** {@hide} */
- public void registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
+ /**
+ * @hide
+ * Register a NetworkAgent with ConnectivityService.
+ * @return NetID corresponding to NetworkAgent.
+ */
+ public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
NetworkCapabilities nc, int score, NetworkMisc misc) {
try {
- mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc);
- } catch (RemoteException e) { }
+ return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc);
+ } catch (RemoteException e) {
+ return NETID_UNSET;
+ }
}
/**
@@ -2444,6 +2451,23 @@
}
/**
+ * Request connectivityservice to refresh network capabilities for the given
+ * {@link network}. This method returns true if the network is still active, false
+ * otherwise. Notice the method call assumes the caller has registered for
+ * listening NetworkCapabilities updates.
+ *
+ * @param network{@link Network} specifying which network you're interested.
+ * @hide
+ */
+ public boolean requestBwUpdate(Network network) {
+ try {
+ return mService.requestBwUpdate(network);
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /**
* Unregisters callbacks about and possibly releases networks originating from
* {@link #requestNetwork} and {@link #registerNetworkCallback} calls. If the
* given {@code NetworkCallback} had previously been used with {@code #requestNetwork},
@@ -2490,30 +2514,9 @@
* @hide
*/
public void factoryReset() {
- // Turn airplane mode off
- setAirplaneMode(false);
-
- // Untether
- for (String tether : getTetheredIfaces()) {
- untether(tether);
- }
-
- // Turn VPN off
try {
- VpnConfig vpnConfig = mService.getVpnConfig();
- if (vpnConfig != null) {
- if (vpnConfig.legacy) {
- mService.prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN);
- } else {
- // Prevent this app from initiating VPN connections in the future without
- // user intervention.
- mService.setVpnPackageAuthorization(false);
-
- mService.prepareVpn(vpnConfig.user, VpnConfig.LEGACY_VPN);
- }
- }
+ mService.factoryReset();
} catch (RemoteException e) {
- // Well, we tried
}
}
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index 1aa9c45..d6c0693 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -43,6 +43,7 @@
/** {@hide} */
interface IConnectivityManager
{
+ Network getActiveNetwork();
NetworkInfo getActiveNetworkInfo();
NetworkInfo getActiveNetworkInfoForUid(int uid);
NetworkInfo getNetworkInfo(int networkType);
@@ -95,7 +96,7 @@
void reportInetCondition(int networkType, int percentage);
- void reportBadNetwork(in Network network);
+ void reportNetworkConnectivity(in Network network, boolean hasConnectivity);
ProxyInfo getGlobalProxy();
@@ -121,8 +122,6 @@
void captivePortalCheckCompleted(in NetworkInfo info, boolean isCaptivePortal);
- int findConnectionTypeForIface(in String iface);
-
int checkMobileProvisioning(int suggestedTimeOutMs);
String getMobileProvisioningUrl();
@@ -135,9 +134,11 @@
void registerNetworkFactory(in Messenger messenger, in String name);
+ boolean requestBwUpdate(in Network network);
+
void unregisterNetworkFactory(in Messenger messenger);
- void registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp,
+ int registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp,
in NetworkCapabilities nc, int score, in NetworkMisc misc);
NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities,
@@ -163,4 +164,6 @@
boolean addVpnAddress(String address, int prefixLength);
boolean removeVpnAddress(String address, int prefixLength);
boolean setUnderlyingNetworksForVpn(in Network[] networks);
+
+ void factoryReset();
}
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index 7e92de2..c722fbc 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -45,7 +45,7 @@
/** Control network policies atomically. */
void setNetworkPolicies(in NetworkPolicy[] policies);
- NetworkPolicy[] getNetworkPolicies();
+ NetworkPolicy[] getNetworkPolicies(String callingPackage);
/** Snooze limit on policy matching given template. */
void snoozeLimit(in NetworkTemplate template);
@@ -58,4 +58,6 @@
NetworkQuotaInfo getNetworkQuotaInfo(in NetworkState state);
boolean isNetworkMetered(in NetworkState state);
+
+ void factoryReset(String subscriber);
}
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index 95ceb2a..9c3a623 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -39,12 +39,18 @@
* @hide
*/
public abstract class NetworkAgent extends Handler {
+ // Guaranteed to be valid (not NETID_UNSET), otherwise registerNetworkAgent() would have thrown
+ // an exception.
+ public final int netId;
+
private volatile AsyncChannel mAsyncChannel;
private final String LOG_TAG;
private static final boolean DBG = true;
private static final boolean VDBG = false;
private final Context mContext;
private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>();
+ private volatile long mLastBwRefreshTime = 0;
+ private static final long BW_REFRESH_MIN_WIN_MS = 500;
private static final int BASE = Protocol.BASE_NETWORK_AGENT;
@@ -134,6 +140,11 @@
*/
public static final int CMD_SAVE_ACCEPT_UNVALIDATED = BASE + 9;
+ /** Sent by ConnectivityService to the NetworkAgent to inform the agent to pull
+ * the underlying network connection for updated bandwidth information.
+ */
+ public static final int CMD_REQUEST_BANDWIDTH_UPDATE = BASE + 10;
+
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);
@@ -151,7 +162,7 @@
if (VDBG) log("Registering NetworkAgent");
ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
Context.CONNECTIVITY_SERVICE);
- cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni),
+ netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni),
new LinkProperties(lp), new NetworkCapabilities(nc), score, misc);
}
@@ -195,6 +206,15 @@
log("Unhandled Message " + msg);
break;
}
+ case CMD_REQUEST_BANDWIDTH_UPDATE: {
+ if (VDBG) {
+ log("CMD_REQUEST_BANDWIDTH_UPDATE request received.");
+ }
+ if (System.currentTimeMillis() > (mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS)) {
+ pollLceData();
+ }
+ break;
+ }
case CMD_REPORT_NETWORK_STATUS: {
if (VDBG) {
log("CMD_REPORT_NETWORK_STATUS(" +
@@ -240,6 +260,7 @@
* Called by the bearer code when it has new NetworkCapabilities data.
*/
public void sendNetworkCapabilities(NetworkCapabilities networkCapabilities) {
+ mLastBwRefreshTime = System.currentTimeMillis();
queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED,
new NetworkCapabilities(networkCapabilities));
}
@@ -294,6 +315,13 @@
abstract protected void unwanted();
/**
+ * Called when ConnectivityService request a bandwidth update. The parent factory
+ * shall try to overwrite this method and produce a bandwidth update if capable.
+ */
+ protected void pollLceData() {
+ }
+
+ /**
* Called when the system determines the usefulness of this network.
*
* Networks claiming internet connectivity will have their internet
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index a7ffee9..bc03637 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -61,12 +61,14 @@
*/
public static final String EXTRA_NETWORK_TEMPLATE = "android.net.NETWORK_TEMPLATE";
+ private final Context mContext;
private INetworkPolicyManager mService;
- public NetworkPolicyManager(INetworkPolicyManager service) {
+ public NetworkPolicyManager(Context context, INetworkPolicyManager service) {
if (service == null) {
throw new IllegalArgumentException("missing INetworkPolicyManager");
}
+ mContext = context;
mService = service;
}
@@ -158,7 +160,7 @@
public NetworkPolicy[] getNetworkPolicies() {
try {
- return mService.getNetworkPolicies();
+ return mService.getNetworkPolicies(mContext.getOpPackageName());
} catch (RemoteException e) {
return null;
}
@@ -185,24 +187,9 @@
* @hide
*/
public void factoryReset(String subscriber) {
- // Turn mobile data limit off
- NetworkPolicy[] policies = getNetworkPolicies();
- NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriber);
- for (NetworkPolicy policy : policies) {
- if (policy.template.equals(template)) {
- policy.limitBytes = NetworkPolicy.LIMIT_DISABLED;
- policy.inferred = false;
- policy.clearSnooze();
- }
- }
- setNetworkPolicies(policies);
-
- // Turn restrict background data off
- setRestrictBackground(false);
-
- // Remove app's "restrict background data" flag
- for (int uid : getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND)) {
- setUidPolicy(uid, NetworkPolicyManager.POLICY_NONE);
+ try {
+ mService.factoryReset(subscriber);
+ } catch (RemoteException e) {
}
}
diff --git a/core/java/android/nfc/IAppCallback.aidl b/core/java/android/nfc/IAppCallback.aidl
index 9599308..c027d54 100644
--- a/core/java/android/nfc/IAppCallback.aidl
+++ b/core/java/android/nfc/IAppCallback.aidl
@@ -24,7 +24,7 @@
*/
interface IAppCallback
{
- BeamShareData createBeamShareData();
- void onNdefPushComplete();
+ BeamShareData createBeamShareData(byte peerLlcpVersion);
+ void onNdefPushComplete(byte peerLlcpVersion);
void onTagDiscovered(in Tag tag);
}
diff --git a/core/java/android/nfc/NfcActivityManager.java b/core/java/android/nfc/NfcActivityManager.java
index d009295..76bd0ec 100644
--- a/core/java/android/nfc/NfcActivityManager.java
+++ b/core/java/android/nfc/NfcActivityManager.java
@@ -46,7 +46,6 @@
static final Boolean DBG = false;
final NfcAdapter mAdapter;
- final NfcEvent mDefaultEvent; // cached NfcEvent (its currently always the same)
// All objects in the lists are protected by this
final List<NfcApplicationState> mApps; // Application(s) that have NFC state. Usually one
@@ -200,7 +199,6 @@
mAdapter = adapter;
mActivities = new LinkedList<NfcActivityState>();
mApps = new ArrayList<NfcApplicationState>(1); // Android VM usually has 1 app
- mDefaultEvent = new NfcEvent(mAdapter);
}
public void enableReaderMode(Activity activity, ReaderCallback callback, int flags,
@@ -354,13 +352,14 @@
/** Callback from NFC service, usually on binder thread */
@Override
- public BeamShareData createBeamShareData() {
+ public BeamShareData createBeamShareData(byte peerLlcpVersion) {
NfcAdapter.CreateNdefMessageCallback ndefCallback;
NfcAdapter.CreateBeamUrisCallback urisCallback;
NdefMessage message;
Activity activity;
Uri[] uris;
int flags;
+ NfcEvent event = new NfcEvent(mAdapter, peerLlcpVersion);
synchronized (NfcActivityManager.this) {
NfcActivityState state = findResumedActivityState();
if (state == null) return null;
@@ -375,10 +374,10 @@
// Make callbacks without lock
if (ndefCallback != null) {
- message = ndefCallback.createNdefMessage(mDefaultEvent);
+ message = ndefCallback.createNdefMessage(event);
}
if (urisCallback != null) {
- uris = urisCallback.createBeamUris(mDefaultEvent);
+ uris = urisCallback.createBeamUris(event);
if (uris != null) {
ArrayList<Uri> validUris = new ArrayList<Uri>();
for (Uri uri : uris) {
@@ -412,7 +411,7 @@
/** Callback from NFC service, usually on binder thread */
@Override
- public void onNdefPushComplete() {
+ public void onNdefPushComplete(byte peerLlcpVersion) {
NfcAdapter.OnNdefPushCompleteCallback callback;
synchronized (NfcActivityManager.this) {
NfcActivityState state = findResumedActivityState();
@@ -420,10 +419,10 @@
callback = state.onNdefPushCompleteCallback;
}
-
+ NfcEvent event = new NfcEvent(mAdapter, peerLlcpVersion);
// Make callback without lock
if (callback != null) {
- callback.onNdefPushComplete(mDefaultEvent);
+ callback.onNdefPushComplete(event);
}
}
diff --git a/core/java/android/nfc/NfcEvent.java b/core/java/android/nfc/NfcEvent.java
index 860700a..cf1d71a 100644
--- a/core/java/android/nfc/NfcEvent.java
+++ b/core/java/android/nfc/NfcEvent.java
@@ -38,7 +38,14 @@
*/
public final NfcAdapter nfcAdapter;
- NfcEvent(NfcAdapter nfcAdapter) {
+ /**
+ * The LLCP version of the peer associated with the NFC event.
+ * The major version is in the top nibble, the minor version is in the bottom nibble.
+ */
+ public final byte peerLlcpVersion;
+
+ NfcEvent(NfcAdapter nfcAdapter, byte peerLlcpVersion) {
this.nfcAdapter = nfcAdapter;
+ this.peerLlcpVersion = peerLlcpVersion;
}
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 7c5ddee..4dfe0de 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -152,10 +152,15 @@
private static final String[] STAT_NAMES = { "l", "c", "u" };
/**
- * Bump the version on this if the checkin format changes.
+ * Current version of checkin data format.
+ */
+ static final String CHECKIN_VERSION = "14";
+
+ /**
+ * Old version, we hit 9 and ran out of room, need to remove.
*/
private static final int BATTERY_STATS_CHECKIN_VERSION = 9;
-
+
private static final long BYTES_PER_KB = 1024;
private static final long BYTES_PER_MB = 1048576; // 1024^2
private static final long BYTES_PER_GB = 1073741824; //1024^3
@@ -178,7 +183,9 @@
private static final String BATTERY_DATA = "bt";
private static final String BATTERY_DISCHARGE_DATA = "dc";
private static final String BATTERY_LEVEL_DATA = "lv";
+ private static final String GLOBAL_WIFI_DATA = "gwfl";
private static final String WIFI_DATA = "wfl";
+ private static final String GLOBAL_BLUETOOTH_DATA = "gble";
private static final String MISC_DATA = "m";
private static final String GLOBAL_NETWORK_DATA = "gn";
private static final String HISTORY_STRING_POOL = "hsp";
@@ -195,8 +202,6 @@
private static final String WIFI_SUPPL_STATE_COUNT_DATA = "wssc";
private static final String WIFI_SIGNAL_STRENGTH_TIME_DATA = "wsgt";
private static final String WIFI_SIGNAL_STRENGTH_COUNT_DATA = "wsgc";
- private static final String BLUETOOTH_STATE_TIME_DATA = "bst";
- private static final String BLUETOOTH_STATE_COUNT_DATA = "bsc";
private static final String POWER_USE_SUMMARY_DATA = "pws";
private static final String POWER_USE_ITEM_DATA = "pwi";
private static final String DISCHARGE_STEP_DATA = "dsd";
@@ -1055,22 +1060,23 @@
public static final int STATE_GPS_ON_FLAG = 1<<29;
public static final int STATE_WIFI_FULL_LOCK_FLAG = 1<<28;
public static final int STATE_WIFI_SCAN_FLAG = 1<<27;
- public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<26;
+ public static final int STATE_WIFI_RADIO_ACTIVE_FLAG = 1<<26;
public static final int STATE_MOBILE_RADIO_ACTIVE_FLAG = 1<<25;
// These are on the lower bits used for the command; if they change
// we need to write another int of data.
public static final int STATE_SENSOR_ON_FLAG = 1<<23;
public static final int STATE_AUDIO_ON_FLAG = 1<<22;
public static final int STATE_PHONE_SCANNING_FLAG = 1<<21;
- public static final int STATE_SCREEN_ON_FLAG = 1<<20;
- public static final int STATE_BATTERY_PLUGGED_FLAG = 1<<19;
- public static final int STATE_PHONE_IN_CALL_FLAG = 1<<18;
- public static final int STATE_CHARGING_FLAG = 1<<17;
- public static final int STATE_BLUETOOTH_ON_FLAG = 1<<16;
+ public static final int STATE_SCREEN_ON_FLAG = 1<<20; // consider moving to states2
+ public static final int STATE_BATTERY_PLUGGED_FLAG = 1<<19; // consider moving to states2
+ // empty slot
+ // empty slot
+ public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<16;
public static final int MOST_INTERESTING_STATES =
- STATE_BATTERY_PLUGGED_FLAG | STATE_SCREEN_ON_FLAG
- | STATE_PHONE_IN_CALL_FLAG | STATE_BLUETOOTH_ON_FLAG;
+ STATE_BATTERY_PLUGGED_FLAG | STATE_SCREEN_ON_FLAG;
+
+ public static final int SETTLE_TO_ZERO_STATES = 0xffff0000 & ~MOST_INTERESTING_STATES;
public int states;
@@ -1088,9 +1094,15 @@
public static final int STATE2_WIFI_ON_FLAG = 1<<28;
public static final int STATE2_FLASHLIGHT_FLAG = 1<<27;
public static final int STATE2_DEVICE_IDLE_FLAG = 1<<26;
+ public static final int STATE2_CHARGING_FLAG = 1<<25;
+ public static final int STATE2_PHONE_IN_CALL_FLAG = 1<<24;
+ public static final int STATE2_BLUETOOTH_ON_FLAG = 1<<23;
public static final int MOST_INTERESTING_STATES2 =
- STATE2_POWER_SAVE_FLAG | STATE2_WIFI_ON_FLAG | STATE2_DEVICE_IDLE_FLAG;
+ STATE2_POWER_SAVE_FLAG | STATE2_WIFI_ON_FLAG | STATE2_DEVICE_IDLE_FLAG
+ | STATE2_CHARGING_FLAG | STATE2_PHONE_IN_CALL_FLAG | STATE2_BLUETOOTH_ON_FLAG;
+
+ public static final int SETTLE_TO_ZERO_STATES2 = 0xffff0000 & ~MOST_INTERESTING_STATES2;
public int states2;
@@ -1137,8 +1149,10 @@
public static final int EVENT_PACKAGE_UNINSTALLED = 0x000d;
// Event for a package being uninstalled.
public static final int EVENT_ALARM = 0x000e;
+ // Record that we have decided we need to collect new stats data.
+ public static final int EVENT_COLLECT_EXTERNAL_STATS = 0x000f;
// Number of event types.
- public static final int EVENT_COUNT = 0x000f;
+ public static final int EVENT_COUNT = 0x0010;
// Mask to extract out only the type part of the event.
public static final int EVENT_TYPE_MASK = ~(EVENT_FLAG_START|EVENT_FLAG_FINISH);
@@ -1750,14 +1764,12 @@
new BitDescription(HistoryItem.STATE_WIFI_FULL_LOCK_FLAG, "wifi_full_lock", "Wl"),
new BitDescription(HistoryItem.STATE_WIFI_SCAN_FLAG, "wifi_scan", "Ws"),
new BitDescription(HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG, "wifi_multicast", "Wm"),
+ new BitDescription(HistoryItem.STATE_WIFI_RADIO_ACTIVE_FLAG, "wifi_radio", "Wr"),
new BitDescription(HistoryItem.STATE_MOBILE_RADIO_ACTIVE_FLAG, "mobile_radio", "Pr"),
new BitDescription(HistoryItem.STATE_PHONE_SCANNING_FLAG, "phone_scanning", "Psc"),
new BitDescription(HistoryItem.STATE_AUDIO_ON_FLAG, "audio", "a"),
new BitDescription(HistoryItem.STATE_SCREEN_ON_FLAG, "screen", "S"),
new BitDescription(HistoryItem.STATE_BATTERY_PLUGGED_FLAG, "plugged", "BP"),
- new BitDescription(HistoryItem.STATE_PHONE_IN_CALL_FLAG, "phone_in_call", "Pcl"),
- new BitDescription(HistoryItem.STATE_CHARGING_FLAG, "charging", "ch"),
- new BitDescription(HistoryItem.STATE_BLUETOOTH_ON_FLAG, "bluetooth", "b"),
new BitDescription(HistoryItem.STATE_DATA_CONNECTION_MASK,
HistoryItem.STATE_DATA_CONNECTION_SHIFT, "data_conn", "Pcn",
DATA_CONNECTION_NAMES, DATA_CONNECTION_NAMES),
@@ -1778,10 +1790,13 @@
= new BitDescription[] {
new BitDescription(HistoryItem.STATE2_POWER_SAVE_FLAG, "power_save", "ps"),
new BitDescription(HistoryItem.STATE2_VIDEO_ON_FLAG, "video", "v"),
- new BitDescription(HistoryItem.STATE2_WIFI_RUNNING_FLAG, "wifi_running", "Wr"),
+ new BitDescription(HistoryItem.STATE2_WIFI_RUNNING_FLAG, "wifi_running", "Ww"),
new BitDescription(HistoryItem.STATE2_WIFI_ON_FLAG, "wifi", "W"),
new BitDescription(HistoryItem.STATE2_FLASHLIGHT_FLAG, "flashlight", "fl"),
new BitDescription(HistoryItem.STATE2_DEVICE_IDLE_FLAG, "device_idle", "di"),
+ new BitDescription(HistoryItem.STATE2_CHARGING_FLAG, "charging", "ch"),
+ new BitDescription(HistoryItem.STATE2_PHONE_IN_CALL_FLAG, "phone_in_call", "Pcl"),
+ new BitDescription(HistoryItem.STATE2_BLUETOOTH_ON_FLAG, "bluetooth", "b"),
new BitDescription(HistoryItem.STATE2_WIFI_SIGNAL_STRENGTH_MASK,
HistoryItem.STATE2_WIFI_SIGNAL_STRENGTH_SHIFT, "wifi_signal_strength", "Wss",
new String[] { "0", "1", "2", "3", "4" },
@@ -1793,12 +1808,12 @@
public static final String[] HISTORY_EVENT_NAMES = new String[] {
"null", "proc", "fg", "top", "sync", "wake_lock_in", "job", "user", "userfg", "conn",
- "motion", "active", "pkginst", "pkgunin", "alarm"
+ "motion", "active", "pkginst", "pkgunin", "alarm", "stats"
};
public static final String[] HISTORY_EVENT_CHECKIN_NAMES = new String[] {
"Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur", "Euf", "Ecn",
- "Esm", "Eac", "Epi", "Epu", "Eal"
+ "Esm", "Eac", "Epi", "Epu", "Eal", "Est"
};
/**
@@ -1883,43 +1898,6 @@
public abstract int getWifiSignalStrengthCount(int strengthBin, int which);
/**
- * Returns the time in microseconds that bluetooth has been on while the device was
- * running on battery.
- *
- * {@hide}
- */
- public abstract long getBluetoothOnTime(long elapsedRealtimeUs, int which);
-
- public abstract int getBluetoothPingCount();
-
- public static final int BLUETOOTH_STATE_INACTIVE = 0;
- public static final int BLUETOOTH_STATE_LOW = 1;
- public static final int BLUETOOTH_STATE_MEDIUM = 2;
- public static final int BLUETOOTH_STATE_HIGH = 3;
-
- static final String[] BLUETOOTH_STATE_NAMES = {
- "inactive", "low", "med", "high"
- };
-
- public static final int NUM_BLUETOOTH_STATES = BLUETOOTH_STATE_HIGH +1;
-
- /**
- * Returns the time in microseconds that Bluetooth has been running in the
- * given active state.
- *
- * {@hide}
- */
- public abstract long getBluetoothStateTime(int bluetoothState,
- long elapsedRealtimeUs, int which);
-
- /**
- * Returns the number of times that Bluetooth has entered the given active state.
- *
- * {@hide}
- */
- public abstract int getBluetoothStateCount(int bluetoothState, int which);
-
- /**
* Returns the time in microseconds that the flashlight has been on while the device was
* running on battery.
*
@@ -2431,9 +2409,6 @@
final long deviceIdlingTime = getDeviceIdlingTime(rawRealtime, which);
final int connChanges = getNumConnectivityChange(which);
final long phoneOnTime = getPhoneOnTime(rawRealtime, which);
- final long wifiOnTime = getWifiOnTime(rawRealtime, which);
- final long wifiRunningTime = getGlobalWifiRunningTime(rawRealtime, which);
- final long bluetoothOnTime = getBluetoothOnTime(rawRealtime, which);
final StringBuilder sb = new StringBuilder(128);
@@ -2475,7 +2450,8 @@
}
}
}
-
+
+ // Dump network stats
final long mobileRxTotalBytes = getNetworkActivityBytes(NETWORK_MOBILE_RX_DATA, which);
final long mobileTxTotalBytes = getNetworkActivityBytes(NETWORK_MOBILE_TX_DATA, which);
final long wifiRxTotalBytes = getNetworkActivityBytes(NETWORK_WIFI_RX_DATA, which);
@@ -2484,19 +2460,34 @@
final long mobileTxTotalPackets = getNetworkActivityPackets(NETWORK_MOBILE_TX_DATA, which);
final long wifiRxTotalPackets = getNetworkActivityPackets(NETWORK_WIFI_RX_DATA, which);
final long wifiTxTotalPackets = getNetworkActivityPackets(NETWORK_WIFI_TX_DATA, which);
-
- // Dump network stats
dumpLine(pw, 0 /* uid */, category, GLOBAL_NETWORK_DATA,
mobileRxTotalBytes, mobileTxTotalBytes, wifiRxTotalBytes, wifiTxTotalBytes,
mobileRxTotalPackets, mobileTxTotalPackets, wifiRxTotalPackets, wifiTxTotalPackets);
+ // Dump Wifi controller stats
+ final long wifiOnTime = getWifiOnTime(rawRealtime, which);
+ final long wifiRunningTime = getGlobalWifiRunningTime(rawRealtime, which);
+ final long wifiIdleTimeMs = getWifiControllerActivity(CONTROLLER_IDLE_TIME, which);
+ final long wifiRxTimeMs = getWifiControllerActivity(CONTROLLER_RX_TIME, which);
+ final long wifiTxTimeMs = getWifiControllerActivity(CONTROLLER_TX_TIME, which);
+ final long wifiPowerMaMs = getWifiControllerActivity(CONTROLLER_POWER_DRAIN, which);
+ dumpLine(pw, 0 /* uid */, category, GLOBAL_WIFI_DATA,
+ wifiOnTime / 1000, wifiRunningTime / 1000,
+ wifiIdleTimeMs, wifiRxTimeMs, wifiTxTimeMs, wifiPowerMaMs / (1000*60*60));
+
+ // Dump Bluetooth controller stats
+ final long btIdleTimeMs = getBluetoothControllerActivity(CONTROLLER_IDLE_TIME, which);
+ final long btRxTimeMs = getBluetoothControllerActivity(CONTROLLER_RX_TIME, which);
+ final long btTxTimeMs = getBluetoothControllerActivity(CONTROLLER_TX_TIME, which);
+ final long btPowerMaMs = getBluetoothControllerActivity(CONTROLLER_POWER_DRAIN, which);
+ dumpLine(pw, 0 /* uid */, category, GLOBAL_BLUETOOTH_DATA,
+ btIdleTimeMs, btRxTimeMs, btTxTimeMs, btPowerMaMs / (1000*60*60));
+
// Dump misc stats
dumpLine(pw, 0 /* uid */, category, MISC_DATA,
- screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
- wifiRunningTime / 1000, bluetoothOnTime / 1000,
- mobileRxTotalBytes, mobileTxTotalBytes, wifiRxTotalBytes, wifiTxTotalBytes,
+ screenOnTime / 1000, phoneOnTime / 1000,
fullWakeLockTimeTotal / 1000, partialWakeLockTimeTotal / 1000,
- 0 /*legacy input event count*/, getMobileRadioActiveTime(rawRealtime, which) / 1000,
+ getMobileRadioActiveTime(rawRealtime, which) / 1000,
getMobileRadioActiveAdjustedTime(which) / 1000, interactiveTime / 1000,
powerSaveModeEnabledTime / 1000, connChanges, deviceIdleModeEnabledTime / 1000,
getDeviceIdleModeEnabledCount(which), deviceIdlingTime / 1000,
@@ -2566,17 +2557,6 @@
}
dumpLine(pw, 0 /* uid */, category, WIFI_SIGNAL_STRENGTH_COUNT_DATA, args);
- // Dump bluetooth state stats
- args = new Object[NUM_BLUETOOTH_STATES];
- for (int i=0; i<NUM_BLUETOOTH_STATES; i++) {
- args[i] = getBluetoothStateTime(i, rawRealtime, which) / 1000;
- }
- dumpLine(pw, 0 /* uid */, category, BLUETOOTH_STATE_TIME_DATA, args);
- for (int i=0; i<NUM_BLUETOOTH_STATES; i++) {
- args[i] = getBluetoothStateCount(i, which);
- }
- dumpLine(pw, 0 /* uid */, category, BLUETOOTH_STATE_COUNT_DATA, args);
-
if (which == STATS_SINCE_UNPLUGGED) {
dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(),
getDischargeCurrentLevel());
@@ -2681,6 +2661,7 @@
continue;
}
final Uid u = uidStats.valueAt(iu);
+
// Dump Network stats per uid, if any
final long mobileBytesRx = u.getNetworkActivityBytes(NETWORK_MOBILE_RX_DATA, which);
final long mobileBytesTx = u.getNetworkActivityBytes(NETWORK_MOBILE_TX_DATA, which);
@@ -2692,11 +2673,6 @@
final int mobileActiveCount = u.getMobileRadioActiveCount(which);
final long wifiPacketsRx = u.getNetworkActivityPackets(NETWORK_WIFI_RX_DATA, which);
final long wifiPacketsTx = u.getNetworkActivityPackets(NETWORK_WIFI_TX_DATA, which);
- final long fullWifiLockOnTime = u.getFullWifiLockTime(rawRealtime, which);
- final long wifiScanTime = u.getWifiScanTime(rawRealtime, which);
- final int wifiScanCount = u.getWifiScanCount(which);
- final long uidWifiRunningTime = u.getWifiRunningTime(rawRealtime, which);
-
if (mobileBytesRx > 0 || mobileBytesTx > 0 || wifiBytesRx > 0 || wifiBytesTx > 0
|| mobilePacketsRx > 0 || mobilePacketsTx > 0 || wifiPacketsRx > 0
|| wifiPacketsTx > 0 || mobileActiveTime > 0 || mobileActiveCount > 0) {
@@ -2707,10 +2683,19 @@
mobileActiveTime, mobileActiveCount);
}
+ final long fullWifiLockOnTime = u.getFullWifiLockTime(rawRealtime, which);
+ final long wifiScanTime = u.getWifiScanTime(rawRealtime, which);
+ final int wifiScanCount = u.getWifiScanCount(which);
+ final long uidWifiRunningTime = u.getWifiRunningTime(rawRealtime, which);
+ final long uidWifiIdleTimeMs = u.getWifiControllerActivity(CONTROLLER_IDLE_TIME, which);
+ final long uidWifiRxTimeMs = u.getWifiControllerActivity(CONTROLLER_RX_TIME, which);
+ final long uidWifiTxTimeMs = u.getWifiControllerActivity(CONTROLLER_TX_TIME, which);
if (fullWifiLockOnTime != 0 || wifiScanTime != 0 || wifiScanCount != 0
- || uidWifiRunningTime != 0) {
+ || uidWifiRunningTime != 0 || uidWifiIdleTimeMs != 0 || uidWifiRxTimeMs != 0
+ || uidWifiTxTimeMs != 0) {
dumpLine(pw, uid, category, WIFI_DATA,
- fullWifiLockOnTime, wifiScanTime, uidWifiRunningTime, wifiScanCount);
+ fullWifiLockOnTime, wifiScanTime, uidWifiRunningTime, wifiScanCount,
+ uidWifiIdleTimeMs, uidWifiRxTimeMs, uidWifiTxTimeMs);
}
if (u.hasUserActivity()) {
@@ -2968,7 +2953,6 @@
final long phoneOnTime = getPhoneOnTime(rawRealtime, which);
final long wifiRunningTime = getGlobalWifiRunningTime(rawRealtime, which);
final long wifiOnTime = getWifiOnTime(rawRealtime, which);
- final long bluetoothOnTime = getBluetoothOnTime(rawRealtime, which);
sb.setLength(0);
sb.append(prefix);
sb.append(" Screen on: "); formatTimeMs(sb, screenOnTime / 1000);
@@ -3317,42 +3301,11 @@
sb.setLength(0);
sb.append(prefix);
- sb.append(" WiFi Energy use: ").append(BatteryStatsHelper.makemAh(
+ sb.append(" WiFi Power drain: ").append(BatteryStatsHelper.makemAh(
getWifiControllerActivity(CONTROLLER_POWER_DRAIN, which) / (double)(1000*60*60)));
sb.append(" mAh");
pw.println(sb.toString());
- sb.setLength(0);
- sb.append(prefix);
- sb.append(" Bluetooth on: "); formatTimeMs(sb, bluetoothOnTime / 1000);
- sb.append("("); sb.append(formatRatioLocked(bluetoothOnTime, whichBatteryRealtime));
- sb.append(")");
- pw.println(sb.toString());
-
- sb.setLength(0);
- sb.append(prefix);
- sb.append(" Bluetooth states:");
- didOne = false;
- for (int i=0; i<NUM_BLUETOOTH_STATES; i++) {
- final long time = getBluetoothStateTime(i, rawRealtime, which);
- if (time == 0) {
- continue;
- }
- sb.append("\n ");
- didOne = true;
- sb.append(BLUETOOTH_STATE_NAMES[i]);
- sb.append(" ");
- formatTimeMs(sb, time/1000);
- sb.append("(");
- sb.append(formatRatioLocked(time, whichBatteryRealtime));
- sb.append(") ");
- sb.append(getPhoneDataConnectionCount(i, which));
- sb.append("x");
- }
-
- if (!didOne) sb.append(" (no activity)");
- pw.println(sb.toString());
-
final long bluetoothIdleTimeMs =
getBluetoothControllerActivity(CONTROLLER_IDLE_TIME, which);
final long bluetoothRxTimeMs = getBluetoothControllerActivity(CONTROLLER_RX_TIME, which);
@@ -3384,6 +3337,14 @@
sb.append(")");
pw.println(sb.toString());
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Bluetooth Power drain: ").append(BatteryStatsHelper.makemAh(
+ getBluetoothControllerActivity(CONTROLLER_POWER_DRAIN, which) /
+ (double)(1000*60*60)));
+ sb.append(" mAh");
+ pw.println(sb.toString());
+
pw.println();
if (which == STATS_SINCE_UNPLUGGED) {
@@ -4883,7 +4844,8 @@
prepareForDumpLocked();
dumpLine(pw, 0 /* uid */, "i" /* category */, VERSION_DATA,
- "13", getParcelVersion(), getStartPlatformVersion(), getEndPlatformVersion());
+ CHECKIN_VERSION, getParcelVersion(), getStartPlatformVersion(),
+ getEndPlatformVersion());
long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 75b1101..4aff7a1 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -1173,7 +1173,6 @@
* the name of the runtime statistic to look up.
* @return the value of the specified runtime statistic or {@code null} if the
* runtime statistic doesn't exist.
- * @hide
*/
public static String getRuntimeStat(String statName) {
return VMDebug.getRuntimeStat(statName);
@@ -1184,7 +1183,6 @@
* that {@link #getRuntimeStat(String)} supports.
*
* @return a map of the names/values of the supported runtime statistics.
- * @hide
*/
public static Map<String, String> getRuntimeStats() {
return VMDebug.getRuntimeStats();
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index b9e307f..44eb1ed 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -466,9 +466,9 @@
}
/**
- * Returns the user handle for the user that the calling process is running on.
+ * Returns the user handle for the user that this process is running under.
*
- * @return the user handle of the user making this call.
+ * @return the user handle of this process.
* @hide
*/
public int getUserHandle() {
@@ -505,6 +505,17 @@
}
/**
+ * Used to check if this process is running under the system user. The system user
+ * is the initial user that is implicitly created on first boot and hosts most of the
+ * system services.
+ *
+ * @return whether this process is running under the system user.
+ */
+ public boolean isSystemUser() {
+ return UserHandle.myUserId() == UserHandle.USER_OWNER;
+ }
+
+ /**
* Used to check if the user making this call is linked to another user. Linked users may have
* a reduced number of available apps, app restrictions and account restrictions.
* @return whether the user making this call is a linked user
diff --git a/core/java/android/os/storage/DiskInfo.java b/core/java/android/os/storage/DiskInfo.java
index dc96640..9f38de8 100644
--- a/core/java/android/os/storage/DiskInfo.java
+++ b/core/java/android/os/storage/DiskInfo.java
@@ -20,12 +20,14 @@
import android.content.res.Resources;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import android.util.DebugUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import java.io.CharArrayWriter;
+import java.util.Objects;
/**
* Information about a physical disk which may contain one or more
@@ -45,7 +47,6 @@
public final int flags;
public long size;
public String label;
- public String[] volumeIds;
public DiskInfo(String id, int flags) {
this.id = Preconditions.checkNotNull(id);
@@ -57,19 +58,36 @@
flags = parcel.readInt();
size = parcel.readLong();
label = parcel.readString();
- volumeIds = parcel.readStringArray();
}
public @NonNull String getId() {
return id;
}
+ private boolean isInteresting(String label) {
+ if (TextUtils.isEmpty(label)) {
+ return false;
+ }
+ if (label.toLowerCase().contains("generic")) {
+ return false;
+ }
+ return true;
+ }
+
public String getDescription() {
- // TODO: splice vendor label into these strings
+ final Resources res = Resources.getSystem();
if ((flags & FLAG_SD) != 0) {
- return Resources.getSystem().getString(com.android.internal.R.string.storage_sd_card);
+ if (isInteresting(label)) {
+ return res.getString(com.android.internal.R.string.storage_sd_card_label, label);
+ } else {
+ return res.getString(com.android.internal.R.string.storage_sd_card);
+ }
} else if ((flags & FLAG_USB) != 0) {
- return Resources.getSystem().getString(com.android.internal.R.string.storage_usb);
+ if (isInteresting(label)) {
+ return res.getString(com.android.internal.R.string.storage_usb_drive_label, label);
+ } else {
+ return res.getString(com.android.internal.R.string.storage_usb_drive);
+ }
} else {
return null;
}
@@ -95,13 +113,11 @@
}
public void dump(IndentingPrintWriter pw) {
- pw.println("DiskInfo:");
+ pw.println("DiskInfo{" + id + "}:");
pw.increaseIndent();
- pw.printPair("id", id);
pw.printPair("flags", DebugUtils.flagsToString(getClass(), "FLAG_", flags));
pw.printPair("size", size);
pw.printPair("label", label);
- pw.printPair("volumeIds", volumeIds);
pw.decreaseIndent();
pw.println();
}
@@ -118,6 +134,20 @@
}
}
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof DiskInfo) {
+ return Objects.equals(id, ((DiskInfo) o).id);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
public static final Creator<DiskInfo> CREATOR = new Creator<DiskInfo>() {
@Override
public DiskInfo createFromParcel(Parcel in) {
@@ -141,6 +171,5 @@
parcel.writeInt(this.flags);
parcel.writeLong(size);
parcel.writeString(label);
- parcel.writeStringArray(volumeIds);
}
}
diff --git a/core/java/android/os/storage/IMountServiceListener.java b/core/java/android/os/storage/IMountServiceListener.java
index fd914bc..8e878a4 100644
--- a/core/java/android/os/storage/IMountServiceListener.java
+++ b/core/java/android/os/storage/IMountServiceListener.java
@@ -98,6 +98,13 @@
reply.writeNoException();
return true;
}
+ case TRANSACTION_onDiskUnsupported: {
+ data.enforceInterface(DESCRIPTOR);
+ final DiskInfo disk = (DiskInfo) data.readParcelable(null);
+ onDiskUnsupported(disk);
+ reply.writeNoException();
+ return true;
+ }
}
return super.onTransact(code, data, reply, flags);
}
@@ -198,6 +205,22 @@
_data.recycle();
}
}
+
+ @Override
+ public void onDiskUnsupported(DiskInfo disk) throws RemoteException {
+ Parcel _data = Parcel.obtain();
+ Parcel _reply = Parcel.obtain();
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeParcelable(disk, 0);
+ mRemote.transact(Stub.TRANSACTION_onDiskUnsupported, _data, _reply,
+ android.os.IBinder.FLAG_ONEWAY);
+ _reply.readException();
+ } finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ }
}
static final int TRANSACTION_onUsbMassStorageConnectionChanged = (IBinder.FIRST_CALL_TRANSACTION + 0);
@@ -206,6 +229,7 @@
static final int TRANSACTION_onVolumeStateChanged = (IBinder.FIRST_CALL_TRANSACTION + 2);
static final int TRANSACTION_onVolumeMetadataChanged = (IBinder.FIRST_CALL_TRANSACTION + 3);
+ static final int TRANSACTION_onDiskUnsupported = (IBinder.FIRST_CALL_TRANSACTION + 4);
}
/**
@@ -230,4 +254,6 @@
throws RemoteException;
public void onVolumeMetadataChanged(VolumeInfo vol) throws RemoteException;
+
+ public void onDiskUnsupported(DiskInfo disk) throws RemoteException;
}
diff --git a/core/java/android/os/storage/StorageEventListener.java b/core/java/android/os/storage/StorageEventListener.java
index 28a187d..ad2fae0 100644
--- a/core/java/android/os/storage/StorageEventListener.java
+++ b/core/java/android/os/storage/StorageEventListener.java
@@ -43,4 +43,7 @@
public void onVolumeMetadataChanged(VolumeInfo vol) {
}
+
+ public void onDiskUnsupported(DiskInfo disk) {
+ }
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 0e977ff..efa3ef2 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -87,6 +87,7 @@
private static final int MSG_STORAGE_STATE_CHANGED = 1;
private static final int MSG_VOLUME_STATE_CHANGED = 2;
private static final int MSG_VOLUME_METADATA_CHANGED = 3;
+ private static final int MSG_DISK_UNSUPPORTED = 4;
final StorageEventListener mCallback;
final Handler mHandler;
@@ -113,6 +114,10 @@
mCallback.onVolumeMetadataChanged((VolumeInfo) args.arg1);
args.recycle();
return true;
+ case MSG_DISK_UNSUPPORTED:
+ mCallback.onDiskUnsupported((DiskInfo) args.arg1);
+ args.recycle();
+ return true;
}
args.recycle();
return false;
@@ -147,6 +152,13 @@
args.arg1 = vol;
mHandler.obtainMessage(MSG_VOLUME_METADATA_CHANGED, args).sendToTarget();
}
+
+ @Override
+ public void onDiskUnsupported(DiskInfo disk) {
+ final SomeArgs args = SomeArgs.obtain();
+ args.arg1 = disk;
+ mHandler.obtainMessage(MSG_DISK_UNSUPPORTED, args).sendToTarget();
+ }
}
/**
@@ -494,6 +506,16 @@
}
/** {@hide} */
+ public @Nullable VolumeInfo findPrivateForEmulated(VolumeInfo emulatedVol) {
+ return findVolumeById(emulatedVol.getId().replace("emulated", "private"));
+ }
+
+ /** {@hide} */
+ public @Nullable VolumeInfo findEmulatedForPrivate(VolumeInfo privateVol) {
+ return findVolumeById(privateVol.getId().replace("private", "emulated"));
+ }
+
+ /** {@hide} */
public @NonNull List<VolumeInfo> getVolumes() {
return getVolumes(0);
}
@@ -511,10 +533,9 @@
public @Nullable String getBestVolumeDescription(VolumeInfo vol) {
String descrip = vol.getDescription();
- if (vol.diskId != null) {
- final DiskInfo disk = findDiskById(vol.diskId);
- if (disk != null && TextUtils.isEmpty(descrip)) {
- descrip = disk.getDescription();
+ if (vol.disk != null) {
+ if (TextUtils.isEmpty(descrip)) {
+ descrip = vol.disk.getDescription();
}
}
diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java
index f06fc8c..f3498d5 100644
--- a/core/java/android/os/storage/VolumeInfo.java
+++ b/core/java/android/os/storage/VolumeInfo.java
@@ -38,6 +38,8 @@
import java.io.CharArrayWriter;
import java.io.File;
+import java.util.Comparator;
+import java.util.Objects;
/**
* Information about a storage volume that may be mounted. A volume may be a
@@ -47,7 +49,10 @@
* @hide
*/
public class VolumeInfo implements Parcelable {
- public static final String EXTRA_VOLUME_ID = "android.os.storage.extra.VOLUME_ID";
+ public static final String ACTION_VOLUME_STATE_CHANGED =
+ "android.os.storage.action.VOLUME_STATE_CHANGED";
+ public static final String EXTRA_VOLUME_ID =
+ "android.os.storage.extra.VOLUME_ID";
/** Stub volume representing internal private storage */
public static final String ID_PRIVATE_INTERNAL = "private";
@@ -61,15 +66,17 @@
public static final int TYPE_OBB = 4;
public static final int STATE_UNMOUNTED = 0;
- public static final int STATE_MOUNTING = 1;
+ public static final int STATE_CHECKING = 1;
public static final int STATE_MOUNTED = 2;
- public static final int STATE_FORMATTING = 3;
- public static final int STATE_UNMOUNTING = 4;
- public static final int STATE_UNMOUNTABLE = 5;
- public static final int STATE_REMOVED = 6;
+ public static final int STATE_MOUNTED_READ_ONLY = 3;
+ public static final int STATE_FORMATTING = 4;
+ public static final int STATE_EJECTING = 5;
+ public static final int STATE_UNMOUNTABLE = 6;
+ public static final int STATE_REMOVED = 7;
+ public static final int STATE_BAD_REMOVAL = 8;
- public static final int FLAG_PRIMARY = 1 << 0;
- public static final int FLAG_VISIBLE = 1 << 1;
+ public static final int MOUNT_FLAG_PRIMARY = 1 << 0;
+ public static final int MOUNT_FLAG_VISIBLE = 1 << 1;
public static final int USER_FLAG_INITED = 1 << 0;
public static final int USER_FLAG_SNOOZED = 1 << 1;
@@ -77,28 +84,49 @@
private static SparseArray<String> sStateToEnvironment = new SparseArray<>();
private static ArrayMap<String, String> sEnvironmentToBroadcast = new ArrayMap<>();
+ private static final Comparator<VolumeInfo>
+ sDescriptionComparator = new Comparator<VolumeInfo>() {
+ @Override
+ public int compare(VolumeInfo lhs, VolumeInfo rhs) {
+ if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(lhs.getId())) {
+ return -1;
+ } else if (lhs.getDescription() == null) {
+ return 1;
+ } else if (rhs.getDescription() == null) {
+ return -1;
+ } else {
+ return lhs.getDescription().compareTo(rhs.getDescription());
+ }
+ }
+ };
+
static {
sStateToEnvironment.put(VolumeInfo.STATE_UNMOUNTED, Environment.MEDIA_UNMOUNTED);
- sStateToEnvironment.put(VolumeInfo.STATE_MOUNTING, Environment.MEDIA_CHECKING);
+ sStateToEnvironment.put(VolumeInfo.STATE_CHECKING, Environment.MEDIA_CHECKING);
sStateToEnvironment.put(VolumeInfo.STATE_MOUNTED, Environment.MEDIA_MOUNTED);
+ sStateToEnvironment.put(VolumeInfo.STATE_MOUNTED_READ_ONLY, Environment.MEDIA_MOUNTED_READ_ONLY);
sStateToEnvironment.put(VolumeInfo.STATE_FORMATTING, Environment.MEDIA_UNMOUNTED);
- sStateToEnvironment.put(VolumeInfo.STATE_UNMOUNTING, Environment.MEDIA_EJECTING);
+ sStateToEnvironment.put(VolumeInfo.STATE_EJECTING, Environment.MEDIA_EJECTING);
sStateToEnvironment.put(VolumeInfo.STATE_UNMOUNTABLE, Environment.MEDIA_UNMOUNTABLE);
sStateToEnvironment.put(VolumeInfo.STATE_REMOVED, Environment.MEDIA_REMOVED);
+ sStateToEnvironment.put(VolumeInfo.STATE_BAD_REMOVAL, Environment.MEDIA_BAD_REMOVAL);
sEnvironmentToBroadcast.put(Environment.MEDIA_UNMOUNTED, Intent.ACTION_MEDIA_UNMOUNTED);
sEnvironmentToBroadcast.put(Environment.MEDIA_CHECKING, Intent.ACTION_MEDIA_CHECKING);
sEnvironmentToBroadcast.put(Environment.MEDIA_MOUNTED, Intent.ACTION_MEDIA_MOUNTED);
+ sEnvironmentToBroadcast.put(Environment.MEDIA_MOUNTED_READ_ONLY, Intent.ACTION_MEDIA_MOUNTED);
sEnvironmentToBroadcast.put(Environment.MEDIA_EJECTING, Intent.ACTION_MEDIA_EJECT);
sEnvironmentToBroadcast.put(Environment.MEDIA_UNMOUNTABLE, Intent.ACTION_MEDIA_UNMOUNTABLE);
sEnvironmentToBroadcast.put(Environment.MEDIA_REMOVED, Intent.ACTION_MEDIA_REMOVED);
+ sEnvironmentToBroadcast.put(Environment.MEDIA_BAD_REMOVAL, Intent.ACTION_MEDIA_BAD_REMOVAL);
}
/** vold state */
public final String id;
public final int type;
- public int flags = 0;
- public int userId = -1;
+ public final DiskInfo disk;
+ public int mountFlags = 0;
+ public int mountUserId = -1;
public int state = STATE_UNMOUNTED;
public String fsType;
public String fsUuid;
@@ -107,28 +135,32 @@
/** Framework state */
public final int mtpIndex;
- public String diskId;
public String nickname;
public int userFlags = 0;
- public VolumeInfo(String id, int type, int mtpIndex) {
+ public VolumeInfo(String id, int type, DiskInfo disk, int mtpIndex) {
this.id = Preconditions.checkNotNull(id);
this.type = type;
+ this.disk = disk;
this.mtpIndex = mtpIndex;
}
public VolumeInfo(Parcel parcel) {
id = parcel.readString();
type = parcel.readInt();
- flags = parcel.readInt();
- userId = parcel.readInt();
+ if (parcel.readInt() != 0) {
+ disk = DiskInfo.CREATOR.createFromParcel(parcel);
+ } else {
+ disk = null;
+ }
+ mountFlags = parcel.readInt();
+ mountUserId = parcel.readInt();
state = parcel.readInt();
fsType = parcel.readString();
fsUuid = parcel.readString();
fsLabel = parcel.readString();
path = parcel.readString();
mtpIndex = parcel.readInt();
- diskId = parcel.readString();
nickname = parcel.readString();
userFlags = parcel.readInt();
}
@@ -150,12 +182,20 @@
return getBroadcastForEnvironment(getEnvironmentForState(state));
}
+ public static @NonNull Comparator<VolumeInfo> getDescriptionComparator() {
+ return sDescriptionComparator;
+ }
+
public @NonNull String getId() {
return id;
}
+ public @Nullable DiskInfo getDisk() {
+ return disk;
+ }
+
public @Nullable String getDiskId() {
- return diskId;
+ return (disk != null) ? disk.id : null;
}
public int getType() {
@@ -174,6 +214,10 @@
return nickname;
}
+ public int getMountUserId() {
+ return mountUserId;
+ }
+
public @Nullable String getDescription() {
if (ID_PRIVATE_INTERNAL.equals(id)) {
return Resources.getSystem().getString(com.android.internal.R.string.storage_internal);
@@ -186,12 +230,20 @@
}
}
+ public boolean isMountedReadable() {
+ return state == STATE_MOUNTED || state == STATE_MOUNTED_READ_ONLY;
+ }
+
+ public boolean isMountedWritable() {
+ return state == STATE_MOUNTED;
+ }
+
public boolean isPrimary() {
- return (flags & FLAG_PRIMARY) != 0;
+ return (mountFlags & MOUNT_FLAG_PRIMARY) != 0;
}
public boolean isVisible() {
- return (flags & FLAG_VISIBLE) != 0;
+ return (mountFlags & MOUNT_FLAG_VISIBLE) != 0;
}
public boolean isInited() {
@@ -203,7 +255,7 @@
}
public boolean isVisibleToUser(int userId) {
- if (type == TYPE_PUBLIC && userId == this.userId) {
+ if (type == TYPE_PUBLIC && userId == this.mountUserId) {
return isVisible();
} else if (type == TYPE_EMULATED) {
return isVisible();
@@ -219,7 +271,7 @@
public File getPathForUser(int userId) {
if (path == null) {
return null;
- } else if (type == TYPE_PUBLIC && userId == this.userId) {
+ } else if (type == TYPE_PUBLIC && userId == this.mountUserId) {
return new File(path);
} else if (type == TYPE_EMULATED) {
return new File(path, Integer.toString(userId));
@@ -228,6 +280,19 @@
}
}
+ /**
+ * Path which is accessible to apps holding
+ * {@link android.Manifest.permission#WRITE_MEDIA_STORAGE}.
+ */
+ public File getInternalPathForUser(int userId) {
+ if (type == TYPE_PUBLIC) {
+ // TODO: plumb through cleaner path from vold
+ return new File(path.replace("/storage/", "/mnt/media_rw/"));
+ } else {
+ return getPathForUser(userId);
+ }
+ }
+
public StorageVolume buildStorageVolume(Context context, int userId) {
final boolean removable;
final boolean emulated;
@@ -311,12 +376,12 @@
}
public void dump(IndentingPrintWriter pw) {
- pw.println("VolumeInfo:");
+ pw.println("VolumeInfo{" + id + "}:");
pw.increaseIndent();
- pw.printPair("id", id);
pw.printPair("type", DebugUtils.valueToString(getClass(), "TYPE_", type));
- pw.printPair("flags", DebugUtils.flagsToString(getClass(), "FLAG_", flags));
- pw.printPair("userId", userId);
+ pw.printPair("diskId", getDiskId());
+ pw.printPair("mountFlags", DebugUtils.flagsToString(getClass(), "MOUNT_FLAG_", mountFlags));
+ pw.printPair("mountUserId", mountUserId);
pw.printPair("state", DebugUtils.valueToString(getClass(), "STATE_", state));
pw.println();
pw.printPair("fsType", fsType);
@@ -325,7 +390,6 @@
pw.println();
pw.printPair("path", path);
pw.printPair("mtpIndex", mtpIndex);
- pw.printPair("diskId", diskId);
pw.printPair("nickname", nickname);
pw.printPair("userFlags", DebugUtils.flagsToString(getClass(), "USER_FLAG_", userFlags));
pw.decreaseIndent();
@@ -344,6 +408,20 @@
}
}
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof VolumeInfo) {
+ return Objects.equals(id, ((VolumeInfo) o).id);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
public static final Creator<VolumeInfo> CREATOR = new Creator<VolumeInfo>() {
@Override
public VolumeInfo createFromParcel(Parcel in) {
@@ -365,15 +443,20 @@
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(id);
parcel.writeInt(type);
- parcel.writeInt(this.flags);
- parcel.writeInt(userId);
+ if (disk != null) {
+ parcel.writeInt(1);
+ disk.writeToParcel(parcel, flags);
+ } else {
+ parcel.writeInt(0);
+ }
+ parcel.writeInt(mountFlags);
+ parcel.writeInt(mountUserId);
parcel.writeInt(state);
parcel.writeString(fsType);
parcel.writeString(fsUuid);
parcel.writeString(fsLabel);
parcel.writeString(path);
parcel.writeInt(mtpIndex);
- parcel.writeString(diskId);
parcel.writeString(nickname);
parcel.writeInt(userFlags);
}
diff --git a/core/java/android/preference/SeekBarVolumizer.java b/core/java/android/preference/SeekBarVolumizer.java
index 30da0e7..4bd085f 100644
--- a/core/java/android/preference/SeekBarVolumizer.java
+++ b/core/java/android/preference/SeekBarVolumizer.java
@@ -121,13 +121,10 @@
protected void updateSeekBar() {
if (mNotificationOrRing && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
- mSeekBar.setEnabled(true);
mSeekBar.setProgress(0);
} else if (mMuted) {
- mSeekBar.setEnabled(false);
mSeekBar.setProgress(0);
} else {
- mSeekBar.setEnabled(true);
mSeekBar.setProgress(mLastProgress > -1 ? mLastProgress : mOriginalStreamVolume);
}
}
@@ -136,6 +133,11 @@
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_SET_STREAM_VOLUME:
+ if (mMuted && mLastProgress > 0) {
+ mAudioManager.adjustStreamVolume(mStreamType, AudioManager.ADJUST_UNMUTE, 0);
+ } else if (!mMuted && mLastProgress == 0) {
+ mAudioManager.adjustStreamVolume(mStreamType, AudioManager.ADJUST_MUTE, 0);
+ }
mAudioManager.setStreamVolume(mStreamType, mLastProgress,
AudioManager.FLAG_SHOW_UI_WARNINGS);
break;
@@ -375,7 +377,8 @@
final boolean streamMatch = mNotificationOrRing ? isNotificationOrRing(streamType)
: (streamType == mStreamType);
if (mSeekBar != null && streamMatch && streamValue != -1) {
- final boolean muted = mAudioManager.isStreamMute(mStreamType);
+ final boolean muted = mAudioManager.isStreamMute(mStreamType)
+ || streamValue == 0;
mUiHandler.postUpdateSlider(streamValue, muted);
}
} else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index f640f0d..a622a21 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -6033,6 +6033,13 @@
public static final String DISPLAY_SIZE_FORCED = "display_size_forced";
/**
+ * The saved value for WindowManagerService.setForcedDisplayScalingMode().
+ * 0 or unset if scaling is automatic, 1 if scaling is disabled.
+ * @hide
+ */
+ public static final String DISPLAY_SCALING_FORCE = "display_scaling_force";
+
+ /**
* The maximum size, in bytes, of a download that the download manager will transfer over
* a non-wifi connection.
* @hide
@@ -6960,6 +6967,9 @@
/** {@hide} */
public static final String
BLUETOOTH_MAP_PRIORITY_PREFIX = "bluetooth_map_priority_";
+ /** {@hide} */
+ public static final String
+ BLUETOOTH_SAP_PRIORITY_PREFIX = "bluetooth_sap_priority_";
/**
* Get the key that retrieves a bluetooth headset's priority.
@@ -6992,6 +7002,15 @@
public static final String getBluetoothMapPriorityKey(String address) {
return BLUETOOTH_MAP_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
}
+
+ /**
+ * Get the key that retrieves a bluetooth map priority.
+ * @hide
+ */
+ public static final String getBluetoothSapPriorityKey(String address) {
+ return BLUETOOTH_SAP_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
+ }
+
/**
* Scaling factor for normal window animations. Setting to 0 will
* disable window animations.
@@ -7720,6 +7739,13 @@
* @hide
*/
public static final String NEW_CONTACT_AGGREGATOR = "new_contact_aggregator";
+
+ /**
+ * Whether to enable contacts metadata syncing or not
+ * The value 1 - enable, 0 - disable
+ * @hide
+ */
+ public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync";
}
/**
diff --git a/core/java/android/security/NetworkSecurityPolicy.java b/core/java/android/security/NetworkSecurityPolicy.java
index 0b3bf453..70cd388 100644
--- a/core/java/android/security/NetworkSecurityPolicy.java
+++ b/core/java/android/security/NetworkSecurityPolicy.java
@@ -46,9 +46,9 @@
* without TLS or STARTTLS) is permitted for this process.
*
* <p>When cleartext network traffic is not permitted, the platform's components (e.g. HTTP and
- * FTP stacks, {@link android.webkit.WebView}, {@link android.media.MediaPlayer}) will refuse
- * this process's requests to use cleartext traffic. Third-party libraries are strongly
- * encouraged to honor this setting as well.
+ * FTP stacks, {@link android.webkit.WebView}, {@link android.app.DownloadManager},
+ * {@link android.media.MediaPlayer}) will refuse this process's requests to use cleartext
+ * traffic. Third-party libraries are strongly encouraged to honor this setting as well.
*
* <p>This flag is honored on a best effort basis because it's impossible to prevent all
* cleartext traffic from Android applications given the level of access provided to them. For
diff --git a/core/java/android/security/keymaster/KeymasterArgument.java b/core/java/android/security/keymaster/KeymasterArgument.java
index 9a1c894..9adde35 100644
--- a/core/java/android/security/keymaster/KeymasterArgument.java
+++ b/core/java/android/security/keymaster/KeymasterArgument.java
@@ -42,6 +42,7 @@
case KeymasterDefs.KM_INT_REP:
return new KeymasterIntArgument(tag, in);
case KeymasterDefs.KM_LONG:
+ case KeymasterDefs.KM_LONG_REP:
return new KeymasterLongArgument(tag, in);
case KeymasterDefs.KM_DATE:
return new KeymasterDateArgument(tag, in);
diff --git a/core/java/android/security/keymaster/KeymasterArguments.java b/core/java/android/security/keymaster/KeymasterArguments.java
index 8ed288c..82f65c7 100644
--- a/core/java/android/security/keymaster/KeymasterArguments.java
+++ b/core/java/android/security/keymaster/KeymasterArguments.java
@@ -63,6 +63,12 @@
}
}
+ public void addLongs(int tag, long... values) {
+ for (long value : values) {
+ addLong(tag, value);
+ }
+ }
+
public void addBoolean(int tag) {
mArguments.add(new KeymasterBooleanArgument(tag));
}
@@ -111,8 +117,13 @@
}
public long getLong(int tag, long defaultValue) {
- if (KeymasterDefs.getTagType(tag) != KeymasterDefs.KM_LONG) {
- throw new IllegalArgumentException("Tag is not a long type: " + tag);
+ switch (KeymasterDefs.getTagType(tag)) {
+ case KeymasterDefs.KM_LONG:
+ break; // Accepted type
+ case KeymasterDefs.KM_LONG_REP:
+ throw new IllegalArgumentException("Repeatable tags must use getLongs: " + tag);
+ default:
+ throw new IllegalArgumentException("Tag is not a long type: " + tag);
}
KeymasterArgument arg = getArgumentByTag(tag);
if (arg == null) {
@@ -175,6 +186,19 @@
return values;
}
+ public List<Long> getLongs(int tag) {
+ if (KeymasterDefs.getTagType(tag) != KeymasterDefs.KM_LONG_REP) {
+ throw new IllegalArgumentException("Tag is not a repeating long: " + tag);
+ }
+ List<Long> values = new ArrayList<Long>();
+ for (KeymasterArgument arg : mArguments) {
+ if (arg.tag == tag) {
+ values.add(((KeymasterLongArgument) arg).value);
+ }
+ }
+ return values;
+ }
+
public int size() {
return mArguments.size();
}
diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java
index ea53c0d..40baf9c 100644
--- a/core/java/android/security/keymaster/KeymasterDefs.java
+++ b/core/java/android/security/keymaster/KeymasterDefs.java
@@ -118,9 +118,9 @@
public static final int KM_DIGEST_SHA_2_512 = 6;
// Key origins.
- public static final int KM_ORIGIN_HARDWARE = 0;
- public static final int KM_ORIGIN_SOFTWARE = 1;
+ public static final int KM_ORIGIN_GENERATED = 0;
public static final int KM_ORIGIN_IMPORTED = 2;
+ public static final int KM_ORIGIN_UNKNOWN = 3;
// Key usability requirements.
public static final int KM_BLOB_STANDALONE = 0;
@@ -192,6 +192,8 @@
public static final int KM_ERROR_SECURE_HW_BUSY = -48;
public static final int KM_ERROR_SECURE_HW_COMMUNICATION_FAILED = -49;
public static final int KM_ERROR_UNSUPPORTED_EC_FIELD = -50;
+ public static final int KM_ERROR_MISSING_NONCE = -51;
+ public static final int KM_ERROR_INVALID_NONCE = -52;
public static final int KM_ERROR_UNIMPLEMENTED = -100;
public static final int KM_ERROR_VERSION_MISMATCH = -101;
public static final int KM_ERROR_UNKNOWN_ERROR = -1000;
@@ -231,6 +233,8 @@
sErrorCodeToString.put(KM_ERROR_INVALID_TAG, "Invalid tag");
sErrorCodeToString.put(KM_ERROR_MEMORY_ALLOCATION_FAILED, "Memory allocation failed");
sErrorCodeToString.put(KM_ERROR_UNSUPPORTED_EC_FIELD, "Unsupported EC field");
+ sErrorCodeToString.put(KM_ERROR_MISSING_NONCE, "Required IV missing");
+ sErrorCodeToString.put(KM_ERROR_INVALID_NONCE, "Invalid IV");
sErrorCodeToString.put(KM_ERROR_UNIMPLEMENTED, "Not implemented");
sErrorCodeToString.put(KM_ERROR_UNKNOWN_ERROR, "Unknown error");
}
diff --git a/core/java/android/security/keymaster/KeymasterLongArgument.java b/core/java/android/security/keymaster/KeymasterLongArgument.java
index 9d2be09..eb17b7e 100644
--- a/core/java/android/security/keymaster/KeymasterLongArgument.java
+++ b/core/java/android/security/keymaster/KeymasterLongArgument.java
@@ -28,6 +28,7 @@
super(tag);
switch (KeymasterDefs.getTagType(tag)) {
case KeymasterDefs.KM_LONG:
+ case KeymasterDefs.KM_LONG_REP:
break; // OK.
default:
throw new IllegalArgumentException("Bad long tag " + tag);
diff --git a/core/java/android/service/carrier/CarrierConfigService.java b/core/java/android/service/carrier/CarrierConfigService.java
new file mode 100644
index 0000000..1880d16
--- /dev/null
+++ b/core/java/android/service/carrier/CarrierConfigService.java
@@ -0,0 +1,104 @@
+/*
+ * 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 android.service.carrier;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+
+/**
+ * A service that sets carrier configuration for telephony services.
+ * <p>
+ * To extend this class, you must declare the service in your manifest file to require the
+ * {@link android.Manifest.permission#BIND_CARRIER_CONFIG_SERVICE} permission and include an intent
+ * filter with the {@link #SERVICE_INTERFACE} action. For example:
+ * </p>
+ *
+ * <pre>{@code
+ * <service android:name=".MyCarrierConfigService"
+ * android:label="@string/service_name"
+ * android:permission="android.permission.BIND_CARRIER_CONFIG_SERVICE">
+ * <intent-filter>
+ * <action android:name="android.service.carrier.CarrierConfigService" />
+ * </intent-filter>
+ * </service>
+ * }</pre>
+ */
+public abstract class CarrierConfigService extends Service {
+
+ public static final String SERVICE_INTERFACE = "android.service.carrier.CarrierConfigService";
+
+ private final ICarrierConfigService.Stub mStubWrapper;
+
+ public CarrierConfigService() {
+ mStubWrapper = new ICarrierConfigServiceWrapper();
+ }
+
+ /**
+ * Override this method to set carrier configuration.
+ * <p>
+ * This method will be called by telephony services to get carrier-specific configuration
+ * values. The returned config will be saved by the system until,
+ * <ol>
+ * <li>The carrier app package is updated, or</li>
+ * <li>The carrier app requests a reload with
+ * {@link android.telephony.CarrierConfigManager#reloadCarrierConfigForSubId
+ * reloadCarrierConfigForSubId}.</li>
+ * </ol>
+ * This method can be called after a SIM card loads, which may be before or after boot.
+ * </p>
+ * <p>
+ * This method should not block for a long time. If expensive operations (e.g. network access)
+ * are required, this method can schedule the work and return null. Then, use
+ * {@link android.telephony.CarrierConfigManager#reloadCarrierConfigForSubId
+ * reloadCarrierConfigForSubId} to trigger a reload when the config is ready.
+ * </p>
+ * <p>
+ * Implementations should use the keys defined in {@link android.telephony.CarrierConfigManager
+ * CarrierConfigManager}. Any configuration values not set in the returned {@link Bundle} may be
+ * overridden by the system's default configuration service.
+ * </p>
+ *
+ * @param id contains details about the current carrier that can be used do decide what
+ * configuration values to return.
+ * @return a {@link Bundle} object containing the configuration or null if default values should
+ * be used.
+ */
+ public abstract Bundle onLoadConfig(CarrierIdentifier id);
+
+ /** @hide */
+ @Override
+ public final IBinder onBind(Intent intent) {
+ if (!SERVICE_INTERFACE.equals(intent.getAction())) {
+ return null;
+ }
+ return mStubWrapper;
+ }
+
+ /**
+ * A wrapper around ICarrierConfigService that forwards calls to implementations of
+ * {@link CarrierConfigService}.
+ *
+ * @hide
+ */
+ private class ICarrierConfigServiceWrapper extends ICarrierConfigService.Stub {
+
+ @Override
+ public Bundle getCarrierConfig(CarrierIdentifier id) {
+ return CarrierConfigService.this.onLoadConfig(id);
+ }
+ }
+}
diff --git a/packages/SystemUI/res/drawable/ic_audio_phone.xml b/core/java/android/service/carrier/CarrierIdentifier.aidl
similarity index 65%
rename from packages/SystemUI/res/drawable/ic_audio_phone.xml
rename to core/java/android/service/carrier/CarrierIdentifier.aidl
index 64147f2b..48b1398 100644
--- a/packages/SystemUI/res/drawable/ic_audio_phone.xml
+++ b/core/java/android/service/carrier/CarrierIdentifier.aidl
@@ -1,7 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2014, The Android Open Source Project
+/**
+ * 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.
@@ -15,9 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
--->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@*android:drawable/ic_audio_phone_am_alpha"
- android:autoMirrored="true"
- android:tint="#ffffffff" />
\ No newline at end of file
+package android.service.carrier;
+
+parcelable CarrierIdentifier;
diff --git a/core/java/android/service/carrier/CarrierIdentifier.java b/core/java/android/service/carrier/CarrierIdentifier.java
new file mode 100644
index 0000000..495fea6
--- /dev/null
+++ b/core/java/android/service/carrier/CarrierIdentifier.java
@@ -0,0 +1,117 @@
+/**
+ * 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 android.service.carrier;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Used to pass info to CarrierConfigService implementations so they can decide what values to
+ * return.
+ */
+public class CarrierIdentifier implements Parcelable {
+
+ /** Used to create a {@link CarrierIdentifier} from a {@link Parcel}. */
+ public static final Creator<CarrierIdentifier> CREATOR = new Creator<CarrierIdentifier>() {
+ @Override
+ public CarrierIdentifier createFromParcel(Parcel parcel) {
+ return new CarrierIdentifier(parcel);
+ }
+
+ @Override
+ public CarrierIdentifier[] newArray(int i) {
+ return new CarrierIdentifier[i];
+ }
+ };
+
+ private String mMcc;
+ private String mMnc;
+ private String mSpn;
+ private String mImsi;
+ private String mGid1;
+ private String mGid2;
+
+ public CarrierIdentifier(String mcc, String mnc, String spn, String imsi, String gid1,
+ String gid2) {
+ mMcc = mcc;
+ mMnc = mnc;
+ mSpn = spn;
+ mImsi = imsi;
+ mGid1 = gid1;
+ mGid2 = gid2;
+ }
+
+ /** @hide */
+ public CarrierIdentifier(Parcel parcel) {
+ readFromParcel(parcel);
+ }
+
+ /** Get the mobile country code. */
+ public String getMcc() {
+ return mMcc;
+ }
+
+ /** Get the mobile network code. */
+ public String getMnc() {
+ return mMnc;
+ }
+
+ /** Get the service provider name. */
+ public String getSpn() {
+ return mSpn;
+ }
+
+ /** Get the international mobile subscriber identity. */
+ public String getImsi() {
+ return mImsi;
+ }
+
+ /** Get the group identifier level 1. */
+ public String getGid1() {
+ return mGid1;
+ }
+
+ /** Get the group identifier level 2. */
+ public String getGid2() {
+ return mGid2;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(mMcc);
+ out.writeString(mMnc);
+ out.writeString(mSpn);
+ out.writeString(mImsi);
+ out.writeString(mGid1);
+ out.writeString(mGid2);
+ }
+
+ /** @hide */
+ public void readFromParcel(Parcel in) {
+ mMcc = in.readString();
+ mMnc = in.readString();
+ mSpn = in.readString();
+ mImsi = in.readString();
+ mGid1 = in.readString();
+ mGid2 = in.readString();
+ }
+}
diff --git a/core/java/android/service/carrier/ICarrierConfigService.aidl b/core/java/android/service/carrier/ICarrierConfigService.aidl
new file mode 100644
index 0000000..d8390b6
--- /dev/null
+++ b/core/java/android/service/carrier/ICarrierConfigService.aidl
@@ -0,0 +1,32 @@
+/**
+ * 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 android.service.carrier;
+
+import android.os.Bundle;
+import android.service.carrier.CarrierIdentifier;
+
+/**
+ * Service used to get carrier config from carrier apps.
+ *
+ * @see android.service.carrier.CarrierConfigService
+ * @hide
+ */
+interface ICarrierConfigService {
+
+ /** @see android.service.carrier.CarrierConfigService#onLoadConfig */
+ Bundle getCarrierConfig(in CarrierIdentifier id);
+}
\ No newline at end of file
diff --git a/core/java/android/service/gatekeeper/IGateKeeperService.aidl b/core/java/android/service/gatekeeper/IGateKeeperService.aidl
index 2f3e296..4f46701 100644
--- a/core/java/android/service/gatekeeper/IGateKeeperService.aidl
+++ b/core/java/android/service/gatekeeper/IGateKeeperService.aidl
@@ -53,13 +53,27 @@
* Verifies an enrolled handle against a provided, plaintext blob.
* @param uid The Android user ID associated to this enrollment
* @param challenge a challenge to authenticate agaisnt the device credential. If successful
- * authentication occurs, this value will be written to the returned
+ * authentication occurs, this value will be written to the returned
* authentication attestation.
* @param enrolledPasswordHandle The handle against which the provided password will be
* verified.
* @param The plaintext blob to verify against enrolledPassword.
* @return an opaque attestation of authentication on success, or null.
*/
- byte[] verifyChallenge(int uid, long challenge, in byte[] enrolledPasswordHandle,
+ byte[] verifyChallenge(int uid, long challenge, in byte[] enrolledPasswordHandle,
in byte[] providedPassword);
+
+ /**
+ * Retrieves the secure identifier for the user with the provided Android ID,
+ * or 0 if none is found.
+ * @param uid the Android user id
+ */
+ long getSecureUserId(int uid);
+
+ /**
+ * Clears secure user id associated with the provided Android ID.
+ * Must be called when password is set to NONE.
+ * @param uid the Android user id.
+ */
+ void clearSecureUserId(int uid);
}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index fa782e4..cc7f880 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -21,6 +21,7 @@
import android.app.INotificationManager;
import android.app.Notification;
import android.app.Notification.Builder;
+import android.app.NotificationManager.Policy;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
@@ -501,6 +502,22 @@
}
/**
+ * Gets the notification policy token associated with this listener.
+ *
+ * <p>
+ * Returns null if this listener is not currently active.
+ */
+ public final Policy.Token getNotificationPolicyToken() {
+ if (!isBound()) return null;
+ try {
+ return getNotificationInterface().getPolicyTokenFromListener(mWrapper);
+ } catch (android.os.RemoteException ex) {
+ Log.v(TAG, "Unable to contact notification manager", ex);
+ return null;
+ }
+ }
+
+ /**
* Sets the desired {@link #getCurrentListenerHints() listener hints}.
*
* <p>
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 1ed4779..14e947c 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -16,6 +16,7 @@
package android.service.notification;
+import android.app.NotificationManager.Policy;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
@@ -470,6 +471,59 @@
}
};
+ public Policy toNotificationPolicy() {
+ int priorityCategories = 0;
+ int prioritySenders = Policy.PRIORITY_SENDERS_ANY;
+ if (allowCalls) {
+ priorityCategories |= Policy.PRIORITY_CATEGORY_CALLS;
+ }
+ if (allowMessages) {
+ priorityCategories |= Policy.PRIORITY_CATEGORY_MESSAGES;
+ }
+ if (allowEvents) {
+ priorityCategories |= Policy.PRIORITY_CATEGORY_EVENTS;
+ }
+ if (allowReminders) {
+ priorityCategories |= Policy.PRIORITY_CATEGORY_REMINDERS;
+ }
+ if (allowRepeatCallers) {
+ priorityCategories |= Policy.PRIORITY_CATEGORY_REPEAT_CALLERS;
+ }
+ switch (allowFrom) {
+ case SOURCE_ANYONE:
+ prioritySenders = Policy.PRIORITY_SENDERS_ANY;
+ break;
+ case SOURCE_CONTACT:
+ prioritySenders = Policy.PRIORITY_SENDERS_CONTACTS;
+ break;
+ case SOURCE_STAR:
+ prioritySenders = Policy.PRIORITY_SENDERS_STARRED;
+ break;
+ }
+ return new Policy(priorityCategories, prioritySenders);
+ }
+
+ public void applyNotificationPolicy(Policy policy) {
+ if (policy == null) return;
+ allowCalls = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_CALLS) != 0;
+ allowMessages = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_MESSAGES) != 0;
+ allowEvents = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_EVENTS) != 0;
+ allowReminders = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_REMINDERS) != 0;
+ allowRepeatCallers = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_REPEAT_CALLERS)
+ != 0;
+ switch (policy.prioritySenders) {
+ case Policy.PRIORITY_SENDERS_CONTACTS:
+ allowFrom = SOURCE_CONTACT;
+ break;
+ case Policy.PRIORITY_SENDERS_STARRED:
+ allowFrom = SOURCE_STAR;
+ break;
+ default:
+ allowFrom = SOURCE_ANYONE;
+ break;
+ }
+ }
+
public static Condition toTimeCondition(Context context, int minutesFromNow, int userHandle) {
final long now = System.currentTimeMillis();
final long millis = minutesFromNow == 0 ? ZERO_VALUE_MS : minutesFromNow * MINUTES_MS;
@@ -881,4 +935,5 @@
public interface Migration {
ZenModeConfig migrate(XmlV1 v1);
}
+
}
diff --git a/core/java/android/service/trust/ITrustAgentServiceCallback.aidl b/core/java/android/service/trust/ITrustAgentServiceCallback.aidl
index 76b2be0..ec66cc8 100644
--- a/core/java/android/service/trust/ITrustAgentServiceCallback.aidl
+++ b/core/java/android/service/trust/ITrustAgentServiceCallback.aidl
@@ -24,7 +24,7 @@
* @hide
*/
oneway interface ITrustAgentServiceCallback {
- void grantTrust(CharSequence message, long durationMs, boolean initiatedByUser);
+ void grantTrust(CharSequence message, long durationMs, int flags);
void revokeTrust();
void setManagingTrust(boolean managingTrust);
void onConfigureCompleted(boolean result, IBinder token);
diff --git a/core/java/android/service/trust/TrustAgentService.java b/core/java/android/service/trust/TrustAgentService.java
index a3178e2..9d7ffad 100644
--- a/core/java/android/service/trust/TrustAgentService.java
+++ b/core/java/android/service/trust/TrustAgentService.java
@@ -17,6 +17,7 @@
package android.service.trust;
import android.Manifest;
+import android.annotation.IntDef;
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.app.Service;
@@ -32,6 +33,8 @@
import android.util.Log;
import android.util.Slog;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
@@ -69,6 +72,7 @@
*/
@SystemApi
public class TrustAgentService extends Service {
+
private final String TAG = TrustAgentService.class.getSimpleName() +
"[" + getClass().getSimpleName() + "]";
private static final boolean DEBUG = false;
@@ -86,6 +90,34 @@
*/
public static final String TRUST_AGENT_META_DATA = "android.service.trust.trustagent";
+
+ /**
+ * Flag for {@link #grantTrust(CharSequence, long, int)} indicating that trust is being granted
+ * as the direct result of user action - such as solving a security challenge. The hint is used
+ * by the system to optimize the experience. Behavior may vary by device and release, so
+ * one should only set this parameter if it meets the above criteria rather than relying on
+ * the behavior of any particular device or release.
+ */
+ public static final int FLAG_GRANT_TRUST_INITIATED_BY_USER = 1 << 0;
+
+ /**
+ * Flag for {@link #grantTrust(CharSequence, long, int)} indicating that the agent would like
+ * to dismiss the keyguard. When using this flag, the {@code TrustAgentService} must ensure
+ * it is only set in response to a direct user action with the expectation of dismissing the
+ * keyguard.
+ */
+ public static final int FLAG_GRANT_TRUST_DISMISS_KEYGUARD = 1 << 1;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true,
+ value = {
+ FLAG_GRANT_TRUST_INITIATED_BY_USER,
+ FLAG_GRANT_TRUST_DISMISS_KEYGUARD,
+ })
+ public @interface GrantTrustFlags {}
+
+
private static final int MSG_UNLOCK_ATTEMPT = 1;
private static final int MSG_CONFIGURE = 2;
private static final int MSG_TRUST_TIMEOUT = 3;
@@ -228,11 +260,35 @@
* direct result of user action - such as solving a security challenge. The hint is used
* by the system to optimize the experience. Behavior may vary by device and release, so
* one should only set this parameter if it meets the above criteria rather than relying on
- * the behavior of any particular device or release.
+ * the behavior of any particular device or release. Corresponds to
+ * {@link #FLAG_GRANT_TRUST_INITIATED_BY_USER}.
+ * @throws IllegalStateException if the agent is not currently managing trust.
+ *
+ * @deprecated use {@link #grantTrust(CharSequence, long, int)} instead.
+ */
+ @Deprecated
+ public final void grantTrust(
+ final CharSequence message, final long durationMs, final boolean initiatedByUser) {
+ grantTrust(message, durationMs, initiatedByUser ? FLAG_GRANT_TRUST_INITIATED_BY_USER : 0);
+ }
+
+ /**
+ * Call to grant trust on the device.
+ *
+ * @param message describes why the device is trusted, e.g. "Trusted by location".
+ * @param durationMs amount of time in milliseconds to keep the device in a trusted state.
+ * Trust for this agent will automatically be revoked when the timeout expires unless
+ * extended by a subsequent call to this function. The timeout is measured from the
+ * invocation of this function as dictated by {@link SystemClock#elapsedRealtime())}.
+ * For security reasons, the value should be no larger than necessary.
+ * The value may be adjusted by the system as necessary to comply with a policy controlled
+ * by the system or {@link DevicePolicyManager} restrictions. See {@link #onTrustTimeout()}
+ * for determining when trust expires.
+ * @param flags TBDocumented
* @throws IllegalStateException if the agent is not currently managing trust.
*/
public final void grantTrust(
- final CharSequence message, final long durationMs, final boolean initiatedByUser) {
+ final CharSequence message, final long durationMs, @GrantTrustFlags final int flags) {
synchronized (mLock) {
if (!mManagingTrust) {
throw new IllegalStateException("Cannot grant trust if agent is not managing trust."
@@ -240,7 +296,7 @@
}
if (mCallback != null) {
try {
- mCallback.grantTrust(message.toString(), durationMs, initiatedByUser);
+ mCallback.grantTrust(message.toString(), durationMs, flags);
} catch (RemoteException e) {
onError("calling enableTrust()");
}
@@ -250,7 +306,7 @@
mPendingGrantTrustTask = new Runnable() {
@Override
public void run() {
- grantTrust(message, durationMs, initiatedByUser);
+ grantTrust(message, durationMs, flags);
}
};
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 1674950..016541f 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -17,6 +17,7 @@
package android.service.wallpaper;
import android.content.res.TypedArray;
+import android.graphics.Canvas;
import android.os.SystemProperties;
import android.view.WindowInsets;
@@ -185,6 +186,7 @@
DisplayManager mDisplayManager;
Display mDisplay;
+ private int mDisplayState;
final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
{
@@ -228,7 +230,19 @@
throw new UnsupportedOperationException(
"Wallpapers do not support keep screen on");
}
-
+
+ @Override
+ public Canvas lockCanvas() {
+ if (mDisplayState == Display.STATE_DOZE
+ || mDisplayState == Display.STATE_DOZE_SUSPEND) {
+ try {
+ mSession.pokeDrawLock(mWindow);
+ } catch (RemoteException e) {
+ // System server died, can be ignored.
+ }
+ }
+ return super.lockCanvas();
+ }
};
final class WallpaperInputEventReceiver extends InputEventReceiver {
@@ -831,9 +845,12 @@
mWindow.setSession(mSession);
+ mLayout.packageName = getPackageName();
+
mDisplayManager = (DisplayManager)getSystemService(Context.DISPLAY_SERVICE);
mDisplayManager.registerDisplayListener(mDisplayListener, mCaller.getHandler());
mDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ mDisplayState = mDisplay.getState();
if (DEBUG) Log.v(TAG, "onCreate(): " + this);
onCreate(mSurfaceHolder);
@@ -873,8 +890,8 @@
void reportVisibility() {
if (!mDestroyed) {
- boolean visible = mVisible
- & mDisplay != null && mDisplay.getState() != Display.STATE_OFF;
+ mDisplayState = mDisplay == null ? Display.STATE_UNKNOWN : mDisplay.getState();
+ boolean visible = mVisible && mDisplayState != Display.STATE_OFF;
if (mReportedVisible != visible) {
mReportedVisible = visible;
if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index 7828851..67794b1 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -165,6 +165,19 @@
return this;
}
+ public Builder setIndents(int[] leftIndents, int[] rightIndents) {
+ int leftLen = leftIndents == null ? 0 : leftIndents.length;
+ int rightLen = rightIndents == null ? 0 : rightIndents.length;
+ int[] indents = new int[Math.max(leftLen, rightLen)];
+ for (int i = 0; i < indents.length; i++) {
+ int leftMargin = i < leftLen ? leftIndents[i] : 0;
+ int rightMargin = i < rightLen ? rightIndents[i] : 0;
+ indents[i] = leftMargin + rightMargin;
+ }
+ nSetIndents(mNativePtr, indents);
+ return this;
+ }
+
/**
* Measurement and break iteration is done in native code. The protocol for using
* the native code is as follows.
@@ -1009,6 +1022,8 @@
private static native void nSetLocale(long nativePtr, String locale, long nativeHyphenator);
+ private static native void nSetIndents(long nativePtr, int[] indents);
+
// Set up paragraph text and settings; done as one big method to minimize jni crossings
private static native void nSetupParagraph(long nativePtr, char[] text, int length,
float firstWidth, int firstWidthLineCount, float restWidth,
diff --git a/core/java/android/text/TextDirectionHeuristics.java b/core/java/android/text/TextDirectionHeuristics.java
index 866137c..354c15f 100644
--- a/core/java/android/text/TextDirectionHeuristics.java
+++ b/core/java/android/text/TextDirectionHeuristics.java
@@ -81,29 +81,47 @@
private static final int STATE_FALSE = 1;
private static final int STATE_UNKNOWN = 2;
- private static int isRtlText(int directionality) {
- switch (directionality) {
+ /* Returns STATE_TRUE for strong RTL characters, STATE_FALSE for strong LTR characters, and
+ * STATE_UNKNOWN for everything else.
+ */
+ private static int isRtlCodePoint(int codePoint) {
+ switch (Character.getDirectionality(codePoint)) {
case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
return STATE_FALSE;
case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
return STATE_TRUE;
- default:
- return STATE_UNKNOWN;
- }
- }
+ case Character.DIRECTIONALITY_UNDEFINED:
+ // Unassigned characters still have bidi direction, defined at:
+ // http://www.unicode.org/Public/UCD/latest/ucd/extracted/DerivedBidiClass.txt
- private static int isRtlTextOrFormat(int directionality) {
- switch (directionality) {
- case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
- case Character.DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING:
- case Character.DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE:
- return STATE_FALSE;
- case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
- case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
- case Character.DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING:
- case Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE:
- return STATE_TRUE;
+ if ((0x0590 <= codePoint && codePoint <= 0x08FF) ||
+ (0xFB1D <= codePoint && codePoint <= 0xFDCF) ||
+ (0xFDF0 <= codePoint && codePoint <= 0xFDFF) ||
+ (0xFE70 <= codePoint && codePoint <= 0xFEFF) ||
+ (0x10800 <= codePoint && codePoint <= 0x10FFF) ||
+ (0x1E800 <= codePoint && codePoint <= 0x1EFFF)) {
+ // Unassigned RTL character
+ return STATE_TRUE;
+ } else if (
+ // Potentially-unassigned Default_Ignorable. Ranges are from unassigned
+ // characters that have Unicode property Other_Default_Ignorable_Code_Point
+ // plus some enlargening to cover bidi isolates and simplify checks.
+ (0x2065 <= codePoint && codePoint <= 0x2069) ||
+ (0xFFF0 <= codePoint && codePoint <= 0xFFF8) ||
+ (0xE0000 <= codePoint && codePoint <= 0xE0FFF) ||
+ // Non-character
+ (0xFDD0 <= codePoint && codePoint <= 0xFDEF) ||
+ ((codePoint & 0xFFFE) == 0xFFFE) ||
+ // Currency symbol
+ (0x20A0 <= codePoint && codePoint <= 0x20CF) ||
+ // Unpaired surrogate
+ (0xD800 <= codePoint && codePoint <= 0xDFFF)) {
+ return STATE_UNKNOWN;
+ } else {
+ // Unassigned LTR character
+ return STATE_FALSE;
+ }
default:
return STATE_UNKNOWN;
}
@@ -181,14 +199,26 @@
/**
* Algorithm that uses the first strong directional character to determine the paragraph
- * direction. This is the standard Unicode Bidirectional algorithm.
+ * direction. This is the standard Unicode Bidirectional Algorithm (steps P2 and P3), with the
+ * exception that if no strong character is found, UNKNOWN is returned.
*/
private static class FirstStrong implements TextDirectionAlgorithm {
@Override
public int checkRtl(CharSequence cs, int start, int count) {
int result = STATE_UNKNOWN;
- for (int i = start, e = start + count; i < e && result == STATE_UNKNOWN; ++i) {
- result = isRtlTextOrFormat(Character.getDirectionality(cs.charAt(i)));
+ int openIsolateCount = 0;
+ for (int cp, i = start, end = start + count;
+ i < end && result == STATE_UNKNOWN;
+ i += Character.charCount(cp)) {
+ cp = Character.codePointAt(cs, i);
+ if (0x2066 <= cp && cp <= 0x2068) { // Opening isolates
+ openIsolateCount += 1;
+ } else if (cp == 0x2069) { // POP DIRECTIONAL ISOLATE (PDI)
+ if (openIsolateCount > 0) openIsolateCount -= 1;
+ } else if (openIsolateCount == 0) {
+ // Only consider the characters outside isolate pairs
+ result = isRtlCodePoint(cp);
+ }
}
return result;
}
@@ -200,9 +230,10 @@
}
/**
- * Algorithm that uses the presence of any strong directional non-format
- * character (e.g. excludes LRE, LRO, RLE, RLO) to determine the
- * direction of text.
+ * Algorithm that uses the presence of any strong directional character of the type indicated
+ * in the constructor parameter to determine the direction of text.
+ *
+ * Characters inside isolate pairs are skipped.
*/
private static class AnyStrong implements TextDirectionAlgorithm {
private final boolean mLookForRtl;
@@ -210,22 +241,31 @@
@Override
public int checkRtl(CharSequence cs, int start, int count) {
boolean haveUnlookedFor = false;
- for (int i = start, e = start + count; i < e; ++i) {
- switch (isRtlText(Character.getDirectionality(cs.charAt(i)))) {
- case STATE_TRUE:
- if (mLookForRtl) {
- return STATE_TRUE;
- }
- haveUnlookedFor = true;
- break;
- case STATE_FALSE:
- if (!mLookForRtl) {
- return STATE_FALSE;
- }
- haveUnlookedFor = true;
- break;
- default:
- break;
+ int openIsolateCount = 0;
+ for (int cp, i = start, end = start + count; i < end; i += Character.charCount(cp)) {
+ cp = Character.codePointAt(cs, i);
+ if (0x2066 <= cp && cp <= 0x2068) { // Opening isolates
+ openIsolateCount += 1;
+ } else if (cp == 0x2069) { // POP DIRECTIONAL ISOLATE (PDI)
+ if (openIsolateCount > 0) openIsolateCount -= 1;
+ } else if (openIsolateCount == 0) {
+ // Only consider the characters outside isolate pairs
+ switch (isRtlCodePoint(cp)) {
+ case STATE_TRUE:
+ if (mLookForRtl) {
+ return STATE_TRUE;
+ }
+ haveUnlookedFor = true;
+ break;
+ case STATE_FALSE:
+ if (!mLookForRtl) {
+ return STATE_FALSE;
+ }
+ haveUnlookedFor = true;
+ break;
+ default:
+ break;
+ }
}
}
if (haveUnlookedFor) {
diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java
index fcc3a40..de509b2 100644
--- a/core/java/android/text/method/ArrowKeyMovementMethod.java
+++ b/core/java/android/text/method/ArrowKeyMovementMethod.java
@@ -240,23 +240,30 @@
boolean handled = Touch.onTouchEvent(widget, buffer, event);
- if (widget.isFocused() && !widget.didTouchFocusSelect()) {
- if (action == MotionEvent.ACTION_DOWN) {
- // Capture the mouse pointer down location to ensure selection starts
- // right under the mouse (and is not influenced by cursor location).
- // The code below needs to run for mouse events.
- // For touch events, the code should run only when selection is active.
- if (isMouse || isTouchSelecting(isMouse, buffer)) {
- int offset = widget.getOffsetForPosition(event.getX(), event.getY());
- buffer.setSpan(LAST_TAP_DOWN, offset, offset, Spannable.SPAN_POINT_POINT);
- // Disallow intercepting of the touch events, so that
- // users can scroll and select at the same time.
- // without this, users would get booted out of select
- // mode once the view detected it needed to scroll.
- widget.getParent().requestDisallowInterceptTouchEvent(true);
+ if (widget.didTouchFocusSelect() && !isMouse) {
+ return handled;
+ }
+ if (action == MotionEvent.ACTION_DOWN) {
+ // Capture the mouse pointer down location to ensure selection starts
+ // right under the mouse (and is not influenced by cursor location).
+ // The code below needs to run for mouse events.
+ // For touch events, the code should run only when selection is active.
+ if (isMouse || isTouchSelecting(isMouse, buffer)) {
+ if (!widget.isFocused()) {
+ if (!widget.requestFocus()) {
+ return handled;
+ }
}
- } else if (action == MotionEvent.ACTION_MOVE) {
-
+ int offset = widget.getOffsetForPosition(event.getX(), event.getY());
+ buffer.setSpan(LAST_TAP_DOWN, offset, offset, Spannable.SPAN_POINT_POINT);
+ // Disallow intercepting of the touch events, so that
+ // users can scroll and select at the same time.
+ // without this, users would get booted out of select
+ // mode once the view detected it needed to scroll.
+ widget.getParent().requestDisallowInterceptTouchEvent(true);
+ }
+ } else if (widget.isFocused()) {
+ if (action == MotionEvent.ACTION_MOVE) {
// Cursor can be active at any location in the text while mouse pointer can start
// selection from a totally different location. Use LAST_TAP_DOWN span to ensure
// text selection will start from mouse pointer location.
diff --git a/core/java/android/text/method/BaseKeyListener.java b/core/java/android/text/method/BaseKeyListener.java
index 07c1ec3..fe7571f 100644
--- a/core/java/android/text/method/BaseKeyListener.java
+++ b/core/java/android/text/method/BaseKeyListener.java
@@ -97,7 +97,7 @@
// Delete a character.
final int start = Selection.getSelectionEnd(content);
final int end;
- if (isForwardDelete || event.isShiftPressed() || isShiftActive) {
+ if (isForwardDelete) {
end = TextUtils.getOffsetAfter(content, start);
} else {
end = TextUtils.getOffsetBefore(content, start);
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 71863b7..71e2251 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -170,6 +170,15 @@
public static final int FLAG_PRESENTATION = 1 << 3;
/**
+ * Display flag: Indicates that the contents of the display should not be scaled
+ * to fit the physical screen dimensions. Used for development only to emulate
+ * devices with smaller physicals screens while preserving density.
+ *
+ * @hide
+ */
+ public static final int FLAG_SCALING_DISABLED = 1 << 30;
+
+ /**
* Display type: Unknown display type.
* @hide
*/
diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java
index de46a4a..5a9a1ea 100644
--- a/core/java/android/view/DisplayEventReceiver.java
+++ b/core/java/android/view/DisplayEventReceiver.java
@@ -22,6 +22,8 @@
import android.os.MessageQueue;
import android.util.Log;
+import java.lang.ref.WeakReference;
+
/**
* Provides a low-level mechanism for an application to receive display events
* such as vertical sync.
@@ -42,7 +44,7 @@
// GC'd while the native peer of the receiver is using them.
private MessageQueue mMessageQueue;
- private static native long nativeInit(DisplayEventReceiver receiver,
+ private static native long nativeInit(WeakReference<DisplayEventReceiver> receiver,
MessageQueue messageQueue);
private static native void nativeDispose(long receiverPtr);
private static native void nativeScheduleVsync(long receiverPtr);
@@ -58,7 +60,7 @@
}
mMessageQueue = looper.getQueue();
- mReceiverPtr = nativeInit(this, mMessageQueue);
+ mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mMessageQueue);
mCloseGuard.open("dispose");
}
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index ecf45b4..243961c 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -538,6 +538,9 @@
if ((flags & Display.FLAG_PRESENTATION) != 0) {
result.append(", FLAG_PRESENTATION");
}
+ if ((flags & Display.FLAG_SCALING_DISABLED) != 0) {
+ result.append(", FLAG_SCALING_DISABLED");
+ }
return result.toString();
}
}
diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java
index 2351548..b8544c6 100644
--- a/core/java/android/view/GestureDetector.java
+++ b/core/java/android/view/GestureDetector.java
@@ -149,12 +149,30 @@
}
/**
+ * The listener that is used to notify when a stylus button press occurs.
+ */
+ public interface OnStylusButtonPressListener {
+ /**
+ * Notified when a stylus button press occurs. This is when the stylus
+ * is touching the screen and the {@value MotionEvent#BUTTON_SECONDARY}
+ * is pressed.
+ *
+ * @param e The motion event that occurred during the stylus button
+ * press.
+ * @return true if the event is consumed, else false
+ */
+ boolean onStylusButtonPress(MotionEvent e);
+ }
+
+ /**
* A convenience class to extend when you only want to listen for a subset
* of all the gestures. This implements all methods in the
- * {@link OnGestureListener} and {@link OnDoubleTapListener} but does
- * nothing and return {@code false} for all applicable methods.
+ * {@link OnGestureListener}, {@link OnDoubleTapListener}, and {@link OnStylusButtonPressListener}
+ * but does nothing and return {@code false} for all applicable methods.
*/
- public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener {
+ public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener,
+ OnStylusButtonPressListener {
+
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@@ -190,6 +208,10 @@
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
+
+ public boolean onStylusButtonPress(MotionEvent e) {
+ return false;
+ }
}
private int mTouchSlopSquare;
@@ -211,10 +233,12 @@
private final Handler mHandler;
private final OnGestureListener mListener;
private OnDoubleTapListener mDoubleTapListener;
+ private OnStylusButtonPressListener mStylusButtonListener;
private boolean mStillDown;
private boolean mDeferConfirmSingleTap;
private boolean mInLongPress;
+ private boolean mInStylusButtonPress;
private boolean mAlwaysInTapRegion;
private boolean mAlwaysInBiggerTapRegion;
@@ -358,6 +382,9 @@
if (listener instanceof OnDoubleTapListener) {
setOnDoubleTapListener((OnDoubleTapListener) listener);
}
+ if (listener instanceof OnStylusButtonPressListener) {
+ setOnStylusButtonPressListener((OnStylusButtonPressListener) listener);
+ }
init(context);
}
@@ -420,6 +447,19 @@
}
/**
+ * Sets the listener which will be called for stylus button related
+ * gestures.
+ *
+ * @param onStylusButtonPressListener the listener invoked for all the
+ * callbacks, or null to stop listening for stylus button
+ * gestures.
+ */
+ public void setOnStylusButtonPressListener(
+ OnStylusButtonPressListener onStylusButtonPressListener) {
+ mStylusButtonListener = onStylusButtonPressListener;
+ }
+
+ /**
* Set whether longpress is enabled, if this is enabled when a user
* presses and holds down you get a longpress event and nothing further.
* If it's disabled the user can press and hold down and then later
@@ -512,7 +552,18 @@
break;
case MotionEvent.ACTION_DOWN:
- if (mDoubleTapListener != null) {
+ if (mStylusButtonListener != null
+ && ev.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS
+ && (ev.getButtonState() & MotionEvent.BUTTON_SECONDARY) != 0) {
+ if (mStylusButtonListener.onStylusButtonPress(ev)) {
+ mInStylusButtonPress = true;
+ handled = true;
+ mHandler.removeMessages(LONG_PRESS);
+ mHandler.removeMessages(TAP);
+ }
+ }
+
+ if (mDoubleTapListener != null && !mInStylusButtonPress) {
boolean hadTapMessage = mHandler.hasMessages(TAP);
if (hadTapMessage) mHandler.removeMessages(TAP);
if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage &&
@@ -540,8 +591,8 @@
mStillDown = true;
mInLongPress = false;
mDeferConfirmSingleTap = false;
-
- if (mIsLongpressEnabled) {
+
+ if (mIsLongpressEnabled && !mInStylusButtonPress) {
mHandler.removeMessages(LONG_PRESS);
mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime()
+ TAP_TIMEOUT + LONGPRESS_TIMEOUT);
@@ -551,7 +602,17 @@
break;
case MotionEvent.ACTION_MOVE:
- if (mInLongPress) {
+ if (mStylusButtonListener != null && !mInStylusButtonPress && !mInLongPress
+ && ev.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS
+ && (ev.getButtonState() & MotionEvent.BUTTON_SECONDARY) != 0) {
+ if (mStylusButtonListener.onStylusButtonPress(ev)) {
+ mInStylusButtonPress = true;
+ handled = true;
+ mHandler.removeMessages(LONG_PRESS);
+ mHandler.removeMessages(TAP);
+ }
+ }
+ if (mInLongPress || mInStylusButtonPress) {
break;
}
final float scrollX = mLastFocusX - focusX;
@@ -591,6 +652,9 @@
} else if (mInLongPress) {
mHandler.removeMessages(TAP);
mInLongPress = false;
+ } else if (mInStylusButtonPress) {
+ mHandler.removeMessages(TAP);
+ mInStylusButtonPress = false;
} else if (mAlwaysInTapRegion) {
handled = mListener.onSingleTapUp(ev);
if (mDeferConfirmSingleTap && mDoubleTapListener != null) {
@@ -649,9 +713,8 @@
mAlwaysInTapRegion = false;
mAlwaysInBiggerTapRegion = false;
mDeferConfirmSingleTap = false;
- if (mInLongPress) {
- mInLongPress = false;
- }
+ mInLongPress = false;
+ mInStylusButtonPress = false;
}
private void cancelTaps() {
@@ -662,9 +725,8 @@
mAlwaysInTapRegion = false;
mAlwaysInBiggerTapRegion = false;
mDeferConfirmSingleTap = false;
- if (mInLongPress) {
- mInLongPress = false;
- }
+ mInLongPress = false;
+ mInStylusButtonPress = false;
}
private boolean isConsideredDoubleTap(MotionEvent firstDown, MotionEvent firstUp,
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index d6625c8..5994d4f 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -70,6 +70,7 @@
int getBaseDisplayDensity(int displayId);
void setForcedDisplayDensity(int displayId, int density);
void clearForcedDisplayDensity(int displayId);
+ void setForcedDisplayScalingMode(int displayId, int mode); // 0 = auto, 1 = disable
void setOverscan(int displayId, int left, int top, int right, int bottom);
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 25c5127..87d5d9a 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -360,7 +360,7 @@
@Override
boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) {
return nCopyLayerInto(mNativeProxy,
- layer.getDeferredLayerUpdater(), bitmap);
+ layer.getDeferredLayerUpdater(), bitmap.getSkBitmap());
}
@Override
@@ -460,6 +460,8 @@
if (buffer != null) {
long[] map = atlas.getMap();
if (map != null) {
+ // TODO Remove after fixing b/15425820
+ validateMap(context, map);
nSetAtlas(renderProxy, buffer, map);
}
// If IAssetAtlas is not the same class as the IBinder
@@ -474,6 +476,32 @@
Log.w(LOG_TAG, "Could not acquire atlas", e);
}
}
+
+ private static void validateMap(Context context, long[] map) {
+ Log.d("Atlas", "Validating map...");
+ HashSet<Long> preloadedPointers = new HashSet<Long>();
+
+ // We only care about drawables that hold bitmaps
+ final Resources resources = context.getResources();
+ final LongSparseArray<Drawable.ConstantState> drawables = resources.getPreloadedDrawables();
+
+ final int count = drawables.size();
+ ArrayList<Bitmap> tmpList = new ArrayList<Bitmap>();
+ for (int i = 0; i < count; i++) {
+ drawables.valueAt(i).addAtlasableBitmaps(tmpList);
+ for (int j = 0; j < tmpList.size(); j++) {
+ preloadedPointers.add(tmpList.get(j).getSkBitmap());
+ }
+ tmpList.clear();
+ }
+
+ for (int i = 0; i < map.length; i += 4) {
+ if (!preloadedPointers.contains(map[i])) {
+ Log.w("Atlas", String.format("Pointer 0x%X, not in getPreloadedDrawables?", map[i]));
+ map[i] = 0;
+ }
+ }
+ }
}
static native void setupShadersDiskCache(String cacheFile);
@@ -503,7 +531,7 @@
private static native long nCreateTextureLayer(long nativeProxy);
private static native void nBuildLayer(long nativeProxy, long node);
- private static native boolean nCopyLayerInto(long nativeProxy, long layer, Bitmap bitmap);
+ private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);
private static native void nPushLayerUpdate(long nativeProxy, long layer);
private static native void nCancelLayerUpdate(long nativeProxy, long layer);
private static native void nDetachSurfaceTexture(long nativeProxy, long layer);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 25fa349..6176b9a 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -18173,7 +18173,8 @@
// flag not set, setMeasuredDimension() was not invoked, we raise
// an exception to warn the developer
if ((mPrivateFlags & PFLAG_MEASURED_DIMENSION_SET) != PFLAG_MEASURED_DIMENSION_SET) {
- throw new IllegalStateException("onMeasure() did not set the"
+ throw new IllegalStateException("View with id " + getId() + ": "
+ + getClass().getName() + "#onMeasure() did not set the"
+ " measured dimension by calling"
+ " setMeasuredDimension()");
}
@@ -20431,11 +20432,12 @@
static int adjust(int measureSpec, int delta) {
final int mode = getMode(measureSpec);
+ int size = getSize(measureSpec);
if (mode == UNSPECIFIED) {
// No need to adjust size for UNSPECIFIED mode.
- return makeMeasureSpec(0, UNSPECIFIED);
+ return makeMeasureSpec(size, UNSPECIFIED);
}
- int size = getSize(measureSpec) + delta;
+ size += delta;
if (size < 0) {
Log.e(VIEW_LOG_TAG, "MeasureSpec.adjust: new size would be negative! (" + size +
") spec: " + toString(measureSpec) + " delta: " + delta);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 98b895d..8f2be99 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -494,6 +494,11 @@
*/
private int mNestedScrollAxes;
+ // Used to manage the list of transient views, added by addTransientView()
+ private List<Integer> mTransientIndices = null;
+ private List<View> mTransientViews = null;
+
+
/**
* Empty ActionMode used as a sentinel in recursive entries to startActionModeForChild.
*
@@ -2822,6 +2827,11 @@
child.dispatchAttachedToWindow(info,
visibility | (child.mViewFlags & VISIBILITY_MASK));
}
+ final int transientCount = mTransientIndices == null ? 0 : mTransientIndices.size();
+ for (int i = 0; i < transientCount; ++i) {
+ View view = mTransientViews.get(i);
+ view.dispatchAttachedToWindow(info, visibility | (view.mViewFlags & VISIBILITY_MASK));
+ }
}
@Override
@@ -2991,6 +3001,11 @@
children[i].dispatchDetachedFromWindow();
}
clearDisappearingChildren();
+ final int transientCount = mTransientViews == null ? 0 : mTransientIndices.size();
+ for (int i = 0; i < transientCount; ++i) {
+ View view = mTransientViews.get(i);
+ view.dispatchDetachedFromWindow();
+ }
super.dispatchDetachedFromWindow();
}
@@ -3291,6 +3306,8 @@
final long drawingTime = getDrawingTime();
if (usingRenderNodeProperties) canvas.insertReorderBarrier();
+ final int transientCount = mTransientIndices == null ? 0 : mTransientIndices.size();
+ int transientIndex = transientCount != 0 ? 0 : -1;
// Only use the preordered list if not HW accelerated, since the HW pipeline will do the
// draw reordering internally
final ArrayList<View> preorderedList = usingRenderNodeProperties
@@ -3298,6 +3315,17 @@
final boolean customOrder = preorderedList == null
&& isChildrenDrawingOrderEnabled();
for (int i = 0; i < childrenCount; i++) {
+ while (transientIndex >= 0 && mTransientIndices.get(transientIndex) == i) {
+ final View transientChild = mTransientViews.get(transientIndex);
+ if ((transientChild.mViewFlags & VISIBILITY_MASK) == VISIBLE ||
+ transientChild.getAnimation() != null) {
+ more |= drawChild(canvas, transientChild, drawingTime);
+ }
+ transientIndex++;
+ if (transientIndex >= transientCount) {
+ transientIndex = -1;
+ }
+ }
int childIndex = customOrder ? getChildDrawingOrder(childrenCount, i) : i;
final View child = (preorderedList == null)
? children[childIndex] : preorderedList.get(childIndex);
@@ -3305,6 +3333,18 @@
more |= drawChild(canvas, child, drawingTime);
}
}
+ while (transientIndex >= 0) {
+ // there may be additional transient views after the normal views
+ final View transientChild = mTransientViews.get(transientIndex);
+ if ((transientChild.mViewFlags & VISIBILITY_MASK) == VISIBLE ||
+ transientChild.getAnimation() != null) {
+ more |= drawChild(canvas, transientChild, drawingTime);
+ }
+ transientIndex++;
+ if (transientIndex >= transientCount) {
+ break;
+ }
+ }
if (preorderedList != null) preorderedList.clear();
// Draw any disappearing views that have animations
@@ -3785,6 +3825,145 @@
}
/**
+ * This method adds a view to this container at the specified index purely for the
+ * purposes of allowing that view to draw even though it is not a normal child of
+ * the container. That is, the view does not participate in layout, focus, accessibility,
+ * input, or other normal view operations; it is purely an item to be drawn during the normal
+ * rendering operation of this container. The index that it is added at is the order
+ * in which it will be drawn, with respect to the other views in the container.
+ * For example, a transient view added at index 0 will be drawn before all other views
+ * in the container because it will be drawn first (including before any real view
+ * at index 0). There can be more than one transient view at any particular index;
+ * these views will be drawn in the order in which they were added to the list of
+ * transient views. The index of transient views can also be greater than the number
+ * of normal views in the container; that just means that they will be drawn after all
+ * other views are drawn.
+ *
+ * <p>Note that since transient views do not participate in layout, they must be sized
+ * manually or, more typically, they should just use the size that they had before they
+ * were removed from their container.</p>
+ *
+ * <p>Transient views are useful for handling animations of views that have been removed
+ * from the container, but which should be animated out after the removal. Adding these
+ * views as transient views allows them to participate in drawing without side-effecting
+ * the layout of the container.</p>
+ *
+ * <p>Transient views must always be explicitly {@link #removeTransientView(View) removed}
+ * from the container when they are no longer needed. For example, a transient view
+ * which is added in order to fade it out in its old location should be removed
+ * once the animation is complete.</p>
+ *
+ * @param view The view to be added
+ * @param index The index at which this view should be drawn, must be >= 0.
+ * This value is relative to the {@link #getChildAt(int) index} values in the normal
+ * child list of this container, where any transient view at a particular index will
+ * be drawn before any normal child at that same index.
+ *
+ * @hide
+ */
+ public void addTransientView(View view, int index) {
+ if (index < 0) {
+ return;
+ }
+ if (mTransientIndices == null) {
+ mTransientIndices = new ArrayList<Integer>();
+ mTransientViews = new ArrayList<View>();
+ }
+ final int oldSize = mTransientIndices.size();
+ if (oldSize > 0) {
+ int insertionIndex;
+ for (insertionIndex = 0; insertionIndex < oldSize; ++insertionIndex) {
+ if (index < mTransientIndices.get(insertionIndex)) {
+ break;
+ }
+ }
+ mTransientIndices.add(insertionIndex, index);
+ mTransientViews.add(insertionIndex, view);
+ } else {
+ mTransientIndices.add(index);
+ mTransientViews.add(view);
+ }
+ view.mParent = this;
+ view.dispatchAttachedToWindow(mAttachInfo, (mViewFlags&VISIBILITY_MASK));
+ invalidate(true);
+ }
+
+ /**
+ * Removes a view from the list of transient views in this container. If there is no
+ * such transient view, this method does nothing.
+ *
+ * @param view The transient view to be removed
+ *
+ * @hide
+ */
+ public void removeTransientView(View view) {
+ if (mTransientViews == null) {
+ return;
+ }
+ final int size = mTransientViews.size();
+ for (int i = 0; i < size; ++i) {
+ if (view == mTransientViews.get(i)) {
+ mTransientViews.remove(i);
+ mTransientIndices.remove(i);
+ view.mParent = null;
+ view.dispatchDetachedFromWindow();
+ invalidate(true);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Returns the number of transient views in this container. Specific transient
+ * views and the index at which they were added can be retrieved via
+ * {@link #getTransientView(int)} and {@link #getTransientViewIndex(int)}.
+ *
+ * @see #addTransientView(View, int)
+ * @return The number of transient views in this container
+ *
+ * @hide
+ */
+ public int getTransientViewCount() {
+ return mTransientIndices == null ? 0 : mTransientIndices.size();
+ }
+
+ /**
+ * Given a valid position within the list of transient views, returns the index of
+ * the transient view at that position.
+ *
+ * @param position The position of the index being queried. Must be at least 0
+ * and less than the value returned by {@link #getTransientViewCount()}.
+ * @return The index of the transient view stored in the given position if the
+ * position is valid, otherwise -1
+ *
+ * @hide
+ */
+ public int getTransientViewIndex(int position) {
+ if (position < 0 || mTransientIndices == null || position >= mTransientIndices.size()) {
+ return -1;
+ }
+ return mTransientIndices.get(position);
+ }
+
+ /**
+ * Given a valid position within the list of transient views, returns the
+ * transient view at that position.
+ *
+ * @param position The position of the view being queried. Must be at least 0
+ * and less than the value returned by {@link #getTransientViewCount()}.
+ * @return The transient view stored in the given position if the
+ * position is valid, otherwise null
+ *
+ * @hide
+ */
+ public View getTransientView(int position) {
+ if (mTransientViews == null || position >= mTransientViews.size()) {
+ return null;
+ }
+ return mTransientViews.get(position);
+ }
+
+ /**
* <p>Adds a child view. If no layout parameters are already set on the child, the
* default parameters for this ViewGroup are set on the child.</p>
*
@@ -4096,6 +4275,16 @@
if (child.getVisibility() != View.GONE) {
notifySubtreeAccessibilityStateChangedIfNeeded();
}
+
+ if (mTransientIndices != null) {
+ final int transientCount = mTransientIndices.size();
+ for (int i = 0; i < transientCount; ++i) {
+ final int oldIndex = mTransientIndices.get(i);
+ if (index <= oldIndex) {
+ mTransientIndices.set(i, oldIndex + 1);
+ }
+ }
+ }
}
private void addInArray(View child, int index) {
@@ -4340,6 +4529,14 @@
if (view.getVisibility() != View.GONE) {
notifySubtreeAccessibilityStateChangedIfNeeded();
}
+
+ int transientCount = mTransientIndices == null ? 0 : mTransientIndices.size();
+ for (int i = 0; i < transientCount; ++i) {
+ final int oldIndex = mTransientIndices.get(i);
+ if (index < oldIndex) {
+ mTransientIndices.set(i, oldIndex - 1);
+ }
+ }
}
/**
@@ -6353,6 +6550,7 @@
public void onStopNestedScroll(View child) {
// Stop any recursive nested scrolling.
stopNestedScroll();
+ mNestedScrollAxes = 0;
}
/**
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index cafe053..3340c73 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -76,9 +76,60 @@
private static boolean sAddressSpaceReserved = false;
private static PackageInfo sPackageInfo;
+ private static class MissingWebViewPackageException extends AndroidRuntimeException {
+ public MissingWebViewPackageException(String message) { super(message); }
+ public MissingWebViewPackageException(Exception e) { super(e); }
+ }
+
+ /** @hide */
+ public static String[] getWebViewPackageNames() {
+ return AppGlobals.getInitialApplication().getResources().getStringArray(
+ com.android.internal.R.array.config_webViewPackageNames);
+ }
+
+ // TODO (gsennton) remove when committing webview xts test change
public static String getWebViewPackageName() {
- return AppGlobals.getInitialApplication().getString(
- com.android.internal.R.string.config_webViewPackageName);
+ String[] webViewPackageNames = getWebViewPackageNames();
+ return webViewPackageNames[webViewPackageNames.length-1];
+ }
+
+ /**
+ * Return the package info of the first package in the webview priority list that contains
+ * webview.
+ *
+ * @hide
+ */
+ public static PackageInfo findPreferredWebViewPackage() {
+ PackageManager pm = AppGlobals.getInitialApplication().getPackageManager();
+
+ for (String packageName : getWebViewPackageNames()) {
+ try {
+ PackageInfo packageInfo = pm.getPackageInfo(packageName,
+ PackageManager.GET_META_DATA);
+ ApplicationInfo applicationInfo = packageInfo.applicationInfo;
+
+ // If the correct flag is set the package contains webview.
+ if (getWebViewLibrary(applicationInfo) != null) {
+ return packageInfo;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+ throw new MissingWebViewPackageException("Could not find a loadable WebView package");
+ }
+
+ // throws MissingWebViewPackageException
+ private static ApplicationInfo getWebViewApplicationInfo() {
+ if (sPackageInfo == null)
+ return findPreferredWebViewPackage().applicationInfo;
+ else
+ return sPackageInfo.applicationInfo;
+ }
+
+ private static String getWebViewLibrary(ApplicationInfo ai) {
+ if (ai.metaData != null)
+ return ai.metaData.getString("com.android.webview.WebViewLibrary");
+ return null;
}
public static PackageInfo getLoadedPackageInfo() {
@@ -99,20 +150,7 @@
Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.getProvider()");
try {
- Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.loadNativeLibrary()");
- loadNativeLibrary();
- Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
-
- Class<WebViewFactoryProvider> providerClass;
- Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.getFactoryClass()");
- try {
- providerClass = getFactoryClass();
- } catch (ClassNotFoundException e) {
- Log.e(LOGTAG, "error loading provider", e);
- throw new AndroidRuntimeException(e);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
- }
+ Class<WebViewFactoryProvider> providerClass = getProviderClass();
StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "providerClass.newInstance()");
@@ -134,29 +172,27 @@
}
}
- private static Class<WebViewFactoryProvider> getFactoryClass() throws ClassNotFoundException {
- Application initialApplication = AppGlobals.getInitialApplication();
+ private static Class<WebViewFactoryProvider> getProviderClass() {
try {
// First fetch the package info so we can log the webview package version.
- String packageName = getWebViewPackageName();
- sPackageInfo = initialApplication.getPackageManager().getPackageInfo(packageName, 0);
- Log.i(LOGTAG, "Loading " + packageName + " version " + sPackageInfo.versionName +
- " (code " + sPackageInfo.versionCode + ")");
+ sPackageInfo = findPreferredWebViewPackage();
+ Log.i(LOGTAG, "Loading " + sPackageInfo.packageName + " version " +
+ sPackageInfo.versionName + " (code " + sPackageInfo.versionCode + ")");
- // Construct a package context to load the Java code into the current app.
- Context webViewContext = initialApplication.createPackageContext(packageName,
- Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
- initialApplication.getAssets().addAssetPath(
- webViewContext.getApplicationInfo().sourceDir);
- ClassLoader clazzLoader = webViewContext.getClassLoader();
- Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "Class.forName()");
+ Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.loadNativeLibrary()");
+ loadNativeLibrary();
+ Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
+
+ Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.getChromiumProviderClass()");
try {
- return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true,
- clazzLoader);
+ return getChromiumProviderClass();
+ } catch (ClassNotFoundException e) {
+ Log.e(LOGTAG, "error loading provider", e);
+ throw new AndroidRuntimeException(e);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
}
- } catch (PackageManager.NameNotFoundException e) {
+ } catch (MissingWebViewPackageException e) {
// If the package doesn't exist, then try loading the null WebView instead.
// If that succeeds, then this is a device without WebView support; if it fails then
// swallow the failure, complain that the real WebView is missing and rethrow the
@@ -171,6 +207,30 @@
}
}
+ // throws MissingWebViewPackageException
+ private static Class<WebViewFactoryProvider> getChromiumProviderClass()
+ throws ClassNotFoundException {
+ Application initialApplication = AppGlobals.getInitialApplication();
+ try {
+ // Construct a package context to load the Java code into the current app.
+ Context webViewContext = initialApplication.createPackageContext(
+ sPackageInfo.packageName,
+ Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
+ initialApplication.getAssets().addAssetPath(
+ webViewContext.getApplicationInfo().sourceDir);
+ ClassLoader clazzLoader = webViewContext.getClassLoader();
+ Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "Class.forName()");
+ try {
+ return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true,
+ clazzLoader);
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new MissingWebViewPackageException(e);
+ }
+ }
+
/**
* Perform any WebView loading preparations that must happen in the zygote.
* Currently, this means allocating address space to load the real JNI library later.
@@ -270,12 +330,10 @@
prepareWebViewInSystemServer(nativeLibs);
}
- private static String[] getWebViewNativeLibraryPaths()
- throws PackageManager.NameNotFoundException {
- final String NATIVE_LIB_FILE_NAME = "libwebviewchromium.so";
-
- PackageManager pm = AppGlobals.getInitialApplication().getPackageManager();
- ApplicationInfo ai = pm.getApplicationInfo(getWebViewPackageName(), 0);
+ // throws MissingWebViewPackageException
+ private static String[] getWebViewNativeLibraryPaths() {
+ ApplicationInfo ai = getWebViewApplicationInfo();
+ final String NATIVE_LIB_FILE_NAME = getWebViewLibrary(ai);
String path32;
String path64;
@@ -400,7 +458,7 @@
} else if (DEBUG) {
Log.v(LOGTAG, "loaded with relro file");
}
- } catch (PackageManager.NameNotFoundException e) {
+ } catch (MissingWebViewPackageException e) {
Log.e(LOGTAG, "Failed to list WebView package libraries for loadNativeLibrary", e);
}
}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index e7b6238..c9d9a8c 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -3116,6 +3116,25 @@
}
}
+ private boolean performStylusButtonPressAction(MotionEvent ev) {
+ if (ev.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS
+ && ev.isButtonPressed(MotionEvent.BUTTON_SECONDARY)
+ && mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode == null) {
+ final View child = getChildAt(mMotionPosition - mFirstPosition);
+ if (child != null) {
+ final int longPressPosition = mMotionPosition;
+ final long longPressId = mAdapter.getItemId(mMotionPosition);
+ if (performLongPress(child, longPressPosition, longPressId)) {
+ mTouchMode = TOUCH_MODE_REST;
+ setPressed(false);
+ child.setPressed(false);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
boolean performLongPress(final View child,
final int longPressPosition, final long longPressId) {
// CHOICE_MODE_MULTIPLE_MODAL takes over long press.
@@ -3757,8 +3776,8 @@
}
if (mTouchMode == TOUCH_MODE_DOWN && mMotionPosition != INVALID_POSITION
- && performButtonActionOnTouchDown(ev)) {
- removeCallbacks(mPendingCheckForTap);
+ && (performButtonActionOnTouchDown(ev) || performStylusButtonPressAction(ev))) {
+ removeCallbacks(mPendingCheckForTap);
}
}
@@ -3800,6 +3819,11 @@
mTouchMode = TOUCH_MODE_DONE_WAITING;
updateSelectorState();
} else if (motionView != null) {
+ if (performStylusButtonPressAction(ev)) {
+ removeCallbacks(mPendingCheckForTap);
+ removeCallbacks(mPendingCheckForLongPress);
+ }
+
// Still within bounds, update the hotspot.
final float[] point = mTmpPoint;
point[0] = x;
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java
index d6f9f78..ff74c60 100644
--- a/core/java/android/widget/AbsSeekBar.java
+++ b/core/java/android/widget/AbsSeekBar.java
@@ -703,9 +703,9 @@
// fallthrough
case KeyEvent.KEYCODE_DPAD_RIGHT:
increment = isLayoutRtl() ? -increment : increment;
- int progress = getProgress() + increment;
- if (progress > 0 && progress < getMax()) {
- setProgress(progress, true);
+
+ // Let progress bar handle clamping values.
+ if (setProgress(getProgress() + increment, true)) {
onKeyChange();
return true;
}
@@ -729,10 +729,10 @@
if (isEnabled()) {
final int progress = getProgress();
if (progress > 0) {
- info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD);
}
if (progress < getMax()) {
- info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD);
}
}
}
@@ -743,29 +743,26 @@
if (super.performAccessibilityActionInternal(action, arguments)) {
return true;
}
+
if (!isEnabled()) {
return false;
}
- final int progress = getProgress();
- final int increment = Math.max(1, Math.round((float) getMax() / 5));
- switch (action) {
- case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
- if (progress <= 0) {
- return false;
- }
- setProgress(progress - increment, true);
+
+ if (action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD
+ || action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) {
+ int increment = Math.max(1, Math.round((float) getMax() / 5));
+ if (action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) {
+ increment = -increment;
+ }
+
+ // Let progress bar handle clamping values.
+ if (setProgress(getProgress() + increment, true)) {
onKeyChange();
return true;
}
- case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
- if (progress >= getMax()) {
- return false;
- }
- setProgress(progress + increment, true);
- onKeyChange();
- return true;
- }
+ return false;
}
+
return false;
}
diff --git a/core/java/android/widget/CalendarViewMaterialDelegate.java b/core/java/android/widget/CalendarViewMaterialDelegate.java
index 7bce756..0ed75d5 100644
--- a/core/java/android/widget/CalendarViewMaterialDelegate.java
+++ b/core/java/android/widget/CalendarViewMaterialDelegate.java
@@ -19,6 +19,7 @@
import android.annotation.StyleRes;
import android.content.Context;
import android.util.AttributeSet;
+import android.widget.DayPickerView.OnDaySelectedListener;
import java.util.Calendar;
@@ -109,8 +110,7 @@
mOnDateChangeListener = listener;
}
- private final DayPickerView.OnDaySelectedListener mOnDaySelectedListener =
- new DayPickerView.OnDaySelectedListener() {
+ private final OnDaySelectedListener mOnDaySelectedListener = new OnDaySelectedListener() {
@Override
public void onDaySelected(DayPickerView view, Calendar day) {
if (mOnDateChangeListener != null) {
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index 06a5bd2..d38a225 100755
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -34,8 +34,6 @@
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
import android.widget.DayPickerView.OnDaySelectedListener;
import android.widget.YearPickerView.OnYearSelectedListener;
@@ -549,7 +547,7 @@
final int listPosition = ss.getListPosition();
if (listPosition != -1) {
if (currentView == VIEW_MONTH_DAY) {
- mDayPickerView.setCurrentItem(listPosition);
+ mDayPickerView.setPosition(listPosition);
} else if (currentView == VIEW_YEAR) {
final int listPositionOffset = ss.getListPositionOffset();
mYearPickerView.setSelectionFromTop(listPosition, listPositionOffset);
diff --git a/core/java/android/widget/DayPickerAdapter.java b/core/java/android/widget/DayPickerPagerAdapter.java
similarity index 92%
rename from core/java/android/widget/DayPickerAdapter.java
rename to core/java/android/widget/DayPickerPagerAdapter.java
index 9a4b6f5..478fa00 100644
--- a/core/java/android/widget/DayPickerAdapter.java
+++ b/core/java/android/widget/DayPickerPagerAdapter.java
@@ -36,7 +36,7 @@
/**
* An adapter for a list of {@link android.widget.SimpleMonthView} items.
*/
-class DayPickerAdapter extends PagerAdapter {
+class DayPickerPagerAdapter extends PagerAdapter {
private static final int MONTHS_IN_YEAR = 12;
private final Calendar mMinDate = Calendar.getInstance();
@@ -63,7 +63,7 @@
private int mCount;
private int mFirstDayOfWeek;
- public DayPickerAdapter(@NonNull Context context, @LayoutRes int layoutResId,
+ public DayPickerPagerAdapter(@NonNull Context context, @LayoutRes int layoutResId,
@IdRes int calendarViewId) {
mInflater = LayoutInflater.from(context);
mLayoutResId = layoutResId;
@@ -200,7 +200,8 @@
final int yearOffset = (day.get(Calendar.YEAR) - mMinDate.get(Calendar.YEAR));
final int monthOffset = (day.get(Calendar.MONTH) - mMinDate.get(Calendar.MONTH));
- return yearOffset * MONTHS_IN_YEAR + monthOffset;
+ final int position = yearOffset * MONTHS_IN_YEAR + monthOffset;
+ return position;
}
@Override
@@ -253,8 +254,6 @@
v.setMonthParams(selectedDay, month, year, mFirstDayOfWeek,
enabledDayRangeStart, enabledDayRangeEnd);
- v.setPrevEnabled(position > 0);
- v.setNextEnabled(position < mCount - 1);
final ViewHolder holder = new ViewHolder(position, itemView, v);
mItems.put(position, holder);
@@ -298,17 +297,10 @@
setSelectedDay(day);
if (mOnDaySelectedListener != null) {
- mOnDaySelectedListener.onDaySelected(DayPickerAdapter.this, day);
+ mOnDaySelectedListener.onDaySelected(DayPickerPagerAdapter.this, day);
}
}
}
-
- @Override
- public void onNavigationClick(SimpleMonthView view, int direction, boolean animate) {
- if (mOnDaySelectedListener != null) {
- mOnDaySelectedListener.onNavigationClick(DayPickerAdapter.this, direction, animate);
- }
- }
};
private static class ViewHolder {
@@ -324,7 +316,6 @@
}
public interface OnDaySelectedListener {
- public void onDaySelected(DayPickerAdapter view, Calendar day);
- public void onNavigationClick(DayPickerAdapter view, int direction, boolean animate);
+ public void onDaySelected(DayPickerPagerAdapter view, Calendar day);
}
}
diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java
index 0e0b2d3..c6b4d7e 100644
--- a/core/java/android/widget/DayPickerView.java
+++ b/core/java/android/widget/DayPickerView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * 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.
@@ -16,37 +16,44 @@
package android.widget;
-import com.android.internal.widget.ViewPager;
import com.android.internal.R;
+import com.android.internal.widget.ViewPager;
+import com.android.internal.widget.ViewPager.OnPageChangeListener;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.MathUtils;
+import android.view.LayoutInflater;
import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityManager;
-import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import libcore.icu.LocaleData;
-/**
- * This displays a list of months in a calendar format with selectable days.
- */
-class DayPickerView extends ViewPager {
+class DayPickerView extends ViewGroup {
+ private static final int DEFAULT_LAYOUT = R.layout.day_picker_content_material;
private static final int DEFAULT_START_YEAR = 1900;
private static final int DEFAULT_END_YEAR = 2100;
+ private static final int[] ATTRS_TEXT_COLOR = new int[] { R.attr.textColor };
+
private final Calendar mSelectedDay = Calendar.getInstance();
private final Calendar mMinDate = Calendar.getInstance();
private final Calendar mMaxDate = Calendar.getInstance();
- private final ArrayList<View> mMatchParentChildren = new ArrayList<>(1);
+ private final AccessibilityManager mAccessibilityManager;
- private final DayPickerAdapter mAdapter;
+ private final ViewPager mViewPager;
+ private final ImageButton mPrevButton;
+ private final ImageButton mNextButton;
+
+ private final DayPickerPagerAdapter mAdapter;
/** Temporary calendar used for date calculations. */
private Calendar mTempCalendar;
@@ -57,17 +64,21 @@
this(context, null);
}
- public DayPickerView(Context context, AttributeSet attrs) {
+ public DayPickerView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, R.attr.calendarViewStyle);
}
- public DayPickerView(Context context, AttributeSet attrs, int defStyleAttr) {
+ public DayPickerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
- public DayPickerView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ public DayPickerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
+ mAccessibilityManager = (AccessibilityManager) context.getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.CalendarView, defStyleAttr, defStyleRes);
@@ -93,14 +104,44 @@
a.recycle();
// Set up adapter.
- mAdapter = new DayPickerAdapter(context,
+ mAdapter = new DayPickerPagerAdapter(context,
R.layout.date_picker_month_item_material, R.id.month_view);
mAdapter.setMonthTextAppearance(monthTextAppearanceResId);
mAdapter.setDayOfWeekTextAppearance(dayOfWeekTextAppearanceResId);
mAdapter.setDayTextAppearance(dayTextAppearanceResId);
mAdapter.setDaySelectorColor(daySelectorColor);
- setAdapter(mAdapter);
+ final LayoutInflater inflater = LayoutInflater.from(context);
+ final ViewGroup content = (ViewGroup) inflater.inflate(DEFAULT_LAYOUT, this, false);
+
+ // Transfer all children from content to here.
+ while (content.getChildCount() > 0) {
+ final View child = content.getChildAt(0);
+ content.removeViewAt(0);
+ addView(child);
+ }
+
+ mPrevButton = (ImageButton) findViewById(R.id.prev);
+ mPrevButton.setOnClickListener(mOnClickListener);
+
+ mNextButton = (ImageButton) findViewById(R.id.next);
+ mNextButton.setOnClickListener(mOnClickListener);
+
+ mViewPager = (ViewPager) findViewById(R.id.day_picker_view_pager);
+ mViewPager.setAdapter(mAdapter);
+ mViewPager.setOnPageChangeListener(mOnPageChangedListener);
+
+ // Proxy the month text color into the previous and next buttons.
+ if (monthTextAppearanceResId != 0) {
+ final TypedArray ta = mContext.obtainStyledAttributes(null,
+ ATTRS_TEXT_COLOR, 0, monthTextAppearanceResId);
+ final ColorStateList monthColor = ta.getColorStateList(0);
+ if (monthColor != null) {
+ mPrevButton.setImageTintList(monthColor);
+ mNextButton.setImageTintList(monthColor);
+ }
+ ta.recycle();
+ }
// Set up min and max dates.
final Calendar tempDate = Calendar.getInstance();
@@ -127,109 +168,68 @@
setDate(setDateMillis, false);
// Proxy selection callbacks to our own listener.
- mAdapter.setOnDaySelectedListener(new DayPickerAdapter.OnDaySelectedListener() {
+ mAdapter.setOnDaySelectedListener(new DayPickerPagerAdapter.OnDaySelectedListener() {
@Override
- public void onDaySelected(DayPickerAdapter adapter, Calendar day) {
+ public void onDaySelected(DayPickerPagerAdapter adapter, Calendar day) {
if (mOnDaySelectedListener != null) {
mOnDaySelectedListener.onDaySelected(DayPickerView.this, day);
}
}
-
- @Override
- public void onNavigationClick(DayPickerAdapter view, int direction, boolean animate) {
- // ViewPager clamps input values, so we don't need to worry
- // about passing invalid indices.
- final int nextItem = getCurrentItem() + direction;
- setCurrentItem(nextItem, animate);
- }
});
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- populate();
+ final ViewPager viewPager = mViewPager;
+ measureChild(viewPager, widthMeasureSpec, heightMeasureSpec);
- // Everything below is mostly copied from FrameLayout.
- int count = getChildCount();
+ final int measuredWidthAndState = viewPager.getMeasuredWidthAndState();
+ final int measuredHeightAndState = viewPager.getMeasuredHeightAndState();
+ setMeasuredDimension(measuredWidthAndState, measuredHeightAndState);
- final boolean measureMatchParentChildren =
- MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY ||
- MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY;
+ final int pagerWidth = viewPager.getMeasuredWidth();
+ final int pagerHeight = viewPager.getMeasuredHeight();
+ final int buttonWidthSpec = MeasureSpec.makeMeasureSpec(pagerWidth, MeasureSpec.AT_MOST);
+ final int buttonHeightSpec = MeasureSpec.makeMeasureSpec(pagerHeight, MeasureSpec.AT_MOST);
+ mPrevButton.measure(buttonWidthSpec, buttonHeightSpec);
+ mNextButton.measure(buttonWidthSpec, buttonHeightSpec);
+ }
- int maxHeight = 0;
- int maxWidth = 0;
- int childState = 0;
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ final ImageButton leftButton = mPrevButton;
+ final ImageButton rightButton = mNextButton;
- for (int i = 0; i < count; i++) {
- final View child = getChildAt(i);
- if (child.getVisibility() != GONE) {
- measureChild(child, widthMeasureSpec, heightMeasureSpec);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
- maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
- childState = combineMeasuredStates(childState, child.getMeasuredState());
- if (measureMatchParentChildren) {
- if (lp.width == LayoutParams.MATCH_PARENT ||
- lp.height == LayoutParams.MATCH_PARENT) {
- mMatchParentChildren.add(child);
- }
- }
- }
+ final int width = right - left;
+ final int height = bottom - top;
+ mViewPager.layout(0, 0, width, height);
+
+ if (mViewPager.getChildCount() < 1) {
+ leftButton.setVisibility(View.INVISIBLE);
+ rightButton.setVisibility(View.INVISIBLE);
+ return;
}
- // Account for padding too
- maxWidth += getPaddingLeft() + getPaddingRight();
- maxHeight += getPaddingTop() + getPaddingBottom();
+ final SimpleMonthView monthView = (SimpleMonthView) mViewPager.getChildAt(0);
+ final int monthHeight = monthView.getMonthHeight();
+ final int cellWidth = monthView.getCellWidth();
- // Check against our minimum height and width
- maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
- maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
+ // Vertically center the previous/next buttons within the month
+ // header, horizontally center within the day cell.
+ final int leftDW = leftButton.getMeasuredWidth();
+ final int leftDH = leftButton.getMeasuredHeight();
+ final int leftIconTop = monthView.getPaddingTop() + (monthHeight - leftDH) / 2;
+ final int leftIconLeft = monthView.getPaddingLeft() + (cellWidth - leftDW) / 2;
+ leftButton.layout(leftIconLeft, leftIconTop, leftIconLeft + leftDW, leftIconTop + leftDH);
+ leftButton.setVisibility(View.VISIBLE);
- // Check against our foreground's minimum height and width
- final Drawable drawable = getForeground();
- if (drawable != null) {
- maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
- maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
- }
-
- setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
- resolveSizeAndState(maxHeight, heightMeasureSpec,
- childState << MEASURED_HEIGHT_STATE_SHIFT));
-
- count = mMatchParentChildren.size();
- if (count > 1) {
- for (int i = 0; i < count; i++) {
- final View child = mMatchParentChildren.get(i);
-
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- final int childWidthMeasureSpec;
- final int childHeightMeasureSpec;
-
- if (lp.width == LayoutParams.MATCH_PARENT) {
- childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
- getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
- MeasureSpec.EXACTLY);
- } else {
- childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
- getPaddingLeft() + getPaddingRight(),
- lp.width);
- }
-
- if (lp.height == LayoutParams.MATCH_PARENT) {
- childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
- getMeasuredHeight() - getPaddingTop() - getPaddingBottom(),
- MeasureSpec.EXACTLY);
- } else {
- childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec,
- getPaddingTop() + getPaddingBottom(),
- lp.height);
- }
-
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
- }
- }
-
- mMatchParentChildren.clear();
+ final int rightDW = rightButton.getMeasuredWidth();
+ final int rightDH = rightButton.getMeasuredHeight();
+ final int rightIconTop = monthView.getPaddingTop() + (monthHeight - rightDH) / 2;
+ final int rightIconRight = width - monthView.getPaddingRight() - (cellWidth - rightDW) / 2;
+ rightButton.layout(rightIconRight - rightDW, rightIconTop,
+ rightIconRight, rightIconTop + rightDH);
+ rightButton.setVisibility(View.VISIBLE);
}
public void setDayOfWeekTextAppearance(int resId) {
@@ -284,8 +284,8 @@
}
final int position = getPositionFromDay(timeInMillis);
- if (position != getCurrentItem()) {
- setCurrentItem(position, animate);
+ if (position != mViewPager.getCurrentItem()) {
+ mViewPager.setCurrentItem(position, animate);
}
mTempCalendar.setTimeInMillis(timeInMillis);
@@ -365,10 +365,57 @@
* Gets the position of the view that is most prominently displayed within the list view.
*/
public int getMostVisiblePosition() {
- return getCurrentItem();
+ return mViewPager.getCurrentItem();
}
+ public void setPosition(int position) {
+ mViewPager.setCurrentItem(position, false);
+ }
+
+ private final OnPageChangeListener mOnPageChangedListener = new OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ final float alpha = Math.abs(0.5f - positionOffset) * 2.0f;
+ mPrevButton.setAlpha(alpha);
+ mNextButton.setAlpha(alpha);
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {}
+
+ @Override
+ public void onPageSelected(int position) {
+ mPrevButton.setVisibility(
+ position > 0 ? View.VISIBLE : View.INVISIBLE);
+ mNextButton.setVisibility(
+ position < (mAdapter.getCount() - 1) ? View.VISIBLE : View.INVISIBLE);
+ }
+ };
+
+ private final OnClickListener mOnClickListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ final int direction;
+ if (v == mPrevButton) {
+ direction = -1;
+ } else if (v == mNextButton) {
+ direction = 1;
+ } else {
+ return;
+ }
+
+ // Animation is expensive for accessibility services since it sends
+ // lots of scroll and content change events.
+ final boolean animate = !mAccessibilityManager.isEnabled();
+
+ // ViewPager clamps input values, so we don't need to worry
+ // about passing invalid indices.
+ final int nextItem = mViewPager.getCurrentItem() + direction;
+ mViewPager.setCurrentItem(nextItem, animate);
+ }
+ };
+
public interface OnDaySelectedListener {
- public void onDaySelected(DayPickerView view, Calendar day);
+ void onDaySelected(DayPickerView view, Calendar day);
}
}
diff --git a/core/java/android/widget/DayPickerViewPager.java b/core/java/android/widget/DayPickerViewPager.java
new file mode 100644
index 0000000..bb6e3a4
--- /dev/null
+++ b/core/java/android/widget/DayPickerViewPager.java
@@ -0,0 +1,137 @@
+/*
+ * 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 android.widget;
+
+import com.android.internal.widget.ViewPager;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+
+import java.util.ArrayList;
+
+/**
+ * This displays a list of months in a calendar format with selectable days.
+ */
+class DayPickerViewPager extends ViewPager {
+ private final ArrayList<View> mMatchParentChildren = new ArrayList<>(1);
+
+ public DayPickerViewPager(Context context) {
+ this(context, null);
+ }
+
+ public DayPickerViewPager(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public DayPickerViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public DayPickerViewPager(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ populate();
+
+ // Everything below is mostly copied from FrameLayout.
+ int count = getChildCount();
+
+ final boolean measureMatchParentChildren =
+ MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY ||
+ MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY;
+
+ int maxHeight = 0;
+ int maxWidth = 0;
+ int childState = 0;
+
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ measureChild(child, widthMeasureSpec, heightMeasureSpec);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
+ maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
+ childState = combineMeasuredStates(childState, child.getMeasuredState());
+ if (measureMatchParentChildren) {
+ if (lp.width == LayoutParams.MATCH_PARENT ||
+ lp.height == LayoutParams.MATCH_PARENT) {
+ mMatchParentChildren.add(child);
+ }
+ }
+ }
+ }
+
+ // Account for padding too
+ maxWidth += getPaddingLeft() + getPaddingRight();
+ maxHeight += getPaddingTop() + getPaddingBottom();
+
+ // Check against our minimum height and width
+ maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
+ maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
+
+ // Check against our foreground's minimum height and width
+ final Drawable drawable = getForeground();
+ if (drawable != null) {
+ maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
+ maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
+ }
+
+ setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
+ resolveSizeAndState(maxHeight, heightMeasureSpec,
+ childState << MEASURED_HEIGHT_STATE_SHIFT));
+
+ count = mMatchParentChildren.size();
+ if (count > 1) {
+ for (int i = 0; i < count; i++) {
+ final View child = mMatchParentChildren.get(i);
+
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ final int childWidthMeasureSpec;
+ final int childHeightMeasureSpec;
+
+ if (lp.width == LayoutParams.MATCH_PARENT) {
+ childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
+ getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
+ MeasureSpec.EXACTLY);
+ } else {
+ childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
+ getPaddingLeft() + getPaddingRight(),
+ lp.width);
+ }
+
+ if (lp.height == LayoutParams.MATCH_PARENT) {
+ childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
+ getMeasuredHeight() - getPaddingTop() - getPaddingBottom(),
+ MeasureSpec.EXACTLY);
+ } else {
+ childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec,
+ getPaddingTop() + getPaddingBottom(),
+ lp.height);
+ }
+
+ child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+ }
+ }
+
+ mMatchParentChildren.clear();
+ }
+}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 1be05f3..955ad06 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -17,6 +17,7 @@
package android.widget;
import android.R;
+import android.annotation.Nullable;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.ClipData;
@@ -1008,14 +1009,14 @@
stopSelectionActionMode();
} else {
stopSelectionActionMode();
- startSelectionActionModeWithSelection();
+ startSelectionActionModeWithSelectionAndStartDrag();
}
handled = true;
}
// Start a new selection
if (!handled) {
- handled = startSelectionActionModeWithSelection();
+ handled = startSelectionActionModeWithSelectionAndStartDrag();
}
return handled;
@@ -1281,74 +1282,79 @@
EXTRACT_UNKNOWN, outText);
}
- private boolean extractTextInternal(ExtractedTextRequest request,
+ private boolean extractTextInternal(@Nullable ExtractedTextRequest request,
int partialStartOffset, int partialEndOffset, int delta,
- ExtractedText outText) {
- final CharSequence content = mTextView.getText();
- if (content != null) {
- if (partialStartOffset != EXTRACT_NOTHING) {
- final int N = content.length();
- if (partialStartOffset < 0) {
- outText.partialStartOffset = outText.partialEndOffset = -1;
- partialStartOffset = 0;
- partialEndOffset = N;
- } else {
- // Now use the delta to determine the actual amount of text
- // we need.
- partialEndOffset += delta;
- // Adjust offsets to ensure we contain full spans.
- if (content instanceof Spanned) {
- Spanned spanned = (Spanned)content;
- Object[] spans = spanned.getSpans(partialStartOffset,
- partialEndOffset, ParcelableSpan.class);
- int i = spans.length;
- while (i > 0) {
- i--;
- int j = spanned.getSpanStart(spans[i]);
- if (j < partialStartOffset) partialStartOffset = j;
- j = spanned.getSpanEnd(spans[i]);
- if (j > partialEndOffset) partialEndOffset = j;
- }
- }
- outText.partialStartOffset = partialStartOffset;
- outText.partialEndOffset = partialEndOffset - delta;
-
- if (partialStartOffset > N) {
- partialStartOffset = N;
- } else if (partialStartOffset < 0) {
- partialStartOffset = 0;
- }
- if (partialEndOffset > N) {
- partialEndOffset = N;
- } else if (partialEndOffset < 0) {
- partialEndOffset = 0;
- }
- }
- if ((request.flags&InputConnection.GET_TEXT_WITH_STYLES) != 0) {
- outText.text = content.subSequence(partialStartOffset,
- partialEndOffset);
- } else {
- outText.text = TextUtils.substring(content, partialStartOffset,
- partialEndOffset);
- }
- } else {
- outText.partialStartOffset = 0;
- outText.partialEndOffset = 0;
- outText.text = "";
- }
- outText.flags = 0;
- if (MetaKeyKeyListener.getMetaState(content, MetaKeyKeyListener.META_SELECTING) != 0) {
- outText.flags |= ExtractedText.FLAG_SELECTING;
- }
- if (mTextView.isSingleLine()) {
- outText.flags |= ExtractedText.FLAG_SINGLE_LINE;
- }
- outText.startOffset = 0;
- outText.selectionStart = mTextView.getSelectionStart();
- outText.selectionEnd = mTextView.getSelectionEnd();
- return true;
+ @Nullable ExtractedText outText) {
+ if (request == null || outText == null) {
+ return false;
}
- return false;
+
+ final CharSequence content = mTextView.getText();
+ if (content == null) {
+ return false;
+ }
+
+ if (partialStartOffset != EXTRACT_NOTHING) {
+ final int N = content.length();
+ if (partialStartOffset < 0) {
+ outText.partialStartOffset = outText.partialEndOffset = -1;
+ partialStartOffset = 0;
+ partialEndOffset = N;
+ } else {
+ // Now use the delta to determine the actual amount of text
+ // we need.
+ partialEndOffset += delta;
+ // Adjust offsets to ensure we contain full spans.
+ if (content instanceof Spanned) {
+ Spanned spanned = (Spanned)content;
+ Object[] spans = spanned.getSpans(partialStartOffset,
+ partialEndOffset, ParcelableSpan.class);
+ int i = spans.length;
+ while (i > 0) {
+ i--;
+ int j = spanned.getSpanStart(spans[i]);
+ if (j < partialStartOffset) partialStartOffset = j;
+ j = spanned.getSpanEnd(spans[i]);
+ if (j > partialEndOffset) partialEndOffset = j;
+ }
+ }
+ outText.partialStartOffset = partialStartOffset;
+ outText.partialEndOffset = partialEndOffset - delta;
+
+ if (partialStartOffset > N) {
+ partialStartOffset = N;
+ } else if (partialStartOffset < 0) {
+ partialStartOffset = 0;
+ }
+ if (partialEndOffset > N) {
+ partialEndOffset = N;
+ } else if (partialEndOffset < 0) {
+ partialEndOffset = 0;
+ }
+ }
+ if ((request.flags&InputConnection.GET_TEXT_WITH_STYLES) != 0) {
+ outText.text = content.subSequence(partialStartOffset,
+ partialEndOffset);
+ } else {
+ outText.text = TextUtils.substring(content, partialStartOffset,
+ partialEndOffset);
+ }
+ } else {
+ outText.partialStartOffset = 0;
+ outText.partialEndOffset = 0;
+ outText.text = "";
+ }
+ outText.flags = 0;
+ if (MetaKeyKeyListener.getMetaState(content, MetaKeyKeyListener.META_SELECTING) != 0) {
+ outText.flags |= ExtractedText.FLAG_SELECTING;
+ }
+ if (mTextView.isSingleLine()) {
+ outText.flags |= ExtractedText.FLAG_SINGLE_LINE;
+ }
+ outText.startOffset = 0;
+ outText.selectionStart = mTextView.getSelectionStart();
+ outText.selectionEnd = mTextView.getSelectionEnd();
+ return true;
}
boolean reportExtractedText() {
@@ -1680,9 +1686,34 @@
}
/**
+ * Starts a Selection Action Mode with the current selection and enters drag mode. This should
+ * be used whenever the mode is started from a touch event.
+ *
+ * @return true if the selection mode was actually started.
+ */
+ private boolean startSelectionActionModeWithSelectionAndStartDrag() {
+ boolean selectionStarted = startSelectionActionModeWithSelectionInternal();
+ if (selectionStarted) {
+ getSelectionController().enterDrag();
+ }
+ return selectionStarted;
+ }
+
+ /**
+ * Starts a Selection Action Mode with the current selection and ensures the selection handles
+ * are shown. This should be used when the mode is started from a non-touch event.
+ *
* @return true if the selection mode was actually started.
*/
boolean startSelectionActionModeWithSelection() {
+ boolean selectionStarted = startSelectionActionModeWithSelectionInternal();
+ if (selectionStarted) {
+ getSelectionController().show();
+ }
+ return selectionStarted;
+ }
+
+ private boolean startSelectionActionModeWithSelectionInternal() {
if (mSelectionActionMode != null) {
// Selection action mode is already started
mSelectionActionMode.invalidate();
@@ -1721,10 +1752,6 @@
imm.showSoftInput(mTextView, 0, null);
}
}
-
- if (selectionStarted) {
- getSelectionController().enterDrag();
- }
return selectionStarted;
}
@@ -3093,6 +3120,7 @@
if (item.getIntent() != null
&& item.getIntent().getAction().equals(Intent.ACTION_PROCESS_TEXT)) {
item.getIntent().putExtra(Intent.EXTRA_PROCESS_TEXT, mTextView.getSelectedText());
+ mPreserveDetachedSelection = true;
mTextView.startActivityForResult(
item.getIntent(), TextView.PROCESS_TEXT_REQUEST_CODE);
return true;
@@ -4231,7 +4259,7 @@
boolean stayedInArea = distanceSquared < doubleTapSlop * doubleTapSlop;
if (stayedInArea && isPositionOnText(x, y)) {
- startSelectionActionModeWithSelection();
+ startSelectionActionModeWithSelectionAndStartDrag();
mDiscardNextActionUp = true;
}
}
diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java
index 4b5407a..552b274 100644
--- a/core/java/android/widget/FastScroller.java
+++ b/core/java/android/widget/FastScroller.java
@@ -662,7 +662,8 @@
final int adjMaxWidth = maxWidth - marginLeft - marginRight;
final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(adjMaxWidth, MeasureSpec.AT_MOST);
- final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(container.height(),
+ MeasureSpec.UNSPECIFIED);
view.measure(widthMeasureSpec, heightMeasureSpec);
// Align to the left or right.
@@ -701,7 +702,8 @@
final int containerWidth = container.width();
final int adjMaxWidth = containerWidth - marginLeft - marginRight;
final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(adjMaxWidth, MeasureSpec.AT_MOST);
- final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(container.height(),
+ MeasureSpec.UNSPECIFIED);
preview.measure(widthMeasureSpec, heightMeasureSpec);
// Align at the vertical center, 10% from the top.
@@ -766,7 +768,8 @@
final Rect container = mContainerRect;
final int maxWidth = container.width();
final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST);
- final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(container.height(),
+ MeasureSpec.UNSPECIFIED);
track.measure(widthMeasureSpec, heightMeasureSpec);
final int top;
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index be0ca71..9ecdc9c 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -1071,7 +1071,8 @@
p.forceAdd = true;
int childHeightSpec = getChildMeasureSpec(
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 0, p.height);
+ MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec),
+ MeasureSpec.UNSPECIFIED), 0, p.height);
int childWidthSpec = getChildMeasureSpec(
MeasureSpec.makeMeasureSpec(mColumnWidth, MeasureSpec.EXACTLY), 0, p.width);
child.measure(childWidthSpec, childHeightSpec);
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index da15302..72f51c9 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -1058,8 +1058,11 @@
// use as much space as it wants because we can shrink things
// later (and re-measure).
if (baselineAligned) {
- final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
- child.measure(freeSpec, freeSpec);
+ final int freeWidthSpec = MeasureSpec.makeMeasureSpec(
+ MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.UNSPECIFIED);
+ final int freeHeightSpec = MeasureSpec.makeMeasureSpec(
+ MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.UNSPECIFIED);
+ child.measure(freeWidthSpec, freeHeightSpec);
} else {
skippedMeasure = true;
}
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index def5929..a79c8e8 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -1155,7 +1155,7 @@
heightMode == MeasureSpec.UNSPECIFIED)) {
final View child = obtainView(0, mIsScrap);
- measureScrapChild(child, 0, widthMeasureSpec);
+ measureScrapChild(child, 0, widthMeasureSpec, heightSize);
childWidth = child.getMeasuredWidth();
childHeight = child.getMeasuredHeight();
@@ -1188,7 +1188,7 @@
mWidthMeasureSpec = widthMeasureSpec;
}
- private void measureScrapChild(View child, int position, int widthMeasureSpec) {
+ private void measureScrapChild(View child, int position, int widthMeasureSpec, int heightHint) {
LayoutParams p = (LayoutParams) child.getLayoutParams();
if (p == null) {
p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
@@ -1204,7 +1204,7 @@
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
} else {
- childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ childHeightSpec = MeasureSpec.makeMeasureSpec(heightHint, MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec, childHeightSpec);
}
@@ -1271,7 +1271,7 @@
for (i = startPosition; i <= endPosition; ++i) {
child = obtainView(i, isScrap);
- measureScrapChild(child, i, widthMeasureSpec);
+ measureScrapChild(child, i, widthMeasureSpec, maxHeight);
if (i > 0) {
// Count the divider for all but one child
@@ -1941,7 +1941,8 @@
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
} else {
- childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ childHeightSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight(),
+ MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec, childHeightSpec);
} else {
@@ -2695,7 +2696,8 @@
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
} else {
- childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ childHeightSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight(),
+ MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec, childHeightSpec);
}
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index 24e9cbe..b59ae17 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -43,6 +43,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
+import android.util.MathUtils;
import android.util.Pools.SynchronizedPool;
import android.view.Gravity;
import android.view.RemotableViewMethod;
@@ -1341,23 +1342,22 @@
}
@android.view.RemotableViewMethod
- synchronized void setProgress(int progress, boolean fromUser) {
+ synchronized boolean setProgress(int progress, boolean fromUser) {
if (mIndeterminate) {
- return;
+ // Not applicable.
+ return false;
}
- if (progress < 0) {
- progress = 0;
+ progress = MathUtils.constrain(progress, 0, mMax);
+
+ if (progress == mProgress) {
+ // No change from current.
+ return false;
}
- if (progress > mMax) {
- progress = mMax;
- }
-
- if (progress != mProgress) {
- mProgress = progress;
- refreshProgress(R.id.progress, mProgress, fromUser);
- }
+ mProgress = progress;
+ refreshProgress(R.id.progress, mProgress, fromUser);
+ return true;
}
/**
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index b95c27d..2026169 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -1238,7 +1238,8 @@
}
@Override
- protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {
+ protected void measureChild(View child, int parentWidthMeasureSpec,
+ int parentHeightMeasureSpec) {
ViewGroup.LayoutParams lp = child.getLayoutParams();
int childWidthMeasureSpec;
@@ -1247,7 +1248,8 @@
childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, mPaddingLeft
+ mPaddingRight, lp.width);
- childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
+ MeasureSpec.getSize(parentHeightMeasureSpec), MeasureSpec.UNSPECIFIED);
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
@@ -1261,7 +1263,7 @@
mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin
+ widthUsed, lp.width);
final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
- lp.topMargin + lp.bottomMargin, MeasureSpec.UNSPECIFIED);
+ MeasureSpec.getSize(parentHeightMeasureSpec), MeasureSpec.UNSPECIFIED);
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
diff --git a/core/java/android/widget/SimpleMonthView.java b/core/java/android/widget/SimpleMonthView.java
index aa7f0b6..0249c22 100644
--- a/core/java/android/widget/SimpleMonthView.java
+++ b/core/java/android/widget/SimpleMonthView.java
@@ -26,7 +26,6 @@
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextPaint;
import android.text.format.DateFormat;
@@ -60,12 +59,6 @@
private static final String DEFAULT_TITLE_FORMAT = "MMMMy";
private static final String DAY_OF_WEEK_FORMAT = "EEEEE";
- /** Virtual view ID for previous button. */
- private static final int ITEM_ID_PREV = 0x101;
-
- /** Virtual view ID for next button. */
- private static final int ITEM_ID_NEXT = 0x100;
-
private final TextPaint mMonthPaint = new TextPaint();
private final TextPaint mDayOfWeekPaint = new TextPaint();
private final TextPaint mDayPaint = new TextPaint();
@@ -87,14 +80,6 @@
private final int mDesiredCellWidth;
private final int mDesiredDaySelectorRadius;
- // Next/previous drawables.
- private final Drawable mPrevDrawable;
- private final Drawable mNextDrawable;
- private final Rect mPrevHitArea;
- private final Rect mNextHitArea;
- private final CharSequence mPrevContentDesc;
- private final CharSequence mNextContentDesc;
-
private CharSequence mTitle;
private int mMonth;
@@ -137,9 +122,6 @@
/** The day of month for the last (inclusive) enabled day. */
private int mEnabledDayEnd = 31;
- /** The number of week rows needed to display the current month. */
- private int mNumWeeks = MAX_WEEKS_IN_MONTH;
-
/** Optional listener for handling day click actions. */
private OnDayClickListener mOnDayClickListener;
@@ -147,9 +129,6 @@
private int mTouchedItem = -1;
- private boolean mPrevEnabled;
- private boolean mNextEnabled;
-
public SimpleMonthView(Context context) {
this(context, null);
}
@@ -170,14 +149,8 @@
mDesiredDayOfWeekHeight = res.getDimensionPixelSize(R.dimen.date_picker_day_of_week_height);
mDesiredDayHeight = res.getDimensionPixelSize(R.dimen.date_picker_day_height);
mDesiredCellWidth = res.getDimensionPixelSize(R.dimen.date_picker_day_width);
- mDesiredDaySelectorRadius = res.getDimensionPixelSize(R.dimen.date_picker_day_selector_radius);
-
- mPrevDrawable = context.getDrawable(R.drawable.ic_chevron_left);
- mNextDrawable = context.getDrawable(R.drawable.ic_chevron_right);
- mPrevHitArea = mPrevDrawable != null ? new Rect() : null;
- mNextHitArea = mNextDrawable != null ? new Rect() : null;
- mPrevContentDesc = res.getText(R.string.date_picker_prev_month_button);
- mNextContentDesc = res.getText(R.string.date_picker_next_month_button);
+ mDesiredDaySelectorRadius = res.getDimensionPixelSize(
+ R.dimen.date_picker_day_selector_radius);
// Set up accessibility components.
mTouchHelper = new MonthViewTouchHelper(this);
@@ -193,18 +166,6 @@
initPaints(res);
}
- public void setNextEnabled(boolean enabled) {
- mNextEnabled = enabled;
- mTouchHelper.invalidateRoot();
- invalidate();
- }
-
- public void setPrevEnabled(boolean enabled) {
- mPrevEnabled = enabled;
- mTouchHelper.invalidateRoot();
- invalidate();
- }
-
/**
* Applies the specified text appearance resource to a paint, returning the
* text color if one is set in the text appearance.
@@ -236,16 +197,16 @@
return textColor;
}
+ public int getMonthHeight() {
+ return mMonthHeight;
+ }
+
+ public int getCellWidth() {
+ return mCellWidth;
+ }
+
public void setMonthTextAppearance(int resId) {
- final ColorStateList monthColor = applyTextAppearance(mMonthPaint, resId);
- if (monthColor != null) {
- if (mPrevDrawable != null) {
- mPrevDrawable.setTintList(monthColor);
- }
- if (mNextDrawable != null) {
- mNextDrawable.setTintList(monthColor);
- }
- }
+ applyTextAppearance(mMonthPaint, resId);
invalidate();
}
@@ -360,7 +321,7 @@
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
- final int touchedItem = getItemAtLocation(x, y);
+ final int touchedItem = getDayAtLocation(x, y);
if (mTouchedItem != touchedItem) {
mTouchedItem = touchedItem;
invalidate();
@@ -368,8 +329,8 @@
break;
case MotionEvent.ACTION_UP:
- final int clickedItem = getItemAtLocation(x, y);
- onItemClicked(clickedItem, true);
+ final int clickedDay = getDayAtLocation(x, y);
+ onDayClicked(clickedDay);
// Fall through.
case MotionEvent.ACTION_CANCEL:
// Reset touched day on stream end.
@@ -389,7 +350,6 @@
drawMonth(canvas);
drawDaysOfWeek(canvas);
drawDays(canvas);
- drawButtons(canvas);
canvas.translate(-paddingLeft, -paddingTop);
}
@@ -482,16 +442,6 @@
}
}
- private void drawButtons(Canvas canvas) {
- if (mPrevEnabled && mPrevDrawable != null) {
- mPrevDrawable.draw(canvas);
- }
-
- if (mNextEnabled && mNextDrawable != null) {
- mNextDrawable.draw(canvas);
- }
- }
-
private static boolean isValidDayOfWeek(int day) {
return day >= Calendar.SUNDAY && day <= Calendar.SATURDAY;
}
@@ -674,33 +624,6 @@
mDaySelectorRadius = Math.min(mDesiredDaySelectorRadius,
Math.min(maxSelectorWidth, maxSelectorHeight));
- // Vertically center the previous/next drawables within the month
- // header, horizontally center within the day cell, then expand the
- // hit area to ensure it's at least 48x48dp.
- final Drawable prevDrawable = mPrevDrawable;
- if (prevDrawable != null) {
- final int dW = prevDrawable.getIntrinsicWidth();
- final int dH = prevDrawable.getIntrinsicHeight();
- final int iconTop = (monthHeight - dH) / 2;
- final int iconLeft = (cellWidth - dW) / 2;
-
- // Button bounds don't include padding, but hit area does.
- prevDrawable.setBounds(iconLeft, iconTop, iconLeft + dW, iconTop + dH);
- mPrevHitArea.set(0, 0, paddingLeft + cellWidth, paddingTop + monthHeight);
- }
-
- final Drawable nextDrawable = mNextDrawable;
- if (nextDrawable != null) {
- final int dW = nextDrawable.getIntrinsicWidth();
- final int dH = nextDrawable.getIntrinsicHeight();
- final int iconTop = (monthHeight - dH) / 2;
- final int iconRight = paddedWidth - (cellWidth - dW) / 2;
-
- // Button bounds don't include padding, but hit area does.
- nextDrawable.setBounds(iconRight - dW, iconTop, iconRight, iconTop + dH);
- mNextHitArea.set(paddedRight - cellWidth, 0, w, paddingTop + monthHeight);
- }
-
// Invalidate cached accessibility information.
mTouchHelper.invalidateRoot();
}
@@ -714,22 +637,15 @@
}
/**
- * Calculates the day of the month or item identifier at the specified
- * touch position. Returns the day of the month or -1 if the position
- * wasn't in a valid day.
+ * Calculates the day of the month at the specified touch position. Returns
+ * the day of the month or -1 if the position wasn't in a valid day.
*
* @param x the x position of the touch event
* @param y the y position of the touch event
- * @return the day of the month at (x, y), an item identifier, or -1 if the
- * position wasn't in a valid day or item
+ * @return the day of the month at (x, y), or -1 if the position wasn't in
+ * a valid day
*/
- private int getItemAtLocation(int x, int y) {
- if (mNextEnabled && mNextDrawable != null && mNextHitArea.contains(x, y)) {
- return ITEM_ID_NEXT;
- } else if (mPrevEnabled && mPrevDrawable != null && mPrevHitArea.contains(x, y)) {
- return ITEM_ID_PREV;
- }
-
+ private int getDayAtLocation(int x, int y) {
final int paddedX = x - getPaddingLeft();
if (paddedX < 0 || paddedX >= mPaddedWidth) {
return -1;
@@ -755,22 +671,10 @@
/**
* Calculates the bounds of the specified day.
*
- * @param id the day of the month, or an item identifier
+ * @param id the day of the month
* @param outBounds the rect to populate with bounds
*/
- private boolean getBoundsForItem(int id, Rect outBounds) {
- if (mNextEnabled && id == ITEM_ID_NEXT) {
- if (mNextDrawable != null) {
- outBounds.set(mNextHitArea);
- return true;
- }
- } else if (mPrevEnabled && id == ITEM_ID_PREV) {
- if (mPrevDrawable != null) {
- outBounds.set(mPrevHitArea);
- return true;
- }
- }
-
+ private boolean getBoundsForDay(int id, Rect outBounds) {
if (id < 1 || id > mDaysInMonth) {
return false;
}
@@ -789,16 +693,8 @@
final int top = getPaddingTop() + headerHeight + row * rowHeight;
outBounds.set(left, top, left + colWidth, top + rowHeight);
- return true;
- }
- /**
- * Called when an item is clicked.
- *
- * @param id the day number or item identifier
- */
- private boolean onItemClicked(int id, boolean animate) {
- return onNavigationClicked(id, animate) || onDayClicked(id);
+ return true;
}
/**
@@ -824,31 +720,6 @@
}
/**
- * Called when the user clicks on a navigation button. Handles callbacks to
- * the {@link OnDayClickListener} if one is set.
- *
- * @param id the item identifier
- */
- private boolean onNavigationClicked(int id, boolean animate) {
- final int direction;
- if (id == ITEM_ID_NEXT) {
- direction = 1;
- } else if (id == ITEM_ID_PREV) {
- direction = -1;
- } else {
- return false;
- }
-
- if (mOnDayClickListener != null) {
- mOnDayClickListener.onNavigationClick(this, direction, animate);
- }
-
- // This is a no-op if accessibility is turned off.
- mTouchHelper.sendEventForVirtualView(id, AccessibilityEvent.TYPE_VIEW_CLICKED);
- return true;
- }
-
- /**
* Provides a virtual view hierarchy for interfacing with an accessibility
* service.
*/
@@ -864,7 +735,7 @@
@Override
protected int getVirtualViewAt(float x, float y) {
- final int day = getItemAtLocation((int) (x + 0.5f), (int) (y + 0.5f));
+ final int day = getDayAtLocation((int) (x + 0.5f), (int) (y + 0.5f));
if (day >= 0) {
return day;
}
@@ -873,14 +744,6 @@
@Override
protected void getVisibleVirtualViews(IntArray virtualViewIds) {
- if (mNextEnabled && mNextDrawable != null) {
- virtualViewIds.add(ITEM_ID_PREV);
- }
-
- if (mPrevEnabled && mPrevDrawable != null) {
- virtualViewIds.add(ITEM_ID_NEXT);
- }
-
for (int day = 1; day <= mDaysInMonth; day++) {
virtualViewIds.add(day);
}
@@ -888,12 +751,12 @@
@Override
protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
- event.setContentDescription(getItemDescription(virtualViewId));
+ event.setContentDescription(getDayDescription(virtualViewId));
}
@Override
protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfo node) {
- final boolean hasBounds = getBoundsForItem(virtualViewId, mTempRect);
+ final boolean hasBounds = getBoundsForDay(virtualViewId, mTempRect);
if (!hasBounds) {
// The day is invalid, kill the node.
@@ -904,8 +767,8 @@
return;
}
- node.setText(getItemText(virtualViewId));
- node.setContentDescription(getItemDescription(virtualViewId));
+ node.setText(getDayText(virtualViewId));
+ node.setContentDescription(getDayDescription(virtualViewId));
node.setBoundsInParent(mTempRect);
node.addAction(AccessibilityAction.ACTION_CLICK);
@@ -921,7 +784,7 @@
Bundle arguments) {
switch (action) {
case AccessibilityNodeInfo.ACTION_CLICK:
- return onItemClicked(virtualViewId, false);
+ return onDayClicked(virtualViewId);
}
return false;
@@ -930,15 +793,11 @@
/**
* Generates a description for a given virtual view.
*
- * @param id the day or item identifier to generate a description for
+ * @param id the day to generate a description for
* @return a description of the virtual view
*/
- private CharSequence getItemDescription(int id) {
- if (id == ITEM_ID_NEXT) {
- return mNextContentDesc;
- } else if (id == ITEM_ID_PREV) {
- return mPrevContentDesc;
- } else if (id >= 1 && id <= mDaysInMonth) {
+ private CharSequence getDayDescription(int id) {
+ if (id >= 1 && id <= mDaysInMonth) {
mTempCalendar.set(mYear, mMonth, id);
return DateFormat.format(DATE_FORMAT, mTempCalendar.getTimeInMillis());
}
@@ -949,13 +808,11 @@
/**
* Generates displayed text for a given virtual view.
*
- * @param id the day or item identifier to generate text for
+ * @param id the day to generate text for
* @return the visible text of the virtual view
*/
- private CharSequence getItemText(int id) {
- if (id == ITEM_ID_NEXT || id == ITEM_ID_PREV) {
- return null;
- } else if (id >= 1 && id <= mDaysInMonth) {
+ private CharSequence getDayText(int id) {
+ if (id >= 1 && id <= mDaysInMonth) {
return Integer.toString(id);
}
@@ -967,7 +824,6 @@
* Handles callbacks when the user clicks on a time object.
*/
public interface OnDayClickListener {
- public void onDayClick(SimpleMonthView view, Calendar day);
- public void onNavigationClick(SimpleMonthView view, int direction, boolean animate);
+ void onDayClick(SimpleMonthView view, Calendar day);
}
}
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index 3746ec6..095cc44 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -811,9 +811,9 @@
View itemView = null;
int itemType = 0;
final int widthMeasureSpec =
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.UNSPECIFIED);
final int heightMeasureSpec =
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.UNSPECIFIED);
// Make sure the number of items we'll measure is capped. If it's a huge data set
// with wildly varying sizes, oh well.
diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java
index 9496e62..aa7168c 100644
--- a/core/java/android/widget/TabWidget.java
+++ b/core/java/android/widget/TabWidget.java
@@ -173,11 +173,12 @@
}
// First, measure with no constraint
- final int unspecifiedWidth = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ final int width = MeasureSpec.getSize(widthMeasureSpec);
+ final int unspecifiedWidth = MeasureSpec.makeMeasureSpec(width, MeasureSpec.UNSPECIFIED);
mImposedTabsHeight = -1;
super.measureHorizontal(unspecifiedWidth, heightMeasureSpec);
- int extraWidth = getMeasuredWidth() - MeasureSpec.getSize(widthMeasureSpec);
+ int extraWidth = getMeasuredWidth() - width;
if (extraWidth > 0) {
final int count = getChildCount();
diff --git a/core/java/android/widget/TableLayout.java b/core/java/android/widget/TableLayout.java
index 093bdcf..6fdd874 100644
--- a/core/java/android/widget/TableLayout.java
+++ b/core/java/android/widget/TableLayout.java
@@ -467,7 +467,7 @@
*/
@Override
void measureVertical(int widthMeasureSpec, int heightMeasureSpec) {
- findLargestCells(widthMeasureSpec);
+ findLargestCells(widthMeasureSpec, heightMeasureSpec);
shrinkAndStretchColumns(widthMeasureSpec);
super.measureVertical(widthMeasureSpec, heightMeasureSpec);
@@ -479,7 +479,7 @@
*
* @param widthMeasureSpec the measure constraint imposed by our parent
*/
- private void findLargestCells(int widthMeasureSpec) {
+ private void findLargestCells(int widthMeasureSpec, int heightMeasureSpec) {
boolean firstRow = true;
// find the maximum width for each column
@@ -502,7 +502,7 @@
final ViewGroup.LayoutParams layoutParams = row.getLayoutParams();
layoutParams.height = LayoutParams.WRAP_CONTENT;
- final int[] widths = row.getColumnsWidths(widthMeasureSpec);
+ final int[] widths = row.getColumnsWidths(widthMeasureSpec, heightMeasureSpec);
final int newLength = widths.length;
// this is the first row, we just need to copy the values
if (firstRow) {
diff --git a/core/java/android/widget/TableRow.java b/core/java/android/widget/TableRow.java
index faf5b84..f73ee49 100644
--- a/core/java/android/widget/TableRow.java
+++ b/core/java/android/widget/TableRow.java
@@ -283,7 +283,7 @@
* column, in this row
* {@hide}
*/
- int[] getColumnsWidths(int widthMeasureSpec) {
+ int[] getColumnsWidths(int widthMeasureSpec, int heightMeasureSpec) {
final int numColumns = getVirtualChildCount();
if (mColumnWidths == null || numColumns != mColumnWidths.length) {
mColumnWidths = new int[numColumns];
@@ -302,7 +302,9 @@
spec = getChildMeasureSpec(widthMeasureSpec, 0, LayoutParams.WRAP_CONTENT);
break;
case LayoutParams.MATCH_PARENT:
- spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ spec = MeasureSpec.makeMeasureSpec(
+ MeasureSpec.getSize(heightMeasureSpec),
+ MeasureSpec.UNSPECIFIED);
break;
default:
spec = MeasureSpec.makeMeasureSpec(layoutParams.width, MeasureSpec.EXACTLY);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index b44a886..726b89a 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -236,6 +236,9 @@
* @attr ref android.R.styleable#TextView_elegantTextHeight
* @attr ref android.R.styleable#TextView_letterSpacing
* @attr ref android.R.styleable#TextView_fontFeatureSettings
+ * @attr ref android.R.styleable#TextView_breakStrategy
+ * @attr ref android.R.styleable#TextView_leftIndents
+ * @attr ref android.R.styleable#TextView_rightIndents
*/
@RemoteView
public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {
@@ -551,6 +554,8 @@
private float mSpacingAdd = 0.0f;
private int mBreakStrategy;
+ private int[] mLeftIndents;
+ private int[] mRightIndents;
private int mMaximum = Integer.MAX_VALUE;
private int mMaxMode = LINES;
@@ -1146,6 +1151,17 @@
case com.android.internal.R.styleable.TextView_breakStrategy:
mBreakStrategy = a.getInt(attr, Layout.BREAK_STRATEGY_SIMPLE);
+ break;
+
+ case com.android.internal.R.styleable.TextView_leftIndents:
+ TypedArray margins = res.obtainTypedArray(a.getResourceId(attr, View.NO_ID));
+ mLeftIndents = parseDimensionArray(margins);
+ break;
+
+ case com.android.internal.R.styleable.TextView_rightIndents:
+ margins = res.obtainTypedArray(a.getResourceId(attr, View.NO_ID));
+ mRightIndents = parseDimensionArray(margins);
+ break;
}
}
a.recycle();
@@ -1421,6 +1437,17 @@
}
}
+ private int[] parseDimensionArray(TypedArray dimens) {
+ if (dimens == null) {
+ return null;
+ }
+ int[] result = new int[dimens.length()];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = dimens.getDimensionPixelSize(i, 0);
+ }
+ return result;
+ }
+
/**
* @hide
*/
@@ -1433,7 +1460,9 @@
if (isTextEditable()) {
replaceSelectionWithText(result);
} else {
- Toast.makeText(getContext(), String.valueOf(result), Toast.LENGTH_LONG).show();
+ if (result.length() > 0) {
+ Toast.makeText(getContext(), String.valueOf(result), Toast.LENGTH_LONG).show();
+ }
}
}
}
@@ -3019,6 +3048,51 @@
}
/**
+ * Set indents. Arguments are arrays holding an indent amount, one per line, measured in
+ * pixels. For lines past the last element in the array, the last element repeats.
+ *
+ * @param leftIndents array of indent values for left margin, in pixels
+ * @param rightIndents array of indent values for right margin, in pixels
+ *
+ * @see #getLeftIndents()
+ * @see #getRightIndents()
+ *
+ * @attr ref android.R.styleable#TextView_leftIndents
+ * @attr ref android.R.styleable#TextView_rightIndents
+ */
+ public void setIndents(@Nullable int[] leftIndents, @Nullable int[] rightIndents) {
+ mLeftIndents = leftIndents;
+ mRightIndents = rightIndents;
+ if (mLayout != null) {
+ nullLayouts();
+ requestLayout();
+ invalidate();
+ }
+ }
+
+ /**
+ * Get left indents. See {#link setMargins} for more details.
+ *
+ * @return left indents
+ * @see #setIndents(int[], int[])
+ * @attr ref android.R.styleable#TextView_leftIndents
+ */
+ public int[] getLeftIndents() {
+ return mLeftIndents;
+ }
+
+ /**
+ * Get right indents. See {#link setMargins} for more details.
+ *
+ * @return right indents
+ * @see #setIndents(int[], int[])
+ * @attr ref android.R.styleable#TextView_rightIndents
+ */
+ public int[] getRightIndents() {
+ return mRightIndents;
+ }
+
+ /**
* Sets font feature settings. The format is the same as the CSS
* font-feature-settings attribute:
* http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings
@@ -6564,6 +6638,9 @@
.setSpacingAdd(mSpacingAdd)
.setIncludePad(mIncludePad)
.setBreakStrategy(mBreakStrategy);
+ if (mLeftIndents != null || mRightIndents != null) {
+ builder.setIndents(mLeftIndents, mRightIndents);
+ }
if (shouldEllipsize) {
builder.setEllipsize(mEllipsize)
.setEllipsizedWidth(ellipsisWidth)
@@ -6652,6 +6729,9 @@
.setSpacingAdd(mSpacingAdd)
.setIncludePad(mIncludePad)
.setBreakStrategy(mBreakStrategy);
+ if (mLeftIndents != null || mRightIndents != null) {
+ builder.setIndents(mLeftIndents, mRightIndents);
+ }
if (shouldEllipsize) {
builder.setEllipsize(effectiveEllipsize)
.setEllipsizedWidth(ellipsisWidth)
@@ -9124,6 +9204,7 @@
void replaceSelectionWithText(CharSequence text) {
((Editable) mText).replace(getSelectionStart(), getSelectionEnd(), text);
+ mEditor.startSelectionActionModeWithSelection();
}
/**
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 4f0e29e..7c5c565 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -95,9 +95,6 @@
void noteWifiState(int wifiState, String accessPoint);
void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth);
void noteWifiRssiChanged(int newRssi);
- void noteBluetoothOn();
- void noteBluetoothOff();
- void noteBluetoothState(int bluetoothState);
void noteFullWifiLockAcquired(int uid);
void noteFullWifiLockReleased(int uid);
void noteWifiScanStarted(int uid);
diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java
index 255f1fd..b04ddf4 100644
--- a/core/java/com/android/internal/content/PackageHelper.java
+++ b/core/java/com/android/internal/content/PackageHelper.java
@@ -361,7 +361,7 @@
VolumeInfo bestCandidate = null;
long bestCandidateAvailBytes = Long.MIN_VALUE;
for (VolumeInfo vol : storageManager.getVolumes()) {
- if (vol.type == VolumeInfo.TYPE_PRIVATE && vol.state == VolumeInfo.STATE_MOUNTED) {
+ if (vol.type == VolumeInfo.TYPE_PRIVATE && vol.isMountedWritable()) {
final long availBytes = storageManager.getStorageBytesUntilLow(new File(vol.path));
if (availBytes >= sizeBytes) {
allCandidates.add(vol.fsUuid);
diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java
index 59dbec6..a53d46c 100644
--- a/core/java/com/android/internal/os/BatteryStatsHelper.java
+++ b/core/java/com/android/internal/os/BatteryStatsHelper.java
@@ -136,6 +136,14 @@
profile.getAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_TX) != 0;
}
+ public static boolean checkHasBluetoothPowerReporting(BatteryStats stats,
+ PowerProfile profile) {
+ return stats.hasBluetoothActivityReporting() &&
+ profile.getAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_IDLE) != 0 &&
+ profile.getAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_RX) != 0 &&
+ profile.getAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_TX) != 0;
+ }
+
public BatteryStatsHelper(Context context) {
this(context, true);
}
@@ -256,7 +264,8 @@
}
public static String makemAh(double power) {
- if (power < .00001) return String.format("%.8f", power);
+ if (power == 0) return "0";
+ else if (power < .00001) return String.format("%.8f", power);
else if (power < .0001) return String.format("%.7f", power);
else if (power < .001) return String.format("%.6f", power);
else if (power < .01) return String.format("%.5f", power);
@@ -342,7 +351,11 @@
mWifiPowerCalculator.reset();
if (mBluetoothPowerCalculator == null) {
- mBluetoothPowerCalculator = new BluetoothPowerCalculator();
+ if (checkHasBluetoothPowerReporting(mStats, mPowerProfile)) {
+ mBluetoothPowerCalculator = new BluetoothPowerCalculator();
+ } else {
+ mBluetoothPowerCalculator = new BluetoothPowerCalculator();
+ }
}
mBluetoothPowerCalculator.reset();
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 87605f6..405c861 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -19,8 +19,6 @@
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
@@ -84,7 +82,6 @@
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
@@ -107,7 +104,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 123 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 125 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -176,7 +173,7 @@
}
public interface ExternalStatsSync {
- void scheduleSync();
+ void scheduleSync(String reason);
}
public final MyHandler mHandler;
@@ -250,6 +247,8 @@
int mNumHistoryTagChars = 0;
int mHistoryBufferLastPos = -1;
boolean mHistoryOverflow = false;
+ int mActiveHistoryStates = 0xffffffff;
+ int mActiveHistoryStates2 = 0xffffffff;
long mLastHistoryElapsedRealtime = 0;
long mTrackRunningHistoryElapsedRealtime = 0;
long mTrackRunningHistoryUptime = 0;
@@ -313,7 +312,7 @@
int mWakeLockNesting;
boolean mWakeLockImportant;
- boolean mRecordAllHistory;
+ public boolean mRecordAllHistory;
boolean mNoAutoReset;
int mScreenState = Display.STATE_UNKNOWN;
@@ -384,12 +383,6 @@
final StopwatchTimer[] mWifiSignalStrengthsTimer =
new StopwatchTimer[NUM_WIFI_SIGNAL_STRENGTH_BINS];
- boolean mBluetoothOn;
- StopwatchTimer mBluetoothOnTimer;
-
- int mBluetoothState = -1;
- final StopwatchTimer[] mBluetoothStateTimer = new StopwatchTimer[NUM_BLUETOOTH_STATES];
-
int mMobileRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
long mMobileRadioActiveStartTime;
StopwatchTimer mMobileRadioActiveTimer;
@@ -398,8 +391,7 @@
LongSamplingCounter mMobileRadioActiveUnknownTime;
LongSamplingCounter mMobileRadioActiveUnknownCount;
- /** Bluetooth headset object */
- BluetoothHeadset mBtHeadset;
+ int mWifiRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
/**
* These provide time bases that discount the time the device is plugged
@@ -458,9 +450,6 @@
long mLastWriteTime = 0; // Milliseconds
- private int mBluetoothPingCount;
- private int mBluetoothPingStart = -1;
-
private int mPhoneServiceState = -1;
private int mPhoneServiceStateRaw = -1;
private int mPhoneSimStateRaw = -1;
@@ -1803,32 +1792,6 @@
return kwlt;
}
- private int getCurrentBluetoothPingCount() {
- if (mBtHeadset != null) {
- List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices();
- if (deviceList.size() > 0) {
- return mBtHeadset.getBatteryUsageHint(deviceList.get(0));
- }
- }
- return -1;
- }
-
- public int getBluetoothPingCount() {
- if (mBluetoothPingStart == -1) {
- return mBluetoothPingCount;
- } else if (mBtHeadset != null) {
- return getCurrentBluetoothPingCount() - mBluetoothPingStart;
- }
- return 0;
- }
-
- public void setBtHeadset(BluetoothHeadset headset) {
- if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) {
- mBluetoothPingStart = getCurrentBluetoothPingCount();
- }
- mBtHeadset = headset;
- }
-
private int writeHistoryTag(HistoryTag tag) {
Integer idxObj = mHistoryTagPool.get(tag);
int idx;
@@ -2259,8 +2222,8 @@
}
final long timeDiff = (mHistoryBaseTime+elapsedRealtimeMs) - mHistoryLastWritten.time;
- final int diffStates = mHistoryLastWritten.states^cur.states;
- final int diffStates2 = mHistoryLastWritten.states2^cur.states2;
+ final int diffStates = mHistoryLastWritten.states^(cur.states&mActiveHistoryStates);
+ final int diffStates2 = mHistoryLastWritten.states2^(cur.states2&mActiveHistoryStates2);
final int lastDiffStates = mHistoryLastWritten.states^mHistoryLastLastWritten.states;
final int lastDiffStates2 = mHistoryLastWritten.states2^mHistoryLastLastWritten.states2;
if (DEBUG) Slog.i(TAG, "ADD: tdelta=" + timeDiff + " diff="
@@ -2325,11 +2288,32 @@
return;
}
+ // After overflow, we allow various bit-wise states to settle to 0.
+ boolean writeAnyway = false;
+ final int curStates = cur.states & HistoryItem.SETTLE_TO_ZERO_STATES
+ & mActiveHistoryStates;
+ if (mHistoryLastWritten.states != curStates) {
+ // mActiveHistoryStates keeps track of which bits in .states are now being
+ // forced to 0.
+ int old = mActiveHistoryStates;
+ mActiveHistoryStates &= curStates | ~HistoryItem.SETTLE_TO_ZERO_STATES;
+ writeAnyway |= old != mActiveHistoryStates;
+ }
+ final int curStates2 = cur.states2 & HistoryItem.SETTLE_TO_ZERO_STATES2
+ & mActiveHistoryStates2;
+ if (mHistoryLastWritten.states2 != curStates2) {
+ // mActiveHistoryStates2 keeps track of which bits in .states2 are now being
+ // forced to 0.
+ int old = mActiveHistoryStates2;
+ mActiveHistoryStates2 &= curStates2 | ~HistoryItem.SETTLE_TO_ZERO_STATES2;
+ writeAnyway |= old != mActiveHistoryStates2;
+ }
+
// Once we've reached the maximum number of items, we only
// record changes to the battery level and the most interesting states.
// Once we've reached the maximum maximum number of items, we only
// record changes to the battery level.
- if (mHistoryLastWritten.batteryLevel == cur.batteryLevel &&
+ if (!writeAnyway && mHistoryLastWritten.batteryLevel == cur.batteryLevel &&
(dataSize >= MAX_MAX_HISTORY_BUFFER
|| ((mHistoryLastWritten.states^cur.states)
& HistoryItem.MOST_INTERESTING_STATES) == 0
@@ -2360,6 +2344,8 @@
mHistoryBufferLastPos = mHistoryBuffer.dataPosition();
mHistoryLastLastWritten.setTo(mHistoryLastWritten);
mHistoryLastWritten.setTo(mHistoryBaseTime + elapsedRealtimeMs, cmd, cur);
+ mHistoryLastWritten.states &= mActiveHistoryStates;
+ mHistoryLastWritten.states2 &= mActiveHistoryStates2;
writeHistoryDelta(mHistoryBuffer, mHistoryLastWritten, mHistoryLastLastWritten);
mLastHistoryElapsedRealtime = elapsedRealtimeMs;
cur.wakelockTag = null;
@@ -2411,8 +2397,8 @@
// into one record.
if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE
&& (mHistoryBaseTime+elapsedRealtimeMs) < (mHistoryEnd.time+1000)
- && ((mHistoryEnd.states^cur.states)&mChangedStates) == 0
- && ((mHistoryEnd.states2^cur.states2)&mChangedStates2) == 0) {
+ && ((mHistoryEnd.states^cur.states)&mChangedStates&mActiveHistoryStates) == 0
+ && ((mHistoryEnd.states2^cur.states2)&mChangedStates2&mActiveHistoryStates2) == 0) {
// If the current is the same as the one before, then we no
// longer need the entry.
if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE
@@ -2424,8 +2410,8 @@
mHistoryEnd = mHistoryLastEnd;
mHistoryLastEnd = null;
} else {
- mChangedStates |= mHistoryEnd.states^cur.states;
- mChangedStates2 |= mHistoryEnd.states^cur.states2;
+ mChangedStates |= mHistoryEnd.states^(cur.states&mActiveHistoryStates);
+ mChangedStates2 |= mHistoryEnd.states^(cur.states2&mActiveHistoryStates2);
mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, cur);
}
return;
@@ -2447,7 +2433,7 @@
if (mHistoryEnd != null && mHistoryEnd.batteryLevel
== cur.batteryLevel &&
(mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS
- || ((mHistoryEnd.states^cur.states)
+ || ((mHistoryEnd.states^(cur.states&mActiveHistoryStates))
& HistoryItem.MOST_INTERESTING_STATES) == 0)) {
return;
}
@@ -2456,7 +2442,7 @@
addHistoryRecordLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE);
}
- void addHistoryEventLocked(long elapsedRealtimeMs, long uptimeMs, int code,
+ public void addHistoryEventLocked(long elapsedRealtimeMs, long uptimeMs, int code,
String name, int uid) {
mHistoryCur.eventCode = code;
mHistoryCur.eventTag = mHistoryCur.localEventTag;
@@ -2515,23 +2501,15 @@
mNumHistoryTagChars = 0;
mHistoryBufferLastPos = -1;
mHistoryOverflow = false;
+ mActiveHistoryStates = 0xffffffff;
+ mActiveHistoryStates2 = 0xffffffff;
mLastRecordedClockTime = 0;
mLastRecordedClockRealtime = 0;
}
public void updateTimeBasesLocked(boolean unplugged, boolean screenOff, long uptime,
long realtime) {
- if (mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime)) {
- if (unplugged) {
- // Track bt headset ping count
- mBluetoothPingStart = getCurrentBluetoothPingCount();
- mBluetoothPingCount = 0;
- } else {
- // Track bt headset ping count
- mBluetoothPingCount = getBluetoothPingCount();
- mBluetoothPingStart = -1;
- }
- }
+ mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime);
boolean unpluggedScreenOff = unplugged && screenOff;
if (unpluggedScreenOff != mOnBatteryScreenOffTimeBase.isRunning()) {
@@ -3396,7 +3374,7 @@
if (!mPhoneOn) {
final long elapsedRealtime = SystemClock.elapsedRealtime();
final long uptime = SystemClock.uptimeMillis();
- mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG;
+ mHistoryCur.states2 |= HistoryItem.STATE2_PHONE_IN_CALL_FLAG;
if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: "
+ Integer.toHexString(mHistoryCur.states));
addHistoryRecordLocked(elapsedRealtime, uptime);
@@ -3409,7 +3387,7 @@
if (mPhoneOn) {
final long elapsedRealtime = SystemClock.elapsedRealtime();
final long uptime = SystemClock.uptimeMillis();
- mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG;
+ mHistoryCur.states2 &= ~HistoryItem.STATE2_PHONE_IN_CALL_FLAG;
if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: "
+ Integer.toHexString(mHistoryCur.states));
addHistoryRecordLocked(elapsedRealtime, uptime);
@@ -3626,7 +3604,7 @@
addHistoryRecordLocked(elapsedRealtime, uptime);
mWifiOn = true;
mWifiOnTimer.startRunningLocked(elapsedRealtime);
- scheduleSyncExternalStatsLocked();
+ scheduleSyncExternalStatsLocked("wifi-off");
}
}
@@ -3640,7 +3618,7 @@
addHistoryRecordLocked(elapsedRealtime, uptime);
mWifiOn = false;
mWifiOnTimer.stopRunningLocked(elapsedRealtime);
- scheduleSyncExternalStatsLocked();
+ scheduleSyncExternalStatsLocked("wifi-on");
}
}
@@ -3788,6 +3766,25 @@
}
}
+ public void noteWifiRadioPowerState(int powerState, long timestampNs) {
+ final long elapsedRealtime = SystemClock.elapsedRealtime();
+ final long uptime = SystemClock.uptimeMillis();
+ if (mWifiRadioPowerState != powerState) {
+ final boolean active =
+ powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM
+ || powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH;
+ if (active) {
+ mHistoryCur.states |= HistoryItem.STATE_WIFI_RADIO_ACTIVE_FLAG;
+ } else {
+ mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RADIO_ACTIVE_FLAG;
+ }
+ if (DEBUG_HISTORY) Slog.v(TAG, "Wifi network active " + active + " to: "
+ + Integer.toHexString(mHistoryCur.states));
+ addHistoryRecordLocked(elapsedRealtime, uptime);
+ mWifiRadioPowerState = powerState;
+ }
+ }
+
public void noteWifiRunningLocked(WorkSource ws) {
if (!mGlobalWifiRunning) {
final long elapsedRealtime = SystemClock.elapsedRealtime();
@@ -3803,7 +3800,7 @@
int uid = mapUid(ws.get(i));
getUidStatsLocked(uid).noteWifiRunningLocked(elapsedRealtime);
}
- scheduleSyncExternalStatsLocked();
+ scheduleSyncExternalStatsLocked("wifi-running");
} else {
Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running");
}
@@ -3842,7 +3839,7 @@
int uid = mapUid(ws.get(i));
getUidStatsLocked(uid).noteWifiStoppedLocked(elapsedRealtime);
}
- scheduleSyncExternalStatsLocked();
+ scheduleSyncExternalStatsLocked("wifi-stopped");
} else {
Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running");
}
@@ -3857,7 +3854,7 @@
}
mWifiState = wifiState;
mWifiStateTimer[wifiState].startRunningLocked(elapsedRealtime);
- scheduleSyncExternalStatsLocked();
+ scheduleSyncExternalStatsLocked("wifi-state");
}
}
@@ -3919,46 +3916,6 @@
}
}
- public void noteBluetoothOnLocked() {
- if (!mBluetoothOn) {
- final long elapsedRealtime = SystemClock.elapsedRealtime();
- final long uptime = SystemClock.uptimeMillis();
- mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG;
- if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: "
- + Integer.toHexString(mHistoryCur.states));
- addHistoryRecordLocked(elapsedRealtime, uptime);
- mBluetoothOn = true;
- mBluetoothOnTimer.startRunningLocked(elapsedRealtime);
- scheduleSyncExternalStatsLocked();
- }
- }
-
- public void noteBluetoothOffLocked() {
- if (mBluetoothOn) {
- final long elapsedRealtime = SystemClock.elapsedRealtime();
- final long uptime = SystemClock.uptimeMillis();
- mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG;
- if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: "
- + Integer.toHexString(mHistoryCur.states));
- addHistoryRecordLocked(elapsedRealtime, uptime);
- mBluetoothOn = false;
- mBluetoothOnTimer.stopRunningLocked(elapsedRealtime);
- scheduleSyncExternalStatsLocked();
- }
- }
-
- public void noteBluetoothStateLocked(int bluetoothState) {
- if (DEBUG) Log.i(TAG, "Bluetooth state -> " + bluetoothState);
- if (mBluetoothState != bluetoothState) {
- final long elapsedRealtime = SystemClock.elapsedRealtime();
- if (mBluetoothState >= 0) {
- mBluetoothStateTimer[mBluetoothState].stopRunningLocked(elapsedRealtime);
- }
- mBluetoothState = bluetoothState;
- mBluetoothStateTimer[bluetoothState].startRunningLocked(elapsedRealtime);
- }
- }
-
int mWifiFullLockNesting = 0;
public void noteFullWifiLockAcquiredLocked(int uid) {
@@ -4313,20 +4270,6 @@
return mWifiSignalStrengthsTimer[strengthBin].getCountLocked(which);
}
- @Override public long getBluetoothOnTime(long elapsedRealtimeUs, int which) {
- return mBluetoothOnTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
- }
-
- @Override public long getBluetoothStateTime(int bluetoothState,
- long elapsedRealtimeUs, int which) {
- return mBluetoothStateTimer[bluetoothState].getTotalTimeLocked(
- elapsedRealtimeUs, which);
- }
-
- @Override public int getBluetoothStateCount(int bluetoothState, int which) {
- return mBluetoothStateTimer[bluetoothState].getCountLocked(which);
- }
-
@Override public boolean hasBluetoothActivityReporting() {
return mHasBluetoothEnergyReporting;
}
@@ -6780,10 +6723,6 @@
mWifiSignalStrengthsTimer[i] = new StopwatchTimer(null, -800-i, null,
mOnBatteryTimeBase);
}
- mBluetoothOnTimer = new StopwatchTimer(null, -6, null, mOnBatteryTimeBase);
- for (int i=0; i< NUM_BLUETOOTH_STATES; i++) {
- mBluetoothStateTimer[i] = new StopwatchTimer(null, -500-i, null, mOnBatteryTimeBase);
- }
mAudioOnTimer = new StopwatchTimer(null, -7, null, mOnBatteryTimeBase);
mVideoOnTimer = new StopwatchTimer(null, -8, null, mOnBatteryTimeBase);
mFlashlightOnTimer = new StopwatchTimer(null, -9, null, mOnBatteryTimeBase);
@@ -7399,10 +7338,6 @@
for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
mWifiSignalStrengthsTimer[i].reset(false);
}
- mBluetoothOnTimer.reset(false);
- for (int i=0; i< NUM_BLUETOOTH_STATES; i++) {
- mBluetoothStateTimer[i].reset(false);
- }
for (int i=0; i< NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
mBluetoothActivityCounters[i].reset(false);
mWifiActivityCounters[i].reset(false);
@@ -7727,16 +7662,12 @@
mWifiActivityCounters[CONTROLLER_IDLE_TIME].addCountLocked(
info.getControllerIdleTimeMillis());
- final double powerDrainMaMs;
- if (mPowerProfile.getAveragePower(
- PowerProfile.POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE) == 0) {
- powerDrainMaMs = 0.0;
- } else {
- powerDrainMaMs = info.getControllerEnergyUsed()
- / mPowerProfile.getAveragePower(
- PowerProfile.POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE);
+ final double opVoltage = mPowerProfile.getAveragePower(
+ PowerProfile.POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE);
+ if (opVoltage != 0) {
+ mWifiActivityCounters[CONTROLLER_POWER_DRAIN].addCountLocked(
+ (long)(info.getControllerEnergyUsed() / opVoltage));
}
- mWifiActivityCounters[CONTROLLER_POWER_DRAIN].addCountLocked((long) powerDrainMaMs);
}
}
@@ -7824,8 +7755,13 @@
info.getControllerTxTimeMillis());
mBluetoothActivityCounters[CONTROLLER_IDLE_TIME].addCountLocked(
info.getControllerIdleTimeMillis());
- mBluetoothActivityCounters[CONTROLLER_POWER_DRAIN].addCountLocked(
- info.getControllerEnergyUsed());
+
+ final double opVoltage = mPowerProfile.getAveragePower(
+ PowerProfile.POWER_BLUETOOTH_CONTROLLER_OPERATING_VOLTAGE);
+ if (opVoltage != 0) {
+ mBluetoothActivityCounters[CONTROLLER_POWER_DRAIN].addCountLocked(
+ (long) (info.getControllerEnergyUsed() / opVoltage));
+ }
}
}
@@ -7871,9 +7807,9 @@
if (mCharging != charging) {
mCharging = charging;
if (charging) {
- mHistoryCur.states |= HistoryItem.STATE_CHARGING_FLAG;
+ mHistoryCur.states2 |= HistoryItem.STATE2_CHARGING_FLAG;
} else {
- mHistoryCur.states &= ~HistoryItem.STATE_CHARGING_FLAG;
+ mHistoryCur.states2 &= ~HistoryItem.STATE2_CHARGING_FLAG;
}
mHandler.sendEmptyMessage(MSG_REPORT_CHARGING);
return true;
@@ -8039,9 +7975,9 @@
}
}
- private void scheduleSyncExternalStatsLocked() {
+ private void scheduleSyncExternalStatsLocked(String reason) {
if (mExternalSync != null) {
- mExternalSync.scheduleSync();
+ mExternalSync.scheduleSync(reason);
}
}
@@ -8067,7 +8003,7 @@
}
}
// Always start out assuming charging, that will be updated later.
- mHistoryCur.states |= HistoryItem.STATE_CHARGING_FLAG;
+ mHistoryCur.states2 |= HistoryItem.STATE2_CHARGING_FLAG;
mHistoryCur.batteryStatus = (byte)status;
mHistoryCur.batteryLevel = (byte)level;
mMaxChargeStepLevel = mMinDischargeStepLevel =
@@ -8109,7 +8045,7 @@
// TODO(adamlesinski): Schedule the creation of a HistoryStepDetails record
// which will pull external stats.
- scheduleSyncExternalStatsLocked();
+ scheduleSyncExternalStatsLocked("battery-level");
}
if (mHistoryCur.batteryStatus != status) {
mHistoryCur.batteryStatus = (byte)status;
@@ -8910,6 +8846,7 @@
mMobileRadioActiveAdjustedTime.readSummaryFromParcelLocked(in);
mMobileRadioActiveUnknownTime.readSummaryFromParcelLocked(in);
mMobileRadioActiveUnknownCount.readSummaryFromParcelLocked(in);
+ mWifiRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
mWifiOn = false;
mWifiOnTimer.readSummaryFromParcelLocked(in);
mGlobalWifiRunning = false;
@@ -8923,16 +8860,9 @@
for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
mWifiSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
}
- mBluetoothOn = false;
- mBluetoothOnTimer.readSummaryFromParcelLocked(in);
- for (int i=0; i< NUM_BLUETOOTH_STATES; i++) {
- mBluetoothStateTimer[i].readSummaryFromParcelLocked(in);
- }
-
for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
mBluetoothActivityCounters[i].readSummaryFromParcelLocked(in);
}
-
for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
mWifiActivityCounters[i].readSummaryFromParcelLocked(in);
}
@@ -9246,10 +9176,6 @@
for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
mWifiSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
}
- mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
- for (int i=0; i< NUM_BLUETOOTH_STATES; i++) {
- mBluetoothStateTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
- }
for (int i=0; i< NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
mBluetoothActivityCounters[i].writeSummaryFromParcelLocked(out);
}
@@ -9542,6 +9468,7 @@
mMobileRadioActiveAdjustedTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
mMobileRadioActiveUnknownTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
mMobileRadioActiveUnknownCount = new LongSamplingCounter(mOnBatteryTimeBase, in);
+ mWifiRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
mWifiOn = false;
mWifiOnTimer = new StopwatchTimer(null, -4, null, mOnBatteryTimeBase, in);
mGlobalWifiRunning = false;
@@ -9558,17 +9485,9 @@
mWifiSignalStrengthsTimer[i] = new StopwatchTimer(null, -800-i,
null, mOnBatteryTimeBase, in);
}
- mBluetoothOn = false;
- mBluetoothOnTimer = new StopwatchTimer(null, -6, null, mOnBatteryTimeBase, in);
- for (int i=0; i< NUM_BLUETOOTH_STATES; i++) {
- mBluetoothStateTimer[i] = new StopwatchTimer(null, -500-i,
- null, mOnBatteryTimeBase, in);
- }
-
for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
mBluetoothActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase, in);
}
-
for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
mWifiActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase, in);
}
@@ -9598,9 +9517,6 @@
mChargeStepTracker.readFromParcel(in);
mLastWriteTime = in.readLong();
- mBluetoothPingCount = in.readInt();
- mBluetoothPingStart = -1;
-
mKernelWakelockStats.clear();
int NKW = in.readInt();
for (int ikw = 0; ikw < NKW; ikw++) {
@@ -9718,10 +9634,6 @@
for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
mWifiSignalStrengthsTimer[i].writeToParcel(out, uSecRealtime);
}
- mBluetoothOnTimer.writeToParcel(out, uSecRealtime);
- for (int i=0; i< NUM_BLUETOOTH_STATES; i++) {
- mBluetoothStateTimer[i].writeToParcel(out, uSecRealtime);
- }
for (int i=0; i< NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
mBluetoothActivityCounters[i].writeToParcel(out);
}
@@ -9748,8 +9660,6 @@
mChargeStepTracker.writeToParcel(out);
out.writeLong(mLastWriteTime);
- out.writeInt(getBluetoothPingCount());
-
if (inclUids) {
out.writeInt(mKernelWakelockStats.size());
for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
@@ -9851,6 +9761,7 @@
mMobileRadioActiveTimer.logState(pr, " ");
pr.println("*** Mobile network active adjusted timer:");
mMobileRadioActiveAdjustedTime.logState(pr, " ");
+ pr.println("*** mWifiRadioPowerState=" + mWifiRadioPowerState);
pr.println("*** Wifi timer:");
mWifiOnTimer.logState(pr, " ");
pr.println("*** WifiRunning timer:");
@@ -9867,12 +9778,6 @@
pr.println("*** Wifi signal strength #" + i + ":");
mWifiSignalStrengthsTimer[i].logState(pr, " ");
}
- pr.println("*** Bluetooth timer:");
- mBluetoothOnTimer.logState(pr, " ");
- for (int i=0; i< NUM_BLUETOOTH_STATES; i++) {
- pr.println("*** Bluetooth active type #" + i + ":");
- mBluetoothStateTimer[i].logState(pr, " ");
- }
pr.println("*** Flashlight timer:");
mFlashlightOnTimer.logState(pr, " ");
}
diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java
index 4fb8b55..961b0df 100644
--- a/core/java/com/android/internal/os/WifiPowerCalculator.java
+++ b/core/java/com/android/internal/os/WifiPowerCalculator.java
@@ -71,7 +71,7 @@
app.wifiRunningTimeMs = idleTimeMs + rxTimeMs + txTimeMs;
double powerDrain = stats.getWifiControllerActivity(BatteryStats.CONTROLLER_POWER_DRAIN,
- statsType) / (1000*60*60);
+ statsType) / (double)(1000*60*60);
if (powerDrain == 0) {
// Some controllers do not report power drain, so we can calculate it here.
powerDrain = ((idleTimeMs * mIdleCurrentMa) + (txTimeMs * mTxCurrentMa)
diff --git a/core/java/com/android/internal/os/WifiPowerEstimator.java b/core/java/com/android/internal/os/WifiPowerEstimator.java
index 0172367..c4e2ef6 100644
--- a/core/java/com/android/internal/os/WifiPowerEstimator.java
+++ b/core/java/com/android/internal/os/WifiPowerEstimator.java
@@ -63,7 +63,7 @@
mTotalAppWifiRunningTimeMs += app.wifiRunningTimeMs;
final double wifiLockPower = (app.wifiRunningTimeMs * mWifiPowerOn) / (1000*60*60);
- final long wifiScanTimeMs = u.getWifiScanTime(rawRealtimeUs, statsType);
+ final long wifiScanTimeMs = u.getWifiScanTime(rawRealtimeUs, statsType) / 1000;
final double wifiScanPower = (wifiScanTimeMs * mWifiPowerScan) / (1000*60*60);
double wifiBatchScanPower = 0;
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index a5efa82..1961b4b 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -251,12 +251,6 @@
}
@Override
- public ActionMode startActionModeForChild(View child, ActionMode.Callback callback) {
- // No starting an action mode for an action bar child! (Where would it go?)
- return null;
- }
-
- @Override
public ActionMode startActionModeForChild(
View child, ActionMode.Callback callback, int type) {
if (type != ActionMode.TYPE_PRIMARY) {
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index 42d875d..2946456 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -367,7 +367,8 @@
if (mTitleLayout != null && mCustomView == null) {
if (mTitleOptional) {
- final int titleWidthSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ final int titleWidthSpec = MeasureSpec.makeMeasureSpec(contentWidth,
+ MeasureSpec.UNSPECIFIED);
mTitleLayout.measure(titleWidthSpec, childSpecHeight);
final int titleWidth = mTitleLayout.getMeasuredWidth();
final boolean titleFits = titleWidth <= availableWidth;
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java
index 2219ad1..a14e98d 100644
--- a/core/java/com/android/internal/widget/FloatingToolbar.java
+++ b/core/java/com/android/internal/widget/FloatingToolbar.java
@@ -108,8 +108,7 @@
}
/**
- * Sets the custom listener for invocation of menu items in this floating
- * toolbar.
+ * Sets the custom listener for invocation of menu items in this floating toolbar.
*/
public FloatingToolbar setOnMenuItemClickListener(
MenuItem.OnMenuItemClickListener menuItemClickListener) {
@@ -188,13 +187,28 @@
}
/**
- * Returns {@code true} if this popup is currently showing. {@code false} otherwise.
+ * Hides this floating toolbar. This is a no-op if the toolbar is not showing.
+ * Use {@link #isHidden()} to distinguish between a hidden and a dismissed toolbar.
+ */
+ public void hide() {
+ mPopup.hide();
+ }
+
+ /**
+ * Returns {@code true} if this toolbar is currently showing. {@code false} otherwise.
*/
public boolean isShowing() {
return mPopup.isShowing();
}
/**
+ * Returns {@code true} if this toolbar is currently hidden. {@code false} otherwise.
+ */
+ public boolean isHidden() {
+ return mPopup.isHidden();
+ }
+
+ /**
* Refreshes {@link #mCoordinates} with values based on {@link #mContentRect}.
*/
private void refreshCoordinates() {
@@ -203,8 +217,8 @@
if (mContentRect.top > mPopup.getHeight()) {
y = mContentRect.top - mPopup.getHeight();
mOverflowDirection = FloatingToolbarPopup.OVERFLOW_DIRECTION_UP;
- } else if (mContentRect.top > getEstimatedToolbarHeight(mContext)) {
- y = mContentRect.top - getEstimatedToolbarHeight(mContext);
+ } else if (mContentRect.top > mPopup.getToolbarHeightWithVerticalMargin()) {
+ y = mContentRect.top - mPopup.getToolbarHeightWithVerticalMargin();
mOverflowDirection = FloatingToolbarPopup.OVERFLOW_DIRECTION_DOWN;
} else {
y = mContentRect.bottom;
@@ -264,7 +278,8 @@
private final View mParent;
private final PopupWindow mPopupWindow;
private final ViewGroup mContentContainer;
- private final int mPadding;
+ private final int mMarginHorizontal;
+ private final int mMarginVertical;
private final Animation.AnimationListener mOnOverflowOpened =
new Animation.AnimationListener() {
@@ -273,13 +288,8 @@
@Override
public void onAnimationEnd(Animation animation) {
- // This animation should never be run if the overflow panel has not been
- // initialized.
- Preconditions.checkNotNull(mOverflowPanel);
- mContentContainer.removeAllViews();
- mContentContainer.addView(mOverflowPanel.getView());
+ setOverflowPanelAsContent();
mOverflowPanel.fadeIn(true);
- setContentAreaAsTouchableSurface();
}
@Override
@@ -292,21 +302,35 @@
@Override
public void onAnimationEnd(Animation animation) {
- // This animation should never be run if the main panel has not been
- // initialized.
- Preconditions.checkNotNull(mMainPanel);
- mContentContainer.removeAllViews();
- mContentContainer.addView(mMainPanel.getView());
+ setMainPanelAsContent();
mMainPanel.fadeIn(true);
- setContentAreaAsTouchableSurface();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
};
- private final AnimatorSet mGrowFadeInFromBottomAnimation;
- private final AnimatorSet mShrinkFadeOutFromBottomAnimation;
+ private final AnimatorSet mShowAnimation;
+ private final AnimatorSet mDismissAnimation;
+ private final AnimatorSet mHideAnimation;
+ private final AnimationSet mOpenOverflowAnimation = new AnimationSet(true) {
+ @Override
+ public void cancel() {
+ if (hasStarted() && !hasEnded()) {
+ super.cancel();
+ setOverflowPanelAsContent();
+ }
+ }
+ };
+ private final AnimationSet mCloseOverflowAnimation = new AnimationSet(true) {
+ @Override
+ public void cancel() {
+ if (hasStarted() && !hasEnded()) {
+ super.cancel();
+ setMainPanelAsContent();
+ }
+ }
+ };
private final Runnable mOpenOverflow = new Runnable() {
@Override
@@ -323,7 +347,8 @@
private final Region mTouchableRegion = new Region();
- private boolean mDismissAnimating;
+ private boolean mDismissed = true; // tracks whether this popup is dismissed or dismissing.
+ private boolean mHidden; // tracks whether this popup is hidden or hiding.
private FloatingToolbarOverflowPanel mOverflowPanel;
private FloatingToolbarMainPanel mMainPanel;
@@ -339,15 +364,22 @@
mParent = Preconditions.checkNotNull(parent);
mContentContainer = createContentContainer(parent.getContext());
mPopupWindow = createPopupWindow(mContentContainer);
- mGrowFadeInFromBottomAnimation = createGrowFadeInFromBottom(mContentContainer);
- mShrinkFadeOutFromBottomAnimation = createShrinkFadeOutFromBottomAnimation(
+ mShowAnimation = createGrowFadeInFromBottom(mContentContainer);
+ mDismissAnimation = createShrinkFadeOutFromBottomAnimation(
mContentContainer,
new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mPopupWindow.dismiss();
- mDismissAnimating = false;
- setMainPanelAsContent();
+ mContentContainer.removeAllViews();
+ }
+ });
+ mHideAnimation = createShrinkFadeOutFromBottomAnimation(
+ mContentContainer,
+ new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mPopupWindow.dismiss();
}
});
// Make the touchable area of this popup be the area specified by mTouchableRegion.
@@ -365,7 +397,10 @@
.TOUCHABLE_INSETS_REGION);
}
});
- mPadding = parent.getResources().getDimensionPixelSize(R.dimen.floating_toolbar_margin);
+ mMarginHorizontal = parent.getResources()
+ .getDimensionPixelSize(R.dimen.floating_toolbar_horizontal_margin);
+ mMarginVertical = parent.getResources()
+ .getDimensionPixelSize(R.dimen.floating_toolbar_vertical_margin);
}
/**
@@ -400,10 +435,19 @@
return;
}
- stopDismissAnimation();
+ mHidden = false;
+ mDismissed = false;
+ cancelAllAnimations();
+ // Make sure a panel is set as the content.
+ if (mContentContainer.getChildCount() == 0) {
+ setMainPanelAsContent();
+ }
preparePopupContent();
+ // If we're yet to show the popup, set the container visibility to zero.
+ // The "show" animation will make this visible.
+ mContentContainer.setAlpha(0);
mPopupWindow.showAtLocation(mParent, Gravity.NO_GRAVITY, x, y);
- growFadeInFromBottom();
+ runShowAnimation();
}
/**
@@ -414,8 +458,23 @@
return;
}
- mDismissAnimating = true;
- shrinkFadeOutFromBottom();
+ mHidden = false;
+ mDismissed = true;
+ runDismissAnimation();
+ setZeroTouchableSurface();
+ }
+
+ /**
+ * Hides this popup. This is a no-op if this popup is not showing.
+ * Use {@link #isHidden()} to distinguish between a hidden and a dismissed popup.
+ */
+ public void hide() {
+ if (!isShowing()) {
+ return;
+ }
+
+ mHidden = true;
+ runHideAnimation();
setZeroTouchableSurface();
}
@@ -423,19 +482,27 @@
* Returns {@code true} if this popup is currently showing. {@code false} otherwise.
*/
public boolean isShowing() {
- return mPopupWindow.isShowing() && !mDismissAnimating;
+ return mPopupWindow.isShowing() && !mDismissed && !mHidden;
+ }
+
+ /**
+ * Returns {@code true} if this popup is currently hidden. {@code false} otherwise.
+ */
+ public boolean isHidden() {
+ return mHidden;
}
/**
* Updates the coordinates of this popup.
* The specified coordinates may be adjusted to make sure the popup is entirely on-screen.
+ * This is a no-op if this popup is not showing.
*/
public void updateCoordinates(int x, int y) {
- if (mDismissAnimating) {
- // Already being dismissed. Ignore.
+ if (!isShowing()) {
return;
}
+ cancelAllAnimations();
preparePopupContent();
mPopupWindow.update(x, y, getWidth(), getHeight());
}
@@ -474,39 +541,53 @@
return mContentContainer.getContext();
}
- /**
- * Performs the "grow and fade in from the bottom" animation on the floating popup.
- */
- private void growFadeInFromBottom() {
- mGrowFadeInFromBottomAnimation.start();
+ int getToolbarHeightWithVerticalMargin() {
+ return getEstimatedToolbarHeight(mParent.getContext()) + mMarginVertical * 2;
}
/**
- * Performs the "shrink and fade out from bottom" animation on the floating popup.
+ * Performs the "show" animation on the floating popup.
*/
- private void shrinkFadeOutFromBottom() {
- mShrinkFadeOutFromBottomAnimation.start();
+ private void runShowAnimation() {
+ mShowAnimation.start();
}
- private void stopDismissAnimation() {
- mDismissAnimating = false;
- mShrinkFadeOutFromBottomAnimation.cancel();
+ /**
+ * Performs the "dismiss" animation on the floating popup.
+ */
+ private void runDismissAnimation() {
+ mDismissAnimation.start();
+ }
+
+ /**
+ * Performs the "hide" animation on the floating popup.
+ */
+ private void runHideAnimation() {
+ mHideAnimation.start();
+ }
+
+ private void cancelAllAnimations() {
+ mShowAnimation.cancel();
+ mDismissAnimation.cancel();
+ mHideAnimation.cancel();
+ mOpenOverflowAnimation.cancel();
+ mCloseOverflowAnimation.cancel();
}
/**
* Opens the floating toolbar overflow.
* This method should not be called if menu items have not been laid out with
- * {@link #layoutMenuItems(List, MenuItem.OnMenuItemClickListener, int)}.
+ * {@link #layoutMenuItems(java.util.List, MenuItem.OnMenuItemClickListener, int)}.
*
* @throws IllegalStateException if called when menu items have not been laid out.
*/
private void openOverflow() {
- Preconditions.checkNotNull(mMainPanel);
- Preconditions.checkNotNull(mOverflowPanel);
+ Preconditions.checkState(mMainPanel != null);
+ Preconditions.checkState(mOverflowPanel != null);
mMainPanel.fadeOut(true);
Size overflowPanelSize = mOverflowPanel.measure();
- final int targetWidth = getOverflowWidth(mParent.getContext());
+ final int targetWidth = overflowPanelSize.getWidth();
final int targetHeight = overflowPanelSize.getHeight();
final boolean morphUpwards = (mOverflowDirection == OVERFLOW_DIRECTION_UP);
final int startWidth = mContentContainer.getWidth();
@@ -539,11 +620,11 @@
widthAnimation.setDuration(240);
heightAnimation.setDuration(180);
heightAnimation.setStartOffset(60);
- AnimationSet animation = new AnimationSet(true);
- animation.setAnimationListener(mOnOverflowOpened);
- animation.addAnimation(widthAnimation);
- animation.addAnimation(heightAnimation);
- mContentContainer.startAnimation(animation);
+ mOpenOverflowAnimation.getAnimations().clear();
+ mOpenOverflowAnimation.setAnimationListener(mOnOverflowOpened);
+ mOpenOverflowAnimation.addAnimation(widthAnimation);
+ mOpenOverflowAnimation.addAnimation(heightAnimation);
+ mContentContainer.startAnimation(mOpenOverflowAnimation);
}
/**
@@ -551,11 +632,11 @@
* This method should not be called if menu items have not been laid out with
* {@link #layoutMenuItems(java.util.List, MenuItem.OnMenuItemClickListener, int)}.
*
- * @throws IllegalStateException
+ * @throws IllegalStateException if called when menu items have not been laid out.
*/
private void closeOverflow() {
- Preconditions.checkNotNull(mMainPanel);
- Preconditions.checkNotNull(mOverflowPanel);
+ Preconditions.checkState(mMainPanel != null);
+ Preconditions.checkState(mOverflowPanel != null);
mOverflowPanel.fadeOut(true);
Size mainPanelSize = mMainPanel.measure();
@@ -591,54 +672,42 @@
widthAnimation.setDuration(150);
widthAnimation.setStartOffset(150);
heightAnimation.setDuration(210);
- AnimationSet animation = new AnimationSet(true);
- animation.setAnimationListener(mOnOverflowClosed);
- animation.addAnimation(widthAnimation);
- animation.addAnimation(heightAnimation);
- mContentContainer.startAnimation(animation);
+ mCloseOverflowAnimation.getAnimations().clear();
+ mCloseOverflowAnimation.setAnimationListener(mOnOverflowClosed);
+ mCloseOverflowAnimation.addAnimation(widthAnimation);
+ mCloseOverflowAnimation.addAnimation(heightAnimation);
+ mContentContainer.startAnimation(mCloseOverflowAnimation);
}
/**
* Prepares the content container for show and update calls.
*/
private void preparePopupContent() {
- // Do not call this method if main view panel has not been initialized.
- Preconditions.checkNotNull(mMainPanel);
-
- // If we're yet to show the popup, set the container visibility to zero.
- // The "show" animation will make this visible.
- if (!mPopupWindow.isShowing()) {
- mContentContainer.setAlpha(0);
+ // Reset visibility.
+ if (mMainPanel != null) {
+ mMainPanel.fadeIn(false);
}
-
- // Make sure panels are visible.
- mMainPanel.fadeIn(false);
if (mOverflowPanel != null) {
mOverflowPanel.fadeIn(false);
}
- // Make sure a panel is set as the content.
- if (mContentContainer.getChildCount() == 0) {
- mContentContainer.addView(mMainPanel.getView());
+ // Reset position.
+ if (mMainPanel != null
+ && mContentContainer.getChildAt(0) == mMainPanel.getView()) {
+ positionMainPanel();
}
-
- // Make sure the main panel is at the correct position.
- if (mContentContainer.getChildAt(0) == mMainPanel.getView()) {
- mContentContainer.setX(mPadding);
- float y = mPadding;
- if (mOverflowDirection == OVERFLOW_DIRECTION_UP) {
- y = getHeight() - getEstimatedToolbarHeight(mParent.getContext()) - mPadding;
- }
- mContentContainer.setY(y);
+ if (mOverflowPanel != null
+ && mContentContainer.getChildAt(0) == mOverflowPanel.getView()) {
+ positionOverflowPanel();
}
-
- setContentAreaAsTouchableSurface();
}
/**
* Sets the current content to be the main view panel.
*/
private void setMainPanelAsContent() {
+ // This should never be called if the main panel has not been initialized.
+ Preconditions.checkNotNull(mMainPanel);
mContentContainer.removeAllViews();
Size mainPanelSize = mMainPanel.measure();
ViewGroup.LayoutParams params = mContentContainer.getLayoutParams();
@@ -646,6 +715,53 @@
params.height = mainPanelSize.getHeight();
mContentContainer.setLayoutParams(params);
mContentContainer.addView(mMainPanel.getView());
+ setContentAreaAsTouchableSurface();
+ }
+
+ /**
+ * Sets the current content to be the overflow view panel.
+ */
+ private void setOverflowPanelAsContent() {
+ // This should never be called if the overflow panel has not been initialized.
+ Preconditions.checkNotNull(mOverflowPanel);
+ mContentContainer.removeAllViews();
+ Size overflowPanelSize = mOverflowPanel.measure();
+ ViewGroup.LayoutParams params = mContentContainer.getLayoutParams();
+ params.width = overflowPanelSize.getWidth();
+ params.height = overflowPanelSize.getHeight();
+ mContentContainer.setLayoutParams(params);
+ mContentContainer.addView(mOverflowPanel.getView());
+ setContentAreaAsTouchableSurface();
+ }
+
+ /**
+ * Places the main view panel at the appropriate resting coordinates.
+ */
+ private void positionMainPanel() {
+ Preconditions.checkNotNull(mMainPanel);
+ float x = mPopupWindow.getWidth()
+ - (mMainPanel.getView().getMeasuredWidth() + mMarginHorizontal);
+ mContentContainer.setX(x);
+
+ float y = mMarginVertical;
+ if (mOverflowDirection == OVERFLOW_DIRECTION_UP) {
+ y = getHeight()
+ - (mMainPanel.getView().getMeasuredHeight() + mMarginVertical);
+ }
+ mContentContainer.setY(y);
+ setContentAreaAsTouchableSurface();
+ }
+
+ /**
+ * Places the main view panel at the appropriate resting coordinates.
+ */
+ private void positionOverflowPanel() {
+ Preconditions.checkNotNull(mOverflowPanel);
+ float x = mPopupWindow.getWidth()
+ - (mOverflowPanel.getView().getMeasuredWidth() + mMarginHorizontal);
+ mContentContainer.setX(x);
+ mContentContainer.setY(mMarginVertical);
+ setContentAreaAsTouchableSurface();
}
private void updatePopupSize() {
@@ -661,8 +777,8 @@
width = Math.max(width, overflowPanelSize.getWidth());
height = Math.max(height, overflowPanelSize.getHeight());
}
- mPopupWindow.setWidth(width + mPadding * 2);
- mPopupWindow.setHeight(height + mPadding * 2);
+ mPopupWindow.setWidth(width + mMarginHorizontal * 2);
+ mPopupWindow.setHeight(height + mMarginVertical * 2);
}
/**
@@ -748,22 +864,22 @@
final MenuItem menuItem = remainingMenuItems.peek();
Button menuItemButton = createMenuItemButton(mContext, menuItem);
- // Adding additional left padding for the first button to even out button spacing.
+ // Adding additional start padding for the first button to even out button spacing.
if (isFirstItem) {
- menuItemButton.setPadding(
- 2 * menuItemButton.getPaddingLeft(),
+ menuItemButton.setPaddingRelative(
+ (int) (1.5 * menuItemButton.getPaddingStart()),
menuItemButton.getPaddingTop(),
- menuItemButton.getPaddingRight(),
+ menuItemButton.getPaddingEnd(),
menuItemButton.getPaddingBottom());
isFirstItem = false;
}
- // Adding additional right padding for the last button to even out button spacing.
+ // Adding additional end padding for the last button to even out button spacing.
if (remainingMenuItems.size() == 1) {
- menuItemButton.setPadding(
- menuItemButton.getPaddingLeft(),
+ menuItemButton.setPaddingRelative(
+ menuItemButton.getPaddingStart(),
menuItemButton.getPaddingTop(),
- 2 * menuItemButton.getPaddingRight(),
+ (int) (1.5 * menuItemButton.getPaddingEnd()),
menuItemButton.getPaddingBottom());
}
@@ -836,10 +952,12 @@
private final ViewGroup mBackButtonContainer;
private final View mBackButton;
private final ListView mListView;
+ private final TextView mListViewItemWidthCalculator;
private final ViewFader mViewFader;
private final Runnable mCloseOverflow;
private MenuItem.OnMenuItemClickListener mOnMenuItemClickListener;
+ private int mOverflowWidth = 0;
/**
* Initializes a floating toolbar popup overflow view panel.
@@ -865,7 +983,7 @@
mBackButtonContainer = new LinearLayout(context);
mBackButtonContainer.addView(mBackButton);
- mListView = createOverflowListView(context);
+ mListView = createOverflowListView();
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@@ -878,6 +996,10 @@
mContentView.addView(mListView);
mContentView.addView(mBackButtonContainer);
+
+ mListViewItemWidthCalculator = createOverflowMenuItemButton(context);
+ mListViewItemWidthCalculator.setLayoutParams(new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
/**
@@ -888,6 +1010,7 @@
overflowListViewAdapter.clear();
overflowListViewAdapter.addAll(menuItems);
setListViewHeight();
+ setOverflowWidth();
}
public void setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener listener) {
@@ -943,7 +1066,21 @@
mListView.setLayoutParams(params);
}
- private static ListView createOverflowListView(final Context context) {
+ private int setOverflowWidth() {
+ for (int i = 0; i < mListView.getAdapter().getCount(); i++) {
+ MenuItem menuItem = (MenuItem) mListView.getAdapter().getItem(i);
+ Preconditions.checkNotNull(menuItem);
+ mListViewItemWidthCalculator.setText(menuItem.getTitle());
+ mListViewItemWidthCalculator.measure(
+ MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ mOverflowWidth = Math.max(
+ mListViewItemWidthCalculator.getMeasuredWidth(), mOverflowWidth);
+ }
+ return mOverflowWidth;
+ }
+
+ private ListView createOverflowListView() {
+ final Context context = mContentView.getContext();
final ListView overflowListView = new ListView(context);
overflowListView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
@@ -962,6 +1099,7 @@
MenuItem menuItem = getItem(position);
menuButton.setText(menuItem.getTitle());
menuButton.setContentDescription(menuItem.getTitle());
+ menuButton.setMinimumWidth(mOverflowWidth);
return menuButton;
}
};
@@ -992,6 +1130,7 @@
}
public void fadeIn(boolean animate) {
+ cancelFadeAnimations();
if (animate) {
mFadeInAnimation.start();
} else {
@@ -1000,12 +1139,18 @@
}
public void fadeOut(boolean animate) {
+ cancelFadeAnimations();
if (animate) {
mFadeOutAnimation.start();
} else {
mView.setAlpha(0);
}
}
+
+ private void cancelFadeAnimations() {
+ mFadeInAnimation.cancel();
+ mFadeOutAnimation.cancel();
+ }
}
@@ -1036,7 +1181,8 @@
private static PopupWindow createPopupWindow(View content) {
ViewGroup popupContentHolder = new LinearLayout(content.getContext());
PopupWindow popupWindow = new PopupWindow(popupContentHolder);
- popupWindow.setWindowLayoutType(WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL);
+ popupWindow.setWindowLayoutType(
+ WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL);
popupWindow.setAnimationStyle(0);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
content.setLayoutParams(new ViewGroup.LayoutParams(
@@ -1077,11 +1223,6 @@
return shrinkFadeOutFromBottomAnimation;
}
- private static int getOverflowWidth(Context context) {
- return context.getResources()
- .getDimensionPixelSize(R.dimen.floating_toolbar_overflow_width);
- }
-
private static int getEstimatedToolbarHeight(Context context) {
return context.getResources().getDimensionPixelSize(R.dimen.floating_toolbar_height);
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 123d1ac..aa60eba 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -472,6 +472,8 @@
updateEncryptionPassword(StorageManager.CRYPT_TYPE_DEFAULT, null);
}
+ setCredentialRequiredToDecrypt(false);
+
getDevicePolicyManager().setActivePasswordState(
DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, 0, 0, 0, 0, 0, 0, 0, userHandle);
diff --git a/core/java/com/android/internal/widget/SlidingTab.java b/core/java/com/android/internal/widget/SlidingTab.java
index 65feab1..0066ed0 100644
--- a/core/java/com/android/internal/widget/SlidingTab.java
+++ b/core/java/com/android/internal/widget/SlidingTab.java
@@ -400,11 +400,13 @@
/**
* Ensure all the dependent widgets are measured.
*/
- public void measure() {
- tab.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
- View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
- text.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
- View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
+ public void measure(int widthMeasureSpec, int heightMeasureSpec) {
+ int width = MeasureSpec.getSize(widthMeasureSpec);
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+ tab.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.UNSPECIFIED),
+ View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.UNSPECIFIED));
+ text.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.UNSPECIFIED),
+ View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.UNSPECIFIED));
}
/**
@@ -491,8 +493,8 @@
}
}
- mLeftSlider.measure();
- mRightSlider.measure();
+ mLeftSlider.measure(widthMeasureSpec, heightMeasureSpec);
+ mRightSlider.measure(widthMeasureSpec, heightMeasureSpec);
final int leftTabWidth = mLeftSlider.getTabWidth();
final int rightTabWidth = mRightSlider.getTabWidth();
final int leftTabHeight = mLeftSlider.getTabHeight();
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 5c95f8a..7a934bd 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -857,13 +857,6 @@
bitmap->unlockPixels();
}
-static jlong Bitmap_refPixelRef(JNIEnv* env, jobject, jlong bitmapHandle) {
- SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
- SkPixelRef* pixelRef = bitmap ? bitmap->pixelRef() : nullptr;
- SkSafeRef(pixelRef);
- return reinterpret_cast<jlong>(pixelRef);
-}
-
///////////////////////////////////////////////////////////////////////////////
static JNINativeMethod gBitmapMethods[] = {
@@ -903,7 +896,6 @@
(void*)Bitmap_copyPixelsFromBuffer },
{ "nativeSameAs", "(JJ)Z", (void*)Bitmap_sameAs },
{ "nativePrepareToDraw", "(J)V", (void*)Bitmap_prepareToDraw },
- { "nativeRefPixelRef", "(J)J", (void*)Bitmap_refPixelRef },
};
int register_android_graphics_Bitmap(JNIEnv* env)
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index f0bd8d1..f0bd5dd 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -373,7 +373,7 @@
return legacyBitmapConfigToColorType(c);
}
-android::Canvas* GraphicsJNI::getNativeCanvas(JNIEnv* env, jobject canvas) {
+SkCanvas* GraphicsJNI::getNativeCanvas(JNIEnv* env, jobject canvas) {
SkASSERT(env);
SkASSERT(canvas);
SkASSERT(env->IsInstanceOf(canvas, gCanvas_class));
@@ -381,7 +381,9 @@
if (!canvasHandle) {
return NULL;
}
- return reinterpret_cast<android::Canvas*>(canvasHandle);
+ SkCanvas* c = reinterpret_cast<android::Canvas*>(canvasHandle)->asSkCanvas();
+ SkASSERT(c);
+ return c;
}
SkRegion* GraphicsJNI::getNativeRegion(JNIEnv* env, jobject region)
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index 8eb43f8..49def13 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -8,7 +8,6 @@
#include "SkPoint.h"
#include "SkRect.h"
#include "SkImageDecoder.h"
-#include <Canvas.h>
#include <jni.h>
class SkBitmapRegionDecoder;
@@ -48,7 +47,7 @@
static SkPoint* jpointf_to_point(JNIEnv*, jobject jpointf, SkPoint* point);
static void point_to_jpointf(const SkPoint& point, JNIEnv*, jobject jpointf);
- static android::Canvas* getNativeCanvas(JNIEnv*, jobject canvas);
+ static SkCanvas* getNativeCanvas(JNIEnv*, jobject canvas);
static SkBitmap* getSkBitmapDeprecated(JNIEnv*, jobject bitmap);
static void getSkBitmap(JNIEnv*, jobject bitmap, SkBitmap* outBitmap);
static SkPixelRef* getSkPixelRef(JNIEnv*, jobject bitmap);
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp
index d0f7591..6591d29 100644
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -80,12 +80,11 @@
///////////////////////////////////////////////////////////////////////////////////////////////
-static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jobject jbitmap,
+static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong bitmapHandle,
jint tileModeX, jint tileModeY)
{
- SkBitmap bitmap;
- GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
- SkShader* s = SkShader::CreateBitmapShader(bitmap,
+ const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
+ SkShader* s = SkShader::CreateBitmapShader(*bitmap,
(SkShader::TileMode)tileModeX,
(SkShader::TileMode)tileModeY);
@@ -250,7 +249,7 @@
};
static JNINativeMethod gBitmapShaderMethods[] = {
- { "nativeCreate", "(Landroid/graphics/Bitmap;II)J", (void*)BitmapShader_constructor },
+ { "nativeCreate", "(JII)J", (void*)BitmapShader_constructor },
};
static JNINativeMethod gLinearGradientMethods[] = {
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index 50a1069..a2c1609 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -39,22 +39,17 @@
}
// Native wrapper constructor used by Canvas(Bitmap)
-static jlong initRaster(JNIEnv* env, jobject, jobject jbitmap) {
- SkBitmap bitmap;
- if (jbitmap != NULL) {
- GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
- }
+static jlong initRaster(JNIEnv* env, jobject, jlong bitmapHandle) {
+ SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
return reinterpret_cast<jlong>(Canvas::create_canvas(bitmap));
}
// Set the given bitmap as the new draw target (wrapped in a new SkCanvas),
// optionally copying canvas matrix & clip state.
-static void setBitmap(JNIEnv* env, jobject, jlong canvasHandle, jobject jbitmap) {
- SkBitmap bitmap;
- if (jbitmap != NULL) {
- GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
- }
- get_canvas(canvasHandle)->setBitmap(bitmap);
+static void setBitmap(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHandle,
+ jboolean copyState) {
+ SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
+ get_canvas(canvasHandle)->setBitmap(bitmap, copyState);
}
static jboolean isOpaque(JNIEnv*, jobject, jlong canvasHandle) {
@@ -663,8 +658,8 @@
static JNINativeMethod gMethods[] = {
{"finalizer", "(J)V", (void*) CanvasJNI::finalizer},
- {"initRaster", "(Landroid/graphics/Bitmap;)J", (void*) CanvasJNI::initRaster},
- {"native_setBitmap", "(JLandroid/graphics/Bitmap;)V", (void*) CanvasJNI::setBitmap},
+ {"initRaster", "(J)J", (void*) CanvasJNI::initRaster},
+ {"native_setBitmap", "(JJZ)V", (void*) CanvasJNI::setBitmap},
{"native_isOpaque","(J)Z", (void*) CanvasJNI::isOpaque},
{"native_getWidth","(J)I", (void*) CanvasJNI::getWidth},
{"native_getHeight","(J)I", (void*) CanvasJNI::getHeight},
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp
index 7d12230..16e5b3c 100644
--- a/core/jni/android_hardware_SensorManager.cpp
+++ b/core/jni/android_hardware_SensorManager.cpp
@@ -19,6 +19,7 @@
#include <map>
#include <ScopedUtfChars.h>
+#include <ScopedLocalRef.h>
#include <utils/Log.h>
#include <utils/Looper.h>
@@ -178,21 +179,21 @@
class Receiver : public LooperCallback {
sp<SensorEventQueue> mSensorQueue;
sp<MessageQueue> mMessageQueue;
- jobject mReceiverObject;
+ jobject mReceiverWeakGlobal;
jfloatArray mScratch;
public:
Receiver(const sp<SensorEventQueue>& sensorQueue,
const sp<MessageQueue>& messageQueue,
- jobject receiverObject, jfloatArray scratch) {
+ jobject receiverWeak, jfloatArray scratch) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
mSensorQueue = sensorQueue;
mMessageQueue = messageQueue;
- mReceiverObject = env->NewGlobalRef(receiverObject);
+ mReceiverWeakGlobal = env->NewGlobalRef(receiverWeak);
mScratch = (jfloatArray)env->NewGlobalRef(scratch);
}
~Receiver() {
JNIEnv* env = AndroidRuntime::getJNIEnv();
- env->DeleteGlobalRef(mReceiverObject);
+ env->DeleteGlobalRef(mReceiverWeakGlobal);
env->DeleteGlobalRef(mScratch);
}
sp<SensorEventQueue> getSensorEventQueue() const {
@@ -213,6 +214,8 @@
virtual int handleEvent(int fd, int events, void* data) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
sp<SensorEventQueue> q = reinterpret_cast<SensorEventQueue *>(data);
+ ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
+
ssize_t n;
ASensorEvent buffer[16];
while ((n = q->read(buffer, 16)) > 0) {
@@ -228,9 +231,11 @@
if (buffer[i].type == SENSOR_TYPE_META_DATA) {
// This is a flush complete sensor event. Call dispatchFlushCompleteEvent
// method.
- env->CallVoidMethod(mReceiverObject,
- gBaseEventQueueClassInfo.dispatchFlushCompleteEvent,
- buffer[i].meta_data.sensor);
+ if (receiverObj.get()) {
+ env->CallVoidMethod(receiverObj.get(),
+ gBaseEventQueueClassInfo.dispatchFlushCompleteEvent,
+ buffer[i].meta_data.sensor);
+ }
} else {
int8_t status;
switch (buffer[i].type) {
@@ -247,12 +252,14 @@
status = SENSOR_STATUS_ACCURACY_HIGH;
break;
}
- env->CallVoidMethod(mReceiverObject,
- gBaseEventQueueClassInfo.dispatchSensorEvent,
- buffer[i].sensor,
- mScratch,
- status,
- buffer[i].timestamp);
+ if (receiverObj.get()) {
+ env->CallVoidMethod(receiverObj.get(),
+ gBaseEventQueueClassInfo.dispatchSensorEvent,
+ buffer[i].sensor,
+ mScratch,
+ status,
+ buffer[i].timestamp);
+ }
}
if (env->ExceptionCheck()) {
mSensorQueue->sendAck(buffer, n);
@@ -269,7 +276,7 @@
}
};
-static jlong nativeInitSensorEventQueue(JNIEnv *env, jclass clazz, jobject eventQ, jobject msgQ,
+static jlong nativeInitSensorEventQueue(JNIEnv *env, jclass clazz, jobject eventQWeak, jobject msgQ,
jfloatArray scratch, jstring packageName) {
SensorManager& mgr(SensorManager::getInstance());
ScopedUtfChars packageUtf(env, packageName);
@@ -282,7 +289,7 @@
return 0;
}
- sp<Receiver> receiver = new Receiver(queue, messageQueue, eventQ, scratch);
+ sp<Receiver> receiver = new Receiver(queue, messageQueue, eventQWeak, scratch);
receiver->incStrong((void*)nativeInitSensorEventQueue);
return jlong(receiver.get());
}
@@ -325,7 +332,7 @@
static JNINativeMethod gBaseEventQueueMethods[] = {
{"nativeInitBaseEventQueue",
- "(Landroid/hardware/SystemSensorManager$BaseEventQueue;Landroid/os/MessageQueue;[FLjava/lang/String;)J",
+ "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;[FLjava/lang/String;)J",
(void*)nativeInitSensorEventQueue },
{"nativeEnableSensor",
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index c9b0e76..33db4a85 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -356,95 +356,58 @@
android_media_AudioRecord_release(env, thiz);
}
-
-// ----------------------------------------------------------------------------
-static jint android_media_AudioRecord_readInByteArray(JNIEnv *env, jobject thiz,
- jbyteArray javaAudioData,
- jint offsetInBytes, jint sizeInBytes) {
- jbyte* recordBuff = NULL;
- // get the audio recorder from which we'll read new audio samples
- sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
- if (lpRecorder == NULL) {
- ALOGE("Unable to retrieve AudioRecord object, can't record");
- return 0;
- }
-
- if (!javaAudioData) {
- ALOGE("Invalid Java array to store recorded audio, can't record");
- return 0;
- }
-
- // get the pointer to where we'll record the audio
- // NOTE: We may use GetPrimitiveArrayCritical() when the JNI implementation changes in such
- // a way that it becomes much more efficient. When doing so, we will have to prevent the
- // AudioSystem callback to be called while in critical section (in case of media server
- // process crash for instance)
- recordBuff = (jbyte *)env->GetByteArrayElements(javaAudioData, NULL);
-
- if (recordBuff == NULL) {
- ALOGE("Error retrieving destination for recorded audio data, can't record");
- return 0;
- }
-
- // read the new audio data from the native AudioRecord object
- ssize_t readSize = lpRecorder->read(recordBuff + offsetInBytes, sizeInBytes);
- env->ReleaseByteArrayElements(javaAudioData, recordBuff, 0);
-
- if (readSize < 0) {
- readSize = (jint)AUDIO_JAVA_INVALID_OPERATION;
- }
- return (jint) readSize;
+// overloaded JNI array helper functions
+static inline
+jbyte *envGetArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy) {
+ return env->GetByteArrayElements(array, isCopy);
}
-// ----------------------------------------------------------------------------
-static jint android_media_AudioRecord_readInShortArray(JNIEnv *env, jobject thiz,
- jshortArray javaAudioData,
- jint offsetInShorts, jint sizeInShorts) {
-
- jshort* recordBuff = NULL;
- // get the audio recorder from which we'll read new audio samples
- sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
- if (lpRecorder == NULL) {
- ALOGE("Unable to retrieve AudioRecord object, can't record");
- return 0;
- }
-
- if (!javaAudioData) {
- ALOGE("Invalid Java array to store recorded audio, can't record");
- return 0;
- }
-
- // get the pointer to where we'll record the audio
- // NOTE: We may use GetPrimitiveArrayCritical() when the JNI implementation changes in such
- // a way that it becomes much more efficient. When doing so, we will have to prevent the
- // AudioSystem callback to be called while in critical section (in case of media server
- // process crash for instance)
- recordBuff = (jshort *)env->GetShortArrayElements(javaAudioData, NULL);
-
- if (recordBuff == NULL) {
- ALOGE("Error retrieving destination for recorded audio data, can't record");
- return 0;
- }
-
- // read the new audio data from the native AudioRecord object
- const size_t sizeInBytes = sizeInShorts * sizeof(short);
- ssize_t readSize = lpRecorder->read(recordBuff + offsetInShorts, sizeInBytes);
-
- env->ReleaseShortArrayElements(javaAudioData, recordBuff, 0);
-
- if (readSize < 0) {
- readSize = (jint)AUDIO_JAVA_INVALID_OPERATION;
- } else {
- readSize /= sizeof(short);
- }
- return (jint) readSize;
+static inline
+void envReleaseArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems, jint mode) {
+ env->ReleaseByteArrayElements(array, elems, mode);
}
-// ----------------------------------------------------------------------------
-static jint android_media_AudioRecord_readInFloatArray(JNIEnv *env, jobject thiz,
- jfloatArray javaAudioData,
- jint offsetInFloats, jint sizeInFloats,
- jboolean isReadBlocking) {
+static inline
+jshort *envGetArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy) {
+ return env->GetShortArrayElements(array, isCopy);
+}
+
+static inline
+void envReleaseArrayElements(JNIEnv *env, jshortArray array, jshort *elems, jint mode) {
+ env->ReleaseShortArrayElements(array, elems, mode);
+}
+
+static inline
+jfloat *envGetArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy) {
+ return env->GetFloatArrayElements(array, isCopy);
+}
+
+static inline
+void envReleaseArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems, jint mode) {
+ env->ReleaseFloatArrayElements(array, elems, mode);
+}
+
+static inline
+jint interpretReadSizeError(ssize_t readSize) {
+ ALOGE_IF(readSize != WOULD_BLOCK, "Error %zd during AudioRecord native read", readSize);
+ switch (readSize) {
+ case WOULD_BLOCK:
+ return (jint)0;
+ case BAD_VALUE:
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ default:
+ // may be possible for other errors such as
+ // NO_INIT to happen if restoreRecord_l fails.
+ case INVALID_OPERATION:
+ return (jint)AUDIO_JAVA_INVALID_OPERATION;
+ }
+}
+
+template <typename T>
+static jint android_media_AudioRecord_readInArray(JNIEnv *env, jobject thiz,
+ T javaAudioData,
+ jint offsetInSamples, jint sizeInSamples,
+ jboolean isReadBlocking) {
// get the audio recorder from which we'll read new audio samples
sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
if (lpRecorder == NULL) {
@@ -453,76 +416,68 @@
}
if (javaAudioData == NULL) {
- ALOGE("Invalid Java array to store recorded audio");
- return (jint)AUDIO_JAVA_BAD_VALUE;
- }
+ ALOGE("Invalid Java array to store recorded audio");
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ }
- // get the pointer to where we'll record the audio
// NOTE: We may use GetPrimitiveArrayCritical() when the JNI implementation changes in such
// a way that it becomes much more efficient. When doing so, we will have to prevent the
// AudioSystem callback to be called while in critical section (in case of media server
// process crash for instance)
- jfloat *recordBuff = (jfloat *)env->GetFloatArrayElements(javaAudioData, NULL);
+
+ // get the pointer to where we'll record the audio
+ auto *recordBuff = envGetArrayElements(env, javaAudioData, NULL);
if (recordBuff == NULL) {
ALOGE("Error retrieving destination for recorded audio data");
return (jint)AUDIO_JAVA_BAD_VALUE;
}
// read the new audio data from the native AudioRecord object
- const size_t sizeInBytes = sizeInFloats * sizeof(float);
- ssize_t readSize = lpRecorder->read(recordBuff + offsetInFloats, sizeInBytes);
+ const size_t sizeInBytes = sizeInSamples * sizeof(*recordBuff);
+ ssize_t readSize = lpRecorder->read(
+ recordBuff + offsetInSamples, sizeInBytes, isReadBlocking == JNI_TRUE /* blocking */);
- env->ReleaseFloatArrayElements(javaAudioData, recordBuff, 0);
+ envReleaseArrayElements(env, javaAudioData, recordBuff, 0);
if (readSize < 0) {
- ALOGE_IF(readSize != WOULD_BLOCK, "Error %zd during AudioRecord native read", readSize);
- switch (readSize) {
- case WOULD_BLOCK:
- return (jint)0;
- case BAD_VALUE:
- return (jint)AUDIO_JAVA_BAD_VALUE;
- default:
- // may be possible for other errors such as
- // NO_INIT to happen if restoreRecord_l fails.
- case INVALID_OPERATION:
- return (jint)AUDIO_JAVA_INVALID_OPERATION;
- }
+ return interpretReadSizeError(readSize);
}
- return (jint)(readSize / sizeof(float));
+ return (jint)(readSize / sizeof(*recordBuff));
}
// ----------------------------------------------------------------------------
static jint android_media_AudioRecord_readInDirectBuffer(JNIEnv *env, jobject thiz,
- jobject jBuffer, jint sizeInBytes) {
+ jobject jBuffer, jint sizeInBytes,
+ jboolean isReadBlocking) {
// get the audio recorder from which we'll read new audio samples
sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
if (lpRecorder==NULL)
- return 0;
+ return (jint)AUDIO_JAVA_INVALID_OPERATION;
// direct buffer and direct access supported?
long capacity = env->GetDirectBufferCapacity(jBuffer);
if (capacity == -1) {
// buffer direct access is not supported
ALOGE("Buffer direct access is not supported, can't record");
- return 0;
+ return (jint)AUDIO_JAVA_BAD_VALUE;
}
//ALOGV("capacity = %ld", capacity);
jbyte* nativeFromJavaBuf = (jbyte*) env->GetDirectBufferAddress(jBuffer);
if (nativeFromJavaBuf==NULL) {
ALOGE("Buffer direct access is not supported, can't record");
- return 0;
+ return (jint)AUDIO_JAVA_BAD_VALUE;
}
// read new data from the recorder
ssize_t readSize = lpRecorder->read(nativeFromJavaBuf,
- capacity < sizeInBytes ? capacity : sizeInBytes);
+ capacity < sizeInBytes ? capacity : sizeInBytes,
+ isReadBlocking == JNI_TRUE /* blocking */);
if (readSize < 0) {
- readSize = (jint)AUDIO_JAVA_INVALID_OPERATION;
+ return interpretReadSizeError(readSize);
}
return (jint)readSize;
}
-
// ----------------------------------------------------------------------------
static jint android_media_AudioRecord_get_native_frame_count(JNIEnv *env, jobject thiz) {
sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
@@ -633,12 +588,15 @@
{"native_finalize", "()V", (void *)android_media_AudioRecord_finalize},
{"native_release", "()V", (void *)android_media_AudioRecord_release},
{"native_read_in_byte_array",
- "([BII)I", (void *)android_media_AudioRecord_readInByteArray},
+ "([BIIZ)I",
+ (void *)android_media_AudioRecord_readInArray<jbyteArray>},
{"native_read_in_short_array",
- "([SII)I", (void *)android_media_AudioRecord_readInShortArray},
+ "([SIIZ)I",
+ (void *)android_media_AudioRecord_readInArray<jshortArray>},
{"native_read_in_float_array",
- "([FIIZ)I", (void *)android_media_AudioRecord_readInFloatArray},
- {"native_read_in_direct_buffer","(Ljava/lang/Object;I)I",
+ "([FIIZ)I",
+ (void *)android_media_AudioRecord_readInArray<jfloatArray>},
+ {"native_read_in_direct_buffer","(Ljava/lang/Object;IZ)I",
(void *)android_media_AudioRecord_readInDirectBuffer},
{"native_get_native_frame_count",
"()I", (void *)android_media_AudioRecord_get_native_frame_count},
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 1f688e1..8d3a9aa 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -510,14 +510,47 @@
android_media_AudioTrack_release(env, thiz);
}
+// overloaded JNI array helper functions (same as in android_media_AudioRecord)
+static inline
+jbyte *envGetArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy) {
+ return env->GetByteArrayElements(array, isCopy);
+}
+
+static inline
+void envReleaseArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems, jint mode) {
+ env->ReleaseByteArrayElements(array, elems, mode);
+}
+
+static inline
+jshort *envGetArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy) {
+ return env->GetShortArrayElements(array, isCopy);
+}
+
+static inline
+void envReleaseArrayElements(JNIEnv *env, jshortArray array, jshort *elems, jint mode) {
+ env->ReleaseShortArrayElements(array, elems, mode);
+}
+
+static inline
+jfloat *envGetArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy) {
+ return env->GetFloatArrayElements(array, isCopy);
+}
+
+static inline
+void envReleaseArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems, jint mode) {
+ env->ReleaseFloatArrayElements(array, elems, mode);
+}
+
// ----------------------------------------------------------------------------
-jint writeToTrack(const sp<AudioTrack>& track, jint audioFormat, const jbyte* data,
- jint offsetInBytes, jint sizeInBytes, bool blocking = true) {
+template <typename T>
+static jint writeToTrack(const sp<AudioTrack>& track, jint audioFormat, const T *data,
+ jint offsetInSamples, jint sizeInSamples, bool blocking) {
// give the data to the native AudioTrack object (the data starts at the offset)
ssize_t written = 0;
// regular write() or copy the data to the AudioTrack's shared memory?
+ size_t sizeInBytes = sizeInSamples * sizeof(T);
if (track->sharedBuffer() == 0) {
- written = track->write(data + offsetInBytes, sizeInBytes, blocking);
+ written = track->write(data + offsetInSamples, sizeInBytes, blocking);
// for compatibility with earlier behavior of write(), return 0 in this case
if (written == (ssize_t) WOULD_BLOCK) {
written = 0;
@@ -527,55 +560,59 @@
if ((size_t)sizeInBytes > track->sharedBuffer()->size()) {
sizeInBytes = track->sharedBuffer()->size();
}
- memcpy(track->sharedBuffer()->pointer(), data + offsetInBytes, sizeInBytes);
+ memcpy(track->sharedBuffer()->pointer(), data + offsetInSamples, sizeInBytes);
written = sizeInBytes;
}
+ if (written > 0) {
+ return written / sizeof(T);
+ }
+ // for compatibility, error codes pass through unchanged
return written;
}
// ----------------------------------------------------------------------------
-static jint android_media_AudioTrack_write_byte(JNIEnv *env, jobject thiz,
- jbyteArray javaAudioData,
- jint offsetInBytes, jint sizeInBytes,
- jint javaAudioFormat,
- jboolean isWriteBlocking) {
- //ALOGV("android_media_AudioTrack_write_byte(offset=%d, sizeInBytes=%d) called",
- // offsetInBytes, sizeInBytes);
+template <typename T>
+static jint android_media_AudioTrack_writeArray(JNIEnv *env, jobject thiz,
+ T javaAudioData,
+ jint offsetInSamples, jint sizeInSamples,
+ jint javaAudioFormat,
+ jboolean isWriteBlocking) {
+ //ALOGV("android_media_AudioTrack_writeArray(offset=%d, sizeInSamples=%d) called",
+ // offsetInSamples, sizeInSamples);
sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
if (lpTrack == NULL) {
jniThrowException(env, "java/lang/IllegalStateException",
"Unable to retrieve AudioTrack pointer for write()");
- return 0;
+ return (jint)AUDIO_JAVA_INVALID_OPERATION;
}
- // get the pointer for the audio data from the java array
+ if (javaAudioData == NULL) {
+ ALOGE("NULL java array of audio data to play");
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ }
+
// NOTE: We may use GetPrimitiveArrayCritical() when the JNI implementation changes in such
// a way that it becomes much more efficient. When doing so, we will have to prevent the
// AudioSystem callback to be called while in critical section (in case of media server
// process crash for instance)
- jbyte* cAudioData = NULL;
- if (javaAudioData) {
- cAudioData = (jbyte *)env->GetByteArrayElements(javaAudioData, NULL);
- if (cAudioData == NULL) {
- ALOGE("Error retrieving source of audio data to play, can't play");
- return 0; // out of memory or no data to load
- }
- } else {
- ALOGE("NULL java array of audio data to play, can't play");
- return 0;
+
+ // get the pointer for the audio data from the java array
+ auto cAudioData = envGetArrayElements(env, javaAudioData, NULL);
+ if (cAudioData == NULL) {
+ ALOGE("Error retrieving source of audio data to play");
+ return (jint)AUDIO_JAVA_BAD_VALUE; // out of memory or no data to load
}
- jint written = writeToTrack(lpTrack, javaAudioFormat, cAudioData, offsetInBytes, sizeInBytes,
- isWriteBlocking == JNI_TRUE /* blocking */);
+ jint samplesWritten = writeToTrack(lpTrack, javaAudioFormat, cAudioData,
+ offsetInSamples, sizeInSamples, isWriteBlocking == JNI_TRUE /* blocking */);
- env->ReleaseByteArrayElements(javaAudioData, cAudioData, 0);
+ envReleaseArrayElements(env, javaAudioData, cAudioData, 0);
- //ALOGV("write wrote %d (tried %d) bytes in the native AudioTrack with offset %d",
- // (int)written, (int)(sizeInBytes), (int)offsetInBytes);
- return written;
+ //ALOGV("write wrote %d (tried %d) samples in the native AudioTrack with offset %d",
+ // (int)samplesWritten, (int)(sizeInSamples), (int)offsetInSamples);
+ return samplesWritten;
}
-
// ----------------------------------------------------------------------------
static jint android_media_AudioTrack_write_native_bytes(JNIEnv *env, jobject thiz,
jbyteArray javaBytes, jint byteOffset, jint sizeInBytes,
@@ -586,7 +623,7 @@
if (lpTrack == NULL) {
jniThrowException(env, "java/lang/IllegalStateException",
"Unable to retrieve AudioTrack pointer for write()");
- return 0;
+ return (jint)AUDIO_JAVA_INVALID_OPERATION;
}
ScopedBytesRO bytes(env, javaBytes);
@@ -602,90 +639,6 @@
}
// ----------------------------------------------------------------------------
-static jint android_media_AudioTrack_write_short(JNIEnv *env, jobject thiz,
- jshortArray javaAudioData,
- jint offsetInShorts, jint sizeInShorts,
- jint javaAudioFormat) {
-
- //ALOGV("android_media_AudioTrack_write_short(offset=%d, sizeInShorts=%d) called",
- // offsetInShorts, sizeInShorts);
- sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
- if (lpTrack == NULL) {
- jniThrowException(env, "java/lang/IllegalStateException",
- "Unable to retrieve AudioTrack pointer for write()");
- return 0;
- }
-
- // get the pointer for the audio data from the java array
- // NOTE: We may use GetPrimitiveArrayCritical() when the JNI implementation changes in such
- // a way that it becomes much more efficient. When doing so, we will have to prevent the
- // AudioSystem callback to be called while in critical section (in case of media server
- // process crash for instance)
- jshort* cAudioData = NULL;
- if (javaAudioData) {
- cAudioData = (jshort *)env->GetShortArrayElements(javaAudioData, NULL);
- if (cAudioData == NULL) {
- ALOGE("Error retrieving source of audio data to play, can't play");
- return 0; // out of memory or no data to load
- }
- } else {
- ALOGE("NULL java array of audio data to play, can't play");
- return 0;
- }
- jint written = writeToTrack(lpTrack, javaAudioFormat, (jbyte *)cAudioData,
- offsetInShorts * sizeof(short), sizeInShorts * sizeof(short),
- true /*blocking write, legacy behavior*/);
- env->ReleaseShortArrayElements(javaAudioData, cAudioData, 0);
-
- if (written > 0) {
- written /= sizeof(short);
- }
- //ALOGV("write wrote %d (tried %d) shorts in the native AudioTrack with offset %d",
- // (int)written, (int)(sizeInShorts), (int)offsetInShorts);
-
- return written;
-}
-
-
-// ----------------------------------------------------------------------------
-static jint android_media_AudioTrack_write_float(JNIEnv *env, jobject thiz,
- jfloatArray javaAudioData,
- jint offsetInFloats, jint sizeInFloats,
- jint javaAudioFormat,
- jboolean isWriteBlocking) {
-
- sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
- if (lpTrack == NULL) {
- jniThrowException(env, "java/lang/IllegalStateException",
- "Unable to retrieve AudioTrack pointer for write()");
- return 0;
- }
-
- jfloat* cAudioData = NULL;
- if (javaAudioData) {
- cAudioData = (jfloat *)env->GetFloatArrayElements(javaAudioData, NULL);
- if (cAudioData == NULL) {
- ALOGE("Error retrieving source of audio data to play, can't play");
- return 0; // out of memory or no data to load
- }
- } else {
- ALOGE("NULL java array of audio data to play, can't play");
- return 0;
- }
- jint written = writeToTrack(lpTrack, javaAudioFormat, (jbyte *)cAudioData,
- offsetInFloats * sizeof(float), sizeInFloats * sizeof(float),
- isWriteBlocking == JNI_TRUE /* blocking */);
- env->ReleaseFloatArrayElements(javaAudioData, cAudioData, 0);
-
- if (written > 0) {
- written /= sizeof(float);
- }
-
- return written;
-}
-
-
-// ----------------------------------------------------------------------------
static jint android_media_AudioTrack_get_native_frame_count(JNIEnv *env, jobject thiz) {
sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
if (lpTrack == NULL) {
@@ -957,6 +910,13 @@
return nativeToJavaStatus( lpTrack->attachAuxEffect(effectId) );
}
+static jboolean android_media_AudioTrack_setOutputDevice(
+ JNIEnv *env, jobject thiz, jint device_id) {
+
+ sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
+ return lpTrack->setOutputDevice(device_id) == NO_ERROR;
+}
+
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
static JNINativeMethod gMethods[] = {
@@ -969,12 +929,12 @@
(void *)android_media_AudioTrack_setup},
{"native_finalize", "()V", (void *)android_media_AudioTrack_finalize},
{"native_release", "()V", (void *)android_media_AudioTrack_release},
- {"native_write_byte", "([BIIIZ)I",(void *)android_media_AudioTrack_write_byte},
+ {"native_write_byte", "([BIIIZ)I",(void *)android_media_AudioTrack_writeArray<jbyteArray>},
{"native_write_native_bytes",
"(Ljava/lang/Object;IIIZ)I",
(void *)android_media_AudioTrack_write_native_bytes},
- {"native_write_short", "([SIII)I", (void *)android_media_AudioTrack_write_short},
- {"native_write_float", "([FIIIZ)I",(void *)android_media_AudioTrack_write_float},
+ {"native_write_short", "([SIIIZ)I",(void *)android_media_AudioTrack_writeArray<jshortArray>},
+ {"native_write_float", "([FIIIZ)I",(void *)android_media_AudioTrack_writeArray<jfloatArray>},
{"native_setVolume", "(FF)V", (void *)android_media_AudioTrack_set_volume},
{"native_get_native_frame_count",
"()I", (void *)android_media_AudioTrack_get_native_frame_count},
@@ -1002,6 +962,8 @@
"(F)I", (void *)android_media_AudioTrack_setAuxEffectSendLevel},
{"native_attachAuxEffect",
"(I)I", (void *)android_media_AudioTrack_attachAuxEffect},
+ {"native_setOutputDevice", "(I)Z",
+ (void *)android_media_AudioTrack_setOutputDevice},
};
diff --git a/core/jni/android_text_StaticLayout.cpp b/core/jni/android_text_StaticLayout.cpp
index 87c58d6..5e73ef2 100644
--- a/core/jni/android_text_StaticLayout.cpp
+++ b/core/jni/android_text_StaticLayout.cpp
@@ -132,6 +132,13 @@
}
}
+static void nSetIndents(JNIEnv* env, jclass, jlong nativePtr, jintArray indents) {
+ ScopedIntArrayRO indentArr(env, indents);
+ std::vector<float> indentVec(indentArr.get(), indentArr.get() + indentArr.size());
+ LineBreaker* b = reinterpret_cast<LineBreaker*>(nativePtr);
+ b->setIndents(indentVec);
+}
+
// Basically similar to Paint.getTextRunAdvances but with C++ interface
static jfloat nAddStyleRun(JNIEnv* env, jclass, jlong nativePtr,
jlong nativePaint, jlong nativeTypeface, jint start, jint end, jboolean isRtl) {
@@ -171,6 +178,7 @@
{"nLoadHyphenator", "(Ljava/lang/String;)J", (void*) nLoadHyphenator},
{"nSetLocale", "(JLjava/lang/String;J)V", (void*) nSetLocale},
{"nSetupParagraph", "(J[CIFIF[III)V", (void*) nSetupParagraph},
+ {"nSetIndents", "(J[I)V", (void*) nSetIndents},
{"nAddStyleRun", "(JJJIIZ)F", (void*) nAddStyleRun},
{"nAddMeasuredRun", "(JII[F)V", (void*) nAddMeasuredRun},
{"nAddReplacementRun", "(JIIF)V", (void*) nAddReplacementRun},
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index 0d54953..91a3c7e 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -29,6 +29,8 @@
#include <gui/DisplayEventReceiver.h>
#include "android_os_MessageQueue.h"
+#include <ScopedLocalRef.h>
+
#include "core_jni_helpers.h"
namespace android {
@@ -49,7 +51,7 @@
class NativeDisplayEventReceiver : public LooperCallback {
public:
NativeDisplayEventReceiver(JNIEnv* env,
- jobject receiverObj, const sp<MessageQueue>& messageQueue);
+ jobject receiverWeak, const sp<MessageQueue>& messageQueue);
status_t initialize();
void dispose();
@@ -59,7 +61,7 @@
virtual ~NativeDisplayEventReceiver();
private:
- jobject mReceiverObjGlobal;
+ jobject mReceiverWeakGlobal;
sp<MessageQueue> mMessageQueue;
DisplayEventReceiver mReceiver;
bool mWaitingForVsync;
@@ -72,15 +74,15 @@
NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env,
- jobject receiverObj, const sp<MessageQueue>& messageQueue) :
- mReceiverObjGlobal(env->NewGlobalRef(receiverObj)),
+ jobject receiverWeak, const sp<MessageQueue>& messageQueue) :
+ mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)),
mMessageQueue(messageQueue), mWaitingForVsync(false) {
ALOGV("receiver %p ~ Initializing input event receiver.", this);
}
NativeDisplayEventReceiver::~NativeDisplayEventReceiver() {
JNIEnv* env = AndroidRuntime::getJNIEnv();
- env->DeleteGlobalRef(mReceiverObjGlobal);
+ env->DeleteGlobalRef(mReceiverWeakGlobal);
}
status_t NativeDisplayEventReceiver::initialize() {
@@ -190,10 +192,13 @@
void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, int32_t id, uint32_t count) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
- ALOGV("receiver %p ~ Invoking vsync handler.", this);
- env->CallVoidMethod(mReceiverObjGlobal,
- gDisplayEventReceiverClassInfo.dispatchVsync, timestamp, id, count);
- ALOGV("receiver %p ~ Returned from vsync handler.", this);
+ ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
+ if (receiverObj.get()) {
+ ALOGV("receiver %p ~ Invoking vsync handler.", this);
+ env->CallVoidMethod(receiverObj.get(),
+ gDisplayEventReceiverClassInfo.dispatchVsync, timestamp, id, count);
+ ALOGV("receiver %p ~ Returned from vsync handler.", this);
+ }
mMessageQueue->raiseAndClearException(env, "dispatchVsync");
}
@@ -201,16 +206,19 @@
void NativeDisplayEventReceiver::dispatchHotplug(nsecs_t timestamp, int32_t id, bool connected) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
- ALOGV("receiver %p ~ Invoking hotplug handler.", this);
- env->CallVoidMethod(mReceiverObjGlobal,
- gDisplayEventReceiverClassInfo.dispatchHotplug, timestamp, id, connected);
- ALOGV("receiver %p ~ Returned from hotplug handler.", this);
+ ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
+ if (receiverObj.get()) {
+ ALOGV("receiver %p ~ Invoking hotplug handler.", this);
+ env->CallVoidMethod(receiverObj.get(),
+ gDisplayEventReceiverClassInfo.dispatchHotplug, timestamp, id, connected);
+ ALOGV("receiver %p ~ Returned from hotplug handler.", this);
+ }
mMessageQueue->raiseAndClearException(env, "dispatchHotplug");
}
-static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverObj,
+static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak,
jobject messageQueueObj) {
sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
if (messageQueue == NULL) {
@@ -219,7 +227,7 @@
}
sp<NativeDisplayEventReceiver> receiver = new NativeDisplayEventReceiver(env,
- receiverObj, messageQueue);
+ receiverWeak, messageQueue);
status_t status = receiver->initialize();
if (status) {
String8 message;
@@ -254,7 +262,7 @@
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "nativeInit",
- "(Landroid/view/DisplayEventReceiver;Landroid/os/MessageQueue;)J",
+ "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;)J",
(void*)nativeInit },
{ "nativeDispose",
"(J)V",
diff --git a/core/jni/android_view_GraphicBuffer.cpp b/core/jni/android_view_GraphicBuffer.cpp
index aa79d70..a12629f 100644
--- a/core/jni/android_view_GraphicBuffer.cpp
+++ b/core/jni/android_view_GraphicBuffer.cpp
@@ -67,6 +67,11 @@
jfieldID bottom;
} gRectClassInfo;
+static struct {
+ jfieldID mSurfaceFormat;
+ jmethodID setNativeBitmap;
+} gCanvasClassInfo;
+
#define GET_INT(object, field) \
env->GetIntField(object, field)
@@ -191,9 +196,13 @@
bitmap.setPixels(NULL);
}
- Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvas);
- nativeCanvas->setBitmap(bitmap);
- nativeCanvas->clipRect(rect.left, rect.top, rect.right, rect.bottom);
+ SET_INT(canvas, gCanvasClassInfo.mSurfaceFormat, buffer->getPixelFormat());
+ INVOKEV(canvas, gCanvasClassInfo.setNativeBitmap, reinterpret_cast<jlong>(&bitmap));
+
+ SkRect clipRect;
+ clipRect.set(rect.left, rect.top, rect.right, rect.bottom);
+ SkCanvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvas);
+ nativeCanvas->clipRect(clipRect);
if (dirtyRect) {
INVOKEV(dirtyRect, gRectClassInfo.set,
@@ -208,8 +217,7 @@
GraphicBufferWrapper* wrapper =
reinterpret_cast<GraphicBufferWrapper*>(wrapperHandle);
- Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvas);
- nativeCanvas->setBitmap(SkBitmap());
+ INVOKEV(canvas, gCanvasClassInfo.setNativeBitmap, (jlong)0);
if (wrapper) {
status_t status = wrapper->buffer->unlock();
@@ -294,6 +302,10 @@
gRectClassInfo.right = GetFieldIDOrDie(env, clazz, "right", "I");
gRectClassInfo.bottom = GetFieldIDOrDie(env, clazz, "bottom", "I");
+ clazz = FindClassOrDie(env, "android/graphics/Canvas");
+ gCanvasClassInfo.mSurfaceFormat = GetFieldIDOrDie(env, clazz, "mSurfaceFormat", "I");
+ gCanvasClassInfo.setNativeBitmap = GetMethodIDOrDie(env, clazz, "setNativeBitmap", "(J)V");
+
return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
}
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 06d1e85..f1c90ea 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -74,6 +74,11 @@
jfieldID bottom;
} gRectClassInfo;
+static struct {
+ jfieldID mSurfaceFormat;
+ jmethodID setNativeBitmap;
+} gCanvasClassInfo;
+
// ----------------------------------------------------------------------------
// this is just a pointer we use to pass to inc/decStrong
@@ -314,6 +319,9 @@
return 0;
}
+ // Associate a SkCanvas object to this surface
+ env->SetIntField(canvasObj, gCanvasClassInfo.mSurfaceFormat, outBuffer.format);
+
SkImageInfo info = SkImageInfo::Make(outBuffer.width, outBuffer.height,
convertPixelFormat(outBuffer.format),
kPremul_SkAlphaType);
@@ -331,12 +339,12 @@
bitmap.setPixels(NULL);
}
- Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvasObj);
- nativeCanvas->setBitmap(bitmap);
+ env->CallVoidMethod(canvasObj, gCanvasClassInfo.setNativeBitmap,
+ reinterpret_cast<jlong>(&bitmap));
if (dirtyRectPtr) {
- nativeCanvas->clipRect(dirtyRect.left, dirtyRect.top,
- dirtyRect.right, dirtyRect.bottom);
+ SkCanvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvasObj);
+ nativeCanvas->clipRect( SkRect::Make(reinterpret_cast<const SkIRect&>(dirtyRect)) );
}
if (dirtyRectObj) {
@@ -362,8 +370,7 @@
}
// detach the canvas from the surface
- Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvasObj);
- nativeCanvas->setBitmap(SkBitmap());
+ env->CallVoidMethod(canvasObj, gCanvasClassInfo.setNativeBitmap, (jlong)0);
// unlock surface
status_t err = surface->unlockAndPost();
@@ -558,6 +565,10 @@
gSurfaceClassInfo.clazz, "mLock", "Ljava/lang/Object;");
gSurfaceClassInfo.ctor = GetMethodIDOrDie(env, gSurfaceClassInfo.clazz, "<init>", "(J)V");
+ clazz = FindClassOrDie(env, "android/graphics/Canvas");
+ gCanvasClassInfo.mSurfaceFormat = GetFieldIDOrDie(env, clazz, "mSurfaceFormat", "I");
+ gCanvasClassInfo.setNativeBitmap = GetMethodIDOrDie(env, clazz, "setNativeBitmap", "(J)V");
+
clazz = FindClassOrDie(env, "android/graphics/Rect");
gRectClassInfo.left = GetFieldIDOrDie(env, clazz, "left", "I");
gRectClassInfo.top = GetFieldIDOrDie(env, clazz, "top", "I");
diff --git a/core/jni/android_view_TextureView.cpp b/core/jni/android_view_TextureView.cpp
index 7e05793..c2bd0b3c4 100644
--- a/core/jni/android_view_TextureView.cpp
+++ b/core/jni/android_view_TextureView.cpp
@@ -48,6 +48,11 @@
} gRectClassInfo;
static struct {
+ jfieldID mSurfaceFormat;
+ jmethodID setNativeBitmap;
+} gCanvasClassInfo;
+
+static struct {
jfieldID nativeWindow;
} gTextureViewClassInfo;
@@ -167,9 +172,13 @@
bitmap.setPixels(NULL);
}
- Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvas);
- nativeCanvas->setBitmap(bitmap);
- nativeCanvas->clipRect(rect.left, rect.top, rect.right, rect.bottom);
+ SET_INT(canvas, gCanvasClassInfo.mSurfaceFormat, buffer.format);
+ INVOKEV(canvas, gCanvasClassInfo.setNativeBitmap, reinterpret_cast<jlong>(&bitmap));
+
+ SkRect clipRect;
+ clipRect.set(rect.left, rect.top, rect.right, rect.bottom);
+ SkCanvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvas);
+ nativeCanvas->clipRect(clipRect);
if (dirtyRect) {
INVOKEV(dirtyRect, gRectClassInfo.set,
@@ -182,8 +191,7 @@
static void android_view_TextureView_unlockCanvasAndPost(JNIEnv* env, jobject,
jlong nativeWindow, jobject canvas) {
- Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, canvas);
- nativeCanvas->setBitmap(SkBitmap());
+ INVOKEV(canvas, gCanvasClassInfo.setNativeBitmap, (jlong)0);
if (nativeWindow) {
sp<ANativeWindow> window((ANativeWindow*) nativeWindow);
@@ -217,6 +225,10 @@
gRectClassInfo.right = GetFieldIDOrDie(env, clazz, "right", "I");
gRectClassInfo.bottom = GetFieldIDOrDie(env, clazz, "bottom", "I");
+ clazz = FindClassOrDie(env, "android/graphics/Canvas");
+ gCanvasClassInfo.mSurfaceFormat = GetFieldIDOrDie(env, clazz, "mSurfaceFormat", "I");
+ gCanvasClassInfo.setNativeBitmap = GetMethodIDOrDie(env, clazz, "setNativeBitmap", "(J)V");
+
clazz = FindClassOrDie(env, "android/view/TextureView");
gTextureViewClassInfo.nativeWindow = GetFieldIDOrDie(env, clazz, "mNativeWindow", "J");
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 4ccbb41..11b3805 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -21,7 +21,6 @@
#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
-#include <GraphicsJNI.h>
#include <ScopedPrimitiveArray.h>
#include <EGL/egl.h>
@@ -348,11 +347,10 @@
}
static jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz,
- jlong proxyPtr, jlong layerPtr, jobject jbitmap) {
+ jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
- SkBitmap bitmap;
- GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
+ SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
return proxy->copyLayerInto(layer, bitmap);
}
@@ -460,7 +458,7 @@
{ "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
{ "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
{ "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer },
- { "nCopyLayerInto", "(JJLandroid/graphics/Bitmap;)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
+ { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
{ "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate },
{ "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate },
{ "nDetachSurfaceTexture", "(JJ)V", (void*) android_view_ThreadedRenderer_detachSurfaceTexture },
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 13877fb..e11c4a7 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -417,13 +417,6 @@
android:description="@string/permdesc_readSms"
android:protectionLevel="dangerous" />
- <!-- Allows an application to write SMS messages. -->
- <permission android:name="android.permission.WRITE_SMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_writeSms"
- android:description="@string/permdesc_writeSms"
- android:protectionLevel="dangerous" />
-
<!-- Allows an application to receive WAP push messages. -->
<permission android:name="android.permission.RECEIVE_WAP_PUSH"
android:permissionGroup="android.permission-group.SMS"
@@ -517,13 +510,6 @@
android:description="@string/permdesc_accessCoarseLocation"
android:protectionLevel="dangerous" />
- <!-- Allows an application to create mock location providers for testing. -->
- <permission android:name="android.permission.ACCESS_MOCK_LOCATION"
- android:permissionGroup="android.permission-group.LOCATION"
- android:label="@string/permlab_accessMockLocation"
- android:description="@string/permdesc_accessMockLocation"
- android:protectionLevel="dangerous" />
-
<!-- ====================================================================== -->
<!-- Permissions for accessing the device telephony -->
<!-- ====================================================================== -->
@@ -734,12 +720,6 @@
<!-- =============================================================== -->
<eat-comment />
-
- <!-- =============================================================== -->
- <!-- Permissions for accessing the user dictionary -->
- <!-- =============================================================== -->
- <eat-comment />
-
<!-- Used for permissions that provide access to the user
calendar to create / view events.-->
<permission-group android:name="android.permission-group.USER_DICTIONARY"
@@ -848,6 +828,12 @@
android:protectionLevel="signature|system" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE"/>
+ <!-- Allows an application to create mock location providers for testing. -->
+ <permission android:name="android.permission.ACCESS_MOCK_LOCATION"
+ android:label="@string/permlab_accessMockLocation"
+ android:description="@string/permdesc_accessMockLocation"
+ android:protectionLevel="normal" />
+
<!-- ======================================= -->
<!-- Permissions for accessing networks -->
<!-- ======================================= -->
@@ -2408,6 +2394,15 @@
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="signature" />
+ <!-- The system process that pulls carrier configuration from carrier apps will
+ have this permission. Carrier apps that provide
+ {@link android.service.carrier.CarrierConfigService} should require this
+ permission for clients binding to their service. -->
+ <permission android:name="android.permission.BIND_CARRIER_CONFIG_SERVICE"
+ android:label="@string/permlab_bindCarrierConfigService"
+ android:description="@string/permdesc_bindCarrierConfigService"
+ android:protectionLevel="signature|system" />
+
<!-- The system process is explicitly the only one allowed to launch the
confirmation UI for full backup/restore -->
<uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/>
diff --git a/core/res/res/drawable/ic_audio_bt.xml b/core/res/res/color/seekbar_track_progress_material.xml
similarity index 67%
rename from core/res/res/drawable/ic_audio_bt.xml
rename to core/res/res/color/seekbar_track_progress_material.xml
index 4f5af3d..3597c00 100644
--- a/core/res/res/drawable/ic_audio_bt.xml
+++ b/core/res/res/color/seekbar_track_progress_material.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!-- 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.
@@ -14,6 +14,8 @@
limitations under the License.
-->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/ic_audio_bt_alpha"
- android:tint="?attr/colorControlNormal" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="false"
+ android:color="?attr/colorControlNormal" />
+ <item android:color="?attr/colorControlActivated" />
+</selector>
diff --git a/core/res/res/drawable-hdpi/ic_audio_bt_alpha.png b/core/res/res/drawable-hdpi/ic_audio_bt_alpha.png
deleted file mode 100644
index 597c384..0000000
--- a/core/res/res/drawable-hdpi/ic_audio_bt_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_audio_bt_mute_alpha.png b/core/res/res/drawable-hdpi/ic_audio_bt_mute_alpha.png
deleted file mode 100644
index 298db92..0000000
--- a/core/res/res/drawable-hdpi/ic_audio_bt_mute_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_audio_phone_am_alpha.png b/core/res/res/drawable-hdpi/ic_audio_phone_am_alpha.png
deleted file mode 100644
index 8a7d67a..0000000
--- a/core/res/res/drawable-hdpi/ic_audio_phone_am_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_audio_bt_alpha.png b/core/res/res/drawable-mdpi/ic_audio_bt_alpha.png
deleted file mode 100644
index 282c643..0000000
--- a/core/res/res/drawable-mdpi/ic_audio_bt_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_audio_bt_mute_alpha.png b/core/res/res/drawable-mdpi/ic_audio_bt_mute_alpha.png
deleted file mode 100644
index f734c1c..0000000
--- a/core/res/res/drawable-mdpi/ic_audio_bt_mute_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_audio_phone_am_alpha.png b/core/res/res/drawable-mdpi/ic_audio_phone_am_alpha.png
deleted file mode 100644
index beda721..0000000
--- a/core/res/res/drawable-mdpi/ic_audio_phone_am_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_audio_bt_alpha.png b/core/res/res/drawable-xhdpi/ic_audio_bt_alpha.png
deleted file mode 100644
index b8aa083..0000000
--- a/core/res/res/drawable-xhdpi/ic_audio_bt_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_audio_bt_mute_alpha.png b/core/res/res/drawable-xhdpi/ic_audio_bt_mute_alpha.png
deleted file mode 100644
index 93a2481..0000000
--- a/core/res/res/drawable-xhdpi/ic_audio_bt_mute_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_audio_phone_am_alpha.png b/core/res/res/drawable-xhdpi/ic_audio_phone_am_alpha.png
deleted file mode 100644
index 2a04619..0000000
--- a/core/res/res/drawable-xhdpi/ic_audio_phone_am_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_audio_bt_alpha.png b/core/res/res/drawable-xxhdpi/ic_audio_bt_alpha.png
deleted file mode 100755
index 140edac..0000000
--- a/core/res/res/drawable-xxhdpi/ic_audio_bt_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_audio_bt_mute_alpha.png b/core/res/res/drawable-xxhdpi/ic_audio_bt_mute_alpha.png
deleted file mode 100644
index 97829b4..0000000
--- a/core/res/res/drawable-xxhdpi/ic_audio_bt_mute_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_audio_phone_am_alpha.png b/core/res/res/drawable-xxhdpi/ic_audio_phone_am_alpha.png
deleted file mode 100644
index 1fd54a1..0000000
--- a/core/res/res/drawable-xxhdpi/ic_audio_phone_am_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/btn_colored_material.xml b/core/res/res/drawable/btn_colored_material.xml
new file mode 100644
index 0000000..81cbe39
--- /dev/null
+++ b/core/res/res/drawable/btn_colored_material.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+ android:insetLeft="@dimen/button_inset_horizontal_material"
+ android:insetTop="@dimen/button_inset_vertical_material"
+ android:insetRight="@dimen/button_inset_horizontal_material"
+ android:insetBottom="@dimen/button_inset_vertical_material">
+ <ripple android:color="?attr/colorControlHighlight">
+ <item>
+ <shape android:shape="rectangle"
+ android:tint="@color/btn_colored_material">
+ <corners android:radius="@dimen/control_corner_material" />
+ <solid android:color="@color/white" />
+ <padding android:left="@dimen/button_padding_horizontal_material"
+ android:top="@dimen/button_padding_vertical_material"
+ android:right="@dimen/button_padding_horizontal_material"
+ android:bottom="@dimen/button_padding_vertical_material" />
+ </shape>
+ </item>
+ </ripple>
+</inset>
diff --git a/core/res/res/drawable/ic_audio_bt_mute.xml b/core/res/res/drawable/ic_audio_bt_mute.xml
deleted file mode 100644
index d2004c0..0000000
--- a/core/res/res/drawable/ic_audio_bt_mute.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/ic_audio_bt_mute_alpha"
- android:tint="?attr/colorControlNormal" />
diff --git a/core/res/res/drawable/ic_audio_media.xml b/core/res/res/drawable/ic_audio_media.xml
new file mode 100644
index 0000000..a453b3db
--- /dev/null
+++ b/core/res/res/drawable/ic_audio_media.xml
@@ -0,0 +1,27 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="32.0dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0"
+ android:width="32.0dp" >
+
+ <path
+ android:fillColor="?android:attr/colorControlNormal"
+ android:pathData="M12.0,3.0l0.0,9.28c-0.47,-0.17 -0.97,-0.28 -1.5,-0.28C8.01,12.0 6.0,14.01 6.0,16.5S8.01,21.0 10.5,21.0c2.31,0.0 4.2,-1.75 4.45,-4.0L15.0,17.0L15.0,6.0l4.0,0.0L19.0,3.0l-7.0,0.0z" />
+
+</vector>
+
diff --git a/core/res/res/drawable/ic_audio_media_mute.xml b/core/res/res/drawable/ic_audio_media_mute.xml
new file mode 100644
index 0000000..2e7f6dc
--- /dev/null
+++ b/core/res/res/drawable/ic_audio_media_mute.xml
@@ -0,0 +1,30 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="32.0dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0"
+ android:width="32.0dp" >
+
+ <path
+ android:fillColor="?android:attr/colorControlNormal"
+ android:pathData="M15.0,6.0l4.0,0.0L19.0,3.0l-7.0,0.0l0.0,5.6l3.0,3.0C15.0,8.8 15.0,6.0 15.0,6.0z" />
+ <path
+ android:fillColor="?android:attr/colorControlNormal"
+ android:pathData="M4.8,3.9L3.5,5.1l6.9,6.9C8.0,12.1 6.0,14.0 6.0,16.5C6.0,19.0 8.0,21.0 10.5,21.0c2.7,0.0 4.5,-2.3 4.5,-4.3c0.0,0.0 0.0,-0.1 0.0,-0.1l4.0,4.0l1.3,-1.3L4.8,3.9z" />
+
+</vector>
+
diff --git a/core/res/res/drawable/ic_audio_phone.xml b/core/res/res/drawable/ic_audio_phone.xml
deleted file mode 100644
index 1bab863..0000000
--- a/core/res/res/drawable/ic_audio_phone.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2013, 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.
- */
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/ic_audio_phone_am_alpha"
- android:autoMirrored="true"
- android:tint="?attr/colorControlNormal" />
diff --git a/core/res/res/drawable/scrubber_control_selector_material.xml b/core/res/res/drawable/scrubber_control_selector_material.xml
deleted file mode 100644
index 9892676..0000000
--- a/core/res/res/drawable/scrubber_control_selector_material.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="false">
- <bitmap android:src="@drawable/scrubber_control_off_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
- <item>
- <bitmap android:src="@drawable/scrubber_control_on_mtrl_alpha"
- android:tint="?attr/colorControlActivated" />
- </item>
-</selector>
diff --git a/core/res/res/drawable/scrubber_control_material_anim.xml b/core/res/res/drawable/seekbar_thumb_material_anim.xml
similarity index 100%
rename from core/res/res/drawable/scrubber_control_material_anim.xml
rename to core/res/res/drawable/seekbar_thumb_material_anim.xml
diff --git a/core/res/res/drawable/scrubber_progress_horizontal_material.xml b/core/res/res/drawable/seekbar_track_material.xml
similarity index 88%
rename from core/res/res/drawable/scrubber_progress_horizontal_material.xml
rename to core/res/res/drawable/seekbar_track_material.xml
index 86a85c3..01eb243 100644
--- a/core/res/res/drawable/scrubber_progress_horizontal_material.xml
+++ b/core/res/res/drawable/seekbar_track_material.xml
@@ -19,7 +19,7 @@
android:gravity="center_vertical|fill_horizontal">
<shape android:shape="rectangle"
android:tint="?attr/colorControlNormal">
- <size android:height="@dimen/scrubber_track_height_material" />
+ <size android:height="@dimen/seekbar_track_background_height_material" />
<solid android:color="@color/white_disabled_material" />
</shape>
</item>
@@ -32,7 +32,7 @@
<item>
<shape android:shape="rectangle"
android:tint="?attr/colorControlActivated">
- <size android:height="@dimen/scrubber_track_height_material" />
+ <size android:height="@dimen/seekbar_track_progress_height_material" />
<solid android:color="@color/white_disabled_material" />
</shape>
</item>
@@ -48,7 +48,7 @@
<item>
<shape android:shape="rectangle"
android:tint="?attr/colorControlActivated">
- <size android:height="@dimen/progress_bar_height_material" />
+ <size android:height="@dimen/seekbar_track_progress_height_material" />
<solid android:color="@color/white" />
</shape>
</item>
diff --git a/core/res/res/layout/date_picker_header_material.xml b/core/res/res/layout/date_picker_header_material.xml
index bda7de9..8125544 100644
--- a/core/res/res/layout/date_picker_header_material.xml
+++ b/core/res/res/layout/date_picker_header_material.xml
@@ -45,6 +45,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.Material.DatePicker.DateLabel"
+ android:gravity="start"
android:maxLines="2"
android:ellipsize="none"
tools:text="Thu, Sep 30"
diff --git a/core/res/res/layout/day_picker_content_material.xml b/core/res/res/layout/day_picker_content_material.xml
new file mode 100644
index 0000000..1852bfa
--- /dev/null
+++ b/core/res/res/layout/day_picker_content_material.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <android.widget.DayPickerViewPager
+ android:id="@+id/day_picker_view_pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <ImageButton
+ android:id="@+id/prev"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minWidth="48dp"
+ android:minHeight="48dp"
+ android:src="@drawable/ic_chevron_left"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:contentDescription="@string/date_picker_prev_month_button"
+ android:visibility="invisible" />
+
+ <ImageButton
+ android:id="@+id/next"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minWidth="48dp"
+ android:minHeight="48dp"
+ android:src="@drawable/ic_chevron_right"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:contentDescription="@string/date_picker_next_month_button"
+ android:visibility="invisible" />
+
+</FrameLayout>
diff --git a/core/res/res/layout/floating_popup_container.xml b/core/res/res/layout/floating_popup_container.xml
index f247919..e1af94c 100644
--- a/core/res/res/layout/floating_popup_container.xml
+++ b/core/res/res/layout/floating_popup_container.xml
@@ -19,7 +19,9 @@
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="@dimen/floating_toolbar_height"
+ android:padding="0dp"
+ android:layout_margin="0dp"
android:elevation="2dp"
android:focusable="true"
android:focusableInTouchMode="true"
- android:background="@android:color/background_light" />
+ android:background="@color/floating_toolbar_background_color"/>
diff --git a/core/res/res/layout/floating_popup_menu_button.xml b/core/res/res/layout/floating_popup_menu_button.xml
index 9fa13bd..70227fa 100644
--- a/core/res/res/layout/floating_popup_menu_button.xml
+++ b/core/res/res/layout/floating_popup_menu_button.xml
@@ -19,13 +19,15 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="@dimen/floating_toolbar_menu_button_side_padding"
- android:paddingLeft="@dimen/floating_toolbar_menu_button_side_padding"
- android:paddingRight="@dimen/floating_toolbar_menu_button_side_padding"
+ android:paddingStart="@dimen/floating_toolbar_menu_button_side_padding"
+ android:paddingEnd="@dimen/floating_toolbar_menu_button_side_padding"
android:paddingTop="0dp"
android:paddingBottom="0dp"
+ android:layout_margin="0dp"
android:singleLine="true"
android:ellipsize="end"
android:fontFamily="sans-serif"
android:textSize="@dimen/floating_toolbar_text_size"
android:textAllCaps="true"
- android:background="?attr/selectableItemBackground" />
\ No newline at end of file
+ android:textColor="@color/floating_toolbar_text_color"
+ android:background="?attr/selectableItemBackground" />
diff --git a/core/res/res/layout/floating_popup_overflow_list_item b/core/res/res/layout/floating_popup_overflow_list_item
index 9294f3b..c0db1bd 100644
--- a/core/res/res/layout/floating_popup_overflow_list_item
+++ b/core/res/res/layout/floating_popup_overflow_list_item
@@ -22,12 +22,14 @@
android:gravity="center_vertical"
android:minWidth="@dimen/floating_toolbar_menu_button_side_padding"
android:minHeight="@dimen/floating_toolbar_height"
- android:paddingLeft="@dimen/floating_toolbar_menu_button_side_padding"
- android:paddingRight="@dimen/floating_toolbar_menu_button_side_padding"
+ android:paddingStart="@dimen/floating_toolbar_overflow_side_padding"
+ android:paddingEnd="@dimen/floating_toolbar_overflow_side_padding"
android:paddingTop="0dp"
android:paddingBottom="0dp"
+ android:layout_margin="0dp"
android:singleLine="true"
android:ellipsize="end"
android:fontFamily="sans-serif"
android:textSize="@dimen/floating_toolbar_text_size"
+ android:textColor="@color/floating_toolbar_text_color"
android:textAllCaps="true" />
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 97df7e5..9ee5a86 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Laat die program toe om SMS-boodskappe wat op jou tablet of SIM-kaart gestoor is, te lees. Dit laat die program toe om alle SMS-boodskappe te lees, ongeag van die inhoud of vertroulikheid daarvan."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Laat die program toe om SMS-boodskappe te lees wat op jou TV of SIM-kaart geberg is. Dit laat die program toe om alle SMS-boodskappe te lees, ongeag inhoud of vertroulikheid."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Laat die program toe om SMS-boodskappe wat op jou foon of SIM-kaart gestoor is, te lees. Dit laat die program toe om alle SMS-boodskappe te lees, ongeag van die inhoud of vertroulikheid daarvan."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"redigeer jou teksboodskappe (SMS of MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Laat die program toe om SMS-boodskappe te lees wat op jou tablet of SIM-kaart gestoor is. Kwaadwillige programme kan dalk jou boodskappe uitvee."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Laat die program toe om na SMS-boodskappe te skryf wat op jou TV of SIM-kaart geberg word. Kwaadwillige programme sal dalk jou boodskappe uitvee."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Laat die program toe om SMS-boodskappe te skryf wat op jou foon of SIM-kaart gestoor is. Kwaadwillige programme kan dalk jou boodskappe uitvee."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ontvang teksboodskappe (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Laat die program toe om WAP-boodskappe te ontvang en te verwerk. Hierdie toestemming sluit ook in dat boodskappe wat na jou toestel gestuur is, gemonitor of uitgevee kan word, sonder dat jy dit gesien het."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"haal lopende programme op"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Gedeeltelike vingerafdruk is bespeur. Probeer asseblief weer."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Kon nie vingerafdruk verwerk nie. Probeer asseblief weer."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Vingerafdruksensor is vuil. Maak dit skoon en probeer weer."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Vinger is te vinnig beweer. Probeer weer."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Vinger is te stadig beweeg. Probeer asseblief weer."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Vingerafdrukhardeware is nie beskikbaar nie."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan nie gestoor word nie. Verwyder asseblief \'n bestaande vingerafdruk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vingerafdrukuittelling is bereik. Probeer weer."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Vingerafdrukhandeling is gekanselleer."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Te veel pogings. Probeer later weer."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probeer weer."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lees sinkroniseer-instellings"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Laat die program toe om na die SD-kaart te skryf."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"maak en/of ontvang SIP-oproepe"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Laat die program toe om SIP-oproepe te maak en te ontvang."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registreer nuwe telekommunikasie-SIM-verbindings"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Laat die program toe om nuwe telekommunikasie-SIM-verbindings te registreer."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registreer nuwe telekommunikasieverbindings"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Laat die program toe om nuwe telekommunikasieverbindings te registreer."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"bestuur telekom-verbindings"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Laat die program toe om telekom-verbindings te bestuur."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"beleef interaksie met inoproep-skerm"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Laat die program beheer wanneer en hoe die gebruiker die inoproep-skerm sien."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"werk met telefoniedienste saam"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Laat die program toe om met telefoniedienste saam te werk om oproepe te maak of ontvang."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"bied \'n inoproep-gebruikerervaring"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Laat die program toe om \'n inoproep-gebruikerervaring te bied."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lees netwerkgebruik-geskiedenis"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Laat die program toe om historiese netwerkgebruik vir spesifieke netwerke en programme te lees."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"bestuur netwerkbeleid"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Laat die program toe om netwerkbeleide te bestuur en program-spesifieke reëls te definieer."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"verander verrekening van netwerkgebruik"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Laat die program toe om te verander hoe netwerkgebruik teenoor programme gemeet word. Nie vir gebruik deur normale programme nie."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"kry toegang tot kennisgewings"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Laat die program toe om kennisgewings op te haal, te bestudeer en te verwyder, insluitende die kennisgewings wat deur ander programme geplaas is."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bind aan \'n kennisgewingluisteraardiens"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Laat die houer toe om aan die top-koppelvlak van \'n kennisgewingluisteraardiens te bind. Behoort nooit vir gewone programme nodig te wees nie."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"verbind met \'n toestandverskafferdiens"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Laat die houer toe om met die topvlak-koppelvlak van \'n toestandverskafferdiens te verbind. Behoort nooit vir normale programme nodig te wees nie."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"bind aan \'n droomdiens"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Laat die houer toe om aan die topvlak-koppelvlak van \'n droomdiens te bind. Behoort nooit vir normale programme nodig te wees nie."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"roep die opstellingprogram op wat deur die diensverskaffer voorsien is"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Laat die houer toe om die opstellingsprogram wat deur die diensverskaffer voorsien word, op te roep. Behoort nooit vir gewone programme nodig te wees nie."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"luister vir waarnemings oor netwerktoestande"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Laat \'n program luister vir waarnemings oor netwerktoestande. Behoort nooit nodig te wees vir normale programme nie."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"verander invoertoestelkalibrasie"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Laat die program toe om die kalibrasieparameters van die raakskerm te wysig. Dit behoort nooit vir normale programme nodig te wees nie."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"gaan in by DRM-sertifikate"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Laat \'n program toe om DRM-sertifikate op te stel en te gebruik. Behoort nooit vir normale programme nodig te wees nie."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Ontvang Android Straal-oordragstatus"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Laat hierdie program toe om inligting oor huidige Android Straal-oordragte te ontvang."</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"verwyder DRM-sertifikate"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Laat \'n program toe om DRM-sertifikate te verwyder. Behoort nooit vir gewone programme nodig te wees nie."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"bind aan \'n diensverskaffer-boodskapdiens"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Dit laat die houer toe om aan die top-koppelvlak van \'n diensverskaffer-boodskapdiens te bind. Behoort nooit vir gewone programme nodig te wees nie."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Stel wagwoordreëls"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Beheer die lengte en die karakters wat in skermslotwagwoorde en -PIN\'e toegelaat word."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Monitor pogings om skerm te ontsluit"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Druk kieslys om oop te sluit of maak noodoproep."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Druk kieslys om oop te maak."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Teken patroon om te ontsluit"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Noodgeval"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Keer terug na oproep"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Reg!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Probeer weer"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidate"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Berei tans <xliff:g id="NAME">%s</xliff:g> voor"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kyk tans vir foute"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nuwe <xliff:g id="NAME">%s</xliff:g> bespeur"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Om foto\'s en media oor te dra"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Beskadigde <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> is beskadig; probeer dit herformateer"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> is onverwags verwyder"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Demonteer <xliff:g id="NAME">%s</xliff:g> voordat dit verwyder word om dataverlies te voorkom"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Het <xliff:g id="NAME">%s</xliff:g> verwyder"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> is verwyder; sit \'n nuwe een in"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Demonteer <xliff:g id="NAME">%s</xliff:g> tans nog …"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Moenie verwyder nie"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Stel op"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Haal uit"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Verken"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Geen passende aktiwiteite gevind nie."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Roeteer media-uitvoer"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Laat \'n program toe om media-uitvoere na ander eksterne toestelle te roeteer."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s-%2$s%3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Interne geheue"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kaart"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-berging"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Redigeer"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Dataverbruik-waarskuwing"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Totdat jy dit afskakel"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Vou in"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokkeer onderbrekings"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Moenie steur nie"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Staantyd"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Weekaande"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Naweke"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index b2a0910..8027861 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"መገለጫው በጡባዊ ተኮዎ ወይም በSIM ካርድዎ የተከማቹ የኤስኤምኤስ. መልዕክቶችን እንዲያነብ ይፈቅድለታል። ይህ መተግበሪያው ይዘት ወይም ሚስጥራዊነትን ከግምት ሳያስገባ ሁሉንም የኤስኤምኤስ መልዕክቶች እንዲያነብ ይፈቅድለታል።"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"መተግበሪያው በእርስዎ ቴሌቪዥን ወይም ሲም ካርድ ላይ የተከማቹ የኤስኤምኤስ መልዕክቶችን እንዲነብ ያስችለዋል። ይሄ መተግበሪያው ይዘትንም ሆነ ሚስጥራዊነት ከግምት ውስጥ ሳያስገባ ሁሉንም የኤስኤምኤስ መልዕክቶችን እንዲያነብ ያስችለዋል።"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"መገለጫው በስልክዎ ወይም በSIM ካርድዎ የተከማቹ የኤስ.ኤም.ኤስ. መልዕክቶችን እንዲያነብ ይፈቅድለታል። ይህ መተግበሪያው ይዘት ወይም ሚስጥራዊነትን ከግምት ሳያስገባ ሁሉንም የኤስ.ኤም.ኤስ. መልዕክቶች እንዲያነብ ይፈቅድለታል።"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"የጽሑፍ መልዕክቶችህን አርትዕ (ኤስ.ኤም.ኤስ. ወይም ኤም.ኤም.ኤስ.)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"በጡባዊ ተኮህ ወይም ሲም ካርድህ ላይ ኤስ ኤም ኤስ መልዕክቶችን ለመፃፍ ለመተግበሪያው ይፈቅዳሉ፡፡መልዕክቶችህን ተንኮል አዘል መተግበሪያዎች ሊሰርዙ ይችላሉ፡፡"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"መተግበሪያው በእርስዎ ቴሌቪዥን ወይም ሲም ካርድ ላይ በተከማቹ የኤስኤምኤስ መልዕክቶች ላይ እንዲጽፍ ያስችለዋል። ተንኮል-አዘል መተግበሪያዎች መልዕክቶችዎን ሊሰርዙ ይችላሉ።"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"በስልክዎ ወይም ሲም ካርድዎ ላይ ኤስ ኤም ኤስ መልዕክቶችን ለመፃፍ ለመተግበሪያው ይፈቅዳሉ። መልዕክቶችዎን ተንኮል አዘል መተግበሪያዎች ሊሰርዙ ይችላሉ።"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"የፅሁፍ መልዕክቶችን ተቀበል (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"መተግበሪያው የWAP መልዕክቶችን እንዲያነብ እና እንዲያካሂድ ይፈቅዳል። ይህ ፈቃድ የተላኩልዎን መልዕክቶች ለእርስዎ ሳያሳይዎ የመቆጣጠር ወይም የመሰረዝ ብቃትን ያጠቃልላል።"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"አሂድ መተግበሪያዎችን ሰርስረው ያውጡ"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ከፊል የጣት አሻራ ተገኝቷል። እባክዎ እንደገና ይሞክሩ።"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ጣት አሻራን መስራት አልተቻለም። እባክዎ እንደገና ይሞክሩ።"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"የጣት አሻራ ዳሳሽ ቆሽሿል። እባክዎ ያጽዱት እና እንደገና ይሞክሩ።"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"ጣት ከልክ በላይ ቶሎ ተንቀሳቅሷል። እባክዎ እንደገና ይሞክሩ።"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"ጣት በጣም በዝግታ ተንቀሳቅሷል። እባክዎ እንደገና ይሞክሩ።"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"የጣት አሻራ ሃርድዌር አይገኝም።"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"የጣት አሻራ ሊከማች አይችልም። እባክዎ አሁን ያለውን የጣት አሻራ ያስወግዱ።"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"የጣት አሻራ ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"የጣት አሻራ ስርዓተ ክወና ተትቷል።"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"እንደገና ይሞክሩ።"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"የሥምሪያ ቅንብሮች አንብብ"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"መተግበሪያውን ወደ SD ካርድ ለመፃፍ ይፈቅዳል።"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"የSIP ጥሪዎችን ያድርጉ/ይቀበሉ"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"መተግበሪያው የSIP ጥሪዎችን እንዲያደር እና እንዲቀበል ያስችላል።"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"አዲስ የቴሌኮም ግንኙነቶችን መዝግብ"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"መተግበሪያው አዲስ የቴሌኮም ሲም ግንኙነቶችን እንዲመዘግብ ያስችለዋል።"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"አዲስ የቴሌኮም ግንኙነቶችን መዝግብ"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"መተግበሪያው አዲስ የቴሌኮም ግንኙነቶችን እንዲመዘግብ ያስችለዋል።"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"የቴሌኮም ግንኙነቶችን ያቀናብራል"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"መተግበሪያው የቴሌኮም ግንኙነቶችን እንዲያቀናብር ያስችለዋል።"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ከውስጠ-ጥሪ ማያ ገጽ ጋር መስተጋብር ይፈጥራል"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"መተግበሪያው ተጠቃሚው በጥሪ ውስጥ ያለውን ማያ ገጽ መቼ እና እንዴት ማየት እንደሚችል እንዲቆጣጠር ይፈቅድለታል።"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"ከስልክ አገልግሎቶች ጋር መስተጋብር ይፈጥራል"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"መተግበሪያው ጥሪዎችን እንዲያደርግ/እንዲቀበል ከስልክ አገልግሎቶች ጋር መስተጋብር እንዲፈጥር ያስችለዋል።"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"የውስጠ-ጥሪ ተጠቃሚ ተሞክሮ ያቀርባል"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"መተግበሪያው የውስጠ-ጥሪ ተጠቃሚ ተሞክሮ እንዲያቀርብ ያስችለዋል።"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"የታሪካዊ አውታረመረብ አጠቃቀም አንብብ"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"የተወሰኑ የአውታረ መረቦች እና ትግበራዎችን ታሪካዊ የአውታረመረብ አጠቃቀም ለማንበብ ለመተግበሪያው ይፈቅዳሉ፡፡"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"የአውታረ መረብ መመሪያ አደራጅ"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"የአውታረመረብ ቋሚ መመሪያዎችን እና ትግበራ ተኮር ደንቦችን ለማደራጀት ለመተግበሪያው ይፈቅዳሉ፡፡"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"የአውታረ መረብ አጠቃቀም"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ከመተግበሪያዎች በተለየ መልኩ እንዴት የአውታረ መረብ አጠቃቀም እንደተመዘገበ ለመቀየር ለመተግበሪያው ይፈቅዳሉ።ለመደበኛ መተግበሪያዎች አገልግሎት አይውልም።"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"ማሳወቂያዎችን ይድረሱ"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"መተግበሪያው ማሳወቂያዎችን እንዲያስመጣ፣ እንዲመረምር እና እንዲያጸዳ ያስችለዋል፣ በሌሎች መተግበሪያዎች የተለጠፉትንም ጨምሮ።"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ከአንድ የማሳወቂያ አዳማጭ አገልግሎት ጋር ይሰሩ"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ያዢው የማሳወቂያ አዳማጭ አገልግሎቱን ከከፍተኛ-ደረጃ በይነገጹ ጋር እንዲያስር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"ከአንድ የሁኔታ አቅራቢ አገልግሎት ጋር ይሰሩ"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"ያዢው የአንድ የሁኔታ አቅራቢ አገልግሎት የከፍተኛ ደረጃ በይነገጽ እንዲያስር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"ከህልም አገልግሎት ጋር ጠርዝ"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"ያዢው የህልም አገልግሎቱን ከከፍተኛ-ደረጃ በይነገጽ ጋር እንዲጠርዝ ይፈቅዳል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"በድምጸ-ተያያዥ ሞደም የቀረበው የውቅር መተግበሪያውን መጥራት"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ያዢው በድምጸ-ተያያዥ ሞደም የቀረበው የውቅር መተግበሪያውን እንዲጠራው ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"በአውታረ መረብ ሁኔታዎች ላይ የተስተዋሉ ነገሮችን ያዳምጣል"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"አንድ መተግበሪያ በአውታረ መረብ ሁኔታዎች ላይ የተስተዋሉ ነገሮችን እንዲያዳምጥ ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ አስፈላጊ ሊሆን አይገባም።"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"የግቤት መሣሪያ ማስተካከያ ቀይር"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"መተግበሪያው የማያ ንካ የማስተካከያ ልኬቶቹን እንዲቀይር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"የDRM የምስክር ወረቀቶች ላይ ይድረሱ"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"አንድ መተግበሪያ የDRM የምስክር ወረቀቶችን እንዲሰጥና እንዲጠቀም ያስችላል። ለመደበኛ መተግበሪያዎች በፍጹም አስፈላጊ አይሆንም።"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"የAndroid Beam ሽግግር ሁኔታን ይቀበሉ"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ይም መተግበሪያ ስለአሁን የAndroid Beam ሽግግሮች መረጃ እንዲቀበል ይፈቅዳል"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"የDRM እውቅና ማረጋገጫዎችን ያስወግዳል"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"አንድ መተግበሪያ የDRM እውቅና ማረጋገጫዎችን እንዲያስወግድ ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"ወደሞባይል አገልግሎት ሰጪ የመልዕክት አገልግሎት አያይዝ"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"ያዢው በሞባይል አገልግሎት ሰጪ የመልዕክት አላላክ አገልግሎት ላይ ከፍተኛውን ደረጃ በይነ ገጽ እንዲይዝ ይፈቅድለታል። ለመደበኛ መተግበሪያ በጭራሽ አያስፈልግም።"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"የይለፍ ቃል ደንቦች አዘጋጅ"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"በማያ ገጽ መቆለፊያ የይለፍ ቃሎች እና ፒኖች ውስጥ የሚፈቀዱ ቁምፊዎችን እና ርዝመታቸውን ተቆጣጠር።"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"የማሳያ-ክፈት ሙከራዎችን አሳይ"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ለመክፈት ምናሌ ተጫንወይም የአደጋ ጊዜ ጥሪ አድርግ።"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"ለመክፈት ምናሌ ተጫን"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"ለመክፈት ስርዓተ ጥለት ሳል"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"ድንገተኛ አደጋ"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"ወደ ጥሪ ተመለስ"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ትክክል!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"እንደገና ሞክር"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"ዕጩዎች"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ን በማዘጋጀት ላይ"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ስህተቶች ካሉ በመፈተሽ ላይ"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"አዲስ <xliff:g id="NAME">%s</xliff:g> ተገኝቷል"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ፎቶዎችን እና ማህደረመረጃን ለማስተላለፍ"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> ተጎድቷል"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> ተጎድቷል፤ ዳግም ቅርጸት ለመስራት ይሞክሩ"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ሳይታሰብ ተወግዷል"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ውሂብ እንዳይጠፋ ለመከላከል ከማስወገድዎ በፊት <xliff:g id="NAME">%s</xliff:g>ን ያላቅቁት"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"«<xliff:g id="NAME">%s</xliff:g>» ተወግዷል"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ተወግዷል፤ አዲስ ያስገቡ"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"አሁንም <xliff:g id="NAME">%s</xliff:g>ን በማስወጣት ላይ…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"አያስወግዱ"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"ማዘጋጀት"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"አስወጣ"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"ያስሱ"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"ምንም ተመሳሳይ እንቅስቃሴዎች አልተገኙም።"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"የሚዲያ ውፅአት መንገድ"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"አንድ መተግበሪያ የሚዲያ ውፅአትን ወደ ሌላ ውጫዊ መሳሪያ እንዲመራ ይፈቅድለታል።"</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s፣ %2$s፣ %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"ውስጣዊ ማከማቻ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD ካርድ"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"የUSB ማከማቻ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"አርትዕ"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"የውሂብ አጠቃቀም ማስጠንቀቂየ"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"ይህን እስኪያጠፉት ድረስ"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ሰብስብ"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"መቆራረጦችን አግድ"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"አትረብሽ"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"የማይገኝበት ጊዜ"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"የሳምንቱ ቀኖች ምሽቶች"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"የሳምንት መጨረሻ ቀኖች"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 222ed6a..95ce46e 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -274,10 +274,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"للسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على الجهاز اللوحي أو على شريحة SIM. ويتيح هذا للتطبيق قراءة جميع الرسائل القصيرة SMS، بغض النظر عن المحتوى أو مدى السرية."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"يتيح للتطبيق قراءة الرسائل القصيرة SMS المخزنة في التلفزيون أو في شريحة SIM. ويتيح هذا للتطبيق قراءة جميع الرسائل القصيرة، بغض النظر عن المحتوى ومدى السرية."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"للسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على هاتفك أو على شريحة SIM. ويتيح هذا للتطبيق قراءة جميع الرسائل القصيرة SMS، بغض النظر عن المحتوى أو مدى السرية."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"تعديل الرسائل النصية (الرسائل القصيرة SMS أو رسائل الوسائط المتعددة)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"للسماح للتطبيق بالكتابة إلى الرسائل القصيرة SMS المخزّنة على الجهاز اللوحي أو شريحة SIM. قد تحذف التطبيقات الضارة رسائلك."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"يتيح للتطبيق كتابة رسائل قصيرة SMS مخزنة على التلفزيون أو شريحة SIM. وقد تؤدي التطبيقات الضارة إلى حذف رسائلك."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"للسماح للتطبيق بالكتابة إلى الرسائل القصيرة SMS المخزّنة على الهاتف أو شريحة SIM. قد تحذف التطبيقات الضارة رسائلك."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"تلقي رسائل نصية (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"للسماح للتطبيق بتلقي رسائل WAP ومعالجتها. ويتضمن هذا الإذن إمكانية مراقبة الرسائل التي يتم إرسالها إليك أو حذفها بدون عرضها لك."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"استرداد التطبيقات التي قيد التشغيل"</string>
@@ -433,21 +429,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"تم اكتشاف بصمة الإصبع بشكل جزئي؛ يرجى إعادة المحاولة."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"تعذرت معالجة بصمة الإصبع. يُرجى إعادة المحاولة."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"جهاز استشعار بصمات الأصابع متسخ، يرجى تنظيفه وإعادة المحاولة."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"تحرك الإصبع بسرعة كبيرة جدًا؛ الرجاء إعادة المحاولة."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"تحرك الإصبع ببطء شديد جدًا؛ يرجى إعادة المحاولة."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"جهاز بصمة الإصبع غير متاح."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"يتعذر تخزين بصمة الإصبع؛ يرجى إزالة إحدى البصمات المخزنة."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"تم بلوغ مهلة إدخال بصمة الإصبع. أعد المحاولة."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"تم إلغاء تشغيل بصمة الإصبع."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"تم إجراء عدد كبير من المحاولات. أعد المحاولة لاحقًا."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"أعد المحاولة."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"قراءة إعدادات المزامنة"</string>
@@ -472,6 +463,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"للسماح للتطبيق بالكتابة إلى بطاقة SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"إجراء/تلقي مكالمات SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"للسماح للتطبيق بإجراء مكالمات SIP وتلقيها."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"تسجيل اتصالات SIM اللاسلكية الجديدة"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"للسماح للتطبيق بتسجيل اتصالات SIM اللاسلكية الجديدة."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"تسجيل الاتصالات اللاسلكية الجديدة"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"للسماح للتطبيق بتسجيل الاتصالات اللاسلكية الجديدة."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"إدارة الاتصالات اللاسلكية"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"للسماح للتطبيق بإدارة الاتصالات اللاسلكية."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"التفاعل مع الشاشة أثناء الاتصال"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"للسماح للتطبيق بالتحكم في وقت وكيفية مشاهدة المستخدم للشاشة أثناء الاتصال."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"التفاعل مع الخدمات الهاتفية"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"للسماح للتطبيق بالتفاعل مع الخدمات الهاتفية لإجراء/تلقي المكالمات."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"توفير تجربة للمستخدم أثناء الاتصال"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"للسماح للتطبيق بتوفير تجربة للمستخدم أثناء الاتصال."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"قراءة بيانات الاستخدام السابقة للشبكة"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"للسماح للتطبيق بقراءة معلومات سابقة عن استخدام الشبكة لشبكات وتطبيقات محددة."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"إدارة سياسة الشبكة"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"للسماح لتطبيق بإدارة سياسات الشبكة وتحديد قواعد متعلقة بالتطبيق."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"تعديل حساب استخدام الشبكة"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"للسماح للتطبيق بتعديل كيفية حساب استخدام الشبكة في التطبيقات. ليس للاستخدام بواسطة التطبيقات العادية."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"إشعارات الدخول"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"يتيح للتطبيق استرجاع الإشعارات وفحصها ومسحها، بما في ذلك تلك التي نشرتها تطبيقات أخرى."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"الربط بخدمة تلقّي الإشعارات الصوتية"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"يتيح للمالك الربط بواجهة المستوى العلوي لخدمة تلقّي الإشعارات الصوتية. ولن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"الربط بخدمة موفر الحالة"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"للسماح للمالك بالربط بواجهة المستوى العلوي لخدمة موفر الحالة. لن تكون هناك حاجة إلى هذا الإعداد مطلقًا مع التطبيقات العادية."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"الالتزام بخدمة dream"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة dream. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"استدعاء تطبيق التهيئة الذي يوفره مشغل شبكة الجوال"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"للسماح للمالك باستدعاء تطبيق التهيئة الذي يوفره مشغل شبكة الجوال. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"الاستماع إلى ملاحظات حول أحوال الشبكة"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"للسماح للتطبيق بالاستماع إلى ملاحظات حول أحوال الشبكة. لا حاجة إلى هذا مع التطبيقات العادية."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"تغيير معايرة أجهزة الإدخال"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"يتيح للتطبيق إمكانية تعديل معلمات المعايرة في شاشة اللمس. يجب عدم اللجوء إليه مع التطبيقات العادية."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"الدخول إلى شهادات DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"للسماح لأحد التطبيقات بتقديم شهادات DRM واستخدامها. لا يجب أن يكون ذلك لازمًا مطلقًا مع التطبيقات العادية."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"تلقي حالة نقل شعاع Android"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"السماح لهذا التطبيق بتلقي معلومات حول عمليات نقل شعاع Android الحالية"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"إزالة شهادات DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"للسماح لأحد التطبيقات بإزالة شهادات DRM. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"الالتزام بخدمة المراسلة التابعة لمشغل شبكة الجوّال"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"يسمح لحامله بالالتزام بواجهة المستوى العالي لخدمة المراسلة التابعة لمشغل شبكة الجوَّال. ومن المفترض عدم الحاجة إليه مع التطبيقات العادية."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"تعيين قواعد كلمة المرور"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"للتحكم في الطول والأحرف المسموح بها في كلمات المرور وأرقام التعريف الشخصي في قفل الشاشة."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"مراقبة محاولات إلغاء قفل الشاشة"</string>
@@ -632,8 +667,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"اضغط على \"القائمة\" لإلغاء التأمين أو إجراء اتصال بالطوارئ."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"اضغط على \"القائمة\" لإلغاء التأمين."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"رسم نقش لإلغاء التأمين"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"الطوارئ"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"العودة إلى الاتصال"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"صحيح!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"أعد المحاولة"</string>
@@ -1057,36 +1091,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"العناصر المرشحة"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"جارٍ تحضير <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"جارٍ التحقق من الأخطاء"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"تم اكتشاف <xliff:g id="NAME">%s</xliff:g> جديدة"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"لنقل الصور والوسائط"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> تالفة"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"إن <xliff:g id="NAME">%s</xliff:g> تالفة؛ حاول"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"تمت إزالة <xliff:g id="NAME">%s</xliff:g> بشكل غير متوقع"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"إلغاء تحميل <xliff:g id="NAME">%s</xliff:g> قبل الإزالة لتجنب فقد البيانات"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"تمت إزالة <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"تمت إزالة <xliff:g id="NAME">%s</xliff:g>؛ أدخل واحدة جديدة"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"لا يزال إخراج <xliff:g id="NAME">%s</xliff:g> جاريًا…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"لا تزِلها"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"الإعداد"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"إلغاء"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"استكشاف"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"لم يتم العثور على أي أنشطة متطابقة."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"توجيه إخراج الوسائط"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"للسماح للتطبيق بتوجيه إخراج الوسائط إلى أجهزة خارجية أخرى."</string>
@@ -1220,6 +1239,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s، %2$s، %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"وحدة تخزين داخلية"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"بطاقة SD"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"بطاقة SD من <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"محرك أقراص USB"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"محرك أقراص USB من <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"وحدة تخزين USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"تعديل"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"تحذير استخدام البيانات"</string>
@@ -1502,7 +1524,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"لحين تعطيل هذا الإعداد"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"تصغير"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"حظر المقاطعات"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"الرجاء عدم الإزعاج"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"التعطل"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ليالي الأسبوع"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"نهايات الأسبوع"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index bd255f4..7ec8b20 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Разрешава на приложението да чете SMS съобщенията, съхранени на таблета или SIM картата ви. Това разрешение му позволява да чете всички съобщения независимо от съдържанието или поверителността."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Разрешава на приложението да чете съхраняваните в телевизора или SIM картата ви SMS съобщения. Това му позволява да чете всички текстови съобщения, независимо от съдържанието или поверителността им."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Разрешава на приложението да чете SMS съобщенията, съхранени на телефона или SIM картата ви. Това разрешение му позволява да чете всички съобщения независимо от съдържанието или поверителността."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"редактиране на текстовите ви съобщения (SMS или MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Разрешава на приложението да записва в SMS съобщенията, съхранени в таблета или в SIM картата ви. Злонамерените приложения могат да изтрият съобщенията ви."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Разрешава на приложението да записва върху съхраняваните в телевизора или SIM картата ви SMS съобщения. Злонамерените приложения може да изтрият съобщенията ви."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Разрешава на приложението да записва в SMS съобщенията, съхранени в телефона или в SIM картата ви. Злонамерените приложения могат да изтрият съобщенията ви."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"получаване на текстови съобщения (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Разрешава на приложението да получава и обработва WAP съобщения. Това разрешение включва възможността да наблюдава или изтрива изпратените до вас, без да ви ги покаже."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"извличане на изпълняваните приложения"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Открит е частичен отпечатък. Моля, опитайте отново."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Отпечатъкът не можа да се обработи. Моля, опитайте отново."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Сензорът за отпечатъци е мръсен. Моля, почистете го и опитайте отново."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Отместихте пръста си твърде бързо. Моля, опитайте отново."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Преместихте пръста си твърде бавно. Моля, опитайте отново."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардуерът за отпечатъци не е налице."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатъкът не може да бъде съхранен. Моля, премахнете съществуващ."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Времето за изчакване за отпечатък изтече. Опитайте отново."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Операцията за отпечатък е анулирана."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Твърде много опити. Пробвайте отново по-късно."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Опитайте отново."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"четене на настройките за синхронизиране"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Разрешава на приложението да записва върху SD картата."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"извършване/получаване на обаждания чрез SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Разрешава на приложението да извършва и получава обаждания чрез SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"регистриране на нови телекомуникационни връзки за SIM карти"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Разрешава на приложението да регистрира новите телекомуникационни връзки за SIM карти."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"регистриране на нови телекомуникационни връзки"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Разрешава на приложението да регистрира новите телекомуникационни връзки."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"управление на телекомуникационните връзки"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Разрешава на приложението да управлява телекомуникационните връзки."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"взаимодействие с екрана за обаждане"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Разрешава на приложението да контролира кога и как потребителят вижда екрана за обаждане."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"взаимодействие с телефонни услуги"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Разрешава на приложението да взаимодейства с телефонни услуги за извършване/получаване на обаждания."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"предоставяне на опции за практическа работа по време на обаждане"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Разрешава на приложението да предоставя опции за практическа работа по време на обаждане."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"четене на употребата на мрежата до момента"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Разрешава на приложението да чете употребата на данни за конкретни мрежи и приложения до момента."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"управление на правилата на мрежата"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Разрешава на приложението да управлява правилата на мрежата и да определя такива за конкретно приложение."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"промяна на отчетността на употребата на мрежа"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Разрешава на приложението да променя това как употребата на мрежа се отчита спрямо приложенията. Не е предназначено за нормални приложения."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"достъп до известията"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Разрешава на приложението да извлича, преглежда и изчиства известия, включително публикуваните от други приложения."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"обвързване с услуга за слушател на известия"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Разрешава на притежателя да се обвърже с интерфейса от първо ниво на услуга за слушател на известия. Нормалните приложения не би трябвало никога да се нуждаят от това."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"свързване с услуга за предоставяне на условия"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Разрешава на притежателя да се свърже с интерфейса от най-високото ниво на услуга за предоставяне на условия. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"свързване с услуга за „мечти“"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Разрешава на притежателя да се свърже с интерфейса от най-високото ниво на услуга за „мечти“. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"извикване на предоставеното от оператора приложение за конфигуриране"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Разрешава на притежателя да извиква предоставеното от оператора приложение за конфигуриране. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"слушане за наблюдения на мрежовите условия"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Разрешава на приложението да слуша за наблюдения на мрежовите условия. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"промяна на калибрирането на устройството за въвеждане"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Разрешава на приложението да променя параметрите на калибриране на сензорния екран. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"достъп до сертификатите за управление на цифровите права (DRM)"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Разрешава на приложението да обезпечава и използва сертификатите за управление на цифровите права (DRM). Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Получаване на състоянието на прехвърлянията чрез Android Лъч"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Разрешава на това приложение да получава информация относно текущите прехвърляния чрез Android Лъч"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"премахване на сертификатите за управление на цифровите права (DRM)"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Разрешава на приложението да премахва сертификатите за управление на цифровите права (DRM). Нормалните приложения би трябвало никога да се нуждаят от това."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"свързване с услуга за съобщения от оператор"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Разрешава на притежателя да се свърже към интерфейса от най-високото ниво на услуга за съобщения от оператор. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Задаване на правила за паролата"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Контролира дължината и разрешените знаци за паролите и ПИН кодовете за заключване на екрана."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Наблюдаване на опитите за отключване на екрана"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Натиснете „Меню“, за да отключите или да извършите спешно обаждане."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Натиснете „Меню“, за да отключите."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Нарисувайте фигура, за да отключите"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Спешни случаи"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Назад към обаждането"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Правилно!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Опитайте отново"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>: Подготвя се"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверява се за грешки"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Открито е ново хранилище (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За прехвърляне на снимки и мултимедия"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g>: Има повреда"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Хранилището (<xliff:g id="NAME">%s</xliff:g>) е повредено. Опитайте да го преформатирате"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>: Неочаквано премахване"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Спрете хранилището (<xliff:g id="NAME">%s</xliff:g>), преди да го извадите, за да не загубите данни"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Премахнахте <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Хранилището (<xliff:g id="NAME">%s</xliff:g>) е премахнато. Поставете ново"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>: Още се изважда…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не премахвайте"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Настройване"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Изваждане"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Изследване"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Не бяха намерени съответстващи дейности."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Насочване на изходящата мултимедия"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Разрешава на приложението да насочва изходящата мултимедия към други външни устройства."</string>
@@ -1188,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"„%1$s“, „%2$s“ – %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Вътрешно хранилище"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD карта"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"SD карта от <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB устройство"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"USB устройство от <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB хранилище"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Редактиране"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Предупрежд. за ползване на данни"</string>
@@ -1450,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Докато не изключите това"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Свиване"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Блокиране на прекъсванията"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не безпокойте"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Почивка"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Делничните вечери"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Събота и неделя"</string>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 6e42fe4..d03ab01 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"অ্যাপ্লিকেশানটিকে আপনার ট্যাবলেটে বা আপনার সিম কার্ডে সংরক্ষিত SMS বার্তাগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তার সমস্ত SMS বার্তা নির্বিশেষে পড়ার অনুমতি দেয়৷"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"অ্যাপ্লিকেশানটিকে আপনার টিভি বা SIM কার্ডে সংরক্ষিত SMS বার্তাগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তা নির্বিশেষে সমস্ত SMS বার্তাগুলি পড়ার অনুমতি দেয়৷"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"অ্যাপ্লিকেশানটিকে আপনার ফোনে বা আপনার সিম কার্ডে সংরক্ষিত SMS বার্তাগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তার সমস্ত SMS বার্তা নির্বিশেষে পড়ার অনুমতি দেয়৷"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"আপনার পাঠ্য বার্তা সম্পাদনা করুন (SMS বা MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"অ্যাপ্লিকেশানকে আপনার ট্যাবলেটে বা সিম কার্ডে SMS বার্তাগুলি লিখতে দেয়৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার বার্তাগুলি মুছে দিতে পারে৷"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"অ্যাপ্লিকেশানকে আপনার টিভি বা SIM কার্ডে সংরক্ষিত SMS বার্তাগুলি লেখার অনুমতি দেয়৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার বার্তাগুলি মুছে দিতে পারে৷"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"অ্যাপ্লিকেশানকে আপনার ফোন বা সিম কার্ডে SMS বার্তাগুলি লিখতে দেয়৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার বার্তাগুলি মুছে দিতে পারে৷"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"পাঠ্য বার্তা পান (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"অ্যাপ্লিকেশানটিকে WAP বার্তা প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"চলমান অ্যাপ্লিকেশান উদ্ধার করে"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"আঙ্গুলের ছাপ আংশিক সনাক্ত করা হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"আঙ্গুলের ছাপ প্রক্রিয়া করা যায়নি৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"আঙ্গুলের ছাপ নেওয়ার সেন্সরটি অপরিস্কার৷ অনুগ্রহ করে পরিষ্কার করে আবার চেষ্টা করুন৷"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"আঙ্গুল অতি দ্রুত সরানো হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"আঙ্গুল ধীরে সরানো হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার অনুপলব্ধ৷"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"আঙ্গুলের ছাপ সংরক্ষণ করা যাবে না৷ অনুগ্রহ করে একটি বিদ্যমান আঙ্গুলের ছাপ সরান৷"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"আঙ্গুলের ছাপ নেওয়ার সময়সীমা শেষ হযেছে৷ আবার চেষ্টা করুন৷"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"আঙ্গুলের ছাপ অপারেশন বাতিল করা হয়েছে৷"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"অনেকবার প্রচেষ্টা করা হয়েছে৷ পরে আবার চেষ্টা করুন৷"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"আবার চেষ্টা করুন৷"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"সিঙ্ক সেটিংস পড়ে"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"অ্যাপ্লিকেশানকে SD কার্ডে লেখার অনুমতি দেয়৷"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP কল করুন/গ্রহণ করুন"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"অ্যাপ্লিকেশানকে SIP কল করতে ও গ্রহণ করতে অনুমতি দেয়।"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"নতুন টেলিকম SIM সংযোগগুলির নিবন্ধন"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"অ্যাপ্লিকেশানটিকে নতুন টেলিকম SIM সংযোগগুলি নিবন্ধিত করতে অনুমোদিত করে৷"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"নতুন টেলিকম সংযোগগুলির নিবন্ধন"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"নতুন টেলিকম সংযোগ নিবন্ধিত করতে অ্যাপ্লিকেশানটিকে অনুমোদিত করে৷"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"টেলিকম সংযোগগুলি পরিচালনা করুন"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"টেলিকম সংযোগগুলি পরিচালনা করতে অ্যাপ্লিকেশানটিকে অনুমোদিত করে৷"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"কলে-থাকা স্ক্রীণের সাথে ইন্টারঅ্যাক্ট করে"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ব্যবহারকারী কখন এবং কীভাবে কলে-থাকা স্ক্রীণটিকে দেখতে পাবেন, অ্যাপ্লিকেশানটিকে তা নিয়ন্ত্রণ করতে দেয়৷"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"টেলিফোন পরিষেবার সাথে ইন্টারঅ্যাক্ট করুন"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"কল করা/গ্রহণ করার জন্য অ্যাপ্লিকেশানটিকে টেলিফোন পরিষেবার সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয়।"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"কলে-থাকা এক ব্যবহারকারী অভিজ্ঞতা সরবরাহ করুন"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"অ্যাপ্লিকেশানটিকে কলে-থাকা এক ব্যবহারকারী অভিজ্ঞতা সরবরাহের অনুমতি দেয়।"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"তারিখ অনুযায়ী নেটওয়ার্কের ব্যবহার পড়ে"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"অ্যাপ্লিকেশানটিকে নিদিষ্ট নেটওয়ার্ক এবং অ্যাপ্লিকেশানগুলির জন্য পূর্বের নেটওয়ার্কের ব্যবহার পড়তে দেয়৷"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"নেটওয়ার্ক নীতি পরিচালনা করে"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"অ্যাপ্লিকেশানকে নেটওয়ার্ক নীতির পরিচালনা করতে এবং অ্যাপ্লিকেশান নির্দিষ্ট নীতিগুলি নির্ধারণ করতে দেয়৷"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"নেটওয়ার্ক ব্যবহারের হিসাবরক্ষণ পরিবর্তন করে"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"অ্যাপ্লিকেশানগুলি অনুযায়ী কীভাবে নেটওয়ার্কের ব্যবহার ধার্য করা হবে তার সংশোধন করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ সাধারণ অ্যাপ্লিকেশানগুলির ব্যবহার করার জন্য নয়৷"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"বিজ্ঞপ্তিগুলি অ্যাক্সেস করে"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"অ্যাপ্লিকেশানটিকে অন্যান্য অ্যাপ্লিকেশান যেগুলি পোস্ট করে সেগুলি সমেত, বিজ্ঞপ্তিগুলি পুনরুদ্ধার করতে, পরীক্ষা করতে এবং সাফ করার অনুমতি দেয়৷"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"একটি বিজ্ঞপ্তি শ্রোতা পরিষেবাতে সংলগ্ন করে"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ধারককে, একটি বিজ্ঞপ্তি শ্রোতা পরিষেবার উচ্চ স্তরের ইন্টারফেসে জুড়তে অনুমতি দেয়৷ সধারণ অ্যাপ্লিকেশানগুলির জন্য কখনই প্রয়োজন হয় না৷"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"একটি শর্ত প্রদানকারীর পরিষেবা বাঁধাই করে"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"ধারককে, একটি শর্ত প্রদানকারী পরিষেবার উচ্চ স্তরের ইন্টারফেসে জুড়তে অনুমতি দেয়৷ সধারণ অ্যাপ্লিকেশানগুলির জন্য কখনই প্রয়োজন হয় না৷"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"একটি স্বপ্নের পরিষেবার সাথে যুক্ত হন"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"ধারককে, একটি স্বপ্নের পরিষেবার উচ্চ স্তরের ইন্টারফেসে জুড়তে অনুমতি দেয়৷ সধারণ অ্যাপ্লিকেশানগুলির জন্য কখনই প্রয়োজন হয় না৷"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ক্যারিয়ারের প্রদেয় কনফিগারেশন অ্যাপ্লিকেশানকে দিয়ে কাজ করায়"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ধারককে, ক্যারিয়ারের প্রদেয় কনফিগারেশন অ্যাপ্লিকেশানকে দিয়ে কাজ করানোর অনুমতি দেয়৷ সধারণ অ্যাপ্লিকেশানগুলির জন্য কখনই প্রয়োজন হয় না৷"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"নেটওয়ার্ক অবস্থার উপর পর্যবেক্ষণের জন্য নজর রাখে"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"নেটওয়ার্ক অবস্থার উপর পর্যবেক্ষণের জন্য একটি অ্যাপ্লিকেশানকে শোনার জন্য অনুমতি নেয়৷ সধারণ অ্যাপ্লিকেশানগুলির জন্য কখনই প্রয়োজন হয় না৷"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ইনপুট ডিভাইস ক্রমাঙ্কন পরিবর্তন করে"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"অ্যাপ্লিকেশানকে টাচ স্ক্রীণের ক্রমাঙ্গন প্যারামিটার সংশোধন করতে দেয়৷ সাধারণ অ্যাপ্লিকেশানগুলির জন্য দরকারী নয়৷"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM শংসাপত্রগুলি অ্যাক্সেস করে"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM শংসাপত্রগুলির বিধান এবং ব্যবহারা করার অনুমতি দিন৷ সাধারণ অ্যাপ্লিকেশানগুলির জন্য কোনোদিন প্রয়োজন হয় না৷"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android বীম স্থানান্তর স্থিতি গ্রহণ করুন"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"এই অ্যাপ্লিকেশানকে বর্তমান Android বীম স্থানান্তর সম্বন্ধে তথ্য গ্রহণ করার অনুমিত দেয়"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM শংসাপত্রগুলি সরান"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"কোনো অ্যাপ্লিকেশানকে DRM শংসাপত্রগুলি সরানোর অনুমতি দেয়। সাধারণ অ্যাপ্লিকেশানগুলির জন্য কখনো প্রয়োজন হয় না।"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"একটি ক্যারিয়ার বার্তাপ্রেরণ পরিষেবা আবদ্ধ করতে"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"ধারককে, একটি ক্যারিয়ার বার্তাপ্রেরণ পরিষেবার উচ্চ স্তরের ইন্টারফেসে জুড়তে অনুমতি দেয়৷ সধারণ অ্যাপ্লিকেশানগুলির জন্য কখনই প্রয়োজন হয় না৷"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"পাসওয়ার্ড নিয়মগুলি সেট করে"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"স্ক্রীন লক করার পাসওয়ার্ডগুলিতে অনুমতিপ্রাপ্ত অক্ষর এবং দৈর্ঘ্য নিয়ন্ত্রণ করে৷"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"স্ক্রীণ আনলক করার প্রচেষ্টাগুলি নিরীক্ষণ করে"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"আনলক করতে বা জরুরী কল করতে মেনু টিপুন৷"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"আনলক করতে মেনু টিপুন৷"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"আনলক করতে প্যাটার্ন আঁকুন"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"জরুরী"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"কলে ফিরুন"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"সঠিক!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"আবার চেষ্টা করুন"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"প্রার্থীরা"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> প্রস্তুত করা হচ্ছে"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ত্রুটি রয়েছে কিনা পরীক্ষা করা হচ্ছে"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"নতুন <xliff:g id="NAME">%s</xliff:g> সনাক্ত করা হয়েছে"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ফটোগুলি এবং মিডিয়া স্থানান্তর করার জন্য"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> ক্ষতিগ্রস্ত হয়েছে"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> ক্ষতিগ্রস্ত হয়েছে; এটি পুনরায় ফর্ম্যাট করার চেষ্টা করুন"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> অপ্রত্যাশিতভাবে মুছে ফেলা হয়েছে"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ডেটা যাতে হারিয়ে না যায় তার জন্য সরানোর আগে <xliff:g id="NAME">%s</xliff:g> আনমাউন্ট করুন"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> সরানো হয়েছে"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> মুছে ফেলা হয়েছে; নতুন একটি ঢোকান"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"এখনও <xliff:g id="NAME">%s</xliff:g> সরিয়ে ফেলা হচ্ছে..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"সরাবেন না"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"সেটআপ"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"বের করে নিন"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"ঘুরে দেখুন"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"কোনো সমরূপ কার্যকলাপ খুঁজে পাওয়া যায়নি৷"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"মিডিয়া আউটপুট রুট করুন"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"অ্যাপ্লিকেশানটিকে অন্যান্য বহিরাগত ডিভাইসে মিডিয়া আউটপুট রুট করার অনুমতি দেয়৷"</string>
@@ -1188,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"অভ্যন্তরীণ সঞ্চয়স্থান"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD কার্ড"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD কার্ড"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB ড্রাইভ"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ড্রাইভ"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB সঞ্চয়স্থান"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"সম্পাদনা করুন"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ডেটা ব্যবহারের সতর্কতা"</string>
@@ -1450,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"আপনার দ্বারা এটি বন্ধ করা পর্যন্ত"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"সঙ্কুচিত করুন"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"বাধাগুলিকে অবরুদ্ধ করুন"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"বিরক্ত করবেন না"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ডাউনটাইম"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"প্রতি সোম-শুক্র রাত"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"সপ্তাহান্ত"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index fa431c7..d02ac93 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permet que l\'aplicació llegeixi missatges SMS emmagatzemats a la tauleta o a la targeta SIM. Això permet que l\'aplicació llegeixi tots els missatges SMS, independentment del contingut o de la confidencialitat."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permet que l\'aplicació llegeixi missatges SMS desats al televisor o a la targeta SIM. Això permet que l\'aplicació llegeixi tots els missatges SMS, independentment del contingut o de la confidencialitat."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permet que l\'aplicació llegeixi missatges SMS emmagatzemats al telèfon o a la targeta SIM. Això permet que l\'aplicació llegeixi tots els missatges SMS, independentment del contingut o de la confidencialitat."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"edició dels missatges de text (SMS o MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permet que l\'aplicació llegeixi missatges SMS emmagatzemats a la tauleta o a la targeta SIM. Les aplicacions malicioses poden llegir els teus missatges confidencials."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permet que l\'aplicació modifiqui els missatges SMS desats al televisor o a la targeta SIM. Les aplicacions malicioses poden suprimir els missatges."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permet que l\'aplicació llegeixi missatges SMS emmagatzemats al telèfon o a la targeta SIM. Les aplicacions malicioses poden llegir els teus missatges confidencials."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"recepció de missatges de text (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permet que l\'aplicació rebi i processi missatges WAP. Aquest permís inclou la capacitat de controlar o de suprimir missatges que s\'han enviat al teu dispositiu sense mostrar-te\'ls."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"recupera les aplicacions en execució"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"S\'ha detectat una empremta digital parcial. Torna-ho a provar."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"No s\'ha pogut processar l\'empremta digital. Torna-ho a provar."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"El sensor d\'empremtes digitals està brut. Neteja\'l i torna-ho a provar."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"El dit s\'ha mogut massa ràpid. Torna-ho a provar."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"El dit s\'ha mogut massa lentament. Torna-ho a provar."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El maquinari per a empremtes digitals no està disponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empremta digital no es pot desar. Suprimeix-ne una."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"S\'ha cancel·lat l\'operació d\'empremta digital."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"S\'han produït massa intents. Torna-ho a provar més tard."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Torna-ho a provar."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"llegir la configuració de sincronització"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permet a l\'aplicació escriure a la targeta SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"Fer i rebre trucades de SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permet que l\'aplicació pugui fer i rebre trucades de SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrar connexions SIM de telecomunicacions noves"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permet que l\'aplicació registri connexions SIM de telecomunicacions noves."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrar connexions de telecomunicacions noves"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permet que l\'aplicació registri connexions de telecomunicacions noves."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"gestionar les connexions de telecomunicacions"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permet que l\'aplicació gestioni les connexions de telecomunicacions."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interaccionar amb la pantalla de la trucada"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permet que l\'aplicació controli quan i com l\'usuari veu la pantalla de la trucada."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interacciona amb els serveis de telefonia"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permet que l\'aplicació interaccioni amb els serveis de telefonia per fer i rebre trucades."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"proporcionar una experiència d\'usuari durant la trucada"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permet que l\'aplicació proporcioni una experiència d\'usuari durant la trucada."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lectura de l\'ús històric de la xarxa"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permet que l\'aplicació llegeixi l\'ús històric de la xarxa per a xarxes i per a aplicacions específiques."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gestió de la política de xarxa"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permet que l\'aplicació gestioni les polítiques de la xarxa i que defineixi les regles específiques d\'aplicació."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modificació del càlcul d\'ús de la xarxa"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permet que l\'aplicació modifiqui la manera com es calcula l\'ús de la xarxa per part de les aplicacions. No indicat per a les aplicacions normals."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"accedeix a les notificacions"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permet que l\'aplicació recuperi, examini i esborri les notificacions, incloses les que han publicat altres aplicacions."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"vincula a un servei oient de notificacions"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permet que el titular vinculi la interfície de nivell superior d\'un servei oient de notificacions. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"enllaçar amb el servei de proveïdor de condicions"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permet enllaçar amb la interfície de nivell superior d\'un servei de proveïdor de condicions. No ha de ser mai necessari per a aplicacions normals."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"enllaçar amb un servei en repòs"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permet enllaçar amb la interfície de nivell superior d\'un servei en repòs. No hauria de ser mai necessari per a aplicacions normals."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invoca l\'aplicació de configuració proporcionada per l\'operador"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permet que el titular invoqui l\'aplicació de configuració proporcionada per l\'operador. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"conèixer les observacions sobre les condicions de la xarxa"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permet que una aplicació conegui les observacions sobre les condicions de la xarxa. No s\'ha de necessitar mai per a aplicacions normals."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"canviar el calibratge del dispositiu d\'entrada"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permet que l\'aplicació modifiqui els paràmetres de calibratge de la pantalla tàctil. No ha de ser mai necessari per a aplicacions normals."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"accedir als certificats de DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permet que una aplicació proporcioni i utilitzi certificats de gestió de drets digitals (DRM, Digital Rights Management). No ha de ser mai necessari per a aplicacions normals."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Rep l\'estat de la transferència d\'Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permet que aquesta aplicació rebi informació sobre les transferències d\'Android Beam actuals."</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"suprimir els certificats DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permet que una aplicació suprimeixi els certificats DRM. No ha de ser mai necessari per a aplicacions normals."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"vincular-la al servei de missatgeria d\'un operador"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permet que el propietari la pugui vincular a la interfície principal del servei de missatgeria d\'un operador. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Definir les normes de contrasenya"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Permet controlar la longitud i el nombre de caràcters permesos a les contrasenyes i als PIN del bloqueig de pantalla."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Controlar els intents de desbloqueig de pantalla"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Premeu Menú per desbloquejar-lo o per fer una trucada d\'emergència."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Premeu Menú per desbloquejar."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dibuixeu el patró de desbloqueig"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Emergència"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Torna a la trucada"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcte!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Torna-ho a provar"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidats"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"S\'està preparant <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"S\'està comprovant si hi ha errors"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"S\'ha detectat <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per transferir fotos i fitxers multimèdia"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> està malmès"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> està malmès; prova de formatar-lo de nou"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"S\'ha extret <xliff:g id="NAME">%s</xliff:g> de manera inesperada"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva <xliff:g id="NAME">%s</xliff:g> abans d\'extraure\'l per evitar perdre dades"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"S\'ha extret <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"S\'ha extret <xliff:g id="NAME">%s</xliff:g>; insereix-ne de nou"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Encara s\'està expulsant <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"No l\'extreguis"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configura"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsa"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explora"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"No s\'ha trobat cap activitat coincident."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Indicació de ruta de sortida de contingut multimèdia"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permet que una aplicació indiqui la ruta de sortida de contingut multimèdia a altres dispositius externs."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Emmagatzematge intern"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Targeta SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Emmagatzematge USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edita"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advertiment d\'ús de dades"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Fins que no ho desactivis"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Replega"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloqueja les interrupcions"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"No molesteu"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Temps d\'inactivitat"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Nits entre setmana"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Caps de setmana"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 5aadbdc..6b6e1f1 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -272,10 +272,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Umožňuje aplikaci číst zprávy SMS uložené v tabletu nebo na SIM kartě.Toto oprávnění umožňuje aplikaci číst zprávy SMS bez ohledu na jejich obsah nebo důvěrnost."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Umožňuje aplikaci číst zprávy SMS uložené v televizi nebo na SIM kartě. Aplikaci to umožní číst veškeré zprávy SMS bez ohledu na obsah či důvěrnost."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Umožňuje aplikaci číst zprávy SMS uložené v telefonu nebo na SIM kartě. Toto oprávnění umožňuje aplikaci číst zprávy SMS bez ohledu na jejich obsah nebo důvěrnost."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"úprava textových zpráv (SMS nebo MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Umožňuje aplikaci zapisování do zpráv SMS uložených v tabletu nebo na SIM kartě. Škodlivé aplikace mohou vaše zprávy smazat."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Umožňuje aplikaci zapisovat do zpráv SMS uložených v televizi nebo na SIM kartě. Škodlivé aplikace mohou vaše zprávy smazat."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Umožňuje aplikaci zapisování do zpráv SMS uložených v telefonu nebo na SIM kartě. Škodlivé aplikace mohou vaše zprávy smazat."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"příjem textových zpráv (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Umožňuje aplikaci přijmout a zpracovat zprávy WAP. Toto oprávnění umožňuje sledovat přijaté zprávy nebo je smazat, aniž by se vám zobrazily."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"načtení spuštěných aplikací"</string>
@@ -431,21 +427,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Byla zjištěna jen část otisku prstu. Zkuste to znovu."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Zpracování otisku prstu se nezdařilo. Zkuste to znovu."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzor otisků prstů je znečištěn. Vyčistěte jej a zkuste to znovu."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Pohyb prstem byl příliš rychlý. Zkuste to znovu."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Pohyb prstem byl příliš pomalý. Zkuste to znovu."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Není k dispozici hardware ke snímání otisků prstů."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisk prstu nelze uložit. Odstraňte existující otisk prstu."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit sejmutí otisku prstu vypršel. Zkuste to znovu."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operace otisku prstu byla zrušena."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Příliš mnoho pokusů. Zkuste to později."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Zkuste to znovu."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"čtení nastavení synchronizace"</string>
@@ -470,6 +461,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Umožňuje aplikaci zapisovat na kartu SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"uskutečňování/příjem volání SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Povolí aplikaci uskutečňovat a přijímat volání SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrování nových komunikačních připojení přes SIM kartu"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Umožňuje aplikaci registrovat nová telekomunikační připojení přes SIM kartu."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrování nových telekomunikačních připojení"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Umožňuje aplikaci registrovat nová telekomunikační připojení."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"správa telekomunikačních připojení"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Umožňuje aplikaci spravovat telekomunikační připojení."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakce s obrazovkou příchozího hovoru"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Umožňuje aplikaci řídit, kdy a jak se uživateli zobrazí obrazovka příchozího hovoru."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"komunikace s telefonními službami"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Umožňuje aplikaci komunikovat s telefonními službami a provádět/přijímat hovory."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"zobrazení uživatelského prostředí během hovoru"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Umožňuje aplikaci zobrazit uživatelské prostředí během hovoru."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"číst využití sítě v historii"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Umožňuje aplikaci číst historii využití sítě (u určitých sítí a aplikací)."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"spravovat zásady sítě"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Umožňuje aplikaci spravovat zásady sítě a definovat pravidla pro konkrétní aplikace."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"upravit kontrolu používání sítě"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Umožňuje aplikaci upravit způsob výpočtu využití sítě aplikacemi. Toto oprávnění není určeno pro běžné aplikace."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"přístup k oznámením"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Umožňuje aplikacím načítat, zobrazovat a mazat oznámení včetně těch přidaných jinými aplikacemi."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"navázání na službu pro poslouchání oznámení"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Umožňuje držiteli navázat se na nejvyšší úroveň služby pro poslouchání oznámení. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"navázání na službu poskytovatele podmínky"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Umožňuje držiteli navázat se na nejvyšší úroveň rozhraní služby poskytovatele podmínky. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"navázat se na službu spořiče"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Umožňuje navázání na nejvyšší úroveň služby spořiče. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"vyvolat konfigurační aplikaci poskytnutou operátorem"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Umožňuje vyvolání konfigurační aplikace poskytnuté operátorem. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"naslouchat informacím o stavu sítě"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Umožňuje aplikaci naslouchat informacím o stavu sítě. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"měnit kalibraci vstupního zařízení"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Umožňuje aplikaci měnit parametry kalibrace dotykové obrazovky. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"přístup k certifikátům DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Umožňuje aplikaci vydávat a používat certifikáty DRM. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Příjem stavu přenosů Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Umožňuje této aplikaci přijímat informace o aktuálních přenosech pomocí technologie Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"odstranění certifikátů DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Povoluje aplikaci odstranit certifikáty DRM. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"navázat se na nejvyšší úroveň rozhraní služby zasílání zpráv prostřednictvím operátora"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Umožňuje držiteli navázat se na nejvyšší úroveň rozhraní služby zasílání zpráv prostřednictvím operátora. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Nastavit pravidla pro heslo"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Ovládání délky a znaků povolených v heslech a kódech PIN zámku obrazovky."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Sledovat pokusy o odemčení obrazovky"</string>
@@ -630,8 +665,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Chcete-li odemknout telefon nebo provést tísňové volání, stiskněte Menu."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Telefon odemknete stisknutím tlačítka Menu."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Odblokujte pomocí gesta"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Stav nouze"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Zavolat zpět"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Správně!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Zkusit znovu"</string>
@@ -1043,35 +1077,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidáti"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Probíhá příprava úložiště <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kontrola chyb"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Zjištěno nové úložiště <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"K přenosu fotek a médií"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Úložiště <xliff:g id="NAME">%s</xliff:g> je poškozeno"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Úložiště <xliff:g id="NAME">%s</xliff:g> je poškozeno. Zkuste jej přeformátovat."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Úložiště <xliff:g id="NAME">%s</xliff:g> neočekávaně odpojeno"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Před odebráním úložiště <xliff:g id="NAME">%s</xliff:g> jej nejprve odpojte. Zabráníte tak ztrátě dat."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Úložiště <xliff:g id="NAME">%s</xliff:g> bylo odpojeno."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Úložiště <xliff:g id="NAME">%s</xliff:g> bylo odpojeno. Vložte nové úložiště."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Probíhá odpojování úložiště <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Neodebírat"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Nastavení"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Odpojit"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Prozkoumat"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nebyly nalezeny žádné odpovídající aktivity."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Směrování výstupu médií"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Umožňuje aplikaci směrovat výstup médií do dalších externích zařízení."</string>
@@ -1203,6 +1223,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s – %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Interní úložiště"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Karta SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Úložiště USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Upravit"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Upozornění na využití dat"</string>
@@ -1475,7 +1501,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Dokud tuto funkci nevypnete"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Sbalit"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokovat vyrušení"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nerušit"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Období klidu"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noci pracovních dnů"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Víkendy"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 99702e2..6e32e16 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tillader, at appen kan læse de sms-beskeder, der er gemt på din tablet eller dit SIM-kort. Med denne tilladelse kan appen læse alle sms-beskeder, uanset indhold eller fortrolighed."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Giver appen lov til at læse sms-beskeder, der er gemt på dit tv eller SIM-kort. Dette gør det muligt for appen at læse alle sms-beskeder uanset indhold eller fortrolighed."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Tillader, at appen kan læse de sms-beskeder, der er gemt på din telefon eller dit SIM-kort. Med denne tilladelse kan appen læse alle sms-beskeder, uanset indhold eller fortrolighed."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"redigere dine tekstbeskeder (sms eller mms)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Tillader, at appen kan skrive til sms-beskeder, der er gemt på din tablet eller på SIM-kortet. Ondsindede apps kan slette dine beskeder."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Giver appen lov til at skrive til sms-beskeder, der er gemt på dit tv eller SIM-kort. Ondsindede apps kan slette dine beskeder."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Tillader, at appen kan skrive til sms-beskeder, der er gemt på din telefon eller dit SIM-kort. Ondsindede apps kan slette dine beskeder."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"modtage tekstbeskeder (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Tillader, at appen kan modtage og behandle WAP-beskeder. Denne tilladelse omfatter muligheden for at overvåge eller slette de beskeder, der sendes til dig, uden at vise dem til dig."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"hente kørende apps"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Der blev registreret et delvist fingeraftryk. Prøv igen."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Fingeraftrykket kunne ikke behandles. Prøv igen."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sensoren til registrering af fingeraftryk er beskidt. Tør den af, og prøv igen."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Du bevægede fingeren for hurtigt. Prøv igen."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Du bevægede fingeren for langsomt. Prøv igen."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardwaren til fingeraftryk er ikke tilgængelig."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeraftrykket kan ikke gemmes. Fjern et eksisterende fingeraftryk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Registrering af fingeraftryk fik timeout. Prøv igen."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingeraftrykshandlingen blev annulleret."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Der er foretaget for mange forsøg. Prøv igen senere."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Prøv igen."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"læse indstillinger for synkronisering"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Tillader, at appen kan skrive til SD-kortet."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"foretage/modtage SIP-opkald"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Tillader, at appen foretager og modtager SIP-opkald."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrere nye telefon-SIM-forbindelser"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Tillader, at appen registrerer nye telefon-SIM-forbindelser."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrere nye telefonforbindelser"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Tillader, at appen registrerer nye telefonforbindelser."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"administrere telefonforbindelser"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Tillader, at appen administrerer telefonforbindelser."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interager med skærmen under opkald"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Tillader, at appen styrer, hvornår og hvordan brugeren ser skærmen for indgående opkald."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interagere med telefonitjenester"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Tillader, at appen kan interagere med telefonitjenester for at foretage/modtage opkald."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"leverer brugeroplevelsen under opkald"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Tillader, at appen leverer brugeroplevelsen under opkald."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"læse historisk netværksbrug"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Tillader, at appen kan læse historisk netværksbrug for specifikke netværk og apps."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"administrer netværkspolitik"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Tillader, at appen kan administrere netværkspolitikker og definere appspecifikke regler."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"skift afregning af netværksbrug"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Tillader, at appen kan ændre den måde, som netværksforbrug udregnes på i forhold til apps. Anvendes ikke af normale apps."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"adgang til underretninger"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Tillader, at appen kan hente, undersøge og rydde underretninger, f.eks. dem, der er sendt af andre apps."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"forpligte sig til en underretningslyttertjeneste"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Tillader brugeren at forpligte sig til en underretningslyttertjenestes grænseflade på øverste niveau. Bør aldrig være nødvendigt til almindelige apps."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"oprette binding til en tjeneste til formidling af betingelser"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Tillader, at brugeren opretter en binding til det øverste niveau af grænsefladen i en tjeneste til formidling af betingelser. Dette bør aldrig være nødvendigt for almindelige apps."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"fastlås til en drømmetjeneste"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Tillader, at indehaveren fastlåser det øverste niveau af brugergrænsefladen for en drømmetjeneste. Dette bør aldrig være nødvendigt for almindelige apps."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"aktivere konfigurationsappen, der leveres af mobilselskabet"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Tillader, at brugeren aktiverer konfigurationsappen, der er forsynet af mobilselskabet. Dette bør aldrig være nødvendigt for almindelige apps."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"observer netværksforhold"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Tillader, at en applikation observerer netværksforhold. Bør aldrig være nødvendigt for almindelige apps."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"skift kalibrering for inputenheden"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Tillader, at appen ændrer kalibreringsparametrene for berøringsskærmen. Dette bør aldrig være nødvendigt for almindelige apps."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"få adgang til DRM-certifikater"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Tillader, at en applikation leverer og anvender DRM-certfikater. Dette bør aldrig være nødvendigt for almindelige apps."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Modtag staus for Android Beam-overførsler"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Tillader, at applikationen modtager oplysninger om aktuelle Android Beam-overførsler"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"fjerne DRM-certifikater"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Tillader, at en app fjerner DRM-certifikater. Dette bør aldrig være nødvendigt for almindelige apps."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"knytte til et mobilselskabs beskedtjeneste"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Dette giver indehaveren mulighed for at knytte sig til det øverste grænsefladeniveau for et mobilselskabs beskedtjeneste. Dette bør ikke være nødvendigt i normale apps."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Indstil regler for adgangskode"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Kontrollér længden samt tilladte tegn i adgangskoder og pinkoder til skærmlåsen."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Overvåg forsøg på oplåsning af skærm"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryk på Menu for at låse op eller foretage et nødopkald."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryk på Menu for at låse op."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Tegn oplåsningsmønster"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Nødopkald"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Tilbage til opkald"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Rigtigt!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Prøv igen"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidater"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kontrollerer for fejl"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Der blev registreret et nyt <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til at overføre billeder og medier"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Beskadiget <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> er beskadiget. Prøv at omformatere det."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> blev fjernet uventet"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"For at undgå datatab skal <xliff:g id="NAME">%s</xliff:g> demonteres inden fjernelse"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> blev fjernet"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> er fjernet. Indsæt et nyt"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Skubber stadig <xliff:g id="NAME">%s</xliff:g> ud…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Fjern ikke"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Konfigurer"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Skub ud"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Udforsk"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Der blev ikke fundet nogen matchende aktiviteter."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Viderefør medieoutput"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Tillader, at en applikation viderefører medieoutput til andre eksterne enheder."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Internt lager"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kort"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-lager"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Rediger"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advarsel om dataforbrug"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Indtil du slår denne indstilling fra"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Skjul"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloker afbrydelser"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Vil ikke forstyrres"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Nedetid"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Hverdagsaftener"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekender"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 8bca1ed..f13496ae 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Ermöglicht der App, auf Ihrem Tablet oder Ihrer SIM-Karte gespeicherte SMS zu lesen. Die App kann alle SMS lesen, unabhängig von Inhalt und Vertraulichkeit."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Ermöglicht der App, auf Ihrem Fernseher oder Ihrer SIM-Karte gespeicherte SMS zu lesen. Die App kann alle SMS lesen, unabhängig von Inhalt und Vertraulichkeit."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Ermöglicht der App, auf Ihrem Telefon oder Ihrer SIM-Karte gespeicherte SMS zu lesen. Die App kann alle SMS lesen, unabhängig von Inhalt und Vertraulichkeit."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"SMS oder MMS bearbeiten"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Ermöglicht der App, auf Ihrem Tablet oder Ihrer SIM-Karte gespeicherte SMS zu bearbeiten. Schädliche Apps können so Ihre Nachrichten löschen."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Ermöglicht der App, auf Ihrem Fernseher oder Ihrer SIM-Karte gespeicherte SMS zu bearbeiten. Schädliche Apps können so Ihre Nachrichten löschen."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Ermöglicht der App, auf Ihrem Telefon oder Ihrer SIM-Karte gespeicherte SMS zu bearbeiten. Schädliche Apps können so Ihre Nachrichten löschen."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"Textnachrichten (WAP) empfangen"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Ermöglicht der App, WAP-Nachrichten zu empfangen und zu verarbeiten. Mit der Berechtigung können Nachrichten, die an Sie gesendet wurden, überwacht und gelöscht werden, bevor sie Ihnen angezeigt werden."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"Aktive Apps abrufen"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Fingerabdruck teilweise erkannt. Versuchen Sie es erneut."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Fingerabdruck konnte nicht verarbeitet werden. Versuchen Sie es erneut."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerabdrucksensor ist verschmutzt. Reinigen Sie ihn und versuchen Sie es erneut."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Finger zu schnell bewegt. Versuchen Sie es erneut."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Finger zu langsam bewegt. Versuchen Sie es erneut."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerabdruckhardware nicht verfügbar"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerabdruck kann nicht gespeichert werden. Entfernen Sie einen vorhandenen Fingerabdruck."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Zeitüberschreitung für Fingerabdruck. Versuchen Sie es erneut."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerabdruckvorgang abgebrochen"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zu viele Versuche. Versuchen Sie es später erneut."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Bitte versuchen Sie es erneut."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"Synchronisierungseinstellungen lesen"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ermöglicht der App, auf die SD-Karte zu schreiben"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-Anrufe tätigen/empfangen"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ermöglicht der App das Tätigen und Empfangen von SIP-Anrufen"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"Neue SIM-Telekommunikationsverbindungen registrieren"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Gestattet der App die Registrierung neuer SIM-Telekommunikationsverbindungen"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"Neue Telekommunikationsverbindungen registrieren"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Gestattet der App die Registrierung neuer Telekommunikationsverbindungen"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"Telekommunikationsverbindungen verwalten"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Gestattet der App die Verwaltung der Telekommunikationsverbindungen"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"Mit Anrufbildschirm interagieren"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Die App kann steuern, wann und wie der Nutzer den Anrufbildschirm sieht."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"Mit Telefondiensten interagieren"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Ermöglicht der App die Interaktion mit Telefondiensten, um Anrufe zu tätigen und zu empfangen"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"Anrufoptionen anzeigen"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Die App kann Anrufoptionen für den Nutzer bereitstellen."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"Bisherige Netzwerkauslastung lesen"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Ermöglicht der App, Daten zur bisherigen Netzwerkauslastung für bestimmte Netzwerke und Apps zu lesen"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"Netzwerkrichtlinien verwalten"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Ermöglicht der App, Netzwerkrichtlinien zu verwalten und anwendungsspezifische Regeln festzulegen"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"Zuordnung für Netzwerknutzung ändern"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Ermöglicht der App, die Art und Weise zu ändern, wie der Netzwerkverbrauch im Hinblick auf Apps berechnet wird. Nicht für normale Apps vorgesehen."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"Auf Benachrichtigungen zugreifen"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Ermöglicht der App das Abrufen, Überprüfen und Löschen von Benachrichtigungen, einschließlich Benachrichtigungen, die von anderen Apps gepostet wurden"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"An Benachrichtigungs-Listener-Dienst binden"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Ermöglicht dem Inhaber, sich an die Oberfläche der obersten Ebene eines Benachrichtigungs-Listener-Dienstes zu binden. Sollte nie für normale Apps benötigt werden."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"An einen Bedingungsproviderdienst binden"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Ermöglicht dem Inhaber, sich an die Oberfläche eines Bedingungsproviderdienstes auf oberster Ebene zu binden. Für normale Apps sollte dies nie erforderlich sein."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"An Dream-Dienst binden"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Ermöglicht der App, sich an die Oberfläche eines Dream-Dienstes auf oberster Ebene zu binden. Für normale Apps sollte dies nie erforderlich sein."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"Vom Mobilfunkanbieter bereitgestellte Konfigurations-App aufrufen"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Ermöglicht dem Inhaber, die vom Mobilfunkanbieter bereitgestellte Konfigurations-App aufzurufen. Sollte für normale Apps nie benötigt werden."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Informationen zu den Netzwerkbedingungen erfassen"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Ermöglicht der App, Informationen zu den Netzwerkbedingungen zu erfassen. Sollte für normale Apps nie benötigt werden."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"Kalibrierung für Eingabegerät ändern"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Ermöglicht der App, die Kalibrierungsparameter des Touchscreens zu ändern. Für normale Apps sollte dies nie erforderlich sein."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"Auf DRM-Zertifikate zugreifen"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Ermöglicht einer App die Bereitstellung und Nutzung von DRM-Zertifikaten. Sollte für normale Apps nie benötigt werden."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Status von Android Beam-Übertragungen erhalten"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Ermöglicht dieser App, Informationen zu aktuellen Android Beam-Übertragungen zu erhalten"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM-Zertifikate entfernen"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Ermöglicht einer App das Entfernen von DRM-Zertifikaten. Sollte für normale Apps nie benötigt werden."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"An einen Mobilfunkanbieter-SMS/MMS-Dienst binden"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Ermöglicht dem Inhaber die Bindung an die Oberfläche eines Mobilfunkanbieter-SMS/MMS-Dienstes auf oberster Ebene. Für normale Apps sollte dies nie erforderlich sein."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Passwortregeln festlegen"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Zulässige Länge und Zeichen für Passwörter für die Displaysperre festlegen"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Versuche zum Entsperren des Displays überwachen"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Drücken Sie die Menütaste, um das Telefon zu entsperren oder einen Notruf zu tätigen."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Zum Entsperren die Menütaste drücken"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Muster zum Entsperren zeichnen"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Notfall"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Zurück zum Anruf"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Korrekt!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Erneut versuchen"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"Kandidaten"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> wird vorbereitet"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Nach Fehlern wird gesucht"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Neue <xliff:g id="NAME">%s</xliff:g> entdeckt"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Für die Übertragung von Fotos und Medien"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> ist beschädigt"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Die <xliff:g id="NAME">%s</xliff:g> ist beschädigt. Bitte formatieren Sie sie neu."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> wurde unerwartet entfernt"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Trennen Sie die <xliff:g id="NAME">%s</xliff:g> vor dem Entfernen, um Datenverluste zu vermeiden."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> wurde entfernt"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> entfernt. Neuen Speicher einlegen"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> wird gerade ausgeworfen…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Nicht entfernen"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Einrichten"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Auswerfen"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Entdecken"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Keine passenden Aktivitäten gefunden"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Medienausgabe umleiten"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Ermöglicht der App, die Medienausgabe auf andere externe Geräte umzuleiten."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s. %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Interner Speicher"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-Karte"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-Speicher"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Bearbeiten"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Warnung zum Datenverbrauch"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Bis zur Deaktivierung"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Minimieren"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Unterbrechungen blockieren"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nicht stören"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Inaktivität"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Wochentags abends"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Wochenende"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 334f62f..256bd41 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων SMS που είναι αποθηκευμένα στο tablet σας ή στην κάρτα σας SIM. Αυτό δίνει τη δυνατότητα στην εφαρμογή να διαβάζει όλα τα μηνύματα SMS, ανεξάρτητα από το περιεχόμενο ή το επίπεδο εμπιστευτικότητάς τους."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Επιτρέπει στην εφαρμογή να διαβάζει μηνύματα SMS που έχουν αποθηκευτεί στην τηλεόραση ή στην κάρτα SIM. Έτσι, η εφαρμογή μπορεί να διαβάζει όλα τα μηνύματα SMS, ανεξαρτήτως περιεχομένου ή εμπιστευτικότητας."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων SMS που είναι αποθηκευμένα στο τηλέφωνό σας ή στην κάρτα σας SIM. Αυτό δίνει τη δυνατότητα στην εφαρμογή να διαβάζει όλα τα μηνύματα SMS, ανεξάρτητα από το περιεχόμενο ή το επίπεδο εμπιστευτικότητάς τους."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"επεξεργασία των μηνυμάτων κειμένου σας (SMS ή MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Επιτρέπει στην εφαρμογή την εγγραφή σε μηνύματα SMS που είναι αποθηκευμένα στο tablet σας ή στην κάρτα SIM. Τυχόν κακόβουλες εφαρμογές ενδέχεται να διαγράψουν τα μηνύματά σας."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Επιτρέπει στην εφαρμογή να γράφει σε μηνύματα SMS που είναι αποθηκευμένα στην τηλεόραση ή στην κάρτα SIM. Κακόβουλες εφαρμογές μπορεί να διαγράψουν τα μηνύματά σας."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Επιτρέπει στην εφαρμογή την εγγραφή σε μηνύματα SMS που είναι αποθηκευμένα στο τηλέφωνό σας ή στην κάρτα SIM. Τυχόν κακόβουλες εφαρμογές ενδέχεται να διαγράψουν τα μηνύματά σας."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"λήψη μηνυμάτων κειμένου (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων WAP. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ανάκτηση εκτελούμενων εφαρμογών"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Εντοπίστηκε μερικό μοναδικό χαρακτηριστικό. Δοκιμάστε ξανά."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Δεν ήταν δυνατή η επεξεργασία του μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Ο αισθητήρας μοναδικού χαρακτηριστικού δεν είναι καθαρός. Καθαρίστε τον και δοκιμάστε ξανά."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Πολύ γρήγορη κίνηση δαχτύλου. Δοκιμάστε ξανά."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Πολύ αργή κίνηση δαχτύλου. Δοκιμάστε ξανά."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Ο εξοπλισμός μοναδικού χαρακτηριστικού δεν είναι διαθέσιμος."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Δεν είναι δυνατή η αποθήκευση μοναδικού χαρακτηριστικού. Καταργήστε το υπάρχον μοναδικό χαρακτηριστικό."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Λήξη χρονικού ορίου μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Η λειτουργία μοναδικού χαρακτηριστικού ακυρώθηκε."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Δοκιμάστε ξανά."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ανάγνωση ρυθμίσεων συγχρονισμού"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Επιτρέπει στην εφαρμογή την εγγραφή στην κάρτα SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"πραγματοποίηση/λήψη κλήσεων SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Επιτρέπει στην εφαρμογή να πραγματοποιεί και να λαμβάνει κλήσεις SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Επιτρέπει στην εφαρμογή την εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"εγγραφή νέων συνδέσεων τηλεπικοινωνιών"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Επιτρέπει στην εφαρμογή την εγγραφή νέων συνδέσεων τηλεπικοινωνιών."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"διαχείριση των συνδέσεων τηλεπικοινωνιών"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Επιτρέπει στην εφαρμογή να διαχειρίζεται τις συνδέσεις τηλεπικοινωνιών."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"αλληλεπίδραση με την οθόνη κατά τη διάρκεια κλήσης"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Επιτρέπει στην εφαρμογή να ελέγχει πότε και πώς βλέπει ο χρήστης την οθόνη κατά τη διάρκεια κλήσης."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"αλληλεπίδραση με υπηρεσίες τηλεφωνίας"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Επιτρέπει στην εφαρμογή να αλληλεπιδρά με υπηρεσίες τηλεφωνίας για την πραγματοποίηση/λήψη κλήσεων."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"παροχή εμπειρίας χρήστη κατά τη διάρκεια κλήσης"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Επιτρέπει στην εφαρμογή να παρέχει μια εμπειρία στο χρήστη κατά τη διάρκεια κλήσης."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ανάγνωση ιστορικών δεδομένων χρήσης δικτύου"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Επιτρέπει στην εφαρμογή την ανάγνωση ιστορικών στοιχείων χρήσης δικτύου για συγκεκριμένα δίκτυα και εφαρμογές."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"διαχείριση πολιτικής δικτύου"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Επιτρέπει στην εφαρμογή τη διαχείριση των πολιτικών δικτύου και τον ορισμό κανόνων για ορισμένες εφαρμογές."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"τροποποίηση υπολογισμού χρήσης δικτύου"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Επιτρέπει στην εφαρμογή την τροποποίηση του τρόπου υπολογισμού της χρήσης δικτύου έναντι των εφαρμογών. Δεν προορίζεται για χρήση από συνήθεις εφαρμογές."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"πρόσβαση στις ειδοποιήσεις"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Επιτρέπει στην εφαρμογή να ανακτά, να εξετάζει και να απαλείφει ειδοποιήσεις, συμπεριλαμβανομένων εκείνων που δημοσιεύονται από άλλες εφαρμογές."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"δέσμευση σε υπηρεσία ακρόασης ειδοποίησης"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας ακρόασης ειδοποιήσεων. Δεν απαιτείται σε κανονικές εφαρμογές."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"σύνδεση σε μια υπηρεσία παρόχου συνθηκών"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Επιτρέπει στον κάτοχο τη σύνδεση στη διεπαφή ανωτάτου επιπέδου ενός παρόχου συνθηκών. Δεν απαιτείται για κανονικές εφαρμογές."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"δέσμευση σε υπηρεσία dream"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας dream. Δεν απαιτείται σε κανονικές εφαρμογές."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"κλήση της εφαρμογής διαμόρφωσης που παρέχεται από την εταιρεία κινητής τηλεφωνίας"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Επιτρέπει στον κάτοχο την κλήση της εφαρμογής διαμόρφωσης που παρέχεται από την εταιρεία κινητής τηλεφωνίας. Δεν απαιτείται για κανονικές εφαρμογές."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"λήψη παρατηρήσεων σχετικά με την κατάσταση δικτύου"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Επιτρέπει σε μια εφαρμογή να λαμβάνει παρατηρήσεις σχετικά με την κατάσταση δικτύου. Δεν θα πρέπει να απαιτείται ποτέ για κανονικές εφαρμογές."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"αλλαγή βαθμονόμησης της συσκευής εισόδου"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Επιτρέπει στην εφαρμογή να τροποποιεί τις παραμέτρους βαθμονόμησης της οθόνης αφής. Δεν απαιτείται για τις κανονικές εφαρμογές."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"πρόσβαση σε πιστοποιητικά DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Επιτρέπει σε μια εφαρμογή να παρέχει και να χρησιμοποιεί πιστοποιητικά DRM. Δεν θα χρειαστεί ποτέ για κανονικές εφαρμογές."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Λήψη κατάστασης μεταφοράς Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Επιτρέπει σε αυτήν την εφαρμογή να λαμβάνει πληροφορίες σχετικά με τις τρέχουσες μεταφορές Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"κατάργηση πιστοποιητικών DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Επιτρέπει σε μια εφαρμογή την κατάργηση πιστοποιητικών DRM. Δεν χρειάζεται ποτέ για κανονικές εφαρμογές."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"δέσμευση σε υπηρεσία ανταλλαγής μηνυμάτων εταιρείας κινητής τηλεφωνίας"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας ανταλλαγής μηνυμάτων εταιρείας κινητής τηλεφωνίας. Δεν απαιτείται για συνήθεις εφαρμογές."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Ορισμός κανόνων κωδικού πρόσβασης"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Ελέγξτε την έκταση και τους επιτρεπόμενους χαρακτήρες σε κωδικούς πρόσβασης κλειδώματος οθόνης και PIN."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Παρακολούθηση προσπαθειών ξεκλειδώματος οθόνης"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Πατήστε \"Menu\" για ξεκλείδωμα ή για κλήση έκτακτης ανάγκης."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Πατήστε \"Μενού\" για ξεκλείδωμα."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Σχεδιασμός μοτίβου για ξεκλείδωμα"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Επείγοντα περιστατικά"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Επιστροφή στην κλήση"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Σωστό!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Προσπαθήστε ξανά"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"υποψήφιοι"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Προετοιμασία <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Έλεγχος για σφάλματα"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Εντοπίστηκε νέο μέσο αποθήκευσης <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Για μεταφορά φωτογραφιών και πολυμέσων"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Κατεστραμμένος χώρος αποθήκευσης <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Ο χώρος αποθήκευσης <xliff:g id="NAME">%s</xliff:g> είναι κατεστραμμένος. Δοκιμάστε να τον διαμορφώσετε ξανά."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Μη αναμενόμενη αφαίρεση <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Αποπροσαρτήστε το μέσο αποθήκευσης <xliff:g id="NAME">%s</xliff:g> πριν τον αφαιρέσετε, προς αποφυγή απώλειας δεδομένων."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Καταργήθηκε το <xliff:g id="NAME">%s</xliff:g>."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Καταργήθηκε <xliff:g id="NAME">%s</xliff:g>. Τοποθετήστε μια νέα κάρτα"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Εξακολουθεί να γίνεται κατάργηση <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Να μην καταργηθεί"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Ρύθμιση"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Εξαγωγή"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Εξερεύνηση"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Δεν βρέθηκαν δραστηριότητες που να συμφωνούν με τα κριτήρια."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Διαγραφή διαδρομής δεδομένων εξόδου μέσων"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Επιτρέπει σε μια εφαρμογή τη διαγραφή διαδρομής δεδομένων εξόδου μέσων σε άλλες εξωτερικές συσκευές."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Εσωτερικός χώρος αποθήκευσης"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Κάρτα SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Χώρος αποθήκευσης USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Επεξεργασία"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Προειδοποίηση χρήσης δεδομένων"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Μέχρι να το απενεργοποιήσετε"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Σύμπτυξη"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Αποκλεισμός διακοπών"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Μην ενοχλείτε"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Διακοπή λειτουργίας"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Καθημερινές"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Σαββατοκύριακα"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 1a893c8..53d59e2 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Allows the app to read SMS messages stored on your tablet or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Allows the app to read SMS messages stored on your TV or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Allows the app to read SMS messages stored on your phone or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"edit your text messages (SMS or MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Allows the app to write to SMS messages stored on your tablet or SIM card. Malicious apps may delete your messages."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Allows the app to write to SMS messages stored on your TV or SIM card. Malicious apps may delete your messages."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Allows the app to write to SMS messages stored on your phone or SIM card. Malicious apps may delete your messages."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"receive text messages (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Allows the app to receive and process WAP messages. This permission includes the ability to monitor or delete messages sent to you without showing them to you."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"retrieve running apps"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Partial fingerprint detected. Please try again."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Couldn\'t process fingerprint. Please try again."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerprint sensor is dirty. Please clean and try again."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Finger moved too fast. Please try again."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Finger moved to slow. Please try again."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerprint operation cancelled."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
@@ -468,6 +459,48 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Allows the app to write to the SD card."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"make/receive SIP calls"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Allows the app to make and receive SIP calls."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"register new telecom SIM connections"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Allows the app to register new telecom SIM connections."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"register new telecom connections"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Allows the app to register new telecom connections."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"manage telecom connections"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Allows the app to manage telecom connections."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interact with in-call screen"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Allows the app to control when and how the user sees the in-call screen."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interact with telephony services"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Allows the app to interact with telephony services to make/receive calls."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"provide an in-call user experience"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Allows the app to provide an in-call user experience."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"read historical network usage"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Allows the app to read historical network usage for specific networks and apps."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"manage network policy"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Allows the app to manage network policies and define app-specific rules."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modify network usage accounting"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Allows the app to modify how network usage is accounted against apps. Not for use by normal apps."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"access notifications"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Allows the app to retrieve, examine, and clear notifications, including those posted by other apps."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bind to a notification listener service"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Allows the holder to bind to the top-level interface of a notification listener service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"bind to a condition provider service"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Allows the holder to bind to the top-level interface of a condition provider service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"bind to a dream service"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Allows the holder to bind to the top-level interface of a dream service. Should never be needed for normal apps."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invoke the carrier-provided configuration app"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Allows the holder to invoke the carrier-provided configuration app. Should never be needed for normal apps."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"listen for observations on network conditions"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Allows an application to listen for observations on network conditions. Should never be needed for normal apps."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"change input device calibration"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Allows the app to modify the calibration parameters of the touch screen. Should never be needed for normal apps."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"access DRM certificates"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Allows an application to provision and use DRM certficates. Should never be needed for normal apps."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Receive Android Beam transfer status"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Allows this application to receive information about current Android Beam transfers"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"remove DRM certificates"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Allows an application to remove DRM certficates. Should never be needed for normal apps."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"bind to a carrier messaging service"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Allows the holder to bind to the top-level interface of a carrier messaging service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindCarrierConfigService" msgid="4110548389449423386">"bind to a carrier config. service"</string>
+ <string name="permdesc_bindCarrierConfigService" msgid="1096888107671817447">"Allows the holder to bind to a carrier config.service. It should never be needed for normal apps."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"Set password rules"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Control the length and the characters allowed in screen lock passwords and PINs."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Monitor screen-unlock attempts"</string>
@@ -1028,35 +1061,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidates"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Damaged <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> is damaged; try reformatting it"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removed; insert a new one"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Still ejecting <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Don\'t remove"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Set up"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"No matching activities found."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Route media output"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Allows an application to route media output to other external devices."</string>
@@ -1186,6 +1205,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Internal storage"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD card"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD card"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB drive"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Data usage warning"</string>
@@ -1448,7 +1470,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Until you turn this off"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Block interruptions"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Weeknights"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekends"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 1a893c8..53d59e2 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Allows the app to read SMS messages stored on your tablet or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Allows the app to read SMS messages stored on your TV or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Allows the app to read SMS messages stored on your phone or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"edit your text messages (SMS or MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Allows the app to write to SMS messages stored on your tablet or SIM card. Malicious apps may delete your messages."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Allows the app to write to SMS messages stored on your TV or SIM card. Malicious apps may delete your messages."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Allows the app to write to SMS messages stored on your phone or SIM card. Malicious apps may delete your messages."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"receive text messages (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Allows the app to receive and process WAP messages. This permission includes the ability to monitor or delete messages sent to you without showing them to you."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"retrieve running apps"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Partial fingerprint detected. Please try again."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Couldn\'t process fingerprint. Please try again."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerprint sensor is dirty. Please clean and try again."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Finger moved too fast. Please try again."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Finger moved to slow. Please try again."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerprint operation cancelled."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
@@ -468,6 +459,48 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Allows the app to write to the SD card."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"make/receive SIP calls"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Allows the app to make and receive SIP calls."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"register new telecom SIM connections"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Allows the app to register new telecom SIM connections."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"register new telecom connections"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Allows the app to register new telecom connections."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"manage telecom connections"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Allows the app to manage telecom connections."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interact with in-call screen"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Allows the app to control when and how the user sees the in-call screen."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interact with telephony services"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Allows the app to interact with telephony services to make/receive calls."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"provide an in-call user experience"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Allows the app to provide an in-call user experience."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"read historical network usage"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Allows the app to read historical network usage for specific networks and apps."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"manage network policy"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Allows the app to manage network policies and define app-specific rules."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modify network usage accounting"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Allows the app to modify how network usage is accounted against apps. Not for use by normal apps."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"access notifications"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Allows the app to retrieve, examine, and clear notifications, including those posted by other apps."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bind to a notification listener service"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Allows the holder to bind to the top-level interface of a notification listener service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"bind to a condition provider service"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Allows the holder to bind to the top-level interface of a condition provider service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"bind to a dream service"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Allows the holder to bind to the top-level interface of a dream service. Should never be needed for normal apps."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invoke the carrier-provided configuration app"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Allows the holder to invoke the carrier-provided configuration app. Should never be needed for normal apps."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"listen for observations on network conditions"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Allows an application to listen for observations on network conditions. Should never be needed for normal apps."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"change input device calibration"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Allows the app to modify the calibration parameters of the touch screen. Should never be needed for normal apps."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"access DRM certificates"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Allows an application to provision and use DRM certficates. Should never be needed for normal apps."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Receive Android Beam transfer status"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Allows this application to receive information about current Android Beam transfers"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"remove DRM certificates"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Allows an application to remove DRM certficates. Should never be needed for normal apps."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"bind to a carrier messaging service"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Allows the holder to bind to the top-level interface of a carrier messaging service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindCarrierConfigService" msgid="4110548389449423386">"bind to a carrier config. service"</string>
+ <string name="permdesc_bindCarrierConfigService" msgid="1096888107671817447">"Allows the holder to bind to a carrier config.service. It should never be needed for normal apps."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"Set password rules"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Control the length and the characters allowed in screen lock passwords and PINs."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Monitor screen-unlock attempts"</string>
@@ -1028,35 +1061,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidates"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Damaged <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> is damaged; try reformatting it"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removed; insert a new one"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Still ejecting <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Don\'t remove"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Set up"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"No matching activities found."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Route media output"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Allows an application to route media output to other external devices."</string>
@@ -1186,6 +1205,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Internal storage"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD card"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD card"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB drive"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Data usage warning"</string>
@@ -1448,7 +1470,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Until you turn this off"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Block interruptions"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Weeknights"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekends"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 1a893c8..53d59e2 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Allows the app to read SMS messages stored on your tablet or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Allows the app to read SMS messages stored on your TV or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Allows the app to read SMS messages stored on your phone or SIM card. This allows the app to read all SMS messages, regardless of content or confidentiality."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"edit your text messages (SMS or MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Allows the app to write to SMS messages stored on your tablet or SIM card. Malicious apps may delete your messages."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Allows the app to write to SMS messages stored on your TV or SIM card. Malicious apps may delete your messages."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Allows the app to write to SMS messages stored on your phone or SIM card. Malicious apps may delete your messages."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"receive text messages (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Allows the app to receive and process WAP messages. This permission includes the ability to monitor or delete messages sent to you without showing them to you."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"retrieve running apps"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Partial fingerprint detected. Please try again."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Couldn\'t process fingerprint. Please try again."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerprint sensor is dirty. Please clean and try again."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Finger moved too fast. Please try again."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Finger moved to slow. Please try again."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerprint operation cancelled."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
@@ -468,6 +459,48 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Allows the app to write to the SD card."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"make/receive SIP calls"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Allows the app to make and receive SIP calls."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"register new telecom SIM connections"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Allows the app to register new telecom SIM connections."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"register new telecom connections"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Allows the app to register new telecom connections."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"manage telecom connections"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Allows the app to manage telecom connections."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interact with in-call screen"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Allows the app to control when and how the user sees the in-call screen."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interact with telephony services"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Allows the app to interact with telephony services to make/receive calls."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"provide an in-call user experience"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Allows the app to provide an in-call user experience."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"read historical network usage"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Allows the app to read historical network usage for specific networks and apps."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"manage network policy"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Allows the app to manage network policies and define app-specific rules."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modify network usage accounting"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Allows the app to modify how network usage is accounted against apps. Not for use by normal apps."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"access notifications"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Allows the app to retrieve, examine, and clear notifications, including those posted by other apps."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bind to a notification listener service"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Allows the holder to bind to the top-level interface of a notification listener service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"bind to a condition provider service"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Allows the holder to bind to the top-level interface of a condition provider service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"bind to a dream service"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Allows the holder to bind to the top-level interface of a dream service. Should never be needed for normal apps."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invoke the carrier-provided configuration app"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Allows the holder to invoke the carrier-provided configuration app. Should never be needed for normal apps."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"listen for observations on network conditions"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Allows an application to listen for observations on network conditions. Should never be needed for normal apps."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"change input device calibration"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Allows the app to modify the calibration parameters of the touch screen. Should never be needed for normal apps."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"access DRM certificates"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Allows an application to provision and use DRM certficates. Should never be needed for normal apps."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Receive Android Beam transfer status"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Allows this application to receive information about current Android Beam transfers"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"remove DRM certificates"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Allows an application to remove DRM certficates. Should never be needed for normal apps."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"bind to a carrier messaging service"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Allows the holder to bind to the top-level interface of a carrier messaging service. Should never be needed for normal apps."</string>
+ <string name="permlab_bindCarrierConfigService" msgid="4110548389449423386">"bind to a carrier config. service"</string>
+ <string name="permdesc_bindCarrierConfigService" msgid="1096888107671817447">"Allows the holder to bind to a carrier config.service. It should never be needed for normal apps."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"Set password rules"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Control the length and the characters allowed in screen lock passwords and PINs."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Monitor screen-unlock attempts"</string>
@@ -1028,35 +1061,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidates"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Damaged <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> is damaged; try reformatting it"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removed; insert a new one"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Still ejecting <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Don\'t remove"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Set up"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"No matching activities found."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Route media output"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Allows an application to route media output to other external devices."</string>
@@ -1186,6 +1205,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Internal storage"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD card"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD card"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB drive"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Data usage warning"</string>
@@ -1448,7 +1470,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Until you turn this off"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Block interruptions"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Weeknights"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekends"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index e70140f..3dde2ff 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -239,7 +239,7 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="2016641188146068700">"usar el teléfono del dispositivo"</string>
<string name="permgrouplab_sensors" msgid="7416703484233940260">"Sensores"</string>
- <string name="permgroupdesc_sensors" msgid="2987451839455524494">"acceder a los sensores y los wearables"</string>
+ <string name="permgroupdesc_sensors" msgid="2987451839455524494">"acceder a los sensores y wearables"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de las ventanas"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de la ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la Exploración táctil"</string>
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permite que la aplicación consulte los mensajes SMS almacenados en la tablet o en la tarjeta SIM. La aplicación puede utilizar este permiso para leer todos los mensajes SMS, independientemente de cuál sea su contenido o su nivel de confidencialidad."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permite que la aplicación lea mensajes SMS en la TV o la tarjeta SIM. Esta opción permite que la aplicación lea todos los mensajes SMS, independientemente del contenido o de la confidencialidad."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permite que la aplicación consulte los mensajes SMS almacenados en el dispositivo o en la tarjeta SIM. La aplicación puede utilizar este permiso para leer todos los mensajes SMS, independientemente de cuál sea su contenido o su nivel de confidencialidad."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"editar tus mensajes de texto (SMS o MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permite que la aplicación escriba en mensajes SMS almacenados en tu tablet o tarjeta SIM. Las aplicaciones maliciosas pueden eliminar tus mensajes."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permite que la aplicación escriba en mensajes SMS almacenados en la TV o la tarjeta SIM. Las aplicaciones malintencionadas pueden eliminar los mensajes."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permite que la aplicación escriba en mensajes SMS almacenados en tu dispositivo o tarjeta SIM. Las aplicaciones maliciosas pueden eliminar tus mensajes."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"recibir mensajes de texto (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permite que la aplicación reciba y procese mensajes WAP, lo que significa que podría controlar o eliminar mensajes enviados al usuario sin mostrártelos."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"recuperar aplicaciones en ejecución"</string>
@@ -328,7 +324,7 @@
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite que la aplicación acceda a las actualizaciones de tus redes sociales y las de tus amigos, y que las sincronice. Ten cuidado al compartir información, ya que la aplicación puede utilizar este permiso para leer las conversaciones que tengas con tus amigos en las redes sociales sin tener en cuenta si son confidenciales. Nota: Este permiso no se puede utilizar en todas las redes sociales."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"Escritura en tu muro social"</string>
<string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Permite que la aplicación muestre actualizaciones de las redes sociales de tus amigos. Ten cuidado al compartir información, ya que la aplicación puede generar mensajes que parezcan proceder de amigos. Nota: Este permiso no se puede utilizar en todas las redes sociales."</string>
- <string name="permlab_readCalendar" msgid="5972727560257612398">"Leer eventos de calendario e información confidencial"</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"leer eventos de calendario e información confidencial"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Permite que la aplicación consulte todos los eventos de calendario almacenados en la tablet, incluidos los de amigos y compañeros de trabajo. La aplicación puede utilizar este permiso para compartir o guardar datos del calendario del usuario sin tener en cuenta si son privados o confidenciales."</string>
<string name="permdesc_readCalendar" product="tv" msgid="3191352452242394196">"Permite que la aplicación lea todos los eventos de calendario almacenados en la TV, incluidos aquellos de amigos o colegas. Esta opción puede permitir que la aplicación comparta o guarde datos de calendario, independientemente de la confidencialidad o la privacidad."</string>
<string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Permite que la aplicación consulte todos los eventos de calendario almacenados en el dispositivo, incluidos los de amigos y compañeros de trabajo. La aplicación puede utilizar este permiso para compartir o guardar los datos del calendario sin tener en cuenta si son privados o confidenciales."</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"La huella digital se detectó parcialmente. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"No se pudo procesar la huella digital. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"El sensor de huellas digitales está sucio. Limpia el sensor y vuelve a intentarlo."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Moviste el dedo muy rápido. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Moviste el dedo muy despacio. Vuelve a intentarlo."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware para detectar huellas digitales no está disponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una de las existentes."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Se canceló la operación de huella digital."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Vuelve a intentarlo más tarde."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Vuelve a intentarlo."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string>
@@ -458,7 +449,7 @@
<string name="permdesc_readDictionary" msgid="659614600338904243">"Permite que la aplicación consulte cualquier palabra, nombre o frase que el usuario haya almacenado en su diccionario."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"agregar palabras en el diccionario definido por el usuario"</string>
<string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permite que la aplicación ingrese palabras nuevas en el diccionario del usuario."</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"leer contenido dispositivo USB"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"leer contenido de disp. USB"</string>
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"leer el contenido de tu tarjeta SD"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Permite leer contenido de USB."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Permite que la aplicación lea el contenido de la tarjeta SD."</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Admite que la aplicación escriba en la tarjeta SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"realizar/recibir llamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que la aplicación realice y reciba llamadas SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"Registrar nuevas conexiones SIM de telecomunicaciones"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que la aplicación registre nuevas conexiones SIM de telecomunicaciones."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"Registrar nuevas conexiones de telecomunicaciones"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que la aplicación registre las conexiones de telecomunicaciones nuevas."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"administrar conexiones de telecomunicaciones"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que la aplicación administre las conexiones de telecomunicaciones."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interactuar con la pantalla de llamada"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permite que la aplicación controle cuándo y cómo el usuario ve la pantalla de llamada."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interaccionar con servicios de telefonía"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permite que la aplicación interaccione con servicios de telefonía para hacer y recibir llamadas."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ofrecer una experiencia de usuario de llamada"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permite que la aplicación proporcione una experiencia de usuario de llamada."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"leer uso histórico de la red"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permite que la aplicación lea el uso histórico de la red en redes y aplicaciones específicas."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gestionar la política de la red"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permite que la aplicación administre las políticas de red y defina reglas específicas de la aplicación."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"Modificar la administración del uso de redes"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permite que la aplicación modifique cómo se registra el uso de red en relación con las aplicaciones. Las aplicaciones normales no deben usar este permiso."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"acceder a las notificaciones"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite que la aplicación recupere, examine y elimine notificaciones, incluidas aquellas publicadas por otras aplicaciones."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"Vincular a un servicio de agente de escucha de notificaciones"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite al propietario vincularse a la interfaz de nivel superior de un servicio de agente de escucha de notificaciones. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"vincular con un servicio de proveedor de condiciones"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite vincular con la interfaz de nivel superior de un servicio de proveedor de condiciones. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"vincularse a un servicio de protector de pantalla interactivo"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permite al propietario vincularse a la interfaz de nivel superior de un servicio de protector de pantalla interactivo. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ejecutar la aplicación de configuración proporcionada por el proveedor"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite al propietario ejecutar la aplicación de configuración proporcionada por el proveedor. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Detectar cambios en el estado de la red"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permite que una aplicación detecte cambios en el estado de la red. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"cambiar la calibración del dispositivo de entrada"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permite que la aplicación modifique los parámetros de calibración de la pantalla táctil. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"Acceder a certificados DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permite que una aplicación proporcione y utilice certificados DRM. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Recibir estado de transferencias de Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite que esta aplicación reciba información sobre las transferencias actuales de Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"eliminar certificados DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permite que una aplicación elimine certificados DRM. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"vincular al servicio de mensajería del proveedor"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permite al propietario vincularse a la interfaz de nivel superior del servicio de mensajería del proveedor. Las aplicaciones regulares no lo necesitan."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Establecer reglas de contraseña"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Permite controlar la longitud y los caracteres permitidos en las contraseñas y los PIN para el bloqueo de pantalla."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Supervisa los intentos para desbloquear la pantalla"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Presiona el Menú para desbloquear o realizar una llamada de emergencia."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Presionar Menú para desbloquear."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dibujar el patrón de desbloqueo"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Emergencia"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Regresar a llamada"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcto"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Vuelve a intentarlo."</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando el medio <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Verificando errores"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Se detectó un nuevo medio (<xliff:g id="NAME">%s</xliff:g>)."</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y contenido multimedia"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Se dañó el medio <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"El medio <xliff:g id="NAME">%s</xliff:g> está dañado. Intenta volver a formatearlo."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Se extrajo <xliff:g id="NAME">%s</xliff:g> de forma inesperada."</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Para evitar que se pierdan datos, desactiva el dispositivo <xliff:g id="NAME">%s</xliff:g> antes de extraerlo."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Se extrajo el medio <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Se extrajo el medio <xliff:g id="NAME">%s</xliff:g>. Inserta uno nuevo."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Expulsando el medio <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"No extraer"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configuración"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"No se encontraron actividades coincidentes."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Dirigir salida de medios"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que la aplicación dirija salidas de medios a otros dispositivos externos."</string>
@@ -1102,8 +1122,8 @@
<string name="no_file_chosen" msgid="6363648562170759465">"No se seleccionó un archivo."</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo auto habilitado"</string>
- <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Toca para salir del modo auto."</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo Auto habilitado"</string>
+ <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Toca para salir del modo Auto."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red o zona activa conectados"</string>
<string name="tethered_notification_message" msgid="6857031760103062982">"Toca para configurar."</string>
<string name="back_button_label" msgid="2300470004503343439">"Atrás"</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Almacenamiento interno"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Tarjeta SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Almacenamiento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advertencia de uso de datos"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Hasta que lo desactives"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloquear interrupciones"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"No molestar"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tiempo de inactividad"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noches entre semana"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fines de semana"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index dc1850b..8e9e428 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permite que la aplicación lea mensajes SMS almacenados en el tablet o en la tarjeta SIM. La aplicación puede utilizar este permiso para leer todos los mensajes SMS, independientemente de cuál sea su contenido o su nivel de confidencialidad."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permite que la aplicación lea mensajes SMS almacenados en tu TV o en tu tarjeta SIM. Esto permite que la aplicación lea todos los mensajes SMS, independientemente de su nivel de privacidad o confidencialidad."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permite que la aplicación lea mensajes SMS almacenados en el teléfono o en la tarjeta SIM. La aplicación puede utilizar este permiso para leer todos los mensajes SMS, independientemente de cuál sea su contenido o su nivel de confidencialidad."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"editar tus mensajes de texto (SMS o MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permite que la aplicación lea mensajes SMS almacenados en el tablet o en la tarjeta SIM. Las aplicaciones malintencionadas pueden leer los mensajes."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permite que la aplicación escriba mensajes SMS almacenados en la TV o la tarjeta SIM. Las aplicaciones maliciosas pueden eliminar tus mensajes."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permite que la aplicación escriba en mensajes SMS almacenados en el teléfono o en la tarjeta SIM. Las aplicaciones malintencionadas pueden borrar los mensajes."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"recibir mensajes de texto (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permite que la aplicación reciba y procese mensajes WAP, lo que significa que podría utilizar este permiso para controlar o eliminar mensajes enviados al usuario sin mostrárselos."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"recuperar aplicaciones en ejecución"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Se ha detectado una huella digital parcial. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"No se ha podido procesar la huella digital. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"El sensor de huellas digitales está sucio. Límpialo y vuelve a intentarlo."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Has quitado el dedo demasiado rápido. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Has movido el dedo muy despacio. Vuelve a intentarlo."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware de huella digital no está disponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una ya creada."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Se ha alcanzado el tiempo de espera de la huella digital. Vuelve a intentarlo."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Se ha cancelado la operación de huella digital."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Vuelve a intentarlo más tarde."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Vuelve a intentarlo."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite que la aplicación escriba en la tarjeta SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"hacer/recibir llamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que la aplicación haga y reciba llamadas SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registras conexiones de SIM de telecomunicaciones nuevas"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que la aplicación registre conexiones de SIM de telecomunicaciones nuevas."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrar conexiones de telecomunicaciones nuevas"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que la aplicación registre conexiones de telecomunicaciones nuevas."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"administrar conexiones de telecomunicaciones"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que la aplicación administre las conexiones de telecomunicaciones."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interactuar con la pantalla de llamada"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permite que la aplicación controle cómo y cuándo aparece la pantalla de llamada."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interactuar con servicios de telefonía"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permite que la aplicación interactúe con servicios de telefonía para hacer y recibir llamadas."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ofrecer una experiencia de usuario de llamada"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permite que la aplicación proporcione una experiencia de usuario de llamada."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"leer uso de red histórico"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permite que la aplicación consulte el uso de red histórico de redes y de aplicaciones específicas."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"administrar política de red"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permite que la aplicación administre políticas de red y defina reglas específicas de la aplicación."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modificar cálculo de uso de red"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permite que la aplicación modifique cómo se registra el uso de red en relación con las aplicaciones. Las aplicaciones normales no deben usar este permiso."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"acceder a las notificaciones"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite que la aplicación recupere, examine y borre notificaciones, incluidas las que han publicado otras aplicaciones."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"enlazar con un servicio de detector de notificaciones"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite enlazar con la interfaz de nivel superior de un servicio de detector de notificaciones. No debe ser necesario para las aplicaciones normales."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"enlazar con un servicio de proveedor de condiciones"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite enlazar con la interfaz de nivel superior de un servicio de proveedor de condiciones. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"enlazar con un servicio de salvapantallas"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permite enlazar con la interfaz de nivel superior de un servicio de salvapantallas. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ejecutar la aplicación de configuración proporcionada por el operador"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite ejecutar la aplicación de configuración proporcionada por el operador. No debe ser necesario para aplicaciones normales."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"detectar cambios en el estado de la red"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permite que una aplicación detecte cambios en el estado de la red. No debe ser necesario para aplicaciones normales."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"cambiar la calibración del dispositivo de entrada"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permite que la aplicación modifique los parámetros de calibración de la pantalla táctil. No debe ser necesario para las aplicaciones normales."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"acceder a certificados DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permite que una aplicación proporcione y utilice certificados DRM. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Recibir estado de transferencias de Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite que esta aplicación reciba información sobre las transferencias actuales de Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"eliminar certificados DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permite a una aplicación eliminar los certificados DRM. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"enlazar con el servicio de mensajería de un operador"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permite enlazar con la interfaz de nivel superior del servicio de mensajería de un operador. Las aplicaciones normales no deberían necesitar este permiso."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Establecimiento de reglas de contraseña"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Controla la longitud y los caracteres permitidos en los PIN y en las contraseñas de bloqueo de pantalla."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Control de intentos de bloqueo de pantalla"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Pulsa la tecla de menú para desbloquear el teléfono o realizar una llamada de emergencia."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pulsa la tecla de menú para desbloquear la pantalla."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dibujar patrón de desbloqueo"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Emergencia"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Volver a llamada"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcto"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Vuelve a intentarlo"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando errores"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nueva <xliff:g id="NAME">%s</xliff:g> detectada"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y contenido multimedia"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Tu <xliff:g id="NAME">%s</xliff:g> tiene daños"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Tu <xliff:g id="NAME">%s</xliff:g> tiene daños: prueba a formatear de nuevo la unidad"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Extracción inesperada de <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva tu <xliff:g id="NAME">%s</xliff:g> antes de extraer la unidad para evitar pérdidas de datos"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Tu <xliff:g id="NAME">%s</xliff:g> se ha extraído"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Tu <xliff:g id="NAME">%s</xliff:g> se ha extraído: inserta otra unidad"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Expulsando <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"No extraer"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configurar"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"No se ha encontrado ninguna actividad coincidente."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Dirigir salida de medio"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que la aplicación dirija salidas de medios a otros dispositivos externos."</string>
@@ -1102,7 +1122,7 @@
<string name="no_file_chosen" msgid="6363648562170759465">"Archivo no seleccionado"</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche."</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche"</string>
<string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Toca para salir del modo coche."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red/Zona Wi-Fi activo"</string>
<string name="tethered_notification_message" msgid="6857031760103062982">"Toca para configurar"</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Almacenamiento interno"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Tarjeta SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Almacenamiento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advertencia de uso de datos"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Hasta apagar el dispositivo"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloquear interrupciones"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"No molestar"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tiempo de inactividad"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noches entre semana"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fines de semana"</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 042e0b3..4668009 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Võimaldab rakendusel lugeda tahvelarvutisse või SIM-kaardile salvestatud SMS-sõnumeid. See võimaldab rakendusel lugeda kõiki SMS-sõnumeid sisust või konfidentsiaalsusest hoolimata."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Lubab rakendusel lugeda telerisse või SIM-kaardile salvestatud SMS-sõnumeid. See võimaldab rakendusel lugeda kõiki SMS-sõnumeid, olenemata nende sisust või konfidentsiaalsusest."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Võimaldab rakendusel lugeda telefoni või SIM-kaardile salvestatud SMS-sõnumeid. See võimaldab rakendusel lugeda kõiki SMS-sõnumeid sisust või konfidentsiaalsusest hoolimata."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"muutke oma tekstisõnumeid (SMS või MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Võimaldab rakendusel kirjutada teie tahvelarvutisse või SIM-kaardile salvestatud SMS-sõnumitesse. Pahatahtlikud rakendused võivad teie sõnumid kustutada."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Lubab rakendusel kirjutada telerisse või SIM-kaardile salvestatud SMS-sõnumeid. Pahatahtlikud rakendused võivad sõnumeid kustutada."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Võimaldab rakendusel kirjutada teie telefoni või SIM-kaardile salvestatud SMS-sõnumitesse. Pahatahtlikud rakendused võivad teie sõnumid kustutada."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"võtke vastu tekstisõnumeid (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Võimaldab rakendusel vastu võtta ja töödelda WAP-sõnumeid. See luba hõlmab võimet jälgida või kustutada teile saadetud sõnumeid neid teile näitamata."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"Käitatud rakenduste toomine"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Tuvastati osaline sõrmejälg. Proovige uuesti."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Sõrmejälge ei õnnestunud töödelda. Proovige uuesti."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sõrmejäljeandur on must. Puhastage see ja proovige uuesti."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Sõrm liikus liiga kiiresti. Proovige uuesti."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Sõrm liikus liiga aeglaselt. Proovige uuesti."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sõrmejälje riistvara pole saadaval."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sõrmejälge ei saa salvestada. Eemaldage olemasolev sõrmejälg."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sõrmejälje riistvara taimeri ajalõpp. Proovige uuesti."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Sõrmejälje toiming tühistati."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Liiga palju katseid. Proovige hiljem uuesti."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Proovige uuesti."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"loe sünkroonimisseadeid"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Võimaldab rakendusel kirjutada SD-kaardile."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-kõnede tegemine/vastuvõtmine"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Lubab rakendusel teha ja vastu võtta SIP-kõnesid."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"uute telekommunikatsiooni SIM-kaardi ühenduste registreerimine"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Lubab rakendusel registreerida uusi telekommunikatsiooni SIM-kaartide ühendusi."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"uute telekommunikatsiooni ühenduste registreerimine"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Lubab rakendusel registreerida uusi telekommunikatsiooni ühendusi."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"telekommunikatsiooni ühenduste haldamine"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Lubab rakendusel hallata telekommunikatsiooni ühendusi."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ekraani Kõne pooleli kasutamine"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Lubab rakendusel juhtida, millal ja kuidas kasutajale kuvatakse ekraan Kõne pooleli."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"telefoniteenustega suhtlemine"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Võimaldab rakendusel telefoniteenustega kõnede tegemiseks ja vastuvõtmiseks suhelda."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"funktsiooni Kõne pooleli kasutuskogemuse pakkumine"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Lubab rakendusel pakkuda kasutuskogemust funktsiooni Kõne pooleli kasutamisel."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"võrgukasutuse ajaloo lugemine"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Võimaldab rakendusel lugeda võrgukasutuse ajalugu teatud võrkude ja rakenduste puhul."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"võrgueeskirjade haldamine"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Võimaldab rakendusel hallata võrgueeskirju ja määratleda rakendusespetsiifilisi reegleid."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"võrgukasutuse arvestamise muutmine"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Võimaldab rakendusel muuta võrgukasutuse loendamist rakenduste suhtes. Mitte kasutada tavarakenduste puhul."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"juurdepääsu märguanded"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Võimaldab rakendusel tuua, kontrollida ja kustutada märguandeid, sh neid, mille on postitanud teised rakendused."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"seo märguannete kuulamisteenusega"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Võimaldab omanikul siduda märguannete kuulamisteenuse ülemise taseme kasutajaliidese. Seda ei tohiks tavarakenduste puhul kunagi vaja olla."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"seo tingimuse pakkuja teenusega"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Lubab omanikul siduda tingimuse pakkuja teenuse ülataseme liidesega. Pole kunagi vajalik tavaliste rakenduste puhul."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"sidumine uneteenusega"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Lubab omanikul siduda uneteenuse ülataseme liidesega. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"operaatoripoolse konfiguratsioonirakenduse aktiveerimine"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Lubab omanikul aktiveerida operaatoripoolse konfiguratsioonirakenduse. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"võrgutingimuste teabe kuulamine"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Lubab rakendusel kuulata võrgutingimuste teavet. Ei ole kunagi vajalik tavaliste rakenduste puhul."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"sisendseadme kalibreerimise muutmine"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Lubab rakendusel muuta puuteekraani kalibreerimisparameetreid. Ei tohiks kunagi olla vajalik tavaliste rakenduste puhul."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"juurdepääs DRM-i sertifikaatidele"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Lubab rakendusel ette valmistada ja kasutada DRM-i sertifikaate. Tavarakenduste puhul ei tohiks see vajalik olla."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beami ülekande oleku vastuvõtmine"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Lubab rakendusel saada teavet praeguste Android Beami ülekannete kohta"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM-sertifikaatide eemaldamine"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Lubab rakendusel eemaldada DRM-sertifikaate. Pole kunagi vajalik tavaliste rakenduste puhul."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"seose loomine operaatori sõnumisideteenusega"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Lubab omanikul luua seose operaatori sõnumisideteenuse ülataseme liidesega. Pole kunagi vajalik tavalise rakenduse puhul."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Parooli reeglite määramine"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Juhitakse ekraaniluku paroolide ja PIN-koodide pikkusi ning lubatud tähemärkide seadeid."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Ekraani avamiskatsed"</string>
@@ -1028,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidaadid"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Üksuse <xliff:g id="NAME">%s</xliff:g> ettevalmistamine"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Vigade kontrollimine"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Tuvastati uus üksus <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotode ja meedia ülekandmiseks"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Üksus <xliff:g id="NAME">%s</xliff:g> on kahjustatud"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Üksus <xliff:g id="NAME">%s</xliff:g> on kahjustatud; proovige see uuesti vormindada"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Üksus <xliff:g id="NAME">%s</xliff:g> eemaldati ootamatult"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Andmekao vältimiseks lahutage üksus <xliff:g id="NAME">%s</xliff:g> enne eemaldamist"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Üksus <xliff:g id="NAME">%s</xliff:g> on eemaldatud"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Üksus <xliff:g id="NAME">%s</xliff:g> eemaldati; sisestage uus"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Üksust <xliff:g id="NAME">%s</xliff:g> ikka eemaldatakse …"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ärge eemaldage"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Seadistamine"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Eemaldamine"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Avastamine"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Sobivat tegevust ei leitud"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Meediaväljundi teekonna koostamine"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Võimaldab rakendusel koostada teekonna meediaväljundist teistesse välistesse seadmetesse."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Sisemine salvestusruum"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kaart"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-mäluseade"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Muuda"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Andmete kasutamise hoiatus"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Kuni lülitate selle välja"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Ahendamine"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Katkestuste blokeerimine"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Mitte segada"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Puhkeaeg"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Argiõhtud"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Nädalavahetused"</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 990a78b..2df1578 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tabletan edo SIM txartelean gordetako SMS mezuak irakurtzeko baimena ematen die aplikazioei. Horrela, aplikazioak SMS mezu guztiak irakurri ahal izango ditu, edukia edo isilpekotasuna kontuan izan gabe."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Telebistan edo SIM txartelean gordetako SMS mezuak irakurtzea baimentzen die aplikazioei. Horrela, aplikazioek SMS mezu guztiak irakurri ahal izango dituzte, edukia edo isilpekotasuna kontuan izan gabe."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Telefonoan edo SIM txartelean gordetako SMS mezuak irakurtzeko baimena ematen die aplikazioei. Horrela, aplikazioak SMS mezu guztiak irakurri ahal izango ditu, edukia edo isilpekotasuna kontuan izan gabe."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"testu-mezuak (SMSak edo MMSak) editatzea"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Tabletan edo SIM txartelean gordeta dituzun SMS mezuetan idaztea baimentzen die aplikazioei. Aplikazio gaiztoek mezuak ezaba ditzakete."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Telebistan edo SIM txartelean gordeta dituzun SMS mezuetan idaztea baimentzen die aplikazioei. Aplikazio gaiztoek mezuak ezaba ditzakete."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Telefonoan edo SIM txartelean gordeta dituzun SMS mezuetan idaztea baimentzen die aplikazioei. Aplikazio gaiztoek mezuak ezaba ditzakete."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"testu-mezuak (WAP bidezkoak) jasotzea"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP mezuak jasotzeko eta prozesatzeko baimena ematen die aplikazioei. Horrela, aplikazioak, besteak beste, gailura bidalitako mezuak kontrola eta ezaba ditzake zuri erakutsi gabe."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"Eskuratu abian diren aplikazioak"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Hatz-marka digitala ez da osorik hauteman. Saiatu berriro."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Ezin izan da hatza-marka prozesatu. Saiatu berriro."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Hatz-marka digitalen sentsorea zikina dago. Garbi ezazu, eta saiatu berriro."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Hatza bizkorregi mugitu duzu. Saiatu berriro."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Hatza mantsoegi mugitu duzu. Saiatu berriro."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hatz-markaren hardwarea ez dago erabilgarri."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ezin da gorde hatz-marka digitala. Kendu lehendik gordeta duzunetako bat."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Hatz-marka digitalak prozesatzeko denbora-muga gainditu da. Saiatu berriro."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Hatz-markaren eragiketa bertan behera utzi da."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Saiakera gehiegi egin dituzu. Saiatu berriro geroago."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Saiatu berriro."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"Irakurri sinkronizazio-ezarpenak"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD txartelean idaztea baimentzen die aplikazioei."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"Egin/Jaso SIP deiak"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP deiak egitea eta jasotzea baimentzen die aplikazioei."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"erregistratu telekomunikabideekiko SIM konexio berriak"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Telekomunikabideekiko SIM konexio berriak erregistratzea baimentzen die aplikazioei."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"erregistratu telekomunikabideekiko konexio berriak"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Telekomunikabideekiko konexio berriak erregistratzea baimentzen die aplikazioei."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"Kudeatu telekomunikabideekiko konexioak"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Telekomunikabideekiko konexioak kudeatzea baimentzen die aplikazioei."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"Deiak abian direnean pantaila erabiltzea"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Erabiltzaileak deiaren pantaila noiz eta nola ikusten duen kontrolatzea baimentzen die aplikazioei."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"Elkarreragin telefono-zerbitzuekin"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Deiak egiteko eta jasotzeko telefonia-zerbitzuekin elkarreragitea baimentzen die aplikazioei."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"Deiak abian direnean erabiltzeko aukera eskaintzea"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Deiak abian direnean erabiltzeko aukera eskaintzea baimentzen die aplikazioei."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"irakurri sare-erabileraren historia"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Sare eta aplikazio jakin batzuen sare-erabileraren historia irakurtzea baimentzen die aplikazioei."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"kudeatu sare-gidalerroak"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Sareko gidalerroak kudeatzea eta aplikazioetarako berariazko arauak definitzea baimentzen die aplikazioei."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"aldatu sare-erabileraren kalkuluak"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Aplikazioen sare-erabilera kalkulatzeko modua aldatzeko baimena ematen die aplikazioei. Aplikazio normalek ez lukete beharko."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"Atzitu jakinarazpenak"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Jakinarazpenak berreskuratu, aztertu eta garbitzeko aukera ematen die aplikazioei, beste aplikazioek argitaratutako jakinarazpenak barne."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"Lotu jakinarazpenak hautemateko zerbitzu batera"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Jakinarazpenak hautemateko zerbitzu baten goi-mailako interfazera lotzeko aukera ematen dio titularrari. Aplikazio normalek ez dute baimen hau behar."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"Lotu baldintza-hornitzaileen zerbitzuei"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Baldintza-hornitzaileen zerbitzuen goi-mailako interfazeari lotzea baimentzen die titularrei. Aplikazio normalek ez lukete beharko."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"lotu dream zerbitzuei"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Dream zerbitzu baten goi-mailako interfazeari lotzea baimentzen die titularrei. Aplikazio normalek ez lukete beharko."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"Deitu operadorearen konfigurazio-aplikazioari"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Operadorearen konfigurazio-aplikazioari deitzeko aukera ematen dio titularrari. Aplikazio normalek ez dute baimen hau behar."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Hauteman sarearen baldintzei buruzko behaketak"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Sareko baldintzak hautemateko aukera ematen die aplikazioei. Aplikazio normalek ez dute baimen hau behar."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"Aldatu idazteko gailuaren kalibrazioa"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Ukipen-pantailaren kalibrazio-parametroak aldatzea baimentzen die aplikazioei. Aplikazio normalek ez lukete beharko."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"Atzitu DRM ziurtagiriak"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM ziurtagiriak hornitzea eta erabiltzea baimentzen die aplikazioei. Aplikazio normalek ez lukete beharko."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Jaso Android Beam transferentzien egoera"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Uneko Android Beam transferentziei buruzko informazioa jasotzea baimentzen die aplikazioei"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"kendu DRM ziurtagiriak"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM ziurtagiriak kentzea baimentzen die aplikazioei. Aplikazio normalek ez lukete beharko."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"lotu operadorearen mezularitza-zerbitzuari"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Operadore baten mezularitza-zerbitzuaren goi-mailako interfazeari lotzea baimentzen die erabiltzaileei. Aplikazio normalek ez lukete inoiz beharko."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Ezarri pasahitzen arauak"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Kontrolatu pantaila blokeoaren pasahitzen eta PINen luzera eta onartutako karaktereak."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Kontrolatu pantaila desblokeatzeko saiakerak"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Desblokeatzeko edo larrialdi-deia egiteko, sakatu Menua."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Desblokeatzeko, sakatu Menua."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Desblokeatzeko, marraztu eredua"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Larrialdiak"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Itzuli deira"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Eredua zuzena da!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Saiatu berriro"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"hautagaiak"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> prestatzen"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Errorerik dagoen egiaztatzen"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> berria hauteman da"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Argazkiak eta multimedia-fitxategiak transferitzeko"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> hondatuta dago"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> hondatuta dago. Saiatu berriro formateatzen"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ustekabean kendu da"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Daturik ez galtzeko, desmuntatu <xliff:g id="NAME">%s</xliff:g> memoria kendu aurretik"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ez dago"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> kendu da. Sartu beste bat"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> ateratzen oraindik…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ez kendu"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Konfigurazioa"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Atera"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Arakatu"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Ez da bat datorren jarduerarik aurkitu."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Multimedia-irteera bideratzea"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Multimedia elementuak kanpoko gailuetara bideratzeko baimena ematen die aplikazioei."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Barneko memoria"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD txartela"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB memoria"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editatu"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Datuen erabilerari buruzko abisua"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Zuk desaktibatu arte"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Tolestu"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokeatu etenaldiak"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ez molestatu"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Jarduerarik gabeko denbora"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Lanegunetako gauak"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Asteburuak"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index b9da918..d869128 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"به برنامه اجازه میدهد پیامکهای ذخیره شده در رایانهٔ لوحی یا سیم کارت شما را بخواند. این ویژگی به برنامه امکان میدهد همه پیامکها را صرفنظر از محتوا یا محرمانه بودن آنها بخواند."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"به برنامه اجازه میدهد تا پیامهای کوتاه ذخیره شده در تلویزیون یا سیمکارت شما را بخواند. به برنامه اجازه میدهد تا همه پیامهای کوتاه را صرفنظر از محتوا یا محرمانه بودن آنها بخواند."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"به برنامه اجازه میدهد پیامکهای ذخیره شده در تلفن یا سیم کارت شما را بخواند. این ویژگی به برنامه امکان میدهد همه پیامکها را صرفنظر از محتوا یا محرمانه بودن آنها بخواند."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"ویرایش پیامهای نوشتاری شما (پیامک یا MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"به برنامه اجازه میدهد تا در پیامهای کوتاه ذخیره شده در رایانهٔ لوحی یا سیم کارت بنویسد. برنامههای مخرب پیامهای شما را حذف میکنند."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"به برنامه اجازه میدهد تا در پیامهای کوتاه ذخیره شده شما در تلویزیون یا سیمکارت بنویسد. شاید برنامههای مخرب پیامهای شما را حذف کند."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"به برنامه اجازه میدهد تا در پیامهای کوتاه ذخیره شده در تلفن یا سیم کارت بنویسد. برنامههای مخرب میتوانند پیامهای شما را حذف کنند."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"دریافت پیامهای نوشتاری (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"به برنامه اجازه میدهد پیامهای WAP را دریافت و پردازش کند. این مجوز میتواند پیامهای ارسالی به شما را بدون نمایش آنها به شما حذف یا کنترل کند."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"بازیابی برنامههای در حال اجرا"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"بخشی از اثر انگشت شناسایی شد. لطفاً دوباره امتحان کنید."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"اثرانگشت پردازش نشد. لطفاً دوباره امتحان کنید."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"حسگر اثر انگشت کثیف است. لطفاً آن را تمیز کنید و دوباره امتحان نمایید."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"حرکت انگشت خیلی سریع بود. لطفاً دوباره امتحان کنید."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"انگشت خیلی آهسته حرکت کرد. لطفاً دوباره امتحان کنید."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"سختافزار اثرانگشت در دسترس نیست."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ذخیره اثر انگشت ممکن نیست. لطفاً یک اثر انگشت موجود را حذف کنید."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"مهلت زمانی ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"عملکرد اثر انگشت لغو شد."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"تلاشهای زیادی انجام شده است. بعداً دوباره امتحان کنید."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"دوباره امتحان کنید."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"خواندن تنظیمات همگامسازی"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"به برنامه اجازه میدهد تا در کارت SD بنویسد."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"تماس گرفتن/دریافت تماس از طریق SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"به برنامه اجازه میدهد تماسهای SIP بگیرد یا دریافت کند."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ثبت ارتباطات سیم کارت مخابراتی جدید"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"به برنامه اجازه میدهد ارتباطات سیم کارت مخابراتی جدیدی ثبت کند."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ثبت ارتباطات مخابراتی جدید"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"به برنامه اجازه میدهد ارتباطات مخابراتی جدیدی ثبت کند."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"مدیریت ارتباطات مخابراتی"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"به برنامه امکان میدهد ارتباطات مخابراتی را مدیریت کند."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"تعامل با صفحهنمایش هنگام تماس"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"به برنامه امکان میدهد کنترل کند که کاربر چه زمانی و چگونه صفحهنمایش هنگام تماس را مشاهده کند."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"تعامل با سرویسهای تلفنی"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"به برنامه اجازه میدهد جهت برقراری/دریافت تماس با سرویسهای تلفنی تعامل داشته باشد."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ارائه یک تجربه کاربری هنگام تماس"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"به برنامه امکان میدهد تجربه کاربر در حال تماس را ارائه دهد."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"خواندن سابقه استفاده از شبکه"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"به برنامه اجازه میدهد تا کاربرد شبکه را در طول زمان برای برنامهها و شبکههای خاص بخواند."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"مدیریت خط مشی شبکه"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"به برنامه اجازه میدهد تا خط مشیهای شبکه را مدیریت کند و قوانین خاص برنامه را تعیین کند."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"اصلاح محاسبه استفاده از شبکه"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"به برنامه اجازه میدهد تا نحوه محاسبه کاربرد شبکه در برنامه را تغییر دهد. برای استفاده برنامههای عادی نیست."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"اعلانهای دسترسی"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"به برنامه اجازه میدهد به بازیابی، بررسی و پاک کردن اعلانها از جمله موارد پست شده توسط سایر برنامهها بپردازد."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"اتصال به یک سرویس شنونده اعلان"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"به دارنده اجازه میدهد به یک رابط سطح بالای سرویس شنونده اعلان متصل شود. هرگز نباید برای برنامههای عادی لازم شود."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"مقید بودن به سرویس ارائهدهنده وضعیت"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"به دارنده امکان میدهد تا به واسط سطح بالای سرویس ارائهدهنده وضعیت مقید باشد. برای برنامههای عادی هرگز نباید لازم باشد."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"اتصال به سرویس مورد نظر"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"به برنامه اجازه میدهد که به رابط سطح بالای سرویس مورد نظر متصل شود. هرگز نباید برای برنامههای معمولی مورد نیاز باشد."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"لغو برنامه پیکربندی ارائه شده توسط شرکت مخابراتی"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"به دارنده اجازه میدهد که تنظیمات برنامه شرکت مخابراتی را لغو کند. هرگز برای برنامههای معمولی مورد نیاز نیست."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"گوش دادن برای بررسی شرایط شبکه"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"به برنامه امکان میدهد برای بررسی شرایط شبکه گوش دهد. این امکان هرگز نباید برای برنامههای معمولی مورد نیاز باشد."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"تغییر کالیبراسیون دستگاه ورودی"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"به برنامه امکان میدهد پارامترهای کالیبراسیون صفحه لمسی را تغییر دهد. هرگز نباید برای برنامههای عادی مورد نیاز باشد."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"دسترسی به گواهیهای DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"به یک برنامه کاربردی اجازه ارائه مجوز و استفاده از گواهیهای DRM را میدهد. هرگز برای برنامههای عادی مورد نیاز نیست."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"دریافت وضعیت انتقال پرتوی Android"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"به برنامه امکان میدهد تا اطلاعاتی درباره انتقالهای کنونی پرتوی Android به دست آورد"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"حذف گواهیهای DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"به برنامه امکان میدهد گواهیهای DRM را حذف کند. نباید برای برنامههای عادی هیچوقت لازم باشد."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"مقید به سرویس پیامرسانی شرکت مخابراتی"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"به کنترلکننده اجازه میدهد که به سطح بالای رابط کاربر سرویس پیامرسانی شرکت مخابراتی مقید شود. هرگز نباید برای برنامههای عادی مورد نیاز شود."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"تنظیم قوانین رمز ورود"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"کنترل طول و نوع نویسههایی که در گذرواژه و پین قفل صفحه مجاز است."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"نمایش تلاشهای قفل گشایی صفحه"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"برای بازگشایی قفل یا انجام تماس اضطراری روی منو فشار دهید."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"برای بازگشایی قفل روی منو فشار دهید."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"الگو را بکشید تا قفل آن باز شود"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"اضطراری"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"بازگشت به تماس"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"صحیح است!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"دوباره امتحان کنید"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"داوطلبین"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"در حال آمادهسازی <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"در حال بررسی برای خطاها"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> جدید شناسایی شد"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"برای انتقال عکسها و رسانه"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> آسیب دیده است"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> آسیب دیده است؛ آن را قالببندی مجدد کنید"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> به طور غیرمنتظره جدا شد"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"قبل از جدا کردن، برای جلوگیری از از دست رفتن اطلاعات، ارتباط <xliff:g id="NAME">%s</xliff:g> را قطع کنید."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> جدا شده است"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> جدا شد؛ رسانه جدیدی وارد کنید"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"همچنان در حال بیرون راندن <xliff:g id="NAME">%s</xliff:g>..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"جدا نکنید"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"تنظیم"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"بیرون راندن"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"کاوش"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"فعالیتی مطابق با این مورد یافت نشد."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"تعیین مسیر خروجی رسانه"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"به یک برنامه اجازه میدهد خروجی رسانه را به دستگاههای خارجی دیگر تعیین مسیر کند."</string>
@@ -1188,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"حافظهٔ داخلی"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"کارت SD"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"کارت SD <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"درایو USB"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"درایو USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"حافظهٔ USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ویرایش"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"هشدار میزان استفاده از داده"</string>
@@ -1450,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"تا وقتی آن را خاموش کنید"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"کوچک کردن"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"مسدود کردن وقفهها"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"مزاحم نشوید"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"فرویش"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"شبهای آخر هفته"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"آخر هفتهها"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index a3cda6d..542ba51 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Antaa sovelluksen lukea tablet-laitteeseen tai SIM-kortille tallennettuja tekstiviestejä. Sovellus voi lukea kaikki tekstiviestit huolimatta niiden arkaluonteisuudesta."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Antaa sovelluksen lukea televisioon tai SIM-kortille tallennettuja tekstiviestejä. Sovellus voi lukea kaikki tekstiviestit huolimatta niiden sisällöstä tai arkaluonteisuudesta."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Antaa sovelluksen lukea puhelimeen tai SIM-kortille tallennettuja tekstiviestejä. Sovellus voi lukea kaikki tekstiviestit huolimatta niiden arkaluonteisuudesta."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"muokkaa tekstiviestejä (teksti tai multimedia)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Antaa sovelluksen kirjoittaa tablet-laitteelle tai SIM-kortille tallennettuihin tekstiviesteihin. Haitalliset sovellukset voivat poistaa viestejä."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Antaa sovelluksen kirjoittaa televisioon tai SIM-kortille tallennettuihin tekstiviesteihin. Haitalliset sovellukset voivat poistaa viestejä."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Antaa sovelluksen kirjoittaa puhelimelle tai SIM-kortille tallennettuihin tekstiviesteihin. Haitalliset sovellukset voivat poistaa viestejä."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"vastaanota tekstiviestejä (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Antaa sovelluksen vastaanottaa ja käsitellä WAP-viestejä. Sovellus voi valvoa tai poistaa laitteeseesi lähetettyjä viestejä näyttämättä niitä sinulle."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"käynnissä olevien sovellusten noutaminen"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Sormenjälki havaittiin vain osittain. Yritä uudelleen."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Sormenjäljen käsittely epäonnistui. Yritä uudelleen."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sormenjälkitunnistin on likainen. Puhdista tunnistin ja yritä uudelleen."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Liikutit sormea liian nopeasti. Yritä uudelleen."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Liikutit sormea liian hitaasti. Yritä uudelleen."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sormenjälkilaitteisto ei ole käytettävissä."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sormenjälkeä ei voida tallentaa. Poista aiemmin lisätty sormenjälki."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sormenjälkitunnistimen toiminta aikakatkaistiin. Yritä uudelleen."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Sormenjälkitoiminto peruutettiin."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Yritä uudelleen."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lue synkronointiasetuksia"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Antaa sovelluksen kirjoittaa SD-kortille."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"soita/vastaanota SIP-puheluja"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Sallii sovelluksen soittaa ja vastaanottaa SIP-puheluja."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"rekisteröidä uusia tietoliikenne-SIM-yhteyksiä"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Antaa sovelluksen rekisteröidä uusia tietoliikenne-SIM-yhteyksiä."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"rekisteröidä uusia tietoliikenneyhteyksiä"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Antaa sovelluksen rekisteröidä uusia tietoliikenneyhteyksiä."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"tietoliikenneyhteyksien hallinta"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Antaa sovelluksen hallita tietoliikenneyhteyksiä."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"Vuorovaikutteinen puhelunäyttö"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Antaa sovelluksen määrätä, milloin ja millaisena käyttäjä näkee puhelunäytön."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"Puhelinpalveluiden yhteyslupa"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Sallii sovelluksen olla yhteydessä puhelinpalveluihin soittamista / puhelujen vastaanottamista varten."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"mahdollistavat puhelukokemuksen"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Antaa sovelluksen määrätä puhelukokemuksen."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"verkonkäyttöhistorian lukeminen"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Sallii sovelluksen lukea tiettyjen verkkojen ja sovellusten verkonkäyttöhistoriaa."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"verkkokäytännön hallinnointi"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Sallii sovelluksen hallinnoida verkkokäytäntöjä ja määritellä sovelluskohtaisia sääntöjä."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"verkon käytön seurannan muokkaaminen"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Antaa sovelluksen muokata, miten sovellusten verkonkäyttöä lasketaan. Ei tavallisten sovellusten käyttöön."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"käytä ilmoituksia"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Antaa sovelluksen noutaa, tutkia ja tyhjentää ilmoituksia (myös muiden sovelluksien lähettämiä)."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"sido ilmoituskuuntelijapalveluun"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Antaa sovelluksen sitoutua ilmoituskuuntelijan ylimmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"ehtojen toimituspalveluun sitominen"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Antaa sovelluksen luoda sidoksen ehtojen toimituspalvelun ylätason rajapintaan. Ei tavallisten sovelluksien käyttöön."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"sitoudu Unelma-palveluun"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Antaa sovelluksen sitoutua Unelma-palvelun ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"Palveluntarjoajan määrityssovelluksen käynnistäminen"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Antaa luvanhaltijan käynnistää palveluntarjoajan määrityssovelluksen. Ei tavallisten sovelluksien käyttöön."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"verkon tilahavaintojen kuunteleminen"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Antaa sovellukselle luvan kuunnella verkon tilahavaintoja. Ei tavallisten sovellusten käyttöön."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"Muuttaa syöttölaitteen kalibrointia."</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Antaa sovelluksen muokata kosketusnäytön kalibrointiparametreja. Ei tavallisten sovellusten käyttöön."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM-varmenteiden käyttö"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Antaa sovelluksen käyttää DRM-varmenteita ja hallita niiden käyttäjiä. Ei tavallisten sovellusten käyttöön."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Vastaanota Android Beam -siirron tilatietoja"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Antaa sovelluksen vastaanottaa tietoja nykyisistä Android Beam -siirroista"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM-varmenteiden poistaminen"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Antaa sovelluksen poistaa DRM-varmenteita. Ei tavallisten sovellusten käyttöön."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"Operaattorin viestipalveluun sitoutuminen"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Antaa sovelluksen sitoutua operaattorin viestipalvelun ylätason liittymään. Ei tavallisten sovellusten käyttöön."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Aseta salasanasäännöt"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Hallinnoi ruudun ruudun lukituksen salasanoissa ja PIN-koodeissa sallittuja merkkejä ja niiden pituutta."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Tarkkaile ruudun lukituksen poistoyrityksiä"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Poista lukitus tai soita hätäpuhelu painamalla Valikko-painiketta."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Poista lukitus painamalla Valikko-painiketta."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Poista lukitus piirtämällä kuvio"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Hätäpuhelu"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Palaa puheluun"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Oikein!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Yritä uudelleen"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidaatit"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Valmistellaan kohdetta <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tarkistetaan virheiden varalta."</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Uusi <xliff:g id="NAME">%s</xliff:g> on havaittu."</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Kuvien ja mediatiedostojen siirtämiseen"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> on vahingoittunut"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> on vahingoittunut. Kokeile alustaa se uudelleen."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> poistettiin yllättäen"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Poista <xliff:g id="NAME">%s</xliff:g> käytöstä ennen sen irrottamista estääksesi tietoja katoamasta."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> on poistettu"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> on poistettu. Aseta uusi."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Kohteen <xliff:g id="NAME">%s</xliff:g> poisto on kesken…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Älä poista."</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Asennus"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Poista"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Tutustu"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Osuvia toimintoja ei löytynyt."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Median reititys"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Antaa sovelluksen reitittää mediaa muihin ulkoisiin laitteisiin."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Sisäinen tallennustila"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kortti"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-tallennustila"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Muokkaa"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Tiedonsiirtovaroitus"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Kunnes poistat tämän käytöstä"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Kutista"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Estä keskeytykset"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Älä häiritse"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Vapaalla"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Arki-illat"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Viikonloput"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 39f75d9..c5a298c 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permet à l\'application de lire les SMS stockés sur votre tablette ou sur la carte SIM. Cette autorisation lui permet de lire tous les SMS, indépendamment de leur contenu ou de leur caractère confidentiel."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permet à l\'application de lire les messages texte stockés sur votre téléviseur ou votre carte SIM. Cela permet à l\'application de lire tous les messages, indépendamment du contenu ou de la confidentialité."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permet à l\'application de lire les SMS stockés sur votre téléphone ou sur la carte SIM. Cette autorisation lui permet de lire tous les SMS, indépendamment de leur contenu ou de leur caractère confidentiel."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"modifier les messages texte ou multimédias"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permet à l\'application de modifier les SMS stockés sur votre tablette ou sur la carte SIM. Des applications malveillantes peuvent exploiter cette fonctionnalité pour supprimer vos messages."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permet à l\'application de modifier les messages texte stockés sur votre téléviseur ou votre carte SIM. Des applications malveillantes pourraient supprimer vos messages."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permet à l\'application de modifier les SMS stockés sur votre téléphone ou sur votre carte SIM. Des applications malveillantes peuvent exploiter cette fonctionnalité pour supprimer vos messages."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"recevoir des messages WAP"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permet à l\'application de recevoir et de traiter les messages WAP. Cette autorisation lui donne la possibilité de surveiller ou de supprimer les messages envoyés à votre appareil sans vous les montrer."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"récupérer les données des applications en cours d\'exécution"</string>
@@ -342,7 +338,7 @@
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permet à l\'application d\'accéder à des commandes de localisation supplémentaires offertes par le fournisseur. Elle est ainsi susceptible d\'interférer avec le bon fonctionnement du GPS ou de toute autre source de localisation."</string>
<string name="permlab_accessFineLocation" msgid="1191898061965273372">"position précise (GPS et réseau)"</string>
<string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Permet à l\'application d\'obtenir votre position exacte à l\'aide du récepteur satellite GPS ou des sources de localisation de réseau tels que les points d\'accès Wi-Fi et les antennes-relais. Ces services de localisation doivent être activés et disponibles sur votre appareil pour que l\'application puissent déterminer où vous vous trouvez, le cas échéant. Cette autorisation peut entraîner une utilisation accrue de la batterie."</string>
- <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"position approximative (réseau)"</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"connaître votre position approximative (réseau)"</string>
<string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Permet à l\'application d\'obtenir votre position approximative. Celle-ci est fournie par des services de localisation sur la base des sources de localisation de réseau tels que les points d\'accès Wi-Fi et les antennes-relais. Ces services de localisation doivent être activés et disponibles sur votre appareil pour que l\'application puisse déterminer où vous vous trouvez de façon approximative, le cas échéant."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifier vos paramètres audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permet à l\'application de modifier les paramètres audio généraux, tels que le volume et la sortie audio utilisée."</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Empreinte digitale partielle détectée. Veuillez essayer de nouveau."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Impossible de traiter les empreintes digitales. Veuillez essayer de nouveau."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Le capteur d\'empreintes digitales est sale. Veuillez le nettoyer et essayer de nouveau."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Vous avez déplacé votre doigt trop rapidement. Veuillez réessayer."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Le doigt a bougé trop lentement. Veuillez essayer de nouveau."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empreinte digitale ne peut pas être enregistrée. Veuillez supprimer une empreinte existante."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Le temps attribué pour lire l\'empreinte est écoulé. Veuillez essayer de nouveau."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Opération d\'empreinte numérique annulée."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Trop de tentatives. Veuillez réessayer plus tard."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Réessayer."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permet à l\'application de modifier le contenu de la carte SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"faire et recevoir des appels SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Autorise l\'application à effectuer et à recevoir des appels SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"enregistrer de nouvelles connexions de télécommunication à l\'aide de la carte SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permettre à l\'application d\'enregistrer de nouvelles connexions de télécommunication à l\'aide de la carte SIM"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"enregistrer de nouvelles connexions de télécommunication"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permettre à l\'application d\'enregistrer de nouvelles connexions de télécommunication"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"gérer les connexions de télécommunication"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permettre à l\'application de gérer les connexions de télécommunication"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interagir avec l\'écran d\'appel"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permet à l\'application de contrôler quand et comment l\'écran d\'appel s\'affiche."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interagir avec les services de téléphonie"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permet à l\'application d\'interagir avec les services de téléphonie afin de faire et de recevoir des appels."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"fournir une expérience utilisateur pendant l\'appel"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permet à l\'application de fournir une expérience utilisateur pendant l\'appel."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lire l\'historique d\'utilisation de réseaux"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permet à l\'application de lire l\'historique d\'utilisation de réseaux et d\'applications particuliers."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gérer les politiques du réseau"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permet à l\'application de gérer les politiques du réseau et de définir celles propres à l\'application"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modifier le système d\'analyse de l\'utilisation du réseau"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permet à l\'application de modifier le système d\'analyse de l\'utilisation du réseau par les autres applications. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"accéder aux notifications"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permet aux applications de récupérer, d\'examiner et d\'autoriser les notifications, y compris celles envoyées par d\'autres applications."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"s\'associer à l\'interface de niveau supérieur d\'un service d\'écoute des notifications"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permet à l\'application de s\'associer à l\'interface de niveau supérieur d\'un service d\'écoute des notifications. Ne devrait jamais être nécessaire pour les applications normales."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"s\'associer à un service de fournisseur de conditions"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permet à l\'application de s\'associer à l\'interface de niveau supérieur d\'un service de fournisseur de conditions. Ne devrait pas être nécessaire pour les applications standards."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"associer à un service de rêve"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service de rêve. Les applications standard ne devraient pas avoir recours à cette fonctionnalité."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"faire appel à l\'application de configuration du fournisseur de services"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permet à l\'application autorisée de faire appel à l\'application de configuration fournie par le fournisseur de services. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"détecter des observations sur les conditions du réseau"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permet à une application de détecter les observations sur les conditions du réseau. Ne devrait jamais être nécessaire pour les applications standards."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"modifier le calibrage du périphérique d\'entrée"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permet à l\'application de modifier les paramètres de calibrage de l\'écran tactile. Ne devrait jamais être nécessaire pour les applications standards."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"accéder aux certificats GDN"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permet à une application de fournir et d\'utiliser les certificats de GDN. Cela ne devrait jamais être nécessaire pour les applications normales."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Recevoir des données sur l\'état du transfert Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Autoriser cette application à recevoir des données sur les transferts Android Beam en cours"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"supprimer des certificats GDN"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permet à une application de supprimer les certificats GDN. Cela ne devrait jamais être nécessaire pour des applications normales."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"s\'associer à un service de messagerie d\'un fournisseur"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service de messagerie d\'un fournisseur. Les applications standards ne devraient jamais avoir recours à cette fonctionnalité."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Définir les règles du mot de passe"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Gérer le nombre et le type de caractères autorisés dans les mots de passe et les NIP de verrouillage de l\'écran."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Gérer les tentatives de déverrouillage de l\'écran"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Appuyez sur \"Menu\" pour débloquer le téléphone ou appeler un numéro d\'urgence."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Appuyez sur \"Menu\" pour déverrouiller l\'appareil."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dessinez un schéma pour déverrouiller le téléphone"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Urgence"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Retour à l\'appel"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"C\'est exact!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Réessayer"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidats"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation de « <xliff:g id="NAME">%s</xliff:g> » en cours"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs en cours..."</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Une nouvelle mémoire « <xliff:g id="NAME">%s</xliff:g> » a été détectée"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer des photos et d\'autres fichiers"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Mémoire « <xliff:g id="NAME">%s</xliff:g> » endommagée"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"La mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> » est endommagée. Veuillez essayer de la reformater."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de la mémoire <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Désinstallez la mémoire « <xliff:g id="NAME">%s</xliff:g> » avant de la retirer pour éviter toute perte de données."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> » retirée"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"La mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> » a été retirée. Insérez-en une autre."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Éjection de la mémoire « <xliff:g id="NAME">%s</xliff:g> »..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne pas retirer"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configuration"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Découvrir"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Aucune activité correspondante trouvée."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Diriger la sortie multimédia"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permet à une application de diriger la sortie multimédia vers d\'autres appareils externes."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Mémoire de stockage interne"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Carte SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Mémoire de stockage USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Modifier"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Avertissement utilisation données"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Jusqu\'à la désactivation"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloquer les interruptions"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne pas déranger"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Temps d\'arrêt"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Les soirs de semaine"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Les fins de semaine"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 76f61c1..da01743 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permet à l\'application de lire les SMS stockés sur votre tablette ou sur la carte SIM. Cette autorisation lui permet de lire tous les SMS, indépendamment de leur contenu ou de leur caractère confidentiel."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permet à l\'application de lire les messages SMS stockés sur le téléviseur ou la carte SIM. Cette fonctionnalité permet à l\'application de lire tous les messages SMS, indépendamment de leur niveau de confidentialité."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permet à l\'application de lire les SMS stockés sur votre téléphone ou sur la carte SIM. Cette autorisation lui permet de lire tous les SMS, indépendamment de leur contenu ou de leur caractère confidentiel."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"modifier les messages texte (SMS ou MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permet à l\'application de modifier les SMS stockés sur votre tablette ou sur la carte SIM. Des applications malveillantes peuvent exploiter cette fonctionnalité pour supprimer vos messages."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permet à l\'application de modifier les messages SMS stockés sur le téléviseur ou la carte SIM. Les applications malveillantes sont susceptibles de supprimer des messages."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permet à l\'application de modifier les SMS stockés sur votre téléphone ou sur votre carte SIM. Des applications malveillantes peuvent exploiter cette fonctionnalité pour supprimer vos messages."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"recevoir des messages texte (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permet à l\'application de recevoir et de traiter les messages WAP. Cette autorisation lui donne la possibilité de surveiller ou supprimer les messages envoyés à votre appareil sans vous les montrer."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"récupérer les applications en cours d\'exécution"</string>
@@ -340,9 +336,9 @@
<string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Permet de créer des sources de localisation fictives à des fins de tests ou pour installer un nouveau fournisseur de position. L\'application peut ainsi modifier la position et/ou l\'état renvoyé par d\'autres sources de localisation telles que le GPS ou les fournisseurs de position."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Accès aux commandes de fournisseur de position géographique supplémentaires"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permet à l\'application d\'accéder à des commandes de localisation supplémentaires offertes par le fournisseur. Elle est ainsi susceptible d\'interférer avec le bon fonctionnement du GPS ou de toute autre source de localisation."</string>
- <string name="permlab_accessFineLocation" msgid="1191898061965273372">"position précise (GPS et réseau)"</string>
+ <string name="permlab_accessFineLocation" msgid="1191898061965273372">"connaître votre position précise (GPS et réseau)"</string>
<string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Permet à l\'application d\'obtenir votre position exacte à l\'aide du récepteur satellite GPS ou des sources de localisation de réseau tels que les points d\'accès Wi-Fi et les antennes-relais. Ces services de localisation doivent être activés et disponibles sur votre appareil pour que l\'application puisse déterminer où vous vous trouvez, le cas échéant. Cette autorisation peut entraîner une utilisation accrue de la batterie."</string>
- <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"position approximative (réseau)"</string>
+ <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"connaître votre position approximative (réseau)"</string>
<string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Permet à l\'application d\'obtenir votre position approximative. Celle-ci est fournie par des services de localisation sur la base des sources de localisation de réseau tels que les points d\'accès Wi-Fi et les antennes-relais. Ces services de localisation doivent être activés et disponibles sur votre appareil pour que l\'application puisse déterminer où vous vous trouvez de façon approximative, le cas échéant."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifier vos paramètres audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permet à l\'application de modifier les paramètres audio généraux, tels que le volume et la sortie audio utilisée."</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Empreinte numérique partiellement détectée. Veuillez réessayer."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Impossible de reconnaître l\'empreinte numérique. Veuillez réessayer."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Le capteur d\'empreintes numériques est sale. Veuillez le nettoyer, puis réessayer."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Vous avez déplacé votre doigt trop rapidement. Veuillez réessayer."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Vous avez déplacé votre doigt trop lentement. Veuillez réessayer."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossible d\'enregistrer l\'empreinte numérique. Veuillez supprimer une empreinte."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Délai de détection de l\'empreinte numérique expiré. Veuillez réessayer."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Opération d\'empreinte numérique annulée."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Trop de tentatives. Veuillez réessayer plus tard."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Veuillez réessayer."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permet à l\'application de modifier le contenu de la carte SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"effectuer/recevoir des appels SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Autorise l\'application à effectuer et à recevoir des appels SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"enregistrer de nouvelles connexions SIM de télécommunication"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permettre à l\'application d\'enregistrer de nouvelles connexions SIM de télécommunication"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"enregistrer de nouvelles connexions de télécommunication"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permettre à l\'application d\'enregistrer de nouvelles connexions de télécommunication"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"gérer les connexions de télécommunication"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permettre à l\'application de gérer les connexions de télécommunication"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"contrôler l\'écran d\'appel"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permet à l\'application de contrôler quand et comment l\'écran d\'appel s\'affiche."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interagir avec des services de téléphonie"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permet à l\'application d\'interagir avec des services de téléphonie pour effectuer et recevoir des appels."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"fournir une expérience utilisateur pendant l\'appel"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permet à l\'application de fournir une expérience utilisateur pendant l\'appel."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lire l\'historique d\'utilisation du réseau"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permet à l\'application de lire l\'historique d\'utilisation de réseaux et d\'applications spécifiques."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gérer les règles du réseau"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permet à l\'application de gérer les stratégies du réseau et de définir celles qui sont spécifiques à l\'application."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modifier le système de comptabilisation de l\'utilisation du réseau"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permet à l\'application de modifier l\'utilisation du réseau par les autres applications. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"accéder aux notifications"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permet aux applications de récupérer, d\'examiner et d\'autoriser les notifications, y compris celles envoyées par d\'autres applications."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"s\'associer à l\'interface de niveau supérieur d\'un service d\'écoute des notifications"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permet à l\'application de s\'associer à l\'interface de niveau supérieur d\'un service d\'écoute des notifications. Ne devrait jamais être nécessaire pour les applications normales."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"s\'associer à un service de fournisseur de conditions"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permet à l\'application de s\'associer à l\'interface de niveau supérieur d\'un service de fournisseur de conditions. Ne devrait pas être nécessaire pour les applications standards."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"associer à un service d\'écran de veille interactif"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service d\'écran de veille interactif. Cette autorisation ne devrait jamais être nécessaire pour les applications standards."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"faire appel à l\'application de configuration fournie par l\'opérateur"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permet à l\'application autorisée de faire appel à l\'application de configuration fournie par l\'opérateur. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"détecter des observations sur les conditions du réseau"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permet à une application de détecter des observations sur les conditions du réseau. Les applications standards ne devraient pas nécessiter cette autorisation."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"modifier le calibrage du périphérique d\'entrée"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permettre à l\'application de modifier les paramètres de calibrage de l\'écran tactile. Ne devrait jamais être nécessaire pour les applications standards."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"accéder aux certificats de GDN"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permettre à une application de fournir et d\'utiliser des certificats de GDN. Ne devrait jamais être nécessaire pour les applications standards."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Recevoir des informations sur l\'état du transfert Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Autoriser cette application à recevoir des informations sur les transferts Android Beam en cours"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"supprimer les certificats de GDN"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permet à une application de supprimer les certificats de GDN. Ne devrait jamais être nécessaire pour les applications standards."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"s\'associer au service SMS/MMS d\'un opérateur"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permettre à l\'application de s\'associer à l\'interface de niveau supérieur du service SMS/MMS d\'un opérateur. Ne devrait jamais être nécessaire pour les applications standards."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Définir les règles du mot de passe"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Gérer le nombre et le type de caractères autorisés dans les mots de passe et les codes d\'accès de verrouillage de l\'écran"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Gérer les tentatives de déverrouillage de l\'écran"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Appuyez sur \"Menu\" pour déverrouiller le téléphone ou appeler un numéro d\'urgence"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Appuyez sur \"Menu\" pour déverrouiller le téléphone."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dessinez un schéma pour déverrouiller le téléphone"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Urgences"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Retour à l\'appel"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Combinaison correcte !"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Veuillez réessayer."</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidats"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation mémoire \"<xliff:g id="NAME">%s</xliff:g>\" en cours"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Une nouvelle mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" a été détectée."</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer des photos et d\'autres fichiers"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Mémoire stockage \"<xliff:g id="NAME">%s</xliff:g>\" endommagée"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"La mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" est endommagée. Veuillez essayer de la reformater."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de mémoire \"<xliff:g id="NAME">%s</xliff:g>\""</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Désinstallez la mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" avant de la retirer pour éviter toute perte de données."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" retirée"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"La mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" a été retirée. Insérez-en une autre."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Éjection de la mémoire \"<xliff:g id="NAME">%s</xliff:g>\""</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne retirez pas la mémoire de stockage."</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configurer"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Parcourir"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Aucune activité correspondante trouvée."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Diriger la sortie multimédia"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permet à une application de diriger la sortie multimédia vers d\'autres appareils externes."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Mémoire de stockage interne"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Carte SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Mémoire de stockage USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Modifier"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Avertissement utilisation données"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Jusqu\'à la désactivation"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloquer les interruptions"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne pas déranger"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Temps d\'arrêt"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Soirs de semaine"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Week-ends"</string>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index b015f9e..d045ec3 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permite á aplicación ler as mensaxes SMS que están almacenadas no teu tablet ou tarxeta SIM. Isto permite á aplicación ler todas as mensaxes SMS, independentemente do seu contido ou confidencialidade."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permite que a aplicación consulte mensaxes SMS almacenadas na televisión ou na tarxeta SIM. A aplicación pode utilizar este permiso para ler todas as túas mensaxes SMS, independentemente do contido ou nivel de confidencialidade."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permite á aplicación ler as mensaxes SMS que están almacenadas no teu teléfono ou tarxeta SIM. Isto permite á aplicación ler todas as mensaxes SMS, independentemente do seu contido ou confidencialidade."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"editar as túas mensaxes de texto (SMS ou MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permite á aplicación escribir en mensaxes SMS almacenadas no teu tablet ou tarxeta SIM. É posible que aplicacións maliciosas eliminen as túas mensaxes."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permite que a aplicación escriba nas mensaxes SMS almacenadas na televisión ou na tarxeta SIM. As aplicacións maliciosas poden eliminar as mensaxes."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permite á aplicación escribir en mensaxes SMS almacenadas no teu teléfono ou tarxeta SIM. É posible que aplicacións maliciosas eliminen as túas mensaxes."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"recibir mensaxes de texto (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permite á aplicación recibir e procesar mensaxes WAP. Este permiso inclúe a capacidade de supervisar ou eliminar mensaxes enviadas a ti sen mostrarchas."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"recuperar aplicacións en execución"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Detectouse unha impresión dixital parcial. Téntao de novo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Non se puido procesar a impresión dixital. Téntao de novo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"O sensor de impresión dixital está sucio. Límpao e téntao de novo."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"O dedo moveuse demasiado rápido. Téntao de novo."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"O dedo moveuse demasiado lento. Téntao de novo."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impresión dixital non dispoñible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Non se pode almacenar a impresión dixital. Elimina unha impresión dixital existente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Esgotouse o tempo de espera da impresión dixital. Téntao de novo."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Cancelouse a operación da impresión dixital."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Téntao de novo máis tarde."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Téntao de novo."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler a configuración de sincronización"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite á aplicación escribir na tarxeta SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"facer/recibir chamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que a aplicación faga e reciba chamadas SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"rexistrar novas conexións SIM de telecomunicacións"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que a aplicación rexistre novas conexións SIM de telecomunicacións."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"rexistrar novas conexións de telecomunicacións"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que a aplicación rexistre novas conexións de telecomunicacións."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"xestionar conexións de telecomunicacións"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que a aplicación xestione conexións de telecomunicacións."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interactuar cunha pantalla de chamada"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permite á aplicación controlar cando e como ve o usuario a pantalla de chamada."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interactuar cos servizos de telefonía"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permite que a aplicación interactúe cos servizos de telefonía para facer ou recibir chamadas."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"proporcionar unha experiencia de usuario durante a chamada"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permite á aplicación proporcionar unha experiencia de usuario durante a chamada."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ler o historial de uso da rede"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permite á aplicación ler o uso da rede histórico de redes e aplicacións específicas."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"xestionar a política de rede"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permite á aplicación xestionar políticas de rede e definir normas específicas de aplicacións."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modificar o reconto de uso da rede"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permite á aplicación modificar a forma de contabilizar o uso da rede por parte das aplicacións. Non está destinado a ser utilizado por aplicacións normais."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"acceso ás notificacións"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite á aplicación recuperar, examinar e borrar notificacións, incluídas as publicadas por outras aplicacións."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"vincular a un servizo de axente de escoita de notificacións"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite ao propietario vincularse á interface de nivel superior dun servizo axente de escoita de notificacións. Non debería ser nunca necesario para as aplicacións normais."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"vincular a un servizo de provedor de condicións"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite ao propietario vincularse á interface de nivel superior dun servizo provedor de condicións. As aplicacións normais non deberían necesitar este permiso."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"vincular a un servizo de soños"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permite ao propietario vincularse á interface de nivel superior dun servizo de soños. As aplicacións normais non deberían necesitar este permiso."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invocar a aplicación de configuración fornecida polo operador"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite ao propietario invocar a aplicación de configuración fornecida polo operador. Non debería ser nunca necesario para as aplicacións normais.."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"escoitar observacións sobre as condicións da rede"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permite a unha aplicación escoitar observacións acerca das condicións da rede. Non se debería necesitar nunca para aplicacións normais."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"cambiar a calibración do dispositivo de entrada"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permite á aplicación modificar os parámetros de calibración da pantalla táctil. As aplicacións normais non deberían necesitar este permiso."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"acceso a certificados DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permite a unha aplicación fornecer e utilizar certificados DRM. Non se deberían precisar nunca para as aplicacións normais."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Recibir estado das transferencias de Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite a esta aplicación recibir información acerca das transferencias actuais de Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"eliminar certificados DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permite a unha aplicación eliminar os certificados DRM. As aplicacións normais non o deberían precisar nunca."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"vincular a un servizo de mensaxería"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permite ao propietario vincularse á interface de nivel superior dun servizo de mensaxería. As aplicacións normais non deberían necesitar este permiso."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Establecer as normas de contrasinal"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Controla a lonxitude e os caracteres permitidos nos contrasinais e nos PIN de bloqueo da pantalla."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Supervisar os intentos de desbloqueo da pantalla"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Preme Menú para desbloquear ou realizar unha chamada de emerxencia."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Preme Menú para desbloquear."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Crea o padrón de desbloqueo"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Emerxencia"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Volver á chamada"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcto!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Téntao de novo"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando se hai erros"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Detectouse unha <xliff:g id="NAME">%s</xliff:g> nova"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e contidos multimedia"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"A <xliff:g id="NAME">%s</xliff:g> está danada"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"A <xliff:g id="NAME">%s</xliff:g> está danada. Proba a formatala"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retirouse a <xliff:g id="NAME">%s</xliff:g> de forma inesperada"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva a <xliff:g id="NAME">%s</xliff:g> antes de retirala para evitar a perda de datos"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Retirouse a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Retirouse a <xliff:g id="NAME">%s</xliff:g>. Insire unha nova"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Aínda expulsando a <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Non retirar"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configuración"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Non se atoparon actividades que coincidan."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Dirixir saída multimedia"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite a unha aplicación dirixir a saída multimedia a outros dispositivos externos."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Almacenamento interno"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Tarxeta SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"almacenamento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Aviso de uso de datos"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Ata que desactives isto"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloquear interrupcións"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Non molestar"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tempo de inactividade"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noites pola semana"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fins de semana"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 0f35a35..34c2d69 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ऐप्स को आपके टेबलेट या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या गोपनीयता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"ऐप को आपके टीवी या सिम कार्ड पर संग्रहीत SMS संदेशों को पढ़ने की अनुमति देती है. इससे ऐप को सामग्री या गोपनीयता पर ध्यान दिए बिना, सभी SMS संदेशों को पढ़ने की अनुमति मिल जाती है."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ऐप्स को आपके फ़ोन या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या गोपनीयता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"अपने लेख संदेश (SMS या MMS) संपादित करें"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ऐप्स को आपके टेबलेट या सिम कार्ड में संग्रहीत SMS संदेशों में लिखने देता है. दुर्भावनापूर्ण ऐप्स आपके संदेशों को हटा सकते हैं."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"ऐप को आपके टीवी या सिम कार्ड पर संग्रहीत SMS संदेशों पर लिखने देती है. दुर्भावनापूर्ण ऐप्स आपके संदेशों को हटा सकते हैं."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ऐप्स को आपके फ़ोन या सिम कार्ड में संग्रहीत SMS संदेशों को लिखने देता है. दुर्भावनापूर्ण ऐप्स आपके संदेशों को हटा सकते हैं."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"लेख संदेश (WAP) प्राप्त करें"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"ऐप्स को WAP संदेशों को प्राप्त और संसाधित करने देता है. इस अनुमति में आपको भेजे गए संदेशों की निगरानी आपको दिखाए बिना करने और हटाने की क्षमता शामिल है."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"चल रहे ऐप्स पुनर्प्राप्त करें"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"आंशिक फ़िंगरप्रिंट की पहचान की गई. कृपया पुनः प्रयास करें."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"फ़िंगरप्रिंट संसाधित नहीं हो सका. कृपया पुन: प्रयास करें."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"फ़िंगरप्रिंट संवेदक गंदा है. कृपया साफ़ करें और पुनः प्रयास करें."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"अंगुली बहुत तेज़ी से चलाई गई है. कृपया पुनः प्रयास करें."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"अंगुली को धीरे चलाया गया. कृपया पुनः प्रयास करें."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फ़िंगरप्रिंट हार्डवेयर उपलब्ध नहीं है."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"फ़िंगरप्रिंट को संग्रहीत नहीं किया जा सका. कृपया कोई मौजूदा फ़िंगरप्रिंट निकालें."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"फ़िंगरप्रिंट का समय समाप्त हो गया. पुनः प्रयास करें."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"फ़िंगरप्रिंट क्रियान्वयन रोक दिया गया."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"बहुत अधिक प्रयास कर लिए गए हैं. बाद में पुन: प्रयास करें."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास करें."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"समन्वयन सेटिंग पढ़ें"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"ऐप्स को SD कार्ड पर लिखने देता है."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP कॉल करें/प्राप्त करें"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"ऐप्स को SIP कॉल करने और प्राप्त करने देती है."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"नए टेलिकॉम सिम कनेक्शन पंजीकृत करें"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"ऐप को नए टेलिकॉम सिम कनेक्शन पंजीकृत करने देती है."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"नए टेलिकॉम कनेक्शन पंजीकृत करें"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ऐप को नए टेलिकॉम कनेक्शन पंजीकृत करने देती है."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"टेलीकॉम कनेक्शन प्रबंधित करें"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"ऐप को टेलीकॉम कनेक्शन प्रबंधित करने देती है."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"इन-कॉल स्क्रीन से सहभागिता करें"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ऐप्स को यह नियंत्रित करने देती है कि उपयोगकर्ता को इन-कॉल स्क्रीन कब और कैसी दिखाई देती है."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"टेलीफ़ोनी सेवाओं के साथ सहभागिता करें"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"कॉल करने/प्राप्त करने के लिए ऐप्स को टेलीफ़ोनी सेवा के साथ सहभागिता करने दें."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"इन कॉल उपयोगकर्ता अनुभव प्रदान करना"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"ऐप्स को इन कॉल उपयोगकर्ता अनुभव लेने देती है."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ऐतिहासिक नेटवर्क उपयोग पढें"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"किसी ऐप्स को विशिष्ट नेटवर्क और ऐप्स के लिए ऐतिहासिक नेटवर्क उपयोग को पढ़ने देता है."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"नेटवर्क नीति प्रबंधित करें"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ऐप्स को नेटवर्क नीतियां प्रबंधित करने और ऐप्स-विशिष्ट नियमों को परिभाषित करने देता है."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"नेटवर्क उपयोग हिसाब बदलें"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ऐप्स को यह संशोधित करने देता है कि ऐप्स की तुलना में नेटवर्क उपयोग का मूल्यांकन कैसे किया जाता है. सामान्य ऐप्स द्वारा उपयोग करने के लिए नहीं."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"नोटिफिकेशन तक पहुंचें"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ऐप्स को नोटिफिकेशन को प्राप्त करने, जांच करने, और साफ़ करने देता है, जिनमें अन्य ऐप्स के द्वारा पोस्ट की गई सूचनाएं भी शामिल हैं."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"नोटिफिकेशन श्रवणकर्ता सेवा से जुड़ें"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"धारक को नोटिफिकेशन श्रवणकर्ता सेवा के शीर्ष स्तरीय इंटरफ़ेस से जुड़ने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होनी चाहिए."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"किसी स्थिति प्रदाता सेवा से आबद्ध हों"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"धारक को किसी स्थिति प्रदाता सेवा के शीर्ष-स्तर के इंटरफ़ेस से आबद्ध होने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"भावी सेवा से आबद्ध करें"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"धारक को किसी भावी सेवा के शीर्ष-स्तर इंटरफ़ेस से आबद्ध होने देता है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"वाहक के द्वारा उपलब्ध कराया गया कॉन्फ़िगरेशन ऐप्स प्रारंभ करें"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"धारक को वाहक के द्वारा उपलब्ध कराया गया कॉन्फ़िगरेशन ऐप्स प्रारंभ करने देता है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"नेटवर्क स्थितियों के अवलोकनों को सुनें"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"ऐप्स को नेटवर्क स्थितियों के अवलोकनों को सुनने देता है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"इनपुट डिवाइस कैलिब्रेशन बदलें"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"ऐप्स को टच स्क्रीन के कैलिब्रेशन पैरामीटर को बदलने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM प्रमाणपत्र एक्सेस करें"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"ऐप्लिकेशन को DRM प्रमाणपत्रों का प्रावधान और उपयोग करने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यकता नहीं होना चाहिए."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam स्थानान्तरण स्थिति प्राप्त करें"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"इस ऐप्लिकेशन को वर्तमान Android Beam स्थानान्तरणों के बारे में जानकारी प्राप्त करने देती है."</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM प्रमाणपत्रों को निकाल सकता है"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"एप्लिकेशन को DRM प्रमाणपत्रों को निकालने देता है. सामान्य ऐप्स के लिए कभी भी आवश्यकता नहीं होनी चाहिए."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"किसी वाहक संदेश सेवा से आबद्ध करें"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"धारक को किसी वाहक संदेश सेवा के शीर्ष-स्तरीय इंटरफ़ेस से आबद्ध होने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"पासवर्ड नियम सेट करें"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"स्क्रीन लॉक पासवर्ड तथा पिन की लंबाई और उसमें अनुमत वर्णों को नियंत्रित करें."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"स्क्रीन-अनलॉक के प्रयासों पर निगरानी रखें"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"अनलॉक करने के लिए मेनू दबाएं या आपातलकालीन कॉल करें."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"अनलॉक करने के लिए मेनू दबाएं."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"अनलॉक करने के लिए आकार आरेखित करें"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"आपातकाल"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"कॉल पर वापस लौटें"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"सही!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"फिर से प्रयास करें"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"उम्मीदवार"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> को तैयार किया जा रहा है"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटियों की जांच कर रहा है"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नए <xliff:g id="NAME">%s</xliff:g> का पता लगा"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फ़ोटो और मीडिया ट्रांसफर करने के लिए"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> क्षतिग्रस्त"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> क्षतिग्रस्त हो गया है; उसे पुनः फ़ॉर्मेट करने का प्रयास करें"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूप से निकाला गया"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा हानि से बचने के लिए <xliff:g id="NAME">%s</xliff:g> को निकालने से पहले अनमाउंट करें"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> निकाल दिया गया"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> निकाल दिया गया है; नया डालें"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> अभी भी निकाला जा रहा है…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"निकालें नहीं"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"सेट करें"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"निकालें"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"एक्सप्लोर करें"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"कोई मिलती-जुलती गतिविधि नहीं मिली."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"मीडिया आउटपुट को रूट करें"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"ऐप्स को मीडिया आउटपुट को अन्य बाहरी डिवाइस पर रूट करने देता है."</string>
@@ -1187,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"मोबाइल मेमोरी"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD कार्ड"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD कार्ड"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB डिस्क"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB डिस्क"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB मेमोरी"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"संपादित करें"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"डेटा उपयोग की चेतावनी"</string>
@@ -1449,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"जब तक आप इसे बंद नहीं कर देते"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त करें"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"बाधाओं को रोकें"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"परेशान ना करें"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"बंद रहने का समय"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"कार्यदिवसों की रात"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"सप्ताहांत"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index fcc57cb..9546035 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -271,10 +271,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Aplikaciji omogućuje čitanje SMS poruka pohranjenih na tabletnom računalu ili SIM kartici. To aplikaciji omogućuje čitanje svih SMS poruka, neovisno o sadržaju ili povjerljivosti."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Aplikaciji omogućuje čitanje SMS poruka pohranjenih na televizoru ili SIM kartici. To omogućuje aplikaciji čitanje svih SMS poruka, bez obzira na sadržaj ili povjerljivost."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Aplikaciji omogućuje čitanje SMS poruka pohranjenih na telefonu ili SIM kartici. To aplikaciji omogućuje čitanje svih SMS poruka, neovisno o sadržaju ili povjerljivosti."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"uređivanje tekstnih poruka (SMS ili MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Omogućuje aplikaciji pisanje u SMS poruke pohranjene na vašem tabletnom računalu ili SIM kartici. Zlonamjerne aplikacije mogu izbrisati vaše poruke."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Aplikaciji omogućuje pisanje u SMS poruke pohranjene na vašem televizoru ili SIM kartici. Zlonamjerne aplikacije mogu izbrisati vaše poruke."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Omogućuje aplikaciji pisanje u SMS poruke pohranjene na telefonu ili SIM kartici. Zlonamjerne aplikacije mogu izbrisati vaše poruke."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"primanje tekstnih poruka (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Aplikaciji omogućuje primanje i obradu WAP poruka. Ta dozvola uključuje mogućnost nadziranja ili brisanja vama poslanih poruka, a da vam ih ne prikaže."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"dohvaćanje pokrenutih aplikacija"</string>
@@ -430,21 +426,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Otkriven je djelomični otisak prsta. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Obrada otiska prsta nije uspjela. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzor otiska prsta nije čist. Očistite ga i pokušajte ponovo."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Prebrzo pomicanje prsta. Pokušajte ponovo."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Presporo pomicanje prsta. Pokušajte ponovo."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otisak prsta nije dostupan."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta nije pohranjen. Uklonite postojeći otisak prsta."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Isteklo je vrijeme čekanja za otisak prsta. Pokušajte ponovo."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja otiska prsta otkazana je."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Pokušajte ponovo."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"čitanje postavki sinkronizacije"</string>
@@ -469,6 +460,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Aplikaciji omogućuje pisanje na SD karticu."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"upućivanje/primanje SIP poziva"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Aplikacija može upućivati i primati SIP pozive."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registriranje novih telekomunikacijskih SIM veza"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Aplikaciji omogućuje registriranje novih telekomunikacijskih SIM veza."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registriranje novih telekomunikacijskih veza"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Aplikaciji omogućuje registriranje novih telekomunikacijskih veza."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"upravljanje telekomunikacijskim vezama"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Aplikaciji omogućuje upravljanje telekomunikacijskim vezama."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcija sa zaslonom tijekom poziva"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Omogućuje aplikaciji upravljanje vremenom i načinom na koji se korisniku prikazuje zaslon tijekom poziva."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interakcija s telefonskim uslugama"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Omogućuje aplikacijama interakciju s telefonskim uslugama za uspostavljanje i primanje poziva."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"pružanje korisničkog iskustva tijekom poziva"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Omogućuje aplikaciji pružanje korisničkog iskustva tijekom poziva."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"čitanje povijesti upotrebe mreže"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Aplikaciji omogućuje čitanje povijesti upotrebe mreže za određene mreže i aplikacije."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"Upravljanje mrežnim pravilima"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Aplikaciji omogućuje upravljanje mrežnim pravilima i određivanje pravila za aplikacije."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"izmjena evidencije mrežne upotrebe"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Omogućuje aplikaciji izmjenu načina upotrebe mreže u odnosu na aplikacije. Nije namijenjeno uobičajenim aplikacijama."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"pristup obavijestima"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Omogućuje aplikaciji dohvaćanje, pregledavanje i brisanje obavijesti, uključujući obavijesti drugih aplikacija."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"vezanje uz uslugu slušatelja obavijesti"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Nositelju omogućuje vezanje uz sučelje najviše razine usluge slušatelja obavijesti. Ne bi smjelo biti potrebno za uobičajene aplikacije."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"povezivanje s uslugom davatelja uvjeta"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Vlasniku omogućuje povezivanje sa sučeljem najviše razine usluge davatelja uvjeta. Nije potrebno za normalne aplikacije."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"vezanje na Dream"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Vlasniku omogućuje povezivanje sa sučeljem najviše razine za Dream. Ne bi trebalo biti potrebno za normalne aplikacije."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"pozovi operaterovu aplikaciju za konfiguraciju"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Dopušta nositelju pozivanje operaterove aplikacije za konfiguraciju. Ne bi smjelo biti potrebno za uobičajene aplikacije."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"praćenje motrenja mrežnih uvjeta"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Omogućuje aplikaciji praćenje motrenja mrežnih uvjeta. Ne bi trebalo biti potrebno za uobičajene aplikacije."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"promjena kalibracije uređaja za unos"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Omogućuje aplikaciji izmjenu parametara kalibracije dodirnog zaslona. Ne bi trebalo biti potrebno za uobičajene aplikacije."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"pristup DRM certifikatima"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Aplikaciji omogućuje pružanje i korištenje DRM certifikata. Ne bi trebalo biti potrebno za uobičajene aplikacije."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Primanje statusa prijenosa Android Beama"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Omogućuje aplikaciji primanje podataka o trenutačnim prijenosima Android Beama"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"uklanjanje DRM certifikata"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Omogućuje aplikaciji uklanjanje DRM certifikata. Ne bi trebalo biti potrebno za uobičajene aplikacije."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"povezivanje s uslugom mobilnog operatera za slanje poruka"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Omogućuje nositelju povezivanje sa sučeljem najviše razine usluge mobilnog operatera za slanje poruka. Ne bi trebalo biti potrebno za uobičajene aplikacije."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Postavi pravila zaporke"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Upravlja duljinom i znakovima koji su dopušteni u zaporkama i PIN-ovima zaključavanja zaslona."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Nadgledaj pokušaje otključavanja zaslona"</string>
@@ -629,8 +664,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Pritisnite Izbornik za otključavanje ili pozivanje hitnih službi."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pritisnite Izbornik za otključavanje."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Iscrtajte uzorak za otključavanje"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Hitno"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Uzvrati poziv"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Ispravno!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Pokušajte ponovo"</string>
@@ -1036,36 +1070,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidati"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema uređaja <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Traženje pogrešaka"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Otkriven je novi uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prijenos fotografija i medijskih datoteka"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Oštećen uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Uređaj <xliff:g id="NAME">%s</xliff:g> oštećen je; pokušajte ga ponovo formatirati"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Uređaj <xliff:g id="NAME">%s</xliff:g> iznenada je uklonjen"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Isključite uređaj <xliff:g id="NAME">%s</xliff:g> prije uklanjanja da ne biste izgubili podatke"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Uklonjen je uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Uklonjen je uređaj <xliff:g id="NAME">%s</xliff:g>; umetnite novi"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"I dalje se izbacuje <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne uklanjajte"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Postavljanje"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Izbaci"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Istražite"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nisu pronađene podudarne radnje."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Usmjeravanje medijskog izlaza"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Aplikaciji omogućuje usmjeravanje medijskog izlaza na druge vanjske uređaje."</string>
@@ -1196,6 +1215,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Interna pohrana"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD kartica"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB pohrana"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Uredi"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Upozorenje o upotrebi podataka"</string>
@@ -1463,7 +1488,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Dok ne isključite"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Sažmi"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokiranje prekida"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne ometaj"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prekid rada"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noći radnih dana"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Vikend"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 1c1edea..c01d2b5 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Lehetővé teszi az alkalmazás számára, hogy hozzáférjen a táblagépen vagy SIM kártyán tárolt SMS-ekhez. Így az alkalmazás hozzáférhet az összes SMS-hez, azok tartalmától és titkos jellegétől függetlenül."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Lehetővé teszi az alkalmazás számára a tévéjén vagy SIM kártyáján tárolt SMS-ek elolvasását. Ezzel az alkalmazás az összes SMS-t elolvashatja, tekintet nélkül tartalmukra vagy bizalmas jellegükre."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Lehetővé teszi az alkalmazás számára, hogy hozzáférjen a telefonon vagy SIM kártyán tárolt SMS-ekhez. Így az alkalmazás hozzáférhet az összes SMS-hez, azok tartalmától és titkos jellegétől függetlenül."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"szöveges üzenetek (SMS vagy MMS) szerkesztése"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Lehetővé teszi az alkalmazás számára, hogy írjon a táblagépen vagy a SIM kártyán lévő SMS-ekbe. A rosszindulatú alkalmazások törölhetik az üzeneteket."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Lehetővé teszi az alkalmazás számára, hogy felülírja a tévéjén vagy SIM kártyáján tárolt SMS-eket. A rosszindulatú alkalmazások ezáltal törölhetik az Ön üzeneteit."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Lehetővé teszi az alkalmazás számára, hogy írjon a telefonon vagy a SIM kártyán lévő SMS-ekbe. A rosszindulatú alkalmazások törölhetik az üzeneteket."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"szöveges üzenetek (WAP) fogadása"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Lehetővé teszi az alkalmazás számára, hogy WAP-üzeneteket fogadjon és dolgozzon fel. Ez azt is jelenti, hogy az alkalmazás megfigyelheti vagy törölheti a beérkező üzeneteket anélkül, hogy Ön látná azokat."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"futó alkalmazások lekérése"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"A rendszer az ujjlenyomatnak csak egy részletét érzékelte. Próbálkozzon újra."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nem sikerült feldolgozni az ujjlenyomatot. Próbálkozzon újra."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Az ujjlenyomat-olvasó koszos. Tisztítsa meg, majd próbálkozzon újra."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Túl hamar vette el az ujját. Próbálkozzon újra."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Túl lassan vette el az ujját. Próbálkozzon újra."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Az ujjlenyomathoz szükséges hardver nem érhető el."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Az ujjlenyomat nem tárolható. Távolítson el egy meglévő ujjlenyomatot."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Az ujjlenyomat-beolvasási műveletkor időtúllépés történt. Próbálkozzon újra."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Ujjlenyomattal kapcsolatos művelet megszakítva"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Túl sok próbálkozás. Próbálja újra később."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Próbálkozzon újra."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"szinkronizálási beállítások olvasása"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Lehetővé teszi az alkalmazás számára, hogy írjon az SD-kártyára."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-hívások indítása/fogadása"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP-hívások indításának és fogadásának engedélyezése az alkalmazás számára."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"új telekommunikációs SIM kapcsolatok regisztrálása"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Engedélyezi az alkalmazásnak új telekommunikációs SIM kapcsolatok regisztrálását."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"új telekommunikációs kapcsolatok regisztrálása"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Engedélyezi az alkalmazásnak új telekommunikációs kapcsolatok regisztrálását."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"telekommunikációs kapcsolatok kezelése"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Engedélyezi az alkalmazásnak a telekommunikációs kapcsolatok kezelését."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakció a hívás közbeni képernyővel"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Lehetővé teszi, hogy az alkalmazás felügyelje, a felhasználók mikor és hogyan láthatják a hívás közbeni képernyőt."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"együttműködés a telefonos szolgáltatásokkal"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Lehetővé teszi, hogy az alkalmazás a telefonos szolgáltatásokkal együttműködve hívásokat kezdeményezzen/fogadjon."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"hívás közbeni felhasználói élmény biztosítása"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Lehetővé teszi, hogy az alkalmazás hívás közbeni felhasználói élményt biztosítson."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"hálózathasználati előzmények beolvasása"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Lehetővé teszi az alkalmazás számára a hálózathasználati előzmények beolvasását adott hálózatok és alkalmazások esetében."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"hálózati házirend kezelése"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Lehetővé teszi az alkalmazás számára, hogy kezelje a hálózati irányelveket és meghatározza az alkalmazásspecifikus szabályokat."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"hálózathasználat elszámolásának módosítása"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Lehetővé teszi az alkalmazás számára annak módosítását, hogy a hálózathasználatot hogyan számolják el az alkalmazások esetében. Normál alkalmazások nem használhatják."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"hozzáférési értesítések"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Lehetővé teszi, hogy az alkalmazás értesítéseket kérdezzen le, vizsgáljon és tisztítson meg, beleértve az egyéb alkalmazások által közzétett értesítéseket is."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"csatlakozzon értesítésfigyelő szolgáltatáshoz"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Lehetővé teszi a használó számára, hogy csatlakozzon egy értesítésfigyelő szolgáltatás legfelső szintű felületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"csatlakozás egy feltételbiztosító szolgáltatáshoz"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Lehetővé teszi a használó számára, hogy csatlakozzon egy feltételbiztosító szolgáltatás legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"csatlakozás egy képernyővédő szolgáltatáshoz"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Lehetővé teszi a használó számára, hogy csatlakozzon egy képernyővédő szolgáltatás legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"a szolgáltatói konfigurációs alkalmazás hívása"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Lehetővé teszi a használó számára a szolgáltató által biztosított konfigurációs alkalmazás hívását. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"hálózati körülményekkel kapcsolatos észrevételek figyelemmel kísérése"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Lehetővé teszi egy alkalmazás számára, hogy figyelemmel kísérje a hálózati körülményekkel kapcsolatos észrevételeket. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"beviteli eszköz kalibrációjának módosítása"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Lehetővé teszi, hogy az alkalmazás módosítsa az érintőképernyő kalibrációs paramétereit. A normál alkalmazásoknál erre elvileg soha nincs szükség."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM-tanúsítványokhoz való hozzáférés"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Engedélyezi egy alkalmazás számára a DRM-tanúsítványokhoz való hozzáférést és azok használatát. Átlagos alkalmazásoknak erre nem lehet szükségük."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam-átviteli állapot fogadása"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Lehetővé teszi az alkalmazás számára a folyamatban lévő Android Beam-átvitelekről szóló információk fogadását"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM-tanúsítványok eltávolítása"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Lehetővé teszi, hogy az alkalmazás eltávolítsa a DRM-tanúsítványokat. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"kapcsolódás egy üzenetszolgáltatáshoz"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Lehetővé teszi, hogy a tulajdonos kapcsolódjon egy üzenetszolgáltatás legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Jelszavakkal kapcsolatos szabályok beállítása"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"A képernyőzár jelszavaiban és PIN kódjaiban engedélyezett karakterek és hosszúság vezérlése."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Képernyőzár-feloldási kísérletek figyelése"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"A feloldáshoz vagy segélyhívás kezdeményezéséhez nyomja meg a Menü gombot."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"A feloldáshoz nyomja meg a Menü gombot."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Rajzolja le a mintát a feloldáshoz"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Vészhívás"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Hívás folytatása"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Helyes!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Próbálja újra"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"jelöltek"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> előkészítése"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hibák keresése"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Új <xliff:g id="NAME">%s</xliff:g> észlelve"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotók és más médiatartalmak átviteléhez"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"A(z) <xliff:g id="NAME">%s</xliff:g> sérült"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"A(z) <xliff:g id="NAME">%s</xliff:g> sérült, próbálja meg újraformázni"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"A(z) <xliff:g id="NAME">%s</xliff:g> váratlanul eltávolítva"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Az adatvesztés elkerülése érdekében kezdje a(z) <xliff:g id="NAME">%s</xliff:g> leválasztásával, mielőtt eltávolítaná azt"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> eltávolítva"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"A(z) <xliff:g id="NAME">%s</xliff:g> el lett távolítva; helyezzen be egy másikat"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"A(z) <xliff:g id="NAME">%s</xliff:g> kiadása még folyamatban van…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne távolítsa el"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Beállítás"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Kiadás"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Felfedezés"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nincs megfelelő tevékenység."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Médiafájlok kimenetének irányítása"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Lehetővé teszi az alkalmazás számára, hogy más külső eszközökre irányítsa a médiafájlok lejátszását."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Belső tárhely"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kártya"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-tár"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Szerkesztés"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Adathasználati figyelmeztetés"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Amíg ki nem kapcsolja ezt"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Összecsukás"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Megszakítások tiltása"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne zavarjanak"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Inaktivitás"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Hétköznap esténként"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Hétvégente"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 3d48452..873e502 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Թույլ է տալիս հավելվածին կարդալ ձեր գրասալիկում կամ SIM քարտում պահված SMS հաղորդագրությունները: Սա թույլ է տալիս հավելվածին կարդալ բոլոր SMS հաղորդագրությունները` անկախ բովանդակությունից կամ գաղտնիությունից:"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Թույլ է տալիս հավելվածին կարդալ հեռուստացույցում կամ SIM քարտի վրա պահված SMS հաղորդագրությունները: Սա թույլ է տալիս հավելվածին կարդալ բոլոր SMS հաղորդագրությունները՝ անկախ բովանդակությունից կամ գաղտնիության աստիճանից:"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Թույլ է տալիս հավելվածին կարդալ ձեր հեռախոսում կամ SIM քարտում պահված SMS հաղորդագրությունները: Սա թույլ է տալիս հավելվածին կարդալ բոլոր SMS հաղորդագրությունները` անկախ բովանդակությունից կամ գաղտնիությունից:"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"խմբագրել ձեր տեքստային հաղորդագրությունները (SMS կամ MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Թույլ է տալիս հավելվածին պատասխանել ձեր գրասալիկում կամ SIM քարտում պահված SMS հաղորդագրություններին: Վնասարար հավելվածները կարող են ջնջել ձեր հաղորդագրությունները:"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Թույլ է տալիս հավելվածին գրել ձեր հեռուստացույցում կամ SIM քարտի վրա պահված SMS հաղորդագրություններում: Վնասարար հավելվածները կարող են ջնջել ձեր հաղորդագրությունները:"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Թույլ է տալիս հավելվածին պատասխանել ձեր հեռախոսում կամ SIM քարտում պահված SMS հաղորդագրություններին: Վնասարար հավելվածները կարող են ջնջել ձեր հաղորդագրությունները:"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ստանալ տեքստային հաղորդագրություններ (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Թույլ է տալիս հավելվածին ստանալ և գործարկել WAP հաղորդագրությունները: Այս թույլտվությունը ներառում է ձեզ ուղարկված հաղորդագրությունները հետևելու կամ ջնջելու կարողությունը` առանց ձեր տեսնելու:"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"առբերել աշխատող հավելվածները"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Մատնահետքը հայտնաբերվել է մասամբ: Փորձեք նորից:"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Չհաջողվեց մշակել մատնահետքը: Նորից փորձեք:"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Մատնահետքերի սենսորն աղտոտված է: Մաքրեք այն և փորձեք նորից:"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Շատ արագ անցկացրեցիք մատը: Փորձեք նորից:"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Մատը շարժեցիք շատ դանդաղ: Փորձեք նորից:"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Մատնահետքի սարքն անհասանելի է:"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Հնարավոր չէ պահել մատնահետքը: Հեռացրեք առկա մատնահետքը:"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Մատնահետքի գրանցման ժամանակը սպառվել է: Փորձեք նորից:"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Իսկորոշումը մատնահետքի միջոցով չեղարկվեց:"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Չափից շատ փորձ եք կատարել: Փորձեք նորից քիչ հետո:"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Փորձեք նորից:"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամեցման կարգավորումները"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Թույլ է տալիս հավելվածին գրել SD քարտի վրա:"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"կատարել կամ ստանալ SIP զանգեր"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ծրագրին թույլ է տալիս կատարել և ստանալ SIP զանգեր:"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"գրանցել նոր հեռահաղորդակցության SIM կապեր"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Հավելվածին թույլ է տալիս գրանցել հեռահաղորդակցության նոր SIM կապեր:"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"գրանցել նոր հեռահաղորդակցության կապեր"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Հավելվածին թույլ է տալիս գրանցել հեռահաղորդակցության նոր կապեր:"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"կառավարել հեռահաղորդակցության կապերը"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Հավելվածին թույլ է տալիս կառավարել հեռահաղորդակցության կապերը:"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"փոխազդել մուտքային զանգի էկրանին"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Թույլ է տալիս ծրագրին վերահսկել՝ երբ և ինչպես է օգտվողը տեսնում մուտքային զանգը էկրանին:"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"համագործակցել հեռախոսակապի ծառայությունների հետ"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Թույլատրում է ծրագրին համագործակցել հեռախոսակապի ծառայությունների հետ՝ զանգեր կատարելու/ստանալու համար:"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"Մատակարարել ներզանգային հնարավորություն:"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Թույլ է տալիս ծրագրին մատակարարել ներզանգային հնարավորություն:"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"կարդալ պատմական ցանցի օգտագործումը"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Թույլ է տալիս հավելվածին կարդալ հատուկ ցանցերի և հավելվածների համար ցանցի օգտագործման պատմությունը:"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"կառավարել ցանցի քաղաքականությունը"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Թույլ է տալիս հավելվածին կառավարել ցանցային քաղաքականությունը և սահմանել հավելվածի հատուկ կանոնները:"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"փոփոխել ցանցի օգտագործման հաշվառումը"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Թույլ է տալիս հավելվածին փոփոխել, թե ինչպես է ցանցի օգտագործումը հաշվարկվում հավելվածների համար: Սովորական հավելվածների օգտագործման համար չէ:"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"մուտք գործել ծանուցումներ"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Թույլ է տալիս հավելվածին առբերել, ուսումնասիրել և մաքրել ծանուցումներն, այդ թվում նաև այլ հավելվածների կողմից գրառվածները:"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"միանալ ծանուցումների ունկնդրիչ ծառայությանը"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Թույլ է տալիս սեփականատիրոջը միանալ ծանուցումները ունկնդրող ծառայության վերին մակարդակի ինտերֆեյսին: Սովորական հավելվածների համար երբևէ չպետք է անհրաժեշտ լինի:"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"կապվել պայմանների մատակարարի ծառայությանը"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Թույլ է տալիս սեփականատիրոջը միանալ պայմանների մատակարարների բազային միջերեսին: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"Միացում էկրանապահների ծառայությանը"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Թույլ է տալիս սեփականատիրոջը միանալ էկրանապահների ծառայության վերին մակարդակի միջերեսին: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"գործարկել օպերատորի կողմից տրամադրված կազմաձևման ծրագիրը"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Թույլ է տալիս սեփականատիրոջը գործարկել օպերատորի կողմից տրամադրված կազմաձևման ծրագիրը: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"լսել դիտարկումներ ցանցային պայմանների վերաբերյալ"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Հավելվածին թույլ է տալիս լսել դիտարկումներ ցանցային պայմանների վերաբերյալ: Սովորական հավելվածների համար երբեք պետք չի գալիս:"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"փոփոխել մուտքի սարքի չափաբերումը"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Թույլ է տալիս ծրագրին փոփոխել հպէկրանի չափաբերման կարգավորումները: Սովորական ծրագրերի համար երբեք պետք չի գալու:"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM հավաստագրերի մատչում"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Ծրագրին թույլ է տալիս տրամադրել և օգտագործել DRM վկայագրեր: Սովորական ծրագրերի համար երբեք պետք չի գալիս:"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Ստանալ Android Beam-ով փոխանցման կարգավիճակը"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Ծրագրին թույլ է տալիս ստանալ Android Beam-ով ընթացիկ փոխանցումների մասին տեղեկատվություն:"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"հեռացնել DRM վկայագրեր"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Ծրագրին թույլ է տալիս հեռացնել DRM վկայագրեր: Սովորական ծրագրերի համար երբեք պետք չի գալիս:"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"Կապակցում օպերատորի հաղորդագրությունների ծառայության հետ"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Թույլ է տալիս տիրոջը կապվել օպերատորի հաղորդագրությունների ծառայության վերին մակարդակի միջերեսի հետ: Սա երբեք չի պահանջվում սովորական հավելվածների համար:"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Սահմանել գաղտնաբառի կանոնները"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Կառավարել էկրանի ապակողպման գաղտնաբառերի և PIN կոդերի թույլատրելի երկարությունն ու գրանշանները:"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Վերահսկել էկրանի ապակողպման փորձերը"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Սեղմեք Ցանկ` ապակողպելու համար, կամ կատարեք արտակարգ իրավիճակների զանգ:"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Ապակողպելու համար սեղմեք Ցանկը:"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Հավաքեք սխեման` ապակողպելու համար"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Արտակարգ իրավիճակ"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Վերադառնալ զանգին"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Ճիշտ է:"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Կրկին փորձեք"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"թեկնածուները"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ի նախապատրաստում"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Սխալների ստուգում"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Հայտնաբերվել է նոր <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Լուսանկարներ և մեդիա ֆայլեր տեղափոխելու համար"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g>-ը վնասված է"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g>-ը վնասված է, փորձեք նորից ձևաչափել"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-ը հեռացվել է առանց անջատելու"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Տվյալները չկորցնելու համար անջատեք <xliff:g id="NAME">%s</xliff:g>-ը՝ մինչ հեռացնելը"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>-ը հեռացված է"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>-ը հեռացվել է, զետեղեք նորը"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>-ը դեռ անջատվում է…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Չհեռացնել"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Կարգավորում"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Անջատել"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Ուսումնասիրել"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Համընկնող գործունեություններ չգտնվեցին:"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Երթուղել մեդիա արտածումը"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Թույլ է տալիս հավելվածին մեդիա արտածումը երթուղել այլ արտաքին սարքեր:"</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Ներքին պահոց"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD քարտ"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB կրիչ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Խմբագրել"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Տվյալների օգտագործման նախազգուշացում"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Քանի դեռ չեք անջատել"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Թաքցնել"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Արգելափակել ընդհատումները"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Չխանգարել"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Անգործունության ժամանակը"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Երկուշաբթիից ուրբաթ"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Հանգստյան օրեր"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 4bdadda..230ebb1 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -219,7 +219,7 @@
<string name="user_owner_label" msgid="6465364741001216388">"Aplikasi pribadi"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"Kantor"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontak"</string>
- <string name="permgroupdesc_contacts" msgid="1437393511338346185">"mengakses dan memodifikasi kontak"</string>
+ <string name="permgroupdesc_contacts" msgid="1437393511338346185">"mengakses dan mengubah kontak"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasi"</string>
<string name="permgroupdesc_location" msgid="536889867433972794">"mengakses lokasi Anda"</string>
<string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Informasi sosial Anda"</string>
@@ -237,7 +237,7 @@
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="2429930670410559293">"menggunakan kamera perangkat"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telepon"</string>
- <string name="permgroupdesc_phone" msgid="2016641188146068700">"menggunakan teleponi perangkat"</string>
+ <string name="permgroupdesc_phone" msgid="2016641188146068700">"menggunakan sistem telefoni perangkat"</string>
<string name="permgrouplab_sensors" msgid="7416703484233940260">"Sensor"</string>
<string name="permgroupdesc_sensors" msgid="2987451839455524494">"mengakses sensor dan perangkat yang dapat dikenakan"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Mengambil konten jendela"</string>
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Memungkinkan aplikasi membaca pesan SMS yang tersimpan di tablet atau kartu SIM Anda. Izin ini memungkinkan aplikasi membaca semua pesan SMS, terlepas dari konten atau kerahasiaan."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Mengizinkan aplikasi untuk membaca pesan SMS yang disimpan di TV atau kartu SIM. Izin ini memungkinkan aplikasi untuk membaca semua pesan SMS, apa pun isinya atau meski bersifat rahasia."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Memungkinkan aplikasi membaca pesan SMS yang tersimpan di ponsel atau kartu SIM Anda. Izin ini memungkinkan aplikasi membaca semua pesan SMS, terlepas dari konten atau kerahasiaan."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"edit pesan teks (SMS atau MMS) Anda"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Mengizinkan apl menulis ke pesan SMS yang tersimpan di tablet atau kartu SIM. Apl berbahaya dapat menghapus pesan Anda."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Mengizinkan aplikasi untuk menulis ke pesan SMS yang disimpan di TV atau kartu SIM. Aplikasi yang berbahaya mungkin menghapus pesan."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Mengizinkan apl menulis ke pesan SMS yang tersimpan di ponsel atau kartu SIM. Apl berbahaya dapat menghapus pesan Anda."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"terima pesan teks (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Memungkinkan aplikasi menerima dan memproses pesan WAP. Izin ini mencakup kemampuan untuk memantau atau menghapus pesan yang dikirim kepada Anda tanpa menunjukkannya kepada Anda."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"mengambil apl yang berjalan"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Sebagian sidik jari terdeteksi. Coba lagi."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Tidak dapat memproses sidik jari. Coba lagi."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Sensor sidik jari kotor. Bersihkan dan coba lagi."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Jari digerakkan terlalu cepat. Coba lagi."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Jari digerakkan terlalu lambat. Coba lagi."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Perangkat keras sidik jari tidak tersedia."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sidik jari tidak dapat disimpan. Hapus sidik jari yang ada."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Waktu sidik jari habis. Coba lagi."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operasi sidik jari dibatalkan."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Terlalu banyak upaya. Coba lagi nanti."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Coba lagi."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"baca setelan sinkron"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Memungkinkan apl menulis ke kartu SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"lakukan/terima panggilan SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Izinkan aplikasi melakukan dan menerima panggilan SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"daftarkan sambungan SIM telekomunikasi baru"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Izinkan aplikasi untuk mendaftarkan sambungan SIM telekomunikasi baru."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"daftarkan sambungan telekomunikasi baru"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Izinkan aplikasi untuk mendaftarkan sambungan telekomunikasi baru."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"kelola sambungan telekomunikasi"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Mengizinkan aplikasi untuk mengelola sambungan telekomunikasi."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"berinteraksi dengan layar dalam panggilan"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Memungkinkan aplikasi mengontrol kapan dan bagaimana pengguna melihat layar dalam panggilan."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"berinteraksi dengan layanan telepon"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Memungkinkan aplikasi berinteraksi dengan layanan telepon untuk melakukan/menerima panggilan."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"memberikan pengalaman pengguna dalam panggilan"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Memungkinkan aplikasi memberikan pengalaman pengguna dalam panggilan."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"baca riwayat penggunaan jaringan"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Mengizinkan apl membaca penggunaan jaringan historis untuk apl dan jaringan tertentu."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"kelola kebijakan jaringan"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Mengizinkan apl mengelola kebijakan jaringan dan menentukan peraturan khusus apl."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"mengubah penghitungan penggunaan jaringan"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Mengizinkan apl memodifikasi cara penggunaan jaringan diperhitungkan terhadap apl. Tidak untuk digunakan oleh apl normal."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"mengakses pemberitahuan"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Mengizinkan aplikasi mengambil, memeriksa, dan menghapus pemberitahuan, termasuk pemberitahuan yang diposkan oleh aplikasi lain."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"mengikat layanan pendengar pemberitahuan"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Memungkinkan pemegang mengikat antarmuka tingkat teratas dari suatu layanan pendengar pemberitahuan. Tidak pernah diperlukan oleh aplikasi normal."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"mengikat ke layanan penyedia ketentuan"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Memungkinkan pemegang mengikat antarmuka tingkat tinggi dari layanan penyedia ketentuan. Tidak pernah diperlukan oleh aplikasi normal."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"mengikat ke layanan lamunan"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Memungkinkan pemegang mengikat antarmuka tingkat tinggi dari suatu layanan lamunan. Tidak pernah diperlukan oleh aplikasi normal."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"memanggil aplikasi konfigurasi yang disediakan operator"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Memungkinkan pemegang meminta aplikasi konfigurasi yang disediakan operator. Tidak pernah diperlukan aplikasi normal."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"mendengar untuk observasi kondisi jaringan"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Memungkinkan aplikasi mendengar untuk observasi kondisi jaringan. Tidak pernah dibutuhkan oleh aplikasi normal."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"mengubah kalibrasi perangkat masukan"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Memungkinkan aplikasi mengubah parameter kalibrasi layar sentuh. Tidak diperlukan oleh aplikasi normal."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"mengakses sertifikat DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Memungkinkan aplikasi menyediakan dan menggunakan sertifikat DRM. Tidak pernah dibutuhkan untuk aplikasi normal."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Menerima status transfer Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Memungkinkan aplikasi ini menerima informasi tentang transfer Android Beam saat ini"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"membuang serifikat DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Memungkinkan aplikasi membuang sertifikat DRM. Tidak pernah dibutuhkan untuk aplikasi normal."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"ikat ke layanan perpesanan operator"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Mengizinkan operator untuk mengikat ke antarmuka tingkat tinggi dari suatu layanan perpesanan operator. Fitur ini seharusnya tidak diperlukan oleh aplikasi normal."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Setel aturan sandi"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Mengontrol panjang dan karakter yang diizinkan dalam sandi dan PIN kunci layar."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Upaya pembukaan kunci layar monitor"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tekan Menu untuk membuka atau melakukan panggilan darurat."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tekan Menu untuk membuka."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Buat pola untuk membuka"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Darurat"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Kembali ke panggilan"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Perbaiki!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Coba lagi"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"calon"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyiapkan <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Memeriksa kesalahan"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> baru terdeteksi"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Untuk mentransfer foto dan media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> rusak"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> rusak; coba format ulang"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> tiba-tiba dicabut"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Lingsirkan <xliff:g id="NAME">%s</xliff:g> sebelum mencabut agar data tidak hilang"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> dicabut"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> dicabut; colokkan yang baru"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Masih mengeluarkan <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Jangan cabut"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Siapkan"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Keluarkan"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Jelajahi"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Tidak ditemukan aktivitas yang sesuai."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Menentukan rute keluaran media"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Memungkinkan aplikasi menentukan rute keluaran media ke perangkat eksternal lainnya."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Penyimpanan internal"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Kartu SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Penyimpanan USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Peringatan penggunaan data"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Hingga Anda menonaktifkan ini"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Ciutkan"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokir gangguan"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Jangan ganggu"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Waktu non-operasional"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Malam hari kerja"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Akhir pekan"</string>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 66bde2c..be753e7 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Leyfir forriti að lesa SMS-skilaboð sem vistuð eru í spjaldtölvunni eða á SIM-kortinu. Þetta gerir forritinu kleift að lesa öll SMS-skilaboð burtséð frá innihaldi eða trúnaðarstigi."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Leyfir forriti að lesa SMS-skilaboð sem vistuð eru í sjónvarpinu eða á SIM-kortinu. Þetta gerir forritinu kleift að lesa öll SMS-skilaboð burtséð frá innihaldi eða trúnaðarstigi."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Leyfir forriti að lesa SMS-skilaboð sem vistuð eru í símanum eða á SIM-kortinu. Þetta gerir forritinu kleift að lesa öll SMS-skilaboð burtséð frá innihaldi eða trúnaðarstigi."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"breyta textaskilaboðum (SMS eða MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Leyfir forriti að skrifa inn í SMS-skilaboð sem vistuð eru í spjaldtölvunni eða á SIM-kortinu. Spilliforrit geta eytt skilaboðunum þínum."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Leyfir forriti að skrifa inn í SMS-skilaboð sem vistuð eru í sjónvarpinu eða á SIM-kortinu. Spilliforrit geta eytt skilaboðunum þínum."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Leyfir forriti að skrifa inn í SMS-skilaboð sem vistuð eru í símanum eða á SIM-kortinu. Spilliforrit geta eytt skilaboðunum þínum."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"taka á móti textaskilaboðum (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Leyfir forriti að taka á móti og vinna úr WAP-skilaboðum. Þessi heimild felur í sér möguleikann á að fylgjast með eða eyða skilaboðum sem þér eru send án þess að birta þér þau."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"sækja forrit í gangi"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Hluti fingrafars greindist. Reyndu aftur."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Ekki var hægt að vinna úr fingrafarinu. Reyndu aftur."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingrafaraskynjarinn er óhreinn. Hreinsaðu hann og reyndu aftur."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Fingurinn hreyfðist of hratt. Reyndu aftur."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Fingurinn hreyfðist of hægt. Reyndu aftur."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingrafarsvélbúnaður ekki til staðar."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ekki er hægt að vista fingrafarið. Fjarlægðu eitthvert af fingraförunum sem fyrir eru."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Hætt við fingrafarsaðgerð."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Of margar tilraunir. Reyndu aftur síðar."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Reyndu aftur."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lesa samstillingar"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Leyfir forriti að skrifa á SD-kortið."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"hringja/svara SIP-símtölum"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Leyfir forritinu að hringja og svara SIP-símtölum."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"skrá nýjar símatengingar fyrir SIM-kort"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Leyfir forritinu að skrá nýjar símatengingar fyrir SIM-kort."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"skrá nýjar símatengingar"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Leyfir forritinu að skrá nýjar símatengingar."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"stjórna símatengingum"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Leyfir forritinu að stjórna símatengingum."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"eiga samskipti við símtalsskjá"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Leyfir forriti að stjórna því hvenær og hvernig notandi sér símtalsskjá."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"hafa samskipti við símafyrirtæki"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Leyfir forritinu að hafa samskipti við símafyrirtæki til að hringja/taka á móti símtölum."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"bjóða upp á notendaviðmót innan símtals"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Leyfir forriti að birta notendaviðmót innan símtals."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lesa söguleg gögn um netnotkun"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Leyfir forriti að lesa söguleg gögn um netnotkun fyrir tiltekin net og forrit."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"hafa umsjón með netstefnu"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Leyfir forriti að vinna með netstefnur og tilgreina sérstakar reglur fyrir forritið."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"breyta skráningu netnotkunar"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Leyfir forriti að breyta því hvernig netnotkun forrita er reiknuð. Venjuleg forrit eiga ekki að nota þetta."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"aðgangur að tilkynningum"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Leyfir forriti að sækja, skoða og hreinsa tilkynningar, þ. á m. þær sem önnur forrit birta."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bindast hlustunarþjónustu tilkynninga"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Leyfir forriti að bindast efsta viðmótslagi hlustunarþjónustu tilkynninga. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"bindast þjónustu skilyrðaveitu"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Leyfir handhafa að bindast efsta viðmótslagi skilyrðaveitu. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"bindast skjávaraþjónustu"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Leyfir handhafa að bindast efsta viðmótslagi skjávaraþjónustu. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ræsa grunnstillingarforrit frá símafyrirtæki"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Leyfir forriti að ræsa grunnstillingarforrit frá símafyrirtæki. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"fylgjast með breytingum á netskilyrðum"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Leyfir forriti að hlusta eftir breytingum á netskilyrðum. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"breyta kvörðun inntakstækis"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Leyfir forriti að breyta kvörðunarbreytum snertiskjásins. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"aðgangur að DRM-vottorðum"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Leyfir forriti að úthluta og nota DRM-vottorð. Ætti aldrei að þurfa fyrir venjuleg forrit."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Fá flutningsstöðu Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Leyfir þessu forriti að fá upplýsingar um flutning sem fram fer með Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"fjarlægja DRM-vottorð"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Leyfir forriti að fjarlægja DRM-vottorð. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"bindast skilaboðaþjónustu símafyrirtækis"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Leyfir forriti að bindast efsta viðmótslagi skilaboðaþjónustu símafyrirtækis. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Setja reglur um aðgangsorð"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Stjórna lengd og fjölda stafa í aðgangsorðum og PIN-númerum skjáláss."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Fylgjast með tilraunum til að taka skjáinn úr lás"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Ýttu á valmyndartakkann til að taka úr lás eða hringja neyðarsímtal."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Ýttu á valmyndartakkann til að taka úr lás."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Teiknaðu mynstur til að taka úr lás"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Neyðarsímtal"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Aftur í símtal"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Rétt!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Reyndu aftur"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"möguleikar"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Undirbýr <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Leitar að villum"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nýtt <xliff:g id="NAME">%s</xliff:g> fannst"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til að flytja myndir og aðrar skrár"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> skemmt"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> er skemmt; prófaðu að forsníða það"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> fjarlægt án fyrirvara"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Aftengdu <xliff:g id="NAME">%s</xliff:g> áður en þú fjarlægir það til að koma í veg fyrir gagnatap"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> fjarlægt"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> fjarlægt; settu nýtt í"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Enn að fjarlægja <xliff:g id="NAME">%s</xliff:g>..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ekki fjarlægja"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Uppsetning"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Fjarlægja"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Kanna"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Engar aðgerðir með samsvörun fundust."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Beina margmiðlunarúttaki"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Leyfir forriti að beina margmiðlunarúttaki til annarra ytri tækja."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Innbyggð geymsla"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kort"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-geymsla"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Breyta"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Viðvörun vegna gagnanotkunar"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Þar til þú slekkur á þessu"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Minnka"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Loka á truflanir"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ónáðið ekki"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Hvíldartími"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Virk kvöld"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Helgar"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 31e8f82..24b3bd6 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Consente all\'applicazione di leggere i messaggi SMS memorizzati sul tablet o sulla scheda SIM. Ciò consente all\'applicazione di leggere tutti i messaggi SMS, indipendentemente dai contenuti o dal livello di riservatezza."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Consente all\'app di leggere gli SMS memorizzati alla TV o nella scheda SIM. L\'app può leggere tutti gli SMS, a prescindere dai contenuti o dalla riservatezza."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Consente all\'applicazione di leggere i messaggi SMS memorizzati sul telefono o sulla scheda SIM. Ciò consente all\'applicazione di leggere tutti i messaggi SMS, indipendentemente dai contenuti o dal livello di riservatezza."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"modifica dei messaggi di testo (SMS o MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Consente all\'applicazione la scrittura nei messaggi SMS memorizzati sul tablet o sulla scheda SIM. Le applicazioni dannose potrebbero cancellare i tuoi messaggi."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Consente all\'app di scrivere negli SMS memorizzati alla TV o nella scheda SIM. Le app dannose potrebbero eliminare i messaggi."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Consente all\'applicazione la scrittura nei messaggi SMS memorizzati sul telefono o sulla scheda SIM. Le applicazioni dannose potrebbero cancellare i tuoi messaggi."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ricezione messaggi di testo (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Consente all\'applicazione di ricevere ed elaborare messaggi WAP. Questa autorizzazione include la facoltà di monitorare o eliminare i messaggi che ti vengono inviati senza mostrarteli."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"recupero applicazioni in esecuzione"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Rilevata impronta digitale parziale. Riprova."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Impossibile elaborare l\'impronta digitale. Riprova."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Il sensore di impronte digitali è sporco. Puliscilo e riprova."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Movimento del dito troppo rapido. Riprova."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Movimento del dito troppo lento. Riprova."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware per l\'impronta digitale non disponibile."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossibile memorizzare l\'impronta digitale. Rimuovi un\'impronta esistente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timeout impronta digitale. Riprova."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operazione associata all\'impronta digitale annullata."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Troppi tentativi. Riprova più tardi."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Riprova."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lettura impostazioni di sincronizz."</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Consente all\'applicazione di scrivere sulla scheda SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"fare/ricevere chiamate SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Consente all\'app di effettuare e ricevere chiamate SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrazione di nuove connessioni SIM di telecomunicazione"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Consente all\'app di registrare nuove connessioni SIM di telecomunicazione."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrazione di nuove connessioni di telecomunicazione"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Consente all\'app di registrare nuove connessioni di telecomunicazione."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"gestisci connessioni di telecomunicazione"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Consente all\'app di gestire connessioni di telecomunicazione."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interazione con lo schermo durante una chiamata"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Consente all\'app di stabilire quando e come l\'utente vede lo schermo durante una chiamata."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interagire con i servizi di telefonia"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Consente all\'app di interagire con i servizi di telefonia per effettuare/ricevere chiamate."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"offerta di un\'esperienza utente durante le chiamate"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Consente all\'app di offrire un\'esperienza utente durante le chiamate."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lettura dati storici di utilizzo della rete"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Consente all\'applicazione di leggere dati storici di utilizzo della rete per reti e applicazioni specifiche."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gestione norme rete"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Consente all\'applicazione di gestire le norme di rete e definire le regole specifiche delle applicazioni."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modifica calcolo dell\'utilizzo della rete"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Consente all\'applicazione di modificare il calcolo dell\'utilizzo della rete tra le applicazioni. Da non usare per normali applicazioni."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"accesso a notifiche"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Consente all\'app di recuperare, esaminare e cancellare notifiche, comprese quelle pubblicate da altre app."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"vincolo a un servizio listener di notifica"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Consente al titolare di vincolarsi all\'interfaccia di primo livello di un servizio listener di notifica. Non dovrebbe mai essere necessaria per le normali applicazioni."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"collegamento a un servizio provider di condizioni"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un servizio provider di condizioni. Non dovrebbe essere mai necessaria per le normali app."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"associa a servizio dream"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Consente all\'utente di associare l\'interfaccia di primo livello di un servizio dream. Questa impostazione non è mai necessaria per le app normali."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"richiamo dell\'app di configurazione operatore-provider"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Consente al titolare di richiamare l\'app di configurazione dell\'operatore-provider. Non dovrebbe essere mai necessaria per le normali applicazioni."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ascolto delle osservazioni sulle condizioni di rete"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Consente a un\'applicazione di ascoltare le osservazioni sulle condizioni di rete. Da non utilizzare mai con app normali."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"modifica calibrazione del dispositivo di immissione"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Consente all\'app di modificare i parametri di calibrazione del touch screen. Questa opzione non deve essere utilizzata per le app normali."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"accesso a certificati DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Consente a un\'app di fornire e utilizzare ceritificati DRM. Questa opzione non deve essere utilizzata per app normali."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Ricevi lo stato dei trasferimenti Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Consente all\'applicazione di ricevere informazioni sugli attuali trasferimenti Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"rimozione di certificati DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Consente a un\'applicazione di rimuovere certificati DRM. Non dovrebbe mai essere necessaria per le normali applicazioni."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"associazione a un servizio di messaggi dell\'operatore"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Consente l\'associazione di un servizio di messaggi dell\'operatore all\'interfaccia principale. Non dovrebbe mai essere necessaria per le normali applicazioni."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Impostazione regole password"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Controlla la lunghezza e i caratteri ammessi nelle password e nei PIN del blocco schermo."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Controllo tentativi di sblocco dello schermo"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Premi Menu per sbloccare o effettuare chiamate di emergenza."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Premi Menu per sbloccare."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Traccia la sequenza di sblocco"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Emergenza"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Torna a chiamata"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Corretta."</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Riprova"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidati"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparazione della <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ricerca errori"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nuova <xliff:g id="NAME">%s</xliff:g> rilevata"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per il trasferimento di foto e contenuti multimediali"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> danneggiata"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"La <xliff:g id="NAME">%s</xliff:g> è danneggiata. Prova a riformattarla."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Rimozione imprevista della <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Per evitare di perdere dati, smonta la <xliff:g id="NAME">%s</xliff:g> prima di rimuoverla"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> rimossa"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> rimossa; inseriscine un\'altra"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Espulsione <xliff:g id="NAME">%s</xliff:g> ancora in corso…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Non rimuovere"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configura"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Espelli"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Scopri"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nessuna attività corrispondente trovata."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Indirizzamento uscita media"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Consente a un\'applicazione di indirizzare l\'uscita di media verso altri dispositivi esterni."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Memoria interna"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Scheda SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Archivio USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Modifica"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Avviso sull\'utilizzo dei dati"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Fino alla disattivazione"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Comprimi"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blocca interruzioni"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Non disturbare"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tempo di inattività"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Sere giorni feriali"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fine settimana"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 4bfc804..1d67b49 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -272,10 +272,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"מאפשר לאפליקציה לקרוא הודעות SMS המאוחסנות בטאבלט או בכרטיס ה-SIM. דבר זה מתיר לאפליקציה לקרוא את כל הודעות ה-SMS, ללא התחשבות בתוכן או בסודיות."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"מאפשרת לאפליקציה לקרוא הודעות SMS השמורות בטלוויזיה או בכרטיס ה-SIM. כך מתאפשר לאפליקציה לקרוא את כל הודעות ה-SMS, בלי קשר לתוכן או לסודיות ההודעות."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"מאפשר לאפליקציה לקרוא הודעות SMS המאוחסנות בטלפון או בכרטיס ה-SIM. דבר זה מתיר לאפליקציה לקרוא את כל הודעות ה-SMS, ללא התחשבות בתוכן או בסודיות."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"עריכת הודעות הטקסט שלך (SMS או MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"מאפשר לאפליקציה לכתוב להודעות SMS המאוחסנות בטאבלט או בכרטיס ה-SIM שלך. אפליקציות זדוניות עלולות למחוק את ההודעות שלך."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"מאפשרת לאפליקציה לכתוב להודעות SMS השמורות בטלוויזיה או בכרטיס ה-SIM. אפליקציות זדוניות עלולות למחוק את ההודעות שלך."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"מאפשר לאפליקציה לכתוב להודעות SMS המאוחסנות בטלפון או בכרטיס ה-SIM שלך. אפליקציות זדוניות עלולות למחוק את ההודעות שלך."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"קבלת הודעות טקסט (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"מאפשר לאפליקציה לקבל ולעבד הודעות WAP. אישור זה כולל את היכולת לעקוב אחר הודעות שנשלחו אליך ולמחוק אותן מבלי להציג לך אותן."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"אחזור אפליקציות פעילות"</string>
@@ -431,21 +427,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"זוהתה טביעת אצבע חלקית. נסה שוב."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"לא ניתן היה לעבד את טביעת האצבע. נסה שוב."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"החיישן של טביעות האצבעות מלוכלך. נקה אותו ונסה שוב."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"הזזת את האצבע מהר מדי. נסה שוב."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"האצבע זזה לאט מדי, נסה שוב."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"החומרה בשביל טביעת אצבע אינה זמינה."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"לא ניתן לאחסן טביעת אצבע. הסר טביעת אצבע קיימת."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"חלף הזמן הקצוב לטביעת אצבע. נסה שוב."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"פעולת טביעת האצבע בוטלה."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"יותר מדי ניסיונות. נסה שוב מאוחר יותר."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"נסה שוב."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"קרא את הגדרות הסינכרון"</string>
@@ -470,6 +461,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"מאפשר לאפליקציה לכתוב לכרטיס ה-SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"ביצוע/קבלה של שיחות SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"אפשר לאפליקציה לבצע ולקבל שיחות SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"רשום חיבורי Telecom SIM חדשים"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"מאפשר לאפליקציה לרשום חיבורי Telecom SIM חדשים."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"רשום חיבורי Telecom חדשים"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"מאפשר לאפליקציה לרשום חיבורי תקשורת חדשים."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"ניהול חיבורי תקשורת"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"מאפשר לאפליקציה לנהל חיבורי תקשורת."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"צור אינטראקציה עם מסך שיחה נכנסת"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"מאפשר לאפליקציה לקבוע מתי ואיך המשתמש יראה את מסך השיחה הנכנסת."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"צור אינטראקציה עם שירותי טלפוניה"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"מאפשר לאפליקציה ליצור אינטראקציה עם שירותי טלפוניה כדי לבצע/לקבל שיחות."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ספק חווית משתמש של שיחה נכנסת"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"מאפשר לאפליקציה לספק חוויית משתמש של שיחה נכנסת."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"קריאת נתוני שימוש היסטוריים ברשת"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"מאפשר לאפליקציה לקרוא נתוני שימוש היסטוריים ברשת עבור רשתות ואפליקציות ספציפיות."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"נהל מדיניות רשת"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"מאפשר לאפליקציה לנהל מדיניות הרשת להגדיר כללים ספציפיים-לאפליקציה."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"שנה ניהול חשבונות של שימוש ברשת"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"הרשאה זו מאפשרת לאפליקציה לשנות את אופן החישוב של נתוני שימוש ברשת מול כל אפליקציה. לא מיועד לשימוש באפליקציות רגילות."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"גישה להתראות"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"מאפשר לאפליקציה לאחזר, לבדוק ולמחוק התראות, כולל כאלה שפורסמו על ידי אפליקציות אחרות."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"איגוד לשירות של מאזין להתראות"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"הרשאה זו מאפשרת למשתמש לבצע איגוד לממשק הרמה העליונה של שירות מאזין להתראות. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילים."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"איגוד לשירות ספק תנאי"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות ספק תנאי. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"איגוד לשירות Dream"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"מאפשרת לבעלים לבצע איגוד לממשק הרמה העליונה של שירות Dream. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילות."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"הפעלה של אפליקציית תצורה שסופקה על ידי ספק"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ההרשאה הזו מאפשרת לבעלים להפעיל את אפליקציית התצורה שסופקה על ידי ספק. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"קליטת מעקב אחר תנאי רשת"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"מאפשרת לאפליקציה לקלוט מעקב אחר תנאי רשת. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"שינוי הכיול של מכשיר קלט"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"מאפשרת לאפליקציה לשנות את פרמטרי הכיול של מסך המגע. לעולם לא אמורה להיות נחוצה לאפליקציות רגילות."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"גישה אל אישורי DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"מאפשרת לאפליקציה לנהל תצורה של אישורי DRM ולהשתמש בהם. לעולם לא אמורה להיות נחוצה עבור אפליקציה רגילה."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"קבלת סטטוס העברה של Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"מאפשר לאפליקציה הזו לקבל מידע על העברות Android Beam נוכחיות"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"הסרת אישורי DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"הרשאה זו מאפשרת לאפליקציה להסיר אישורי DRM. באפליקציות רגילות אף פעם לא אמור להיות בה צורך."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"איגוד לשירות העברת הודעות של ספק"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות העברת הודעות של ספק. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"הגדר כללי סיסמה"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי PIN של מסך הנעילה."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"עקוב אחר ניסיונות לביטול נעילת מסך"</string>
@@ -630,8 +665,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"לחץ על \'תפריט\' כדי לבטל את הנעילה או כדי לבצע שיחת חירום."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"לחץ על \'תפריט\' כדי לבטל את הנעילה."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"שרטט קו לביטול נעילת המסך"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"חירום"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"חזור לשיחה"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"נכון!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"נסה שוב"</string>
@@ -1043,36 +1077,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"מועמדים"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"הכנת <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"בודק אם יש שגיאות"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"זוהה <xliff:g id="NAME">%s</xliff:g> חדש"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"להעברת תמונות ומדיה"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> פגום"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> פגום. נסה לקבוע לו פורמט מחדש"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> הוסר באופן בלתי צפוי"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"בטל טעינה של <xliff:g id="NAME">%s</xliff:g> לפני הסרתו כדי למנוע אובדן נתונים"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> הוסר"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> הוסר. הכנס מדיה חדשה"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"הוצאת <xliff:g id="NAME">%s</xliff:g> נמשכת..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"אל תסיר"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"הגדר"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"הוצא"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"גלה"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"לא נמצאו פעילויות תואמות."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"ניתוב פלט מדיה"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"מאפשר לאפליקציה לנתב פלט מדיה למכשירים חיצוניים אחרים."</string>
@@ -1204,6 +1223,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"אחסון פנימי"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"כרטיס SD"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"כרטיס SD של <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"כונן USB"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"כונן USB של <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"אחסון USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ערוך"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"אזהרת שימוש בנתונים"</string>
@@ -1476,7 +1498,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"עד שתכבה"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"כווץ"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"חסימת הפרעות"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"נא לא להפריע"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"זמן השבתה"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"לילות בימי חול"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"סופי שבוע"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 98dc866..770ba69 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"タブレットまたはSIMカードに保存されているSMSメッセージの読み取りをアプリに許可します。これにより、すべてのSMSメッセージをコンテンツや機密性に関係なくアプリから読み取ることができるようになります。"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"テレビまたはSIMカードに保存されているSMSメッセージの読み取りをアプリに許可します。これにより、すべてのSMSメッセージをコンテンツや機密性に関係なくアプリから読み取ることができるようになります。"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"携帯端末またはSIMカードに保存されているSMSメッセージの読み取りをアプリに許可します。これにより、すべてのSMSメッセージをコンテンツや機密性に関係なくアプリから読み取ることができるようになります。"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"テキストメッセージ(SMSまたはMMS)の編集"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"タブレットやSIMカードに保存されているSMSメッセージへの書き込みをアプリに許可します。この許可を悪意のあるアプリに利用されると、メッセージが削除される恐れがあります。"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"テレビやSIMカードに保存されているSMSメッセージへの書き込みをアプリに許可します。この許可を悪意のあるアプリに利用されると、メッセージが削除される恐れがあります。"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"携帯端末やSIMカードに保存されているSMSメッセージへの書き込みをアプリに許可します。この許可を悪意のあるアプリに利用されると、メッセージが削除される恐れがあります。"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"テキストメッセージ(WAP)の受信"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAPメッセージの受信と処理をアプリに許可します。これにより、アプリが端末に届いたメッセージを表示することなく監視または削除できるようになります。"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"実行中のアプリの取得"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"指紋を一部しか検出できませんでした。もう一度お試しください。"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"指紋を処理できませんでした。もう一度お試しください。"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指紋センサーに汚れがあります。汚れを落としてもう一度お試しください。"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"指の動きが速すぎました。もう一度お試しください。"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"指の動きが遅すぎました。もう一度お試しください。"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋ハードウェアは使用できません。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋を保存できません。既存の指紋を削除してください。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋の操作をキャンセルしました。"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"所定の回数以上間違えました。しばらくしてからもう一度お試しください。"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"もう一度お試しください。"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"同期設定の読み取り"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SDカードへの書き込みをアプリに許可します。"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP通話の発着信"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP通話の発着信をアプリに許可します。"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"新しい通信SIM接続の登録"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"アプリに新しい通信SIM接続の登録を許可します。"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"新しい通信接続の登録"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"新しい通信接続の登録をアプリに許可します。"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"通信接続の管理"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"通信接続の管理をアプリに許可します。"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"通話画面とのインタラクション"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"通話画面をユーザーに表示するタイミングと方法の制御をアプリに許可します。"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"電話サービスとの通信"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"受発信のためアプリが電話サービスと通信することを許可する。"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"通話中のユーザーエクスペリエンスの提供"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"通話中のユーザーエクスペリエンスの提供をアプリに許可します。"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ネットワーク使用履歴の読み取り"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"特定のネットワークやアプリに関するネットワーク使用履歴の読み取りをアプリに許可します。"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ネットワークポリシーの管理"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ネットワークポリシーを管理しアプリ固有のルールを定義することをアプリに許可します。"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ネットワークの課金の変更"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"アプリに対するネットワーク利用の計算方法を変更することをアプリに許可します。通常のアプリでは使用しません。"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"通知にアクセス"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"通知(他のアプリから投稿されたものも含む)を取得、調査、クリアすることをアプリに許可します。"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"通知リスナーサービスにバインド"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"通知リスナーサービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"コンディションプロバイダサービスへのバインド"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"コンディションプロバイダサービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"ドリームサービスにバインド"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"ドリームサービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"携帯通信会社が提供する設定アプリの呼び出し"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"携帯通信会社が提供する設定アプリを呼び出すことを所有者に許可します。通常のアプリでは不要です。"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ネットワーク状況監視のためのリッスン"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"ネットワーク状況を監視するためリッスンすることをアプリに許可します。通常のアプリで必要になることはありません。"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"入力デバイスの調整を変更"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"タッチスクリーンの調整パラメータの変更をアプリに許可します。通常のアプリでは必要ありません。"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM証明書へのアクセス権"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM証明書のプロビジョニングと使用をアプリに許可します。通常のアプリでは不要です。"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Androidビーム転送のステータスを受信"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"現在のAndroidビーム転送に関する情報を受信することをこのアプリに許可します。"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM証明書の削除"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM証明書の削除をアプリに許可します。通常のアプリでは不要です。"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"携帯通信会社のSMSサービスへのバインド"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"携帯通信会社のSMSサービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"パスワードルールの設定"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"画面ロックのパスワードとPINの長さと使用できる文字を制御します。"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"画面ロック解除試行の監視"</string>
@@ -1028,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"候補"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>を準備中"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"エラーを確認中"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"新しい<xliff:g id="NAME">%s</xliff:g>が検出されました"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"写真などのメディアを転送するため"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g>が破損しています"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g>は破損しています。再フォーマットを試みてください。"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>が不適切に取り外されました"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"データの喪失を防ぐため<xliff:g id="NAME">%s</xliff:g>を取り外す前にマウントを解除してください。"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>が取り外されました"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>が取り外されました。新しいものを挿入してください。"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"まだ<xliff:g id="NAME">%s</xliff:g>を取り外し中です…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"取り外さないでください"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"セットアップ"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"取り外し"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"外部メディア"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"一致するアクティビティが見つかりません。"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"メディア出力のルーティング"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"メディア出力を他の外部デバイスにルーティングすることをアプリに許可します。"</string>
@@ -1186,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s、%2$s、%3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"内部ストレージ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SDカード"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g>製SDカード"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USBドライブ"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g>製USBドライブ"</string>
<string name="storage_usb" msgid="3017954059538517278">"USBストレージ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"編集"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"データ使用の警告"</string>
@@ -1448,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"ユーザーがOFFにするまで"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"折りたたむ"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"通知のブロック"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"通知を非表示"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ダウンタイム"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"平日の夜間"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"週末"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 75564cc..d9bed78 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"აპს შეეძლება თქვენს ტაბლეტში ან SIM ბარათში შენახული SMS შეტყობინებების წაკითხვა. ამგვარად, აპს ექნება შესაძლებლობა წაიკითხოს ყველა SMS შეტყობინება, მათი კონტენტისა და კონფიდენციალურობის მიუხედავად."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"ნებას აძლევს აპლიკაციას წაიკითხოს SMS შეტყობინებები, შენახული თვენი ტელევიზორის სიმ ბარათზე. ეს ნებას რთავს აპლიკაციას, წაიკითხოს SMS შეტყობინებები, განურჩევლად შემცველობისა და კონფიდენციალურობის."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"აპს შეეძლება თქვენს ტაბლეტში ან SIM ბარათში შენახული SMS შეტყობინებების წაკითხვა. ამგვარად, აპს ექნება შესაძლებლობა წაიკითხოს ყველა SMS შეტყობინება, მათი კონტენტისა და კონფიდენციალურობის მიუხედავად."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"თქვენი ტექსტური შეტყობინებების (SMS ან MMS) რედაქტირება"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"აპს შეეძლება, უპასუხოს თქვენ ტაბლეტში ან SIM ბარათზე შენახულ SMS შეტყობინებებს. მავნე აპებმა შეიძლება წაშალონ თქვენი შეტყობინებები."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"ნებას რთავს აპლიკაციას მიწეეროს თქვენს ტელევიზორის სიმ ბარათზე შენახულ შეტყობინებებს."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"აპს უფლება ექნება , უპასუხოს თქვენ ტაბლეტში ან SIM ბარათზე შენახულ SMS შეტყობინებებს. მავნე აპებმა შეიძლება წაშალონ თქვენი შეტყობინებები."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ტექსტური შეტყობინებების (WAP) მიღება"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"აპს შეეძლება WAP შეტყობინებების მიღება და გენერირება. ამ უფლებით აპი ისე დააკვირდება და წაშლის თქვენთვის გამოგზავნილ შეტყობინებებს, რომ თქვენ ვერც ნახავთ."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"მოქმედი აპების მოძიება"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"აღმოჩენილია თითის ნაწილობრივი ანაბეჭდი. გთხოვთ, სცადოთ ხელახლა."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"თითის ანაბეჭდი ვერ მუშავდება. გთხოვთ, სცადოთ ხელახლა."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"თითის ანაბეჭდის სენსორი დაბინძურებულია. გთხოვთ, გაასუფთაოთ და სცადოთ ხელახლა."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"თითის აღება მეტისმეტად სწრაფად მოხდა. გთხოვთ, სცადოთ ხელახლა."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"თითის აღება მეტისმეტად ნელა მოხდა. გთხოვთ, სცადოთ ხელახლა."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"თითის ანაბეჭდის აპარატურა არ არის ხელმისაწვდომი."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"თითის ანაბეჭდის შენახვა ვერ ხერხდება. გთხოვთ, ამოშალოთ არსებული თითის ანაბეჭდი."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"თითის ანაბეჭდის ლოდინის დრო ამოიწურა. სცადეთ ხელახლა."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"თითის ანაბეჭდის აღების ოპერაცია გაუქმდა."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ძალიან ბევრი მცდელობა იყო. სცადეთ მოგვიანებით."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ხელახლა სცადეთ"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"სინქრონიზაციის პარამეტრების წაკითხვა"</string>
@@ -468,6 +459,48 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"უფლებას აძლევს აპს, ჩაწეროს SD ბარათზე."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP ზარების წამოწყება/მიღება"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"ნებას რთავს აპს განახორციელოს და მიიღოს SIP ზარები."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ტელეკომის ახალი SIM კავშირების რეგისტრაცია"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"აპს ტელეკომის ახალი SIM კავშირების რეგისტრაცია შეეძლება."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ტელეკომის ახალი კავშირების რეგისტრაცია"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"აპს ტელეკომის ახალი კავშირების რეგისტრაცია შეეძლება."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"ტელეკომის კავშირების მართვა"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"აპს ტელეკომის კავშირების მართვა შეეძლება."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ინტერაქცია საუბრის რეჟიმის ეკრანთან"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"აპს შეეძლება გაკონტროლება, როდის და როგორ დაინახავს მომხმარებელი საუბრის რეჟიმის ეკრანს."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"ტელეფონიის სერვისებთან ინტერაქცია"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"ნებას აძლევს აპს მოახდინოს ტელეფონიის სერვისებთან ინტერაქცია, რათა განახორციელოს/მიიღოს ზარები."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"უზრუნველყოფს საუბრის რეჟიმში მომხმარებლის გამოცდილებას."</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"აპს საშუალებას აძლევს, უზრუნველყოს საუბრის რეჟიმში მომხმარებლის გამოცდილება."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ქსელის გამოყენების ისტორიის წაკითხვა"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"აპს შეეძლება კონკრეტული ქსელისა და აპების ისტორიული ქსელის გამოყენების წაკითხვას."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ქსელის დებულების მართვა"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"აპს საშუალება ექნება მართოს ქსელის პოლიტიკა და დააწესოს წესები ცალკეული აპებისთვის."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ქსელის გამოყენების აღრიცხვის შეცვლა"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"აპს შეეძლება, შეცვალოს ქსელის გამოყენების აღრიცხვა აპებთან მიმართებაში. არ გამოიყენება ჩვეულებრივ აპებში."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"წვდომა შეტყობინებებთან"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"აპს შეეძლება მოიძიოს, გამოიკვლიოს და წაშალოს შეტყობინებები, მათ შორის სხვა აპების მიერ გამოქვეყნებული."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"შეტყობინებების მოსმენის სერვისთან დაკავშირება"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"მფლობელს შეეძლება შეტყობინებების მსმენლის სერვისის ზედა დონის ინტერფეისთან დაკავშირება. არ უნდა მოხდეს მისი გამოყენება ჩვეუელებრივი აპებისთვის.ფ"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"მდგომარეობის პროვაიდერის სერვისებთან შეკავშირება"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"მფლობელს შეეძლება შეკავშირდეს მდგომარეობის პროვაიდერის სერვისების ზედა დონის ინტერფეისთან. ჩვეულებრივ აპს ეს წესით არასოდეს უნდა დასჭირდეს."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"dream სერვისთან მიბმა"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"მფლობელს შეეძლება მიებას dream სერვისის ზედა დონის ინტერფეისი. ჩვეულებრივ აპს ეს წესით არასოდეს უნდა დაჭირდეს."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ოპერატორის მიერ მოწოდებული კოფიგურაციის აპის გამოხმობა"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"საშუალებას აძლევს მფლობელს გამოიწვიოს ოპერატორის მიერ მოწოდებული კონფიგურაციის აპი. ჩვეულებრივ აპს ეს წესით არასოდეს არ უნდა დაჭირდეს."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"განხორციელდეს ქსელის მდგომარეობის მონიტორინგი"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"საშუალებას აძლევს აპლიკაციებს განახორციელოს ქსელის მდგომარეობის მონიტორინგი. ეს ფუნქცია ჩვეულებრივ აპებს არ ჭირდება."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"შეყვანის მოწყობილობის კალიბრაციის ცვლილება"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"საშუალებას აძლევს აპს შეცვალოს სენსორული ეკრანის კალიბრაციის პარამეტრები. ჩვეულებრივ აპებს წესით არ უნდა დაჭირდეს."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM სერთიფიკატებზე წვდომა"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"საშუალებას აძლევს აპლიკაციას დანერგოს და გამოიყენოს DRM სერთიფიკატები. ეს უფლება ჩვეულებრივ აპებს არ ჭირდება."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam ტრანსფერის სტატუსის მიღება"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ნებას რთავს ამ აპლიკაციას, მიიღოს ინფორმაცია მიმდინარე Android Beam-ის ტრანსფერების შესახებ"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM სერტიფიკატების ამოშლა"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"საშუალებას აძლევს აპლიკაციას ამოშალოს DRM სერtიფიკატები. ეს წესით ჩვეულებრივ აპებს არ უნდა დაჭირდეს."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"აკავშირებს შეტყობინების გაცვლის მომსახურებას"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"საშუალებას აძლევს მფლობელს შექმნას შეტყობინების გაცვლის მომსახურების უმახლესი დონის ინტერფეისი. არასდროს იქნება საჭირო ნორმალური აპლიკაციებისათვის."</string>
+ <string name="permlab_bindCarrierConfigService" msgid="4110548389449423386">"ოპერატორის კონფიგურაციის სერვისთან დაკავშირება"</string>
+ <string name="permdesc_bindCarrierConfigService" msgid="1096888107671817447">"საშუალებას აძლევს მფლობელს, დაუკავშირდეს ოპერატორის კონფიგურაციის სერვისს. ნორმალურ აპებში არასდროს უნდა იყოს საჭირო."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"პაროლის წესების დაყენება"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"აკონტროლეთ ეკრანის ბლოკირების პაროლებისა და PIN-ების სიმბოლოების სიგრძე."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"ეკრანის განბლოკვის მცდელობების გაკონტროლება"</string>
@@ -628,8 +661,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"განბლოკვისთვის ან გადაუდებელი ზარისთვის დააჭირეთ მენიუს."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"განბლოკვისთვის დააჭირეთ მენიუს."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"განსაბლოკად დახატეთ ნიმუში"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"საგანგებო სამსახურები"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"ზარზე დაბრუნება"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"სწორია!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"კიდევ სცადეთ"</string>
@@ -1029,36 +1061,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"კანდიდატები"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ის მომზადება"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"შეცდომების შემოწმება"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"აღმოჩენილია ახალი <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ფოტოებისა და მედიის გადასატანად"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> დაზიანებულია"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> დაზიანებულია; სცადეთ მისი დაფორმატება"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"მოულოდნელად მოხდა <xliff:g id="NAME">%s</xliff:g>-ის ამოღება"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"მონაცემთა დაკარგვის თავიდან ასაცილებლად, ფიზიკურად ამოღებამდე, სისტემურად მოხსენით <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ამოღებულია"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ამოღებულია; ჩასვით ახალი"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>-ის გამოღება არ დასრულებულა…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"არ ამოიღოთ"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"დაყენება"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"გამოღება"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"დათვალიერება"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"შესატყვისი აქტივობები არ არის."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"მულტიმედია მონაცემების გადამისამართება"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"აპლიკაციას შეეძლება გადაამისამართოს მულტიმედია მონაცემები სხვა გარე მოწყობილობებისკენ."</string>
@@ -1188,6 +1205,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"შიდა მეხსიერება"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD ბარათი"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD ბარათი"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB დისკი"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB დისკი"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB მეხსიერება"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"რედაქტირება"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ინტერნეტის გამოყენების გაფრთხილება"</string>
@@ -1450,7 +1470,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"სანამ ამას გამორთავდეთ"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"აკეცვა"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"შეფერხებების დაბლოკვა"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"არ შემაწუხოთ"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ავარიული პაუზა"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"კვირის ღამეებისას"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"შაბათ-კვირას"</string>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 200cba2..c72e28a 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Қолданбаға планшетте сақталған SMS хабарларын немесе SIM картасын оқу мүмкіндігін береді. Бұл қолданбаға мазмұны немесе құпиялығына қарамастан барлық SMS хабарларын оқу мүмкіндігін береді."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Қолданбаға ТД немесе SMS картасында сақталған SMS хабарларын оқуға рұқсат етеді. Бұл қолданбаға мазмұнына немесе құпиялығына қарамастан барлық SMS хабарларын оқуға рұқсат етеді."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Қолданбаға телефонда сақталған SMS хабарларын немесе SIM картасын оқу мүмкіндігін береді. Бұл қолданбаға мазмұны немесе құпиялығына қарамастан барлық SMS хабарларын оқу мүмкіндігін береді."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"мәтін хабарларын жөндеу (SMS немесе MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Қолданбаға планшетте немесе SIM картасында сақталған SMS хабарларына жазуға рұқсат береді. Зиянкес қолданбалар хабарларыңызды жоюы мүмкін."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Қолданбаға теледидарда немесе SIM картасында сақталған SMS хабарларына жазуға рұқсат етеді. Зиянкес қолданбалар хабарларыңызды жоюы мүмкін."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Қолданбаға телефонда немесе SIM картасында сақталған SMS хабарларына жазуға рұқсат береді. Зиянкес қолданбалар хабарларыңызды жоюы мүмкін."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"мәтін хабарларын алу (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Қолданбаға WAP хабарларын алу және өңдеу мүмкіндігін береді. Бұл қолданба құрылғыңызға жіберілген хабарларды сізге көрсетпестен қабылдай және жоя алады дегенді білдіреді."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"жұмыс істеп жатқан қолданбаларды шығарып алу"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Саусақ ізі ішінара анықталды. Әрекетті қайталаңыз."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Саусақ ізін өңдеу мүмкін емес. Әрекетті қайталаңыз."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Саусақ ізі сенсоры лас. Тазалап, әрекетті қайталаңыз."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Саусағыңызды тым жылдам қозғалттыңыз. Әрекетті қайталап көріңіз."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Саусақ тым баяу қозғалды. Әрекетті қайталаңыз."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Саусақ ізі жабдығы қолжетімді емес."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Саусақ ізін сақтау мүмкін емес. Бар саусақ ізін жойыңыз."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Саусақ ізін күту уақыты бітті. Әрекетті қайталаңыз."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Саусақ ізі операциясынан бас тартылған."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Талпыныстар тым көп. Кейінірек қайталап көріңіз."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Әрекетті қайталаңыз."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"синх параметрлерін оқу"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Қолданбаға SD картасына жазуға рұқсат береді."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP қоңырауларын шалу/қабылдау"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Қолданбаға SIP қоңырауларын шалуға және қабылдауға рұқсат етеді."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"жаңа телекоммуникациялық SIM байланыстарын тіркеу"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Қолданбаға жаңа телекоммуникациялық SIM байланыстарын тіркеуге рұқсат етеді."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"жаңа телекоммуникациялық байланыстарды тіркеу"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Қолданбаға жаңа телекоммуникациялық байланыстарды тіркеуге рұқсат етеді."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"телекоммуникациялық байланыстарды басқару"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Қолданбаға телекоммуникациялық байланыстарды басқаруға рұқсат етеді."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"қоңыраудағы экранмен өзара әрекеттесу"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Қолданбаға пайдаланушының қоңырау кезінде экранды қашан және қалай көретінін басқару мүмкіндігін береді."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"телефония қызметтерімен өзара әрекеттесу"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Қолданбаға қоңыраулар шалу/қабылдау үшін телефония қызметтерімен өзара әрекеттесуге рұқсат етеді."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"қоңыраудағы пайдаланушы тәжірибесін қамтамасыз ету"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Қолданбаға қоңыраудағы пайдаланушы тәжірибесін қамтамасыз етуге рұқсат етеді."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"тарихи желі қолданысын оқу"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Қолданбаға белгілі бір желілер және қолданбалар үшін журналдық желіні пайдалануды оқуға рұқсат береді."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"желі саясатын басқару"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Қолданбаға желілік саясаттарды басқаруға және қолданба ережелерін анықтауға рұқсат береді."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"желіні қолдану есептік жазбаларын өзгерту"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Қолданбаға қолданбалардың желіні қолдану әрекетін өзгерту мүмкіндігін береді. Қалыпты қолданбалар қолданысына арналмаған."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"хабарларға кіру"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Қолданбаға хабарларды алу, тексеру және тазалау мүмкіндігін береді, басқа қолданбалар арқылы қойылған хабарларды қоса."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"хабар тыңдау қызметіне қосылу"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Пайдаланушыға хабар есту қызметінің жоғары деңгейлі интерфейсіне жалғану мүмкіндігін ұсынады. Қалыпты қолданбаны ешқашан қажет етпеуі тиіс."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"шарттар провайдері қызметіне байластыру"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Пайдаланушыға шарт провайдері қызметінің жоғары деңгейлі интерфейсіне байластыруға рұқсат береді. Қалыпты қолданбалар үшін ешқашан қажет болмайды."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"dream қызметіне байластыру"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Иесіне dream қызметінің жоғарғы деңгейлі интерфейсіне байластыруға рұқсат береді. Қалыпты қолданбалар үшін ешқашан қажет болмайды."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"жабдықтаушы ұсынатын жасақтамалық қолданбаны қосу"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Пайдаланушыға жабдықтаушы ұсынатын жасақтамалық қолданбаны қосу мүмкіндігін ұсынады. Қалыпты қолданбаны қажет етпеуі тиіс."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"желі күйлері туралы бағдарды тыңдау мүмкіндігі"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Қолданбаның желі күйі туралы бағдарларды тыңдау мүмкіндігін ұсынады. Қалыпты қоданбаны қажет етпеуі керек."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"кіріс құрылғысының калибрлеуін өзгерту"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Қолданбаға сенсорлы экранның параметрлерін өзгертуге рұқсат береді. Қалыпты қолданбалар үшін ешқашан қажет болмайды."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM сертификаттарына қатынасу"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Қолданбаға DRM сертификаттарын қамтамасыз етуге және пайдалануға рұқсат береді. Қалыпты қолданбалар үшін ешқашан қажет болмайды."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam тасымалдау күйін алу"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Осы қолданбаға ағымдағы Android Beam тасымалдаулары туралы ақпарат алуға рұқсат ету"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM сертификаттарын жою"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Қолданбаға DRM сертификаттарын жоюға рұқсат етеді. Қалыпты қолданбалар үшін ешқашан қажет болмайды."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"оператордың хабар алмасу қызметіне байластыру"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Иесіне оператордың хабар алмасу қызметінің жоғарғы деңгейлі интерфейсіне байластыруға рұқсат етеді. Қалыпты қолданбалар үшін ешқашан қажет болмайды."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Кілтсөз ережелерін тағайындау"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Экран бекітпесінің құпия сөздерінің және PIN кодтарының ұзындығын және оларда рұқсат етілген таңбаларды басқару."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Экранды ашу әркеттерін бақылау"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Бекітпесін ашу үшін немесе төтенше қоңырауды табу үшін Мәзір тармағын басыңыз."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Ашу үшін Мәзір пернесін басыңыз."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Бекітпесін ашу үшін кескінді сызыңыз"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Төтенше жағдай"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Қоңырауға оралу"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Дұрыс!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Әрекетті қайталау"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"үміткерлер"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> дайындалуда"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Қателер тексерілуде"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Жаңа <xliff:g id="NAME">%s</xliff:g> анықталды"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Фотосуреттер мен медиа файлдарын тасымалдау үшін"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> зақымдалған"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> зақымдалған; оны қайта пішімдеп көріңіз"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> кенеттен шығарылды"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Деректер жоғалып қалмауы үшін <xliff:g id="NAME">%s</xliff:g> құрылғысын ажыратып барып, шығару керек"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> жоқ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> шығарылды; жаңасын салыңыз"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> әлі шығарылуда…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Шығармаңыз"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Орнату"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Шығару"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Зерттеу"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Сәйкес әрекеттер табылмады."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Медиа шығысын бағыттау"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Қолданбаға медиа шығысын басқа сыртқы құрылғыларға бағыттау мүмкіндігін береді."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Ішкі жад"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD картасы"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB жады"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Өзгерту"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Дерекқор қолдануға қатысты ескерту"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Сіз осыны өшіргенше"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Тасалау"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Кедергілерді бұғаттау"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Мазаламауыңызды сұраймын"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Бос тұру уақыты"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Жұмыс күндерінің түндері"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Демалыс күндері"</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index ef00ccd..8a1323b 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ឲ្យកម្មវិធីអានសារ SMS ដែលមានក្នុងកុំព្យូទ័របន្ទះ ឬស៊ីមកាត។ វាឲ្យកម្មវិធីអានសារ SMS ទាក់ទងនឹងមាតិកា ឬព័ត៌មានសម្ងាត់។"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"អនុញ្ញាតឲ្យកម្មវិធីអានសារ SMS ដែលបានផ្ទុកនៅក្នុងទូរទស្សន៍ ឬស៊ីមកាតរបស់អ្នក។ វាអនុញ្ញាតឲ្យកម្មវិធីអានសារ SMS ទាំងអស់ ដោយមិនគិតពីមាតិកា ឬព័ត៌មានសម្ងាត់ឡើយ។"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ឲ្យកម្មវិធីអានសារ SMS ដែលបានរក្សាទុកក្នុងទូរស័ព្ទ ឬស៊ីមកាត។ វាឲ្យកម្មវិធីអានសារ SMS ទាំងអស់ ទាក់ទងនឹងមាតិកា ឬព័ត៌មានសម្ងាត់។"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"កែសម្រួលសារអត្ថបទរបស់អ្នក (សារ SMS ឬ MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ឲ្យកម្មវិធីសរសេរសារ SMS ដែលបានរក្សាទុកក្នុងកុំព្យូទ័របន្ទះ ឬស៊ីមកាតរបស់អ្នក។ កម្មវិធីព្យាបាទអាចលុបសាររបស់អ្នក។"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"អនុញ្ញាតឲ្យកម្មវិធីសរសេរទៅសារ SMS ដែលបានផ្ទុកនៅលើទូរទស្សន៍ ឬស៊ីមកាតរបស់អ្នក។ កម្មវិធីព្យាបាទអាចលុបសាររបស់អ្នក។"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ឲ្យកម្មវិធីសរសេរសារ SMS ដែលបានរក្សាទុកក្នុងទូរស័ព្ទ ឬស៊ីមកាត។ កម្មវិធីព្យាបាទអាចលុបសាររបស់អ្នក។"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ទទួលសារអត្ថបទ (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"ឲ្យកម្មវិធីទទួល និងដំណើរការសារ WAP ។ សិទ្ធិនេះមានលទ្ធភាពតាមដាន ឬលុបសារដែលបានផ្ញើឲ្យអ្នកដោយមិនបង្ហាញ។"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ទៅយកកម្មវិធីកំពុងដំណើរការ"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"បានផ្តិតយកស្នាមម្រាមដៃមិនពេញលក្ខណៈ។ សូមព្យាយាមម្តងទៀត។"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"មិនអាចដំណើរការស្នាមម្រាមដៃបានទេ។ សូមព្យាយាមម្តងទៀត។"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ឧបករណ៍ផ្តិតម្រាមដៃប្រលាក់ហើយ។ សូមសម្អាត ហើយព្យាយាមម្តងទៀត។"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"ម្រាមដៃផ្លាស់ទីលឿនពេក។ សូមព្យាយាមម្តងទៀត។"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"ម្រាមដៃមានចលនាយឺតពេក។ សូមព្យាយាមម្តងទៀត។"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ផ្នែករឹងស្នាមម្រាមដៃមិនមានទេ។"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"មិនអាចផ្ទុកស្នាមម្រាមដៃទេ។ សូមយកស្នាមម្រាមដៃដែលមានស្រាប់ចេញ។"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ការផ្តិតម្រាមដៃបានអស់ពេល។ សូមព្យាយាមម្តងទៀត។"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"បានបោះបង់ប្រតិបត្តិការស្នាមម្រាមដៃ។"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ព្យាយាមម្ដងទៀត។"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"អានការកំណត់ធ្វើសមកាលកម្ម"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"ឲ្យកម្មវិធីសរសេរទៅកាតអេសឌី។"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"បង្កើត/ទទួល ការហៅ SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"ឲ្យកម្មវិធី បង្កើត និងទទួលការហៅ SIP ។"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ចុះឈ្មោះការភ្ជាប់ស៊ីមទូរគមនាគមន៍ថ្មី"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"អនុញ្ញាតឲ្យកម្មវិធីចុះឈ្មោះជាមួយស៊ីមទូរគមនាគមន៍ថ្មី"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ចុះឈ្មោះការភ្ជាប់ទូរគមនាគមន៍ថ្មី"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ឲ្យកម្មវិធីចុះឈ្មោះការភ្ជាប់ទូរគមនាគមន៍ថ្មី។"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"គ្រប់គ្រងការភ្ជាប់ទូរគមនាគមន៍"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"ឲ្យកម្មវិធីគ្រប់គ្រងការភ្ជាប់ទូរគមនាគមន៍។"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ទាក់ទងជាមួយអេក្រង់ហៅចូល"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ឲ្យកម្មវិធីពិនិត្យពេលវេលា និងវិធីដែលអ្នកប្រើមើលឃើញអេក្រង់ហៅចូល។"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"ទាក់ទងជាមួយសេវាកម្មទូរស័ព្ទ"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"ឲ្យកម្មវិធីទាក់ទងជាមួយសេវាកម្មទូរស័ព្ទ ដើម្បីហៅ/ទទួលការហៅ។"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ផ្ដល់បទពិសោធន៍អ្នកប្រើហៅចូល"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"ឲ្យកម្មវិធីផ្ដល់បទពិសោធន៍អ្នកប្រើហៅចូល។"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"អានការប្រើបណ្ដាញពិសេស"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"ឲ្យកម្មវិធីអានការប្រើបណ្ដាញជាប្រវត្តិសាស្ត្រសម្រាប់បណ្ដាញ និងកម្មវិធីជាក់លាក់។"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"គ្រប់គ្រងគោលនយោបាយបណ្ដាញ"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ឲ្យកម្មវិធីគ្រប់គ្រងគោលនយោបាយបណ្ដាញ និងកំណត់ក្បួនជាក់លាក់សម្រាប់កម្មវិធី។"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"កែគណនីប្រើបណ្ដាញ"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ឲ្យកម្មវិធីកែវិធីគិតថ្លៃសេវាកម្មប្រើបណ្ដាញតាមកម្មវិធី។ មិនសម្រាប់ប្រើដោយកម្មវិធីធម្មតា។"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"ចូលដំណើរការការជូនដំណឹង"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ឲ្យកម្មវិធីទៅយក ពិនិត្យ និងសម្អាតការជូនដំណឹង រួមមានប្រកាសដោយកម្មវិធីផ្សេងៗ។"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ចងទៅសេវាកម្មស្ដាប់ការជូនដំណឹង"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ឲ្យម្ចាស់ចងចំណុចប្រទាក់កម្រិតកំពូលនៃសេវាកម្មកម្មវិធីស្ដាប់ការជូនដំណឹង។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"ភ្ជាប់ទៅសេវាកម្មក្រុមហ៊ុនផ្ដល់លក្ខខណ្ឌ"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"អនុញ្ញាតឲ្យម្ចាស់ភ្ជាប់ទៅចំណុចប្រទាក់កម្រិតកំពូលរបស់សេវាកម្មក្រុមហ៊ុនផ្ដល់លក្ខខណ្ឌ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"ភ្ជាប់ទៅសេវាកម្មស្រមោលស្រមៃ"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"អនុញ្ញាតឲ្យម្ចាស់ភ្ជាប់ទៅចំណុចប្រទាក់កម្រិតកំពូលនៃសេវាកម្មស្រមើស្រមៃ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ដកហូតកម្មវិធីកំណត់រចនាសម្ព័ន្ធដែលបានផ្ដល់ដោយក្រុមហ៊ុនបញ្ជូន"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"អនុញ្ញាតឲ្យម្ចាស់ដកហូតកម្មវិធីកំណត់រចនាសម្ព័ន្ធដែលបានផ្ដល់ដោយក្រុមហ៊ុនបញ្ជូន។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"សង្កេតមើលលើលក្ខខណ្ឌបណ្ដាញ"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"ឲ្យកម្មវិធីសង្កេតមើលលើលក្ខខណ្ឌបណ្ដាញ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ប្ដូរចំណុចឧបករណ៍បញ្ចូល"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"ឲ្យកម្មវិធីកែប៉ារ៉ាម៉ែត្រកែចំណុចនៃការប៉ះអេក្រង់។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"ចូលមើលវិញ្ញាបនបត្រ DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"ឲ្យកម្មវិធីផ្ដល់ និងប្រើវិញ្ញាបនបត្រ DRM ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"ទទួលស្ថានភាពផ្ទេរ Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ឲ្យកម្មវិធីទទួលព័ត៌មានអំពីការផ្ទេរ Android Beam បច្ចុប្បន្ន"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"លុបវិញ្ញាបនបត្រ DRM ចេញ"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"អនុញ្ញាតឲ្យកម្មវិធីលុបចេញវិញ្ញាបនបត្រ DRM ។ គួរតែមិនត្រូវការសម្រាប់កម្មវិធីធម្មតា។"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"ភ្ជាប់ទៅសេវាកម្មសារអ្នកផ្តល់សេវាកម្មទូរស័ព្ទ"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"អនុញ្ញាតឲ្យអ្នកប្រើភ្ជាប់ទៅអ៊ីនធឺហ្វេសកម្រិតខ្ពស់នៃសេវាកម្មសារអ្នកផ្តល់សេវាកម្មទូរស័ព្ទ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"កំណត់ក្បួនពាក្យសម្ងាត់"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"គ្រប់គ្រងប្រវែង និងតួអក្សរដែលអនុញ្ញាតឲ្យប្រើក្នុងពាក្យសម្ងាត់ និងលេខសម្ងាត់ចាក់សោអេក្រង់។"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"ពិនិត្យការព្យាយាមដោះសោអេក្រង់"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ចុចម៉ឺនុយ ដើម្បីដោះសោ ឬហៅពេលអាសន្ន។"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"ចុចម៉ឺនុយ ដើម្បីដោះសោ។"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"គូរលំនាំ ដើម្បីដោះសោ"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"បន្ទាន់"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"ត្រឡប់ទៅការហៅ"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ត្រឹមត្រូវ!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"ព្យាយាមម្ដងទៀត"</string>
@@ -1031,36 +1065,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"បេក្ខជន"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"កំពុងរៀបចំ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"កំពុងពិនិត្យរកកំហុស"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"បានរកឃើញ <xliff:g id="NAME">%s</xliff:g> ថ្មី"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"សម្រាប់ផ្ទេររូបភាព និងមេឌៀ"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> មានការខូចខាត"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> មានការខូចខាត សូមព្យាយាមសម្អាតវាម្តងទៀត"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញដោយមិនបានរំពឹងទុក"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ផ្តាច់ <xliff:g id="NAME">%s</xliff:g> មុនពេលដកចេញដើម្បីជៀងវាងការបាត់បង់ទិន្នន័យ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញ សូមដោតចូលថ្មីមួយទៀត"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"នៅកំពុងដក <xliff:g id="NAME">%s</xliff:g> ចេញ…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"កុំដកចេញ"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"ដំឡើង"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"ដកចេញ"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"រុករក"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"រកមិនឃើញសកម្មភាពផ្គូផ្គង។"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"នាំផ្លូវលទ្ធផលមេឌៀ"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"ឲ្យកម្មវិធីនាំផ្លូវលទ្ធផលមេឌៀទៅឧបករណ៍ខាងក្រៅផ្សេង។"</string>
@@ -1190,6 +1209,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"ឧបករណ៍ផ្ទុកខាងក្នុង"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"កាតអេសឌី"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"ឧបករណ៍ផ្ទុកយូអេសប៊ី"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"កែសម្រួល"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ការព្រមានប្រើទិន្នន័យ"</string>
@@ -1452,7 +1477,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"រហូតដល់ពេលអ្នកបិទវា"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"បង្រួម"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"រារាំងការរំខាន"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"កុំរំខាន"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ពេលមិនដំណើរការ"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"យប់ថ្ងៃធ្វើការ"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"ចុងសប្តាហ៍"</string>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index 78190ef..654ea8e 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ವಿಷಯ ಅಥವಾ ಗೌಪ್ಯತೆಯನ್ನು ಲೆಕ್ಕಿಸದೆಯೇ, ಎಲ್ಲಾ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"ನಿಮ್ಮ ಟಿವಿ ಅಥವಾ SIM ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ವಿಷಯ ಅಥವಾ ಗೋಪ್ಯತೆಯನ್ನು ಪರಿಗಣಿಸದೆ, ಎಲ್ಲಾ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ನಿಮ್ಮ ಫೋನ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ವಿಷಯ ಅಥವಾ ಗೌಪ್ಯತೆಯನ್ನು ಲೆಕ್ಕಿಸದೆಯೇ, ಎಲ್ಲಾ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"ನಿಮ್ಮ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸಂಪಾದಿಸಿ (SMS ಅಥವಾ MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ SMS ಸಂದೇಶಗಳನ್ನು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಸಂದೇಶಗಳನ್ನು ಅಳಿಸಬಹುದು."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"ನಿಮ್ಮ ಟಿವಿ ಅಥವಾ SIM ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳನ್ನು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಸಂದೇಶಗಳನ್ನು ಅಳಿಸಬಹುದು."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ನಿಮ್ಮ ಫೋನ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳಲ್ಲಿ ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಸಂದೇಶಗಳನ್ನು ಅಳಿಸಬಹುದು."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು, ನಿಮಗೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡುವ ಅಥವಾ ಅಳಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ರನ್ ಆಗುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಹಿಂಪಡೆಯಿರಿ"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ಭಾಗಶಃ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಪತ್ತೆಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸಾರ್ ಕೊಳೆಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಅದನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"ಬೆರಳನ್ನು ಅತಿ ವೇಗವಾಗಿ ಸರಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"ಬೆರಳನ್ನು ನಿಧಾನವಾಗಿ ಸರಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ತೆಗೆದುಹಾಕಿ."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅವಧಿ ಮೀರಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರದ್ದುಮಾಡಲಾಗಿದೆ."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ಹಲವಾರು ಪ್ರಯತ್ನಗಳು. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ರೀಡ್ ಮಾಡು"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD ಕಾರ್ಡ್ಗೆ ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP ಕರೆಗಳನ್ನು ಮಾಡಿ/ಸ್ವೀಕರಿಸಿ"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"ಅಪ್ಲಿಕೇಶನ್ಗೆ ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಲು ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ಹೊಸ ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಣಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ಒಳ-ಕರೆ ಪರದೆಯ ಮೂಲಕ ಸಂವಹನ ನಡೆಸಿ"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ಬಳಕೆದಾರರು ಒಳ-ಕರೆಯ ಪರದೆಯನ್ನು ಯಾವಾಗ ಮತ್ತು ಹೇಗೆ ನೋಡುತ್ತಾರೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"ಟೆಲಿಫೋನಿ ಸೇವೆಗಳೊಂದಿಗೆ ಸಂವಾದ ನಡೆಸಿ"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"ಕರೆಗಳನ್ನು ಮಾಡಲು/ಸ್ವೀಕರಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ ಲಿಫೋನಿ ಸೇವೆಗಳ ಜೊತೆ ಸಂವಾದ ನಡೆಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಕೊಡಿ."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ಒಳ ಕರೆ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಿ"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"ಒಳ ಕರೆಯ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ಐತಿಹಾಸಿಕ ನೆಟ್ವರ್ಕ್ ಬಳಕೆಯನ್ನು ಓದಿರಿ"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"ನಿರ್ದಿಷ್ಟ ನೆಟ್ವರ್ಕ್ಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಐತಿಹಾಸಿಕ ನೆಟ್ವರ್ಕ್ನ ಬಳಕೆಯನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ನೆಟ್ವರ್ಕ್ ನೀತಿಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ನೆಟ್ವರ್ಕ್ ನೀತಿಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ದಿಷ್ಟ ನಿಯಮಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ನೆಟವರ್ಕ್ ಬಳಕೆಯ ಲೆಕ್ಕ ಪರಿಶೋಧನೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ವಿರುದ್ಧವಾಗಿ ನೆಟ್ವರ್ಕ್ ಬಳಕೆಯನ್ನು ಹೇಗೆ ಲೆಕ್ಕಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಬಳಸಲಾಗುವುದಿಲ್ಲ."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೂಲಕ ಪೋಸ್ಟ್ ಮಾಡಿರುವ ಅಧಿಸೂಚನೆಗಳೂ ಸೇರಿದಂತೆ, ಅಂತಹ ಅಧಿಸೂಚನೆಗಳನ್ನು ಹಿಂಪಡೆದುಕೊಳ್ಳಲು, ಪರೀಕ್ಷಿಸಲು ಮತ್ತು ತೆರವುಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ಅಧಿಸೂಚನೆ ಕೇಳುಗರ ಸೇವೆಗೆ ಪ್ರತಿಬಂಧಿಸಿ"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ಅಧಿಸೂಚನೆ ಕೇಳುಗ ಸೇವೆಯ ಮೇಲ್ಮಟ್ಟದ ಇಂಟರ್ಫೇಸ್ಗೆ ಪ್ರತಿಬಂಧಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"ಕಂಡೀಶನ್ ಪೂರೈಕೆದಾರರ ಸೇವೆಯನ್ನು ಪ್ರತಿಬಂಧಿಸು"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"ಕಂಡೀಶನ್ ಪೂರೈಕೆದಾರರ ಮೇಲ್ಮಟ್ಟದ ಇಂಟರ್ಫೇಸ್ಗೆ ಪ್ರತಿಬಂಧಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"ಕನಸಿನ ಸೇವೆಗೆ ಪ್ರತಿಬಂಧಿಸಿ"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"ಕನಸಿನ ಸೇವೆಯ ಮೇಲ್ಮಟ್ಟದ ಇಂಟರ್ಫೇಸ್ಗೆ ಪ್ರತಿಬಂಧಿಸಲು ಮಾಲೀಕರಿಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ವಾಹಕ-ಒದಗಿಸಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ ಅಪ್ಲಿಕೇಶನ್ಗೆ ವಿನಂತಿಸಿಕೊಳ್ಳಿ"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ವಾಹಕ-ಒದಗಿಸಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ವಿನಂತಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ನೆಟ್ವರ್ಕ್ ಪರಿಸ್ಥಿತಿಗಳ ಕುರಿತು ಪರಿಶೀಲನೆಗಳನ್ನು ಆಲಿಸಿ"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"ನೆಟ್ವರ್ಕ್ ಪರಿಸ್ಥಿತಿಗಳ ಕುರಿತು ಪರಿಶೀಲನೆಗಾಗಿ ಆಲಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ಇನ್ಪುಟ್ ಸಾಧನ ಮಾಪನಾಂಕ ನಿರ್ಣಯವನ್ನು ಬದಲಾಯಿಸಿ"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"ಸ್ಪರ್ಶದ ಪರದೆಯ ಮಾಪನಾಂಕ ನಿರ್ಣಯ ಪ್ಯಾರಾಮೀಟರ್ಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM ಪ್ರಮಾಣಪತ್ರಗಳಿಗೆ ಅನುಮತಿ ಕಲ್ಪಿಸಲು ಮತ್ತು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam ವರ್ಗಾವಣೆ ಸ್ಥಿತಿಯನ್ನು ಸ್ವೀಕರಿಸಿ"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ಪ್ರಸ್ತುತ Android Beam ವರ್ಗಾವಣೆಗಳ ಕುರಿತ ಮಾಹಿತಿಯನ್ನು ಸ್ವೀಕರಿಸಲು ಈ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸಿ"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"ವಾಹಕ ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಸೇವೆಗೆ ಪ್ರತಿಬಂಧಿಸಿ"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"ವಾಹಕ ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಸೇವೆಯ ಮೇಲ್ಮಟ್ಟದ ಇಂಟರ್ಫೇಸ್ಗೆ ಪ್ರತಿಬಂಧಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"ಪಾಸ್ವರ್ಡ್ ನಿಮಯಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"ಪರದೆ ಲಾಕ್ನಲ್ಲಿನ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಪಿನ್ಗಳ ಅನುಮತಿಸಲಾದ ಅಕ್ಷರಗಳ ಪ್ರಮಾಣವನ್ನು ನಿಯಂತ್ರಿಸಿ."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"ಪರದೆಯ-ಅನ್ಲಾಕ್ ಪ್ರಯತ್ನಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಿ"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಮೆನು ಒತ್ತಿರಿ ಇಲ್ಲವೇ ತುರ್ತು ಕರೆಯನ್ನು ಮಾಡಿ."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಮೆನು ಒತ್ತಿರಿ."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"ಅನ್ಲಾಕ್ ಮಾಡಲು ನಮೂನೆ ಚಿತ್ರಿಸಿ"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"ತುರ್ತು"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"ಕರೆಗೆ ಹಿಂತಿರುಗು"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ಸರಿಯಾಗಿದೆ!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸು"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"ಅಭ್ಯರ್ಥಿಗಳು"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ದೋಷಗಳನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ಹೊಸ <xliff:g id="NAME">%s</xliff:g> ಪತ್ತೆಯಾಗಿದೆ"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ಫೋಟೋಗಳು ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ವರ್ಗಾಯಿಸಲು"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> ಹಾನಿಯಾಗಿದೆ"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> ಹಾನಿಯಾಗಿದೆ; ಅದನ್ನು ಮರುಫಾರ್ಮ್ಯಾಟ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ಅನಿರೀಕ್ಷಿತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ಡೇಟಾ ನಷ್ಟವನ್ನು ತಪ್ಪಿಸಲು ತೆಗೆದುಹಾಕುವುದಕ್ಕೂ ಮುನ್ನ <xliff:g id="NAME">%s</xliff:g> ಅಳವಡಿಕೆಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ತೆಗೆದುಹಾಕಲಾಗಿದೆ; ಹೊಸದನ್ನು ಸೇರಿಸಿ"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> ಇನ್ನೂ ಎಜೆಕ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ತೆಗೆದುಹಾಕಬೇಡಿ"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"ಸೆಟಪ್"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"ಎಜೆಕ್ಟ್ ಮಾಡು"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"ಎಕ್ಸ್ಪ್ಲೋರ್"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಯ ಚಟುವಟಿಕೆಗಳು ಕಂಡುಬಂದಿಲ್ಲ."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"ಮೀಡಿಯಾ ಔಟ್ಪುಟ್ ಅನ್ನು ರೂಟ್ ಮಾಡಿ"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"ಇತರ ಬಾಹ್ಯ ಸಾಧನಗಳಿಗೆ ಮೀಡಿಯಾ ಔಟ್ಪುಟ್ ಅನ್ನು ರೂಟ್ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"ಆಂತರಿಕ ಸಂಗ್ರಹಣೆ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD ಕಾರ್ಡ್"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB ಸಂಗ್ರಹಣೆ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ಸಂಪಾದಿಸು"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ಡೇಟಾ ಬಳಕೆಯ ಎಚ್ಚರಿಕೆ"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"ನೀವಿದನ್ನು ಆಫ್ ಮಾಡುವವರೆಗೆ"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ಸಂಕುಚಿಸು"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"ಅಡಚಣೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ಸ್ಥಗಿತಕಾಲ"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ವಾರದ ರಾತ್ರಿಗಳು"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"ವಾರಾಂತ್ಯಗಳು"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index e2d67d70..b397326 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"앱이 태블릿 또는 SIM 카드에 저장된 SMS 메시지를 읽을 수 있도록 허용합니다. 이렇게 하면 앱이 콘텐츠 또는 비밀유지와 관계 없이 모든 SMS 메시지를 읽을 수 있습니다."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"앱이 TV 또는 SIM 카드에 저장된 SMS 메시지를 읽을 수 있도록 허용합니다. 이 경우 내용의 기밀성과 관계없이 앱이 모든 SMS 메시지를 읽을 수 있게 됩니다."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"앱이 휴대전화 또는 SIM 카드에 저장된 SMS 메시지를 읽을 수 있도록 허용합니다. 이렇게 하면 앱이 콘텐츠 또는 비밀유지와 관계 없이 모든 SMS 메시지를 읽을 수 있습니다."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"내 문자 메시지 수정(SMS 또는 MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"앱이 태블릿 또는 SIM 카드에 저장된 SMS 메시지에 쓸 수 있도록 허용합니다. 이 경우 악성 앱이 이 기능을 이용하여 메시지를 삭제할 수 있습니다."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"앱이 TV 또는 SIM 카드에 저장된 SMS 메시지에 작성할 수 있도록 허용합니다. 이 경우 악성 앱이 메시지를 삭제할 수 있습니다."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"앱이 휴대전화 또는 SIM 카드에 저장된 SMS 메시지에 쓸 수 있도록 허용합니다. 이 경우 악성 앱이 이 기능을 이용하여 메시지를 삭제할 수 있습니다."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"문자 메시지 받기(WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"앱이 WAP 메시지를 수신하고 처리할 수 있도록 허용합니다. 이는 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 모니터링 또는 삭제할 수도 있다는 것을 의미합니다."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"실행 중인 앱 검색"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"지문이 일부만 인식되었습니다. 다시 시도해 주세요."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"지문을 인식할 수 없습니다. 다시 시도해 주세요."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"지문 센서를 깨끗이 닦고 다시 시도하세요."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"손가락을 너무 빨리 움직였습니다. 다시 시도해 주세요."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"손가락을 너무 느리게 움직였습니다. 다시 시도해 주세요."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"지문 인식 하드웨어를 사용할 수 없습니다."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"지문을 저장할 수 없습니다. 기존 지문을 삭제하세요."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"지문 인식 시간이 초과되었습니다. 다시 시도하세요."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"지문 인식 작업이 취소되었습니다."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"다시 시도해 보세요."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"동기화 설정 읽기"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"앱이 SD 카드에 쓸 수 있도록 허용합니다."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP 통화 발신/수신"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"앱에서 SIP 통화를 발신 및 수신하도록 허용"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"새로운 통신 SIM 연결 등록"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"앱이 새 통신 SIM 연결을 등록할 수 있게 허용합니다."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"새로운 통신 연결 등록"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"앱이 새 통신 연결을 등록할 수 있게 허용합니다."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"통신 연결 관리"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"앱이 통신 연결을 관리할 수 있게 허용합니다."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"통화 화면과 상호작용"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"앱에서 사용자가 통화 화면을 보는 시기와 방법을 제어하도록 허용합니다."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"전화 서비스와 상호 작용"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"앱을 전화 서비스와 상호 작용하도록 허용하여 전화를 송수신하세요."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"통화 사용자 경험 제공"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"앱에서 통화 사용자 경험을 제공하도록 허용합니다."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"이전 네트워크 사용량 읽기"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"앱이 특정 네트워크 및 앱에 대한 이전 네트워크 사용량을 읽을 수 있도록 허용합니다."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"네트워크 정책 관리"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"앱이 네트워크 정책을 관리하고 앱별 규칙을 정의할 수 있도록 허용합니다."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"네트워크 사용량 계산 수정"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"애플리케이션이 애플리케이션의 네트워크 사용량을 계산하는 방식을 수정할 수 있도록 허용합니다. 일반 애플리케이션에서는 사용하지 않습니다."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"알림 액세스"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"앱이 다른 앱에서 게시한 알림을 비롯하여 알림을 검색하고 살펴보며 삭제할 수 있도록 허용합니다."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"알림 수신기 서비스 사용"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"권한을 가진 프로그램이 알림 수신기 서비스에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"조건 제공자 서비스 사용"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"권한을 가진 프로그램이 조건 제공자 서비스의 최상위 인터페이스를 사용하도록 합니다. 일반 앱에는 필요하지 않습니다."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"드림 서비스에 연결"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"권한을 가진 프로그램이 드림 서비스에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"이동통신사에서 제공한 구성 앱 호출"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"권한을 가진 프로그램이 이동통신사에서 제공한 구성 앱을 호출하도록 합니다. 일반 앱에는 필요하지 않습니다."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"네트워크 상태에 대한 관측 보고 수신"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"애플리케이션이 네트워크 상태에 대한 관측 보고를 수신하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"입력 기기 보정 변경"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"앱이 터치 스크린의 보정 매개변수를 수정할 수 있도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM 인증서에 액세스"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"애플리케이션이 DRM 인증서를 프로비저닝하고 사용하도록 허용합니다. 일반 앱에서는 필요하지 않습니다."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam 전송 상태 수신"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"이 애플리케이션이 현재 Android Beam 전송 관련 정보를 수신하도록 허용합니다."</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM 인증서 삭제"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"애플리케이션이 DRM 인증서를 삭제하도록 허용합니다. 일반 앱에서는 필요하지 않습니다."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"이동통신사 메시지 서비스에 고정"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"보유자가 이동통신사 메시지 서비스의 최상위 인터페이스에 고정할 수 있습니다. 일반 앱에는 필요하지 않습니다."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"비밀번호 규칙 설정"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"화면 잠금 비밀번호와 PIN에 허용되는 길이와 문자 수를 제어합니다."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"화면 잠금해제 시도 모니터링"</string>
@@ -1028,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"가능한 원인"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> 준비 중"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"오류 확인 중"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"새로운 <xliff:g id="NAME">%s</xliff:g> 감지됨"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"사진 및 미디어를 전송하는 데 사용합니다."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> 손상됨"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g>이(가) 손상되었습니다. 다시 포맷해 보세요."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>이(가) 예기치 않게 삭제됨"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"데이터 손실을 피하려면 <xliff:g id="NAME">%s</xliff:g>을(를) 마운트 해제한 다음 삭제하세요."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> 삭제됨"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>이(가) 삭제되었습니다. 새로 삽입하세요."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"아직 <xliff:g id="NAME">%s</xliff:g> 꺼내는 중…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"삭제하지 마세요."</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"설정"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"꺼내기"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"둘러보기"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"일치하는 활동이 없습니다."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"미디어 출력 연결"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"앱이 미디어 출력을 기타 외부 기기에 연결할 수 있도록 허용합니다."</string>
@@ -1186,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"내부 저장소"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD 카드"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD 카드"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB 드라이브"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB 드라이브"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB 저장소"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"수정"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"데이터 사용 경고"</string>
@@ -1448,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"이 기능을 사용 중지할 때까지"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"접기"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"알림 차단"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"알림 일시중지"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"다운타임"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"평일 밤"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"주말"</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index e4ca5e9..53d5332 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -382,10 +382,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Колдонмого планшетиңизде же SIM-картаңызда сакталган SMS билдирүүлөрүңүздү окуганга уруксат берет. Бул колдонмого SMS билдирүүлөрүңүздү, алардын мазмунуна же конфиденциалдуулугуна карабастан, окууга уруксат берет."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Колдонмого сыналгыңызда же SIM картаңызда сакталган SMS билдирүүлөрүн окуу мүмкүнчүлүгүн берет. Ушуну менен колдонмо бардык SMS билдирүүлөрүн, алардын мазмунуна же купуялуулугуна карабастан окуй алат."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Колдонмого телефонуңузда же SIM-картаңызда сакталган SMS билдирүүлөрүңүздү окуганга уруксат берет. Бул колдонмого SMS билдирүүлөрүңүздү, алардын мазмунуна же конфиденциалдуулугуна карабастан, окуганга уруксат берет."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"билдирүүлөрүңүздү (SMS же MMS) өзгөртүү"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Колдонмого планшетиңизде же SIM картаңызда сакталган SMS билдирүүлөргө жазуу мүмкүнчүлүгүн берет. Кесепеттүү колдонмолор билдирүүлөрүңүздү жок кылып салышы мүмкүн."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Колдонмого сыналгы же SIM картаңызда сакталган SMS билдирүүлөрүн жазуу мүмкүнчүлүгүн берет. Зыянкеч колдонмолор билдирүүлөрүңүздү жок кылып салышы мүмкүн."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Колдонмого телефонуңузда же SIM картаңызда сакталган SMS билдирүүлөргө жазуу мүмкүнчүлүгүн берет. Кесепеттүү колдонмолор билдирүүлөрүңүздү жок кылып салышы мүмкүн."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"билдирүүлөрдү (WAP) кабыл алуу"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Колдонмого WAP билдирүүлөрүн кабыл алууга жана аларды иштетип чыгууга уруксат берет. Бул, колдонмо сизге билгизбестен түзмөгүңүзгө жөнөтүлгөн билдирүүлөрдү мониторлой же жок кыла алат дегенди билдирет."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"иштеп жаткан колдонмолорду түшүрүп алуу"</string>
@@ -557,21 +553,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Манжа изи жарым-жартылай аныкталды. Кайра аракет кылыңыз."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Манжа изи иштелбей койду. Кайра аракет кылыңыз."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Манжа изинин сенсору кирдеп калган. Тазалап, кайра аракет кылыңыз."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Манжа өтө тез жылдырылды. Кайра аракет кылыңыз."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Манжа өтө жай жылдырылды. Кайра аракет кылыңыз."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Манжа изинин аппараттык камсыздоосу жеткиликтүү эмес."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Манжа изин сактоо мүмкүн эмес. Учурдагы манжа изин алып салыңыз."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Манжа изин күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Манжа изи иш-аракети жокко чыгарылды."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Аракеттер өтө көп болду. Кийинчерээк кайра аракет кылыңыз."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Кайра бир аракеттениңиз."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<!-- no translation found for permlab_readSyncSettings (6201810008230503052) -->
@@ -599,6 +590,53 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Колдонмого SD картага жазуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP чалуу/чалууну кабыл алуу"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Колдонмого SIP чалууларга жана чалууларды кабыл алууга мүмкүнчүлүк берет."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"жаңы телеком SIM туташууларын каттоо"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Колдонмого жаңы телеком SIM туташууларын каттоо мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"жаңы телеком туташууларын каттоо"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Колдонмого жаңы телеком туташууларын каттоо мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"телеком туташууларын башкаруу"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Колдонмого телеком туташууларын башкаруу мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"чалуу экраны менен байланыштыруу"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Колдонмого чалуу экраны качан жана кандай көрүнө тургандыгын башкаруу мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"телефония кызматтары"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Колдонмого чалууларды жасоо/кабыл алуу үчүн телефония кызматтары менен байланышууга уруксат берет."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"чалуу ичиндеги колдонуучу тажрыйбасын камсыз кылуу"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Колдонмого чалуу учурундагы колдонуучу тажрыйбасын камсыз кылуу мүмкүнчүлүгүн берет."</string>
+ <!-- no translation found for permlab_readNetworkUsageHistory (7862593283611493232) -->
+ <skip />
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Колдонмого белгилүү бир тармактарга жана колдонмолорго байланыштуу тармактын колдонулушу жөнүндө таржымалды окуу мүмкүнчүлүгүн берет."</string>
+ <!-- no translation found for permlab_manageNetworkPolicy (2562053592339859990) -->
+ <skip />
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Колдонмого тармак саясаттарын башкаруу жана колдонмого мүнөздүү эрежелерди белгилөө мүмкүнчүлүгүн берет."</string>
+ <!-- no translation found for permlab_modifyNetworkAccounting (5088217309088729650) -->
+ <skip />
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Колдонмого желени башка колдонмолордун пайдалануусун башкарган тууралоолорду киргизүү уруксатын берет. Жөнөкөй колдонмолор үчүн эмес."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"эскертүүлөр менен иштөө"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Колдонмого (башка колдонмолор жайгаштырган дагы) эскертүүлөрдү алуу, изилдөө, жана аларды тазалоо мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"эскертүү тыңшагыч кызматына байланыштыруу"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Ээсине эскертүү тыңшагыч кызматтын жогорку деңгээл интерфейсине туташуу мүмкүнчүлүгүн берет. Жөнөкөй колдонмолордо эч качан керектелбейт."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"шарт түзүүчү кызматына жалгаштыруу"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Кармоочуга шарт түзүүчү кызматтын жогорку деңгээлдеги интерфейсине жалгашуу мүмкүнчүлүгүн берет. Кадимки колдонмолорго эч качан талап кылынбайт."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"dream кызматына жалгаштыруу"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Кармоочуга dream кызматынын жогорку деңгээлдеги интерфейсине жалгашуу мүмкүнчүлүгүн берет. Кадимки колдонмолорго эч качан талап кылынбайт."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"оператордун конфигурациялык колдонмосун чакыруу"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Ээсине оператор тарабынан берилген конфигурация колдонмосун чакыруу мүмкүнчүлүгүн берет. Жалпыга багышталган колдонмолордо эч качан колдонулбашы керек."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"тармак абалынын көрсөткүчтөрүн тыңшоо"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Колдонмого тармак абалынын көрсөткүчтөрүн тыңшоо мүмкүнчүлүгүн берет. Жалпыга багышталган колдонмолордо эч качан колдонулбашы керек."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"киргизүү түзмөгүнүн калибрлөөсүн өзгөртүү"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Колдонмого сенсордук экрандын калибрлөө параметрлерин өзгөртүү мүмкүнчүлүгүн берет. Кадимки колдонмолорго эч качан талап кылынбайт."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM тастыктамаларына кирүү"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Колдонмого DRM тастыктамаларын ишке киргизип, колдонуу мүмкүнчүлүгүн берет. Кадимки колдонмолорго эч качан талап кылынбайт."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam өткөрүү абалын алуу"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Бул колдонмого учурдагы Android Beam өткөрүүлөрү жөнүндө маалымат алуу мүмкүнчүлүгүн берет"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM тастыктамаларын алып салуу"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Колдонмого DRM тастыктамаларын алып салуу мүмкүнчүлүгүн берет. Кадимки колдонмолорго эч качан талап кылынбайт."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"оператордун билдирүү кызматына байланышуу"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Кармоочуга оператордун билдирүү кызматынын жогорку деңгээлдеги интерфейсине байланышуу мүмкүнчүлүгүн берет. Кадимки колдонмолорго эч качан талап кылынбашы мүмкүн."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<!-- no translation found for policylab_limitPassword (4497420728857585791) -->
<skip />
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Экран кулпусунун сырсөздөрү менен PIN\'дерине уруксат берилген узундук менен белгилерди көзөмөлдөө."</string>
@@ -830,8 +868,7 @@
<skip />
<!-- no translation found for lockscreen_pattern_instructions (7478703254964810302) -->
<skip />
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Тез жардам"</string>
<!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
<skip />
<!-- no translation found for lockscreen_pattern_correct (9039008650362261237) -->
@@ -1378,36 +1415,21 @@
<skip />
<!-- no translation found for candidates_style (4333913089637062257) -->
<skip />
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> даярдалууда"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Каталар текшерилүүдө"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Жаңы <xliff:g id="NAME">%s</xliff:g> аныкталды"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Сүрөттөрдү жана медиа өткөрүү үчүн"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> бүлүнгөн"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> бүлүнгөн; аны кайра форматтап көрүңүз"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> күтүүсүздөн алынып салынды"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Дайындарды жоготуунун алдын алуу үчүн чыгаруудан мурун <xliff:g id="NAME">%s</xliff:g> түзмөгүн бошотуңуз"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> алынды"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> алынды; жаңысын салыңыз"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> дагы эле чыгарылууда…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Чыгарба"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Орнотуу"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Чыгаруу"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Изилдөө"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Туура келген аракеттер табылбады."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Медиа чыгарылышын багыттоо"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Колдонмого медиа мазмунду башка тышкы түзмөктөргө багыттоо уруксатын берет."</string>
@@ -1586,6 +1608,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Ички сактагыч"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-карта"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<!-- no translation found for storage_usb (3017954059538517278) -->
<skip />
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Өзгөртүү"</string>
@@ -1864,7 +1892,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Бул өчүрүлгөнгө чейин"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Жыйнап коюу"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Үзгүлтүккө учуратууларды бөгөттөө"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Тынчымды алба"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Аракетсиз убакыт"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Иш түндөрү"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Дем алыш күндөрү"</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 3417493..870bd77 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ອະນຸຍາດໃຫ້ແອັບຯອ່ານ SMS ທີ່ບັນທຶກໄວ້ໃນແທັບເລັດ ຫຼື SIM card ຂອງທ່ານ. ຄຸນສົມບັດນີ້ຈະເຮັດໃຫ້ແອັບຯສາມາດອ່ານຂໍ້ຄວາມ SMS ທັງໝົດໄດ້ ບໍ່ເນື້ອຫາຂອງມັນຈະແມ່ນຫຍັງກໍຕາມ."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"ອະນຸຍາດໃຫ້ແອັບອ່ານຂໍ້ຄວາມ SMS ທີ່ເກັບໄວ້ຢູ່ໃນໂທລະພາບ ຫຼືແຜ່ນ SIM ຂອງທ່ານ. ອັນນີ້ອະນຸຍາດໃຫ້ແອັບອ່ານທຸກຂໍ້ຄວາມ SMS ໂດຍບໍ່ຄຳນຶງເຖິງເນື້ອໃນ ຫຼືຄວາມລັບ."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານຂໍ້ຄວາມ SMS ທີ່ເກັບໄວ້ໃນໂທລະສັບຂອງທ່ານ ຫຼືຊິມກາດ. ນີ້ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານຂໍ້ຄວາມ SMS ທັງໝົດ, ໂດຍບໍ່ຄຳນຶງເຖິງເນື້ອຫາ ຫຼືຄວາມລັບ."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"ແກ້ໄຂຂໍ້ຄວາມຂອງທ່ານ (SMS ຫຼື MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ອະນຸຍາດໃຫ້ແອັບຯຂຽນຂໍ້ຄວາມ SMS ທີ່ບັນທຶກໄວ້ໃນແທັບເລັດຂອງທ່ານ ຫຼືຊິມກາດຂອງທ່ານ. ແອັບຯທີ່ເປັນອັນຕະລາຍ ອາດລຶບຂໍ້ຄວາມຂອງທ່ານໄດ້."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"ອະນຸຍາດໃຫ້ແອັບຂຽນຫາຂໍ້ຄວາມ SMS ທີ່ເກັບໄວ້ຢູ່ໃນໂທລະພາບຫຼືແຜ່ນ SIM ຂອງທ່ານໄດ້. ແອັບທີ່ເປັນອັນຕະລາຍອາດຈະລຶບຂໍ້ຄວາມຂອງທ່ານໄດ້."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ອະນຸຍາດໃຫ້ແອັບຯ ຂຽນລົງໃສ່ຂໍ້ຄວາມ SMS ທີ່ເກັບໄວ້ໃນໂທລະສັບ ຫຼືຊິມກາດຂອງທ່ານ. ແອັບຯທີ່ເປັນອັນຕະລາຍ ອາດລຶບຂໍ້ຄວາມຂອງທ່ານໄດ້."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ຮັບຂໍ້ຄວາມສັ້ນ (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"ອະນຸຍາດໃຫ້ແອັບຯຮັບ ແລະປະມວນຜົນຂໍ້ຄວາມ WAP. ການອະນຸຍາດນີ້ຮວມເຖິງຄວາມສາມາດໃນການກວດເບິ່ງ ແລະລຶບຂໍ້ຄວາມທີ່ສົ່ງແລ້ວ ໂດຍບໍ່ຕ້ອງສະແດງໃຫ້ທ່ານເຫັນ."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ດຶງແອັບຯທີ່ເຮັດວຽກຢູ່ມາ"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ກວດພົບລາຍນີ້ວມືບາງສ່ວນແລ້ວ. ກະລຸນາລອງໃໝ່ອີກ."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ບໍ່ສາມາດດຳເນີນການລາຍນີ້ວມືໄດ້. ກະລຸນາລອງໃໝ່ອີກ."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ເຊັນເຊີລາຍນີ້ວມືເປື້ອນ. ກະລຸນາທຳຄວາມສະອາດ ແລະລອງໃໝ່ອີກ."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"ຍ້າຍນີ້ວມືໄປໄວເກີນໄປ. ກະລຸນາລອງໃໝ່ອີກ."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"ຍ້າຍນີ້ວມືໄປຊ້ເກີນໄປ. ກະລຸນາລອງໃໝ່ອີກ."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ບໍ່ມີຮາດແວລາຍນີ້ວມືໃຫ້ຢູ່."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ບໍ່ສາມາດເກັບຮັກສາລາຍນີ້ວມືໄວ້ໄດ້. ກະລຸນາເອົາລາຍນີ້ວມືທີ່ມີຢູ່ອອກໄປ."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ເວລາລາຍນີ້ວມືບໍ່ເຂົ້າເຖິງໄດ້. ລອງໃໝ່ອີກ."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ຍົກເລີກການດຳເນີນການລາຍນີ້ວມືແລ້ວ."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ລອງໃໝ່ພາຍຫຼັງ."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ລອງໃໝ່ອີກຄັ້ງ."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ອ່ານການຕັ້ງຄ່າຊິ້ງຂໍ້ມູນ"</string>
@@ -468,6 +459,48 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"ອະນຸຍາດໃຫ້ແອັບຯຂຽນຂໍ້ມູນລົງໃນ SD card ໄດ້."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"ຮັບສາຍ/ໂທອອກ ຜ່ານ SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"ອະນຸຍາດໃຫ້ແອັບຯສາມາດຮັບສາຍ ແລະໂທອອກຜ່ານ SIP ໄດ້"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ລົງທະບຽນ SIM ການເຊື່ອມຕໍ່ໂທລະຄົມມະນາຄົມໃໝ່"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"ອະນຸຍາດໃຫ້ແອັບຯລົງທະບຽນ SIM ການເຊື່ອມຕໍ່ໂທລະຄົມມະນາຄົມໃໝ່."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ລົງທະບຽນການເຊື່ອມຕໍ່ໂທລະຄົມມະນາຄົມໃໝ່"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ອະນຸຍາດໃຫ້ແອັບຯລົງທະບຽນການເຊື່ອມຕໍ່ໂທລະຄົມມະນາຄົມໃໝ່."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"ຈັດການການເຊື່ອມຕໍ່ໂທລະຄົມມະນາຄົມ"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"ອະນຸຍາດໃຫ້ແອັບຯຈັດການການເຊື່ອມຕໍ່ໂທລະຄົມມະນາຄົມ."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ໂຕ້ຕອບກັບໜ້າຈໍການໂທ"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ອະນຸຍາດໃຫ້ແອັບຯຄວບຄຸມເວລາ ແລະວິທີການທີ່ຜູ່ໃຊ້ເຫັນໜ້າຈໍການໂທໄດ້."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"ສັ່ງບໍລິການໂທລະສັບ"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"ອະນຸຍາດໃຫ້ແອັບຯສັ່ງບໍລິການໂທລະສັບເພື່ອໂທຫຼືຮັບສາຍໄດ້."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ສະໜອງປະສົບການຜູ່ໃຊ້ໃນການໂທລະສັບ"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"ອະນຸຍາດໃຫ້ແອັບຯສະໜອງປະສົບການຜູ່ໃຊ້ໃນການໂທລະສັບ."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ອ່ານປະຫວັດການນຳໃຊ້ເຄືອຂ່າຍ"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານປະຫວັດການນຳໃຊ້ເຄືອຂ່າຍຂອງແອັບຯ ແລະເຄືອຂ່າຍໃດນຶ່ງ."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ຈັດການນະໂຍບາຍເຄືອຂ່າຍ"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ອະນຸຍາດໃຫ້ແອັບຯຈັດການກັບນະໂຍບາຍເຄືອຂ່າຍ ແລະກຳນົດກົດລະບຽບສະເພາະຂອງແອັບຯ."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ແກ້ໄຂການຄຳນວນການນຳໃຊ້ເຄືອຂ່າຍ"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ອະນຸຍາດໃຫ້ແອັບຯແກ້ໄຂວິທີການບັນທຶກບັນຊີ ການນຳໃຊ້ເຄືອຂ່າຍຂອງແອັບຯ. ແອັບຯທົ່ວໄປບໍ່ຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"ເຂົ້າເຖິງການແຈ້ງເຕືອນ"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ອະນຸຍາດໃຫ້ແອັບຯດຶງຂໍ້ມູນ, ກວດສອບ ແລະລຶບລ້າງການແຈ້ງເຕືອນ ຮວມທັງພວກທີ່ໂພສໂດຍແອັບຯອື່ນໆນຳ."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ເຊື່ອມໂຍງກັບບໍລິການໂຕຟັງການແຈ້ງເຕືອນ"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງເຊື່ອມໂຍງສ່ວນຕິດຕໍ່ລະດັບເທິງສຸດ ຂອງຜູ່ຟັງບໍລິການການແຈ້ງເຕືອນ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"ເຊື່ອມໂຍງກັບບໍລິການຜູ່ສະໜອງເງື່ອນໄຂ"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງເຊື່ອມໂຍງສ່ວນຕິດຕໍ່ລະດັບສູງສຸດຂອງບໍລິການສະໜອງເງື່ອນໄຂ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"ຜູກກັບບໍລິການ dream"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"ອະນຸຍາດໃຫ້ຜູ່ຖືຜູກກັບສ່ວນຕິດຕໍ່ລະດັບສູງສຸດ ຂອງບໍລິການ dream. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ຮ້ອງຂໍແອັບຯປັບຄ່າທີ່ສະໜອງໂດຍຜູ່ໃຫ້ບໍລິການ"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງຮ້ອງຂໍແອັບຯປັບຄ່າທີ່ສະໜອງໂດຍຜູ່ໃຫ້ບໍລິການ. ບໍ່ໜ້າຈະຕ້ອງການສຳລັບແອັບຯທົ່ວໄປ."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ຕິດຕາມເພື່ອສັງເກດສະພາບຂອງເຄືອຂ່າຍ"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັ່ນຕິດຕາມເພື່ອສັງເກດສະພາບຂອງເຄືອຂ່າຍ. ປົກກະຕິແລ້ວແອັບຯທຳມະດາຈະບໍ່ຕ້ອງການໃຊ້."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ປ່ຽນການວັດແທ້ອຸປະກອນປ້ອນຂໍ້ມູນ"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"ອະນຸຍາດໃຫ້ແອັບຯແກ້ໄຂຄ່າການວັດແທ້ໜ້າຈໍສຳຜັດ. ແອັບຯທຳມະດາບໍ່ຄວນໃຊ້."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"ເຂົ້າເຖິງໃບຮັບຮອງ DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນຈັດຫາ ແລະນຳໃຊ້ໃບຮັບຮອງ DRM. ແອັບຯທຳມະດາບໍ່ຄວນຕ້ອງການໃຊ້."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"ຮັບສະຖານະການໂອນຂໍ້ມູນ Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນນີ້ຮັບຂໍ້ມູນກ່ຽວກັບການໂອນຂໍ້ມູນ Android Beam ໃນປັດຈຸບັນ"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"ລຶບໃບຮັບຮອງ DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນລຶບໃບຮັບຮອງ DRM. ແອັບຯທົ່ວໄປບໍ່ຄວນຈຳເປັນຕ້ອງໃຊ້."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"ຜູກພັນກັບການບໍລິການສົ່ງຂໍ້ຄວາມຜູ້ໃຫ້ບໍລິການ"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"ອະນຸຍາດໃຫ້ຜູ້ຖືຜູກພັນກັບຕົວປະສານລະດັບສູງສຸດຂອງບໍລິການສົ່ງຂໍ້ຄວາມຜູ້ໃຫ້ບໍລິການ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string>
+ <string name="permlab_bindCarrierConfigService" msgid="4110548389449423386">"ປະຕິບັດຕາມການບໍລິການກຳນົດຄ່າຂອງບໍລິສັດເຄືອຂ່າຍມືຖື"</string>
+ <string name="permdesc_bindCarrierConfigService" msgid="1096888107671817447">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງປະຕິບັດຕາມການບໍລິການກຳນົດຄ່າຂອງບໍລິສັດເຄືອຂ່າຍມືຖື. ບໍ່ຄວນຈະໄດ້ໃຊ້ໃນແອັບທົ່ວໄປ."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"ຕັ້ງຄ່າກົດຂອງລະຫັດຜ່ານ"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"ຄວບຄຸມຄວາມຍາວ ແລະຕົວອັກສອນທີ່ອະນຸຍາດໃຫ້ຢູ່ໃນລະຫັດລັອກໜ້າຈໍ ແລະ PIN."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"ຕິດຕາມການພະຍາຍາມປົດລັອກໜ້າຈໍ"</string>
@@ -1028,36 +1061,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"ຕົວເລືອກ"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"ກຳລັງກຽມ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ກຳລັງກວດຫາຂໍ້ຜິດພາດ"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ກວດພົບ <xliff:g id="NAME">%s</xliff:g> ໃໝ່ແລ້ວ"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ສຳລັບການໂອນຮູບຖ່າຍ ແລະມີເດຍ"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> ເສຍຫາຍແລ້ວ"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> ເສຍຫາຍ. ລອງຟໍແມັດມັນອີກຄັ້ງເບິ່ງ"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ຖືກຖອດອອກໄປແບບບໍ່ຄາດຄິດ"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ຖອດເຊື່ອມຕໍ່ <xliff:g id="NAME">%s</xliff:g> ກ່ອນເອົາອອກໄປ ເພື່ອຫຼີກເວັ້ນການເສຍຂໍ້ມູນ"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"ເອົາ <xliff:g id="NAME">%s</xliff:g> ອອກໄປແລ້ວ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ຖືກຖອດອອກແລ້ວ. ກະລຸນາໃສ່ອັນໃໝ່"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ຍັງກຳລັງເອົາອອກ <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ຢ່າເອົາອອກ"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"ຕິດຕັ້ງ"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"ເອົາອອກ"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"ຄົ້ນຫາ"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"ບໍ່ພົບກິດຈະກຳທີ່ກົງກັນ."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"ກຳນົດເສັ້ນທາງເອົ້າພຸດຂອງສື່"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນ ກຳນົດເສັ້ນທາງເອົ້າພຸດຂອງສື່ໄປຫາອຸປະກອນພາຍນອກອື່ນໆ."</string>
@@ -1187,6 +1205,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"ບ່ອນຈັດເກັບຂໍ້ມູນພາຍໃນ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD card"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> ແຜ່ນ SD"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB ດຣ້າຍ"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ດຣ້າຍ"</string>
<string name="storage_usb" msgid="3017954059538517278">"ບ່ອນຈັດເກັບຂໍ້ມູນ USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ແກ້ໄຂ"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ເຕືອນກ່ຽວກັບການນຳໃຊ້ຂໍ້ມູນ"</string>
@@ -1449,7 +1470,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"ຈົນກວ່າທ່ານຈະປິດ"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ຫຍໍ້"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"ບລັອກການລົບກວນ"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"ຫ້າມລົບກວນ"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ເວລາປິດເຮັດວຽກ"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ຄືນວັນຈັນຫາສຸກ"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"ທ້າຍອາທິດ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index d756805..d36f4bc 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -272,10 +272,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Leidžiama programai skaityti planšetiniame kompiuteryje ar SIM kortelėje saugomus SMS pranešimus. Taip programai leidžiama skaityti visus SMS pranešimus, neatsižvelgiant į turinį ar konfidencialumą."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Programai leidžiama nuskaityti TV arba SIM kortelėje saugomus SMS pranešimus. Taip programos gali nuskaityti visus SMS pranešimus, neatsižvelgiant į turinį ar konfidencialumą."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Leidžiama programai skaityti telefone ar SIM kortelėje saugomus SMS pranešimus. Taip programai leidžiama skaityti visus SMS pranešimus, neatsižvelgiant į turinį ar konfidencialumą."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"redaguoti teksto pranešimus (SMS arba MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Leidžiama programai rašyti SMS pranešimus, išsaugotus jūsų planšetiniame kompiuteryje ar SIM kortelėje. Kenkėjiškos programos gali ištrinti jūsų pranešimus."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Programai leidžiama rašyti TV arba SIM kortelėje saugomus SMS pranešimus. Kenkėjiškos programos gali ištrinti pranešimus."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Leidžiama programai rašyti SMS pranešimus, išsaugotus jūsų telefone ar SIM kortelėje. Kenkėjiškos programos gali ištrinti jūsų pranešimus."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"gauti teksto pranešimus (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Leidžiama programai gauti ir apdoroti WAP pranešimus. Šis leidimas apima galimybę stebėti ar ištrinti jums siunčiamus pranešimus jums jų neparodžius."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"nuskaityti vykdomas programas"</string>
@@ -431,21 +427,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Aptiktas dalinis kontrolinis kodas. Bandykite dar kartą."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nepavyko apdoroti kontrolinio kodo. Bandykite dar kartą."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Kontrolinio kodo jutiklis purvinas. Nuvalykite ir bandykite dar kartą."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Per greitai judinate pirštą. Bandykite dar kartą."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Per lėtai judinate pirštą. Bandykite dar kartą."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Kontrolinio kodo aparatinė įranga nepasiekiama."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Negalima išsaugoti kontrolinio kodo. Pašalinkite esamą kontrolinį kodą."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Baigėsi kontrolinio kodo nustatymo skirtasis laikas. Bandykite dar kartą."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Kontrolinio kodo operacija atšaukta."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Per daug bandymų. Vėliau bandykite dar kartą."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Bandykite dar kartą."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"skaityti sinchronizavimo nustatymus"</string>
@@ -470,6 +461,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Leidžiama programai rašyti į SD kortelę."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"skambinti / priimti SIP skambučius"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Leidžiama programai skambinti ir priimti SIP skambučius."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registruoti naujus telekomunikacijų SIM ryšius"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Programai leidžiama registruoti naujus telekomunikacijų SIM ryšius."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registruoti naujus telekomunikacijų ryšius"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Programai leidžiama registruoti naujus telekomunikacijų ryšius."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"tvarkyti telekomunikacijų ryšius"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Programai leidžiama tvarkyti telekomunikacijų ryšius."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"sąveika su gaunamojo skambučio ekranu"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Programai leidžiama valdyti, kada ir kaip naudotojai matys gaunamojo skambučio ekraną."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"sąveikauti su telefonijos paslaugomis"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Programai leidžiama sąveikauti su telefonijos paslaugomis skambučiams atlikti / gauti."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"naudotojui teikti paslaugas vykstant skambučiui"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Programai leidžiama teikti naudotojui paslaugas vykstant skambučiui."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"skaityti tinklo naudojimo istoriją"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Leidžiama programai skaityti konkrečių tinklų ir programų tinklo naudojimo istoriją."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"valdyti tinklo politiką"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Leidžiama programai valdyti tinklo politiką ir apibrėžti konkrečios programos taisykles."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"keisti tinklo naudojimo apskaitą"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Leidžiama programai keisti, kaip tinklas naudojamas, palyginti su programomis. Neskirta naudoti įprastoms programoms."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"pasiekti pranešimus"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Programai leidžiama gauti, patikrinti ir išvalyti pranešimus, įskaitant pranešimus, kuriuos paskelbė kitos programos."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"susisaistyti su pranešimų skaitymo priemonės paslauga"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Leidžiama turėtojui susisaistyti su pranešimų skaitymo priemonės paslaugos aukščiausio lygio sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"susaistyti su sąlygos teikėjo paslauga"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Turėtojui leidžiama susaistyti programą su sąlygos teikėjo paslaugos aukščiausio lygio sąsaja. Įprastoms programoms to niekada neturėtų prireikti."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"susisaistyti su mėgstama paslauga"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Savininkui leidžiama susisaistyti su mėgstamos paslaugos aukščiausio lygio sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"iškviesti operatoriaus pateiktą konfigūravimo programą"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Turėtojui leidžiama iškviesti operatoriaus pateiktą konfigūravimo programą. Įprastoms programoms to neturėtų prireikti."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"vykdyti tinklo sąlygų stebėjimą"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Leidžiama programai vykdyti tinklo sąlygų stebėjimą. To niekada neturėtų prireikti naudojant įprastas programas."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"keisti įvesties įrenginio kalibravimą"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Leidžiama programai keisti jutiklinio ekrano kalibravimo parametrus. Neturėtų prireikti naudojant įprastas programas."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"gali pasiekti DRM sertifikatus"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Programai leidžiama pasiekti ir naudoti DRM sertifikatus. Neturėtų prireikti naudojant įprastas programas."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Gauti „Android“ perdavimo funkcijos perkėlimo būseną"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Programai leidžiama gauti informaciją apie dabartinius „Android“ perdavimo funkcijos perkėlimus"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"pašalinti DRM sertifikatus"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Programai leidžiama pašalinti DRM sertifikatus. Neturėtų prireikti naudojant įprastas programas."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"susaistyti su operatoriaus susirašinėjimo žinutėmis paslauga"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Leidžiama savininkui susisaistyti su aukščiausio lygio operatoriaus susirašinėjimo žinutėmis paslaugos sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Nustatyti slaptažodžio taisykles"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Valdykite, kokio ilgio ekrano užrakto slaptažodžius ir PIN kodus galima naudoti."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Stebėti bandymus atrakinti ekraną"</string>
@@ -1042,36 +1077,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidatai"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Ruošiama <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tikrinama, ar nėra klaidų"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Aptikta nauja <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Norint perkelti nuotraukas ir mediją"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Sugadinta <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> sugadinta; pabandykite formatuoti iš naujo"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> netikėtai pašalinta"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Išmontuokite <xliff:g id="NAME">%s</xliff:g> prieš pašalindami, kad neprarastumėte duomenų."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Pašalinta <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> pašalinta; įdėkite naują"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Vis dar šalinama <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Nepašalinti"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Sąranka"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Pašalinti"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Naršyti"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nerasta atitinkančios veiklos."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Medijos išvesties nukreipimas"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Leidžiama programai nukreipti medijos išvestį į kitus išorinius įrenginius."</string>
@@ -1203,6 +1223,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Vidinė atmintis"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD kortelė"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB atmintis"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Redaguoti"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Įspėjimas dėl duomenų naudojimo"</string>
@@ -1475,7 +1501,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Kol išjungsite"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Sutraukti"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Netrukdyti"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Netrukdyti"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prastova"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Savaitgalių naktimis"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Savaitgaliais"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index b0f83da..a652445 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -271,10 +271,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Ļauj lietotnei lasīt planšetdatorā vai SIM kartē saglabātās īsziņas. Tas ļauj lietotnei lasīt visas īsziņas, neraugoties uz to saturu vai konfidencialitāti."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Ļauj lietotnei lasīt televizorā vai SIM kartē saglabātās īsziņas. Šādi lietotne var lasīt visas īsziņas neatkarīgi no to satura vai konfidencialitātes."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Ļauj lietotnei lasīt tālrunī vai SIM kartē saglabātās īsziņas. Tas ļauj lietotnei lasīt visas īsziņas, neraugoties uz to saturu vai konfidencialitāti."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"rediģēt ziņojumus (SMS vai MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Ļauj lietotnei rakstīt īsziņās, kas ir saglabātas planšetdatorā vai SIM kartē. Ļaunprātīgas lietotnes var dzēst jūsu ziņojumus."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Ļauj lietotnei rakstīt īsziņās, kas ir saglabātas televizorā vai SIM kartē. Ļaunprātīgas lietotnes var dzēst jūsu ziņojumus."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Ļauj lietotnei rakstīt īsziņās, kas ir saglabātas tālrunī vai SIM kartē. Ļaunprātīgas lietotnes var dzēst jūsu ziņojumus."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"saņemt īsziņas (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Ļauj lietotnei saņemt un apstrādāt WAP ziņojumus. Šī atļauja ietver iespēju pārraudzīt vai dzēst jums nosūtītos ziņojumus, neparādot tos jums."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"izgūt izmantotās lietotnes"</string>
@@ -430,21 +426,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Noteikts daļējs pirksta nospiedums. Lūdzu, mēģiniet vēlreiz."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nevarēja apstrādāt pirksta nospiedumu. Lūdzu, mēģiniet vēlreiz."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Pirkstu nospiedumu sensors ir netīrs. Lūdzu, notīriet to un mēģiniet vēlreiz."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Pārāk ātra pirksta kustība. Lūdzu, mēģiniet vēlreiz."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Pārāk lēna pirksta kustība. Lūdzu, mēģiniet vēlreiz."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Nospieduma aparatūra nav pieejama."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Pirkstu nospiedumu nevar saglabāt. Lūdzu, noņemiet esošu pirksta nospiedumu."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Pirkstu nospiedumu nolasīšanas aparatūras noildze. Mēģiniet vēlreiz."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Nospieduma darbība neizdevās."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Mēģiniet vēlreiz."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lasīt sinhronizācijas iestatījumus"</string>
@@ -469,6 +460,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ļauj lietotnei rakstīt SD kartē."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP zvanu veikšana/saņemšana"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ļauj lietotnei veikt un saņemt SIP zvanus."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"reģistrēt jaunus telekomunikāciju SIM savienojumus"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Ļauj lietotnei reģistrēt jaunus telekomunikāciju SIM savienojumus."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"reģistrēt jaunus telekomunikāciju savienojumus"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Ļauj lietotnei reģistrēt jaunus telekomunikāciju savienojumus."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"telekomunikācijas savienojumu pārvaldība"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Ļauj lietotnei pārvaldīt telekomunikācijas savienojumus."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"Mijiedarboties ar zvana laikā rādītu ekrānu"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Ļauj lietotnei kontrolēt, kad un kā lietotājam ir redzams zvana laikā redzamais ekrāns."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"mijiedarbība ar tālruņu komunikācijas pakalpojumiem"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Ļauj lietotnei sazināties ar tālruņu komunikācijas pakalpojumiem, lai veiktu vai saņemtu zvanus."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"Nodrošināt lietotāja pieredzi zvana laikā"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Ļauj lietotnei nodrošināt lietotāja pieredzi zvana laikā."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lasīt informāciju par iepriekšēju tīkla izmantošanu"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Ļauj lietotnei lasīt informāciju par iepriekšēju tīkla izmantošanu saistībā ar noteiktiem tīkliem un lietotnēm."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"pārvaldīt tīkla politiku"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Ļauj lietotnei pārvaldīt tīkla politikas un noteikt lietotnes kārtulas."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"Tīkla lietojuma uzskaites mainīšana"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Ļauj lietotnei mainīt to, kā tīkla lietojums tiek uzskaitīts saistībā ar lietotnēm. Atļauja neattiecas uz parastām lietotnēm."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"piekļuve paziņojumiem"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Ļauj lietotnei izgūt, pārbaudīt un dzēst paziņojumus, tostarp lietotņu publicētos paziņojumus."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"saites izveidošana ar paziņojumu uztvērēja pakalpojumu"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Ļauj īpašniekam izveidot saiti ar paziņojumu uztvērēja pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"Saistīšana ar nosacījumu sniedzēja pakalpojumu"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Ļauj īpašniekam izveidot savienojumu ar drukas nosacījumu sniedzēja pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"piesaistīt ekrānsaudzētāja pakalpojumu"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Ļauj īpašniekam piesaistīt ekrānsaudzētāja pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"Operatora nodrošinātas konfigurācijas lietotnes izsaukšana"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Ļauj īpašniekam izsaukt operatora nodrošināto konfigurācijas lietotni. Parastām lietotnēm tas nekad nav nepieciešams."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"iegūt informāciju par tīkla stāvokļa novērojumiem"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Ļauj lietojumprogrammai iegūt informāciju par tīkla stāvokļa novērojumiem. Parastām lietotnēm šī atļauja nekad nav nepieciešama."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"mainīt ievadierīces kalibrēšanu"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Ļauj lietotnei pārveidot skārienekrāna kalibrēšanas parametrus. Parastām lietotnēm šī atļauja nekad nav nepieciešama."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"Piekļuve digitālā satura tiesību pārvaldības sertifikātiem"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Ļauj lietojumprogrammai nodrošināt un izmantot digitālā satura tiesību pārvaldības sertifikātus. Parastām lietotnēm šī atļauja nekad nav nepieciešama."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Saņemt Android Beam pārsūtīšanas statusu"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Ļauj šai lietojumprogrammai saņemt informāciju par pašreizēju Android Beam pārsūtīšanu"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"noņemt DRM sertifikātus"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Ļauj lietojumprogrammai noņemt DRM sertifikātus. Parastās lietotnēs tas nebūs nepieciešams."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"Savienojuma izveide ar mobilo sakaru operatora ziņojumapmaiņas pakalpojumu"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Ļauj īpašniekam izveidot savienojumu ar mobilo sakaru operatora ziņojumapmaiņas pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Paroles kārtulu iestatīšana"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Kontrolēt ekrāna bloķēšanas paroļu un PIN garumu un tajos atļautās rakstzīmes."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Ekrāna atbloķēšanas mēģinājumu pārraudzīšana"</string>
@@ -629,8 +664,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Nospiediet Izvēlne, lai atbloķētu, vai veiciet ārkārtas zvanu."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Lai atbloķētu, nospiediet vienumu Izvēlne."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Zīmējiet kombināciju, lai atbloķētu."</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Ārkārtas"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Atpakaļ pie zvana"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Pareizi!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Mēģināt vēlreiz"</string>
@@ -1036,36 +1070,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidāti"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Notiek <xliff:g id="NAME">%s</xliff:g> sagatavošana"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tiek meklētas kļūdas"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Tika atrasta jauna <xliff:g id="NAME">%s</xliff:g>."</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Varat to izmantot fotoattēlu un satura pārsūtīšanai."</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> ir bojāta"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> atmiņa ir bojāta. Mēģiniet to atkārtoti formatēt."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> tika negaidīti izņemta"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Pirms izņemšanas atvienojiet <xliff:g id="NAME">%s</xliff:g>, lai nezaudētu datus."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> tika izņemta"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ir izņemta. Ievietojiet citu datu nesēju."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> joprojām tiek atvienota…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Neizņemiet to."</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Iestatīt"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Izstumt"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Izpētīt"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nav atrasta neviena atbilstoša darbība."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Multivides datu izejas maršrutēšana"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Ļauj lietojumprogrammai maršrutēt multivides datu izeju uz citām ārējām ierīcēm."</string>
@@ -1196,6 +1215,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s: %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Iekšējā atmiņa"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD karte"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB atmiņa"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Rediģēt"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Datu izmantošanas brīdinājums"</string>
@@ -1463,7 +1488,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Līdz brīdim, kad izslēgsiet"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Sakļaut"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloķēt pārtraukumus"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Netraucēt"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Dīkstāve"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Darbadienu naktīs"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Brīvdienās"</string>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index f3eeca4..84f1d7b 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Овозможува апликацијата да чита СМС пораки зачувани на вашиот таблет или на СИМ картичката. Ова овозможува апликацијата да ги прочита сите СМС пораки, без разлика на нивната содржината или доверливост."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Дозволува апликацијата да ги чита СМС пораките кои се складирани на вашиот телевизор или СИМ-картичка. Ова дозволува апликацијата да ги чита сите СМС пораки, без разлика на содржината или доверливоста."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Овозможува апликацијата да чита СМС пораки зачувани на вашиот телефон или на СИМ картичката. Ова овозможува апликацијата да ги прочита сите СМС пораки, без разлика на нивната содржина или доверливост."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"уреди ги своите текстуални пораки (СМС или ММС)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Дозволува апликацијата да пишува СМС-пораки складирани на таблетот или на СИМ-картичката. Злонамерните апликации може да ги избришат вашите пораки."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Дозволува апликацијата да запишува по СМС-пораките складирани на вашиот телевизор или СИМ-картичка. Злонамерните апликации може да ги избришат вашите пораки."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Дозволува апликацијата да пишува СМС-пораки складирани на телефонот или на СИМ-картичката. Злонамерните апликации може да ги избришат вашите пораки."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"прими текстуални пораки (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Овозможува апликацијата да прима и да обработува WAP пораки. Оваа дозвола ја опфаќа способноста за следење или за бришење пораки испратени до вашиот уред без да ви ги прикаже вам."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"обнови активни апликации"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Откриен е делумен отпечаток. Обидете се повторно."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Отпечатокот не можеше да се обработи. Обидете се повторно."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Сензорот за отпечатоци е валкан. Исчистете го и обидете се повторно."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Прстот се дрижеше пребрзо. Обидете се повторно."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Прстот се движеше премногу бавно. Обидете се повторно."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отпечаток од прст не е достапен."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатокот не може да се складира. Отстранете го постоечкиот отпечаток."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Се достигна времето на истекување на отпечатокот. Обидете се повторно."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Операцијата со отпечаток од прст се откажа."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Премногу обиди. Обидете се повторно подоцна."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Обидете се повторно."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"прочитај синхронизирани подесувања"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Дозволува апликацијата да пишува на СД-картичката."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"остварувај/примај повици преку СИП"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Дозволува апликацијата да остварува и прима повици преку СИП."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"регистрира нови телекомуникациски врски преку СИМ"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Дозволува апликацијата да регистрира нови телекомуникациски врски преку СИМ."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"регистрира нови телекомуникациски врски"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Дозволува апликацијата да регистрира нови телекомуникациски врски."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"управува со телекомуникациски врски"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Дозволува апликацијата да управува со телекомуникациски врски."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"комуницирај со екран на дојдовен повик"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Овозможува апликацијата да контролира кога и како корисникот го гледа екранот на дојдовен повик."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"комуницира со телефонски услуги"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Дозволува апликацијата да комуницира со телефонски услуги за да прави/прима повици."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"обезбеди искуство за корисникот при дојдовен повик"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Овозможува апликацијата да обезбеди искуство за корисникот при дојдовен повик."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"читај употреба на мрежа во минатото"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Дозволува апликацијата да го чита историското користење на мрежата за одредени мрежи или апликации."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"управувај со политика на мрежа"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Дозволува апликацијата да управува со мрежните политики и да дефинира правила карактеристични за дадена апликација."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"измени пресметување употреба на мрежа"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Овозможува апликацијата да менува како се смета користењето на мрежата наспроти апликации. Не се користи со стандардни апликации."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"пристапи кон известувања"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Овозможува апликацијата да враќа, проверува и брише известувања, вклучувајќи ги и оние објавени од други апликации."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"поврзи се со услугата слушател на известувања"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Овозможува сопственикот да се поврзе со интерфејс од највисоко ниво на услугата слушател на известувања. Не треба да се користи за стандардни апликации."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"поврзување со услуга за давател на услов"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Дозволува сопственикот да се поврзе со интерфејс од највисоко ниво на давател на услуги за услов. Не треба да се користи за стандардни апликации."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"поврзи се со услугата мечтаење"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Дозволува сопственикот да се поврзе со интерфејс од највисоко ниво на услугата мечтаење. Не треба да се користи за стандардни апликации."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"повикај конфигурација на апликацијата обезбедена од давателот"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Овозможува сопственикот да ја повика конфигурацијата на апликацијата обезбедена од давателот. Не треба да се користи за стандардни апликации."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"слушај за набљудувања во врска со услови на мрежа"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Овозможува апликацијата да слуша за набљудувања во врска со условите на мрежата. Не треба да се користи за стандардни апликации."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"промени калибрирање на уред за внес"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Дозволува апликацијата да ги изменува калибрирачките параметри на екранот на допир. Не треба да се користи за стандардни апликации."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"пристап до ДРМ-сертификати"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Дозволува апликацијата да обезбедува и користи ДРМ-сертификати. Не треба да се користи за стандардни апликации."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Примајте статус на трансфер на Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Ѝ дозволува на оваа апликација да добива информации за моменталните трансфери на Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"отстранување ДРМ-сетификати"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Дозволува апликација да отстранува ДРМ-сертификати. Не треба да се користи за стандардни апликации."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"сврзување со давателот на услугата за пораки"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Дозволува сопственикот да се сврзе со интерфејсот од највисоко ниво на давателот на услугата за пораки. Не треба да се користи за стандардни апликации."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Подеси правила за лозинката"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Контролирај ги должината и знаците што се дозволени за лозинки и ПИН-броеви за отклучување екран."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Следи ги обидите за отклучување на екранот"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Притисни „Мени“ да се отклучи или да направи итен повик."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Притиснете „Мени“ за да се отклучи."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Употребете ја шемата за да се отклучи"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Итен случај"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Врати се на повик"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Точно!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Обидете се повторно"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Се подготвува <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Се проверува за грешки"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Откриена е нова <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За пренесување фотографии и медиуми"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Оштетена <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> е оштетена; обидете се да ја форматирате повторно"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> неочекувано е отстранета"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Откачете ја <xliff:g id="NAME">%s</xliff:g> пред да ја отстраните за да избегнете губење на податоците"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Отстранета <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> е отстранета; вметнете нова"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Сѐ уште се вади <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не отстранувај"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Поставување"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Извади"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Истражувај"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Не се пронајдени соодветни активности."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Насочи излез за медиуми"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Овозможува апликацијата да насочува излез за медиуми кон други надворешни уреди."</string>
@@ -1190,6 +1209,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Внатрешна меморија"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"СД картичка"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"УСБ меморија"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Уреди"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Предупредување за користење податоци"</string>
@@ -1452,7 +1477,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Додека не го исклучите"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Собери"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Блокирај прекини"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не вознемирувај"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Пауза"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Ноќите во неделата"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Викенди"</string>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index 224353b..416b4a7 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"നിങ്ങളുടെ ടാബ്ലെറ്റിലോ സിം കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങൾ വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് ഉള്ളടക്കമോ രഹസ്യാത്മകതയോ പരിഗണിക്കാതെ എല്ലാ SMS സന്ദേശങ്ങളും വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"നിങ്ങളുടെ ടിവിയിലോ SIM കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങൾ റീഡുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉള്ളടക്കമോ രഹസ്യാത്മകതയോ ഇല്ലാത്ത എല്ലാ SMS സന്ദേശങ്ങളും വായിക്കുന്നതിന് ഇത് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"നിങ്ങളുടെ ഫോണിലോ സിം കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങൾ വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് ഉള്ളടക്കമോ രഹസ്യാത്മകതയോ പരിഗണിക്കാതെ എല്ലാ SMS സന്ദേശങ്ങളും വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"നിങ്ങളുടെ വാചക സന്ദേശങ്ങൾ എഡിറ്റുചെയ്യുക (SMS അല്ലെങ്കിൽ MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"നിങ്ങളുടെ ടാബ്ലെറ്റിലോ സിം കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങളിലേക്ക് റൈറ്റുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ദോഷകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ സന്ദേശങ്ങളെ ഇല്ലാതാക്കിയേക്കാം."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"നിങ്ങളുടെ ടിവിയിലോ SIM കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങളിൽ റൈറ്റുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ദോഷകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ സന്ദേശങ്ങൾ ഇല്ലാതാക്കിയേക്കാം."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"നിങ്ങളുടെ ഫോണിലോ സിം കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങളിലേക്ക് റൈറ്റുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ദോഷകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ സന്ദേശങ്ങളെ ഇല്ലാതാക്കിയേക്കാം."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"വാചക സന്ദേശം നേടുക (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP സന്ദേശങ്ങൾ നേടാനും പ്രോസസ്സുചെയ്യാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. നിങ്ങൾക്ക് അയയ്ക്കുന്ന സന്ദേശങ്ങൾ നിങ്ങൾക്ക് ദൃശ്യമാക്കാതെ തന്നെ നിരീക്ഷിക്കാനോ ഇല്ലാതാക്കാനോ ഉള്ള കഴിവ് ഈ അനുമതികളിൽ ഉൾപ്പെടുന്നു."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"പ്രവർത്തിക്കുന്ന അപ്ലിക്കേഷനുകൾ വീണ്ടെടുക്കുക"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"വിരലടയാളം ഭാഗികമായി തിരിച്ചറിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"വിരലടയാളം പ്രോസസ്സ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"വിരലടയാള സെൻസറിന് വൃത്തിയില്ല. അത് ശുചിയാക്കി വീണ്ടും ശ്രമിക്കുക."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"വിരൽ വളരെ വേഗത്തിൽ നീക്കി. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"വിരൽ പതുക്കെ നീക്കി. വീണ്ടും ശ്രമിക്കുക."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ഫിംഗർപ്രിന്റ് ഹാർഡ്വെയർ ലഭ്യമല്ല."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"വിരലടയാളം സംഭരിക്കാനാവില്ല. നിലവിലുള്ള വിരലടയാളം നീക്കംചെയ്യുക."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"വിരലടയാളം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ഫിംഗർപ്രിന്റ് പ്രവർത്തനം റദ്ദാക്കി."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"നിരവധി ശ്രമങ്ങൾ. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"വീണ്ടും ശ്രമിക്കൂ."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യുക"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD കാർഡിൽ റൈറ്റുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP കോളുകൾ വിളിക്കുക/സ്വീകരിക്കുക"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP കോളുകൾ വിളിക്കാനും സ്വീകരിക്കാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"പുതിയ ടെലികോം SIM കണക്ഷനുകൾ രജിസ്റ്റർ ചെയ്യുക"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"പുതിയ ടെലികോം SIM കണക്ഷനുകൾ രജിസ്റ്റർ ചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"പുതിയ ടെലികോം കണക്ഷനുകൾ രജിസ്റ്റർ ചെയ്യുക"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"പുതിയ ടെലികോം കണക്ഷനുകൾ രജിസ്റ്റർ ചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"ടെലികോം കണക്ഷനുകൾ നിയന്ത്രിക്കുക"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"ടെലികോം കണക്ഷനുകൾ നിയന്ത്രിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ഇൻ-കോൾ സ്ക്രീനുമായി സംവദിക്കുക"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ഉപയോക്താവ് ഇൻ-കോൾ സ്ക്രീൻ എപ്പോൾ, എങ്ങനെ കാണുന്നുവെന്നത് നിയന്ത്രിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"ടെലിഫോണി സേവനങ്ങൾ ഉപയോഗിച്ച് സംവദിക്കുക"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"കോളുകൾ ചെയ്യുന്നതിനോ/സ്വീകരിക്കുന്നതിനോ ടെലിഫോണി സേവനങ്ങൾ ഉപയോഗിച്ച് സംവദിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ഇൻ-കോൾ ഉപയോക്തൃ അനുഭവം നൽകുക"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"ഇൻ- കോൾ ഉപയോക്തൃ അനുഭവം നൽകുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ചരിത്രപരമായ നെറ്റ്വർക്ക് ഉപയോഗം വായിക്കുക"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"നിർദ്ദിഷ്ട നെറ്റ്വർക്കുകൾക്കും അപ്ലിക്കേഷനുകൾക്കുമുള്ള ചരിത്രപരമായ നെറ്റ്വർക്ക് ഉപയോഗം റീഡുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"നെറ്റ്വർക്ക് നയം നിയന്ത്രിക്കുക"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"നെറ്റ്വർക്ക് നയങ്ങൾ നിയന്ത്രിക്കുന്നതിനും നിർദ്ദിഷ്ട അപ്ലിക്കേഷൻ നിയമങ്ങൾ നിർവ്വചിക്കുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"നെറ്റ്വർക്ക് ഉപയോഗ അക്കൗണ്ടിംഗ് പരിഷ്ക്കരിക്കുക"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"നെറ്റ്വർക്ക് ഉപയോഗം അപ്ലിക്കേഷനുകളിൽ കണക്കാക്കുന്നതെങ്ങനെയെന്ന് പരിഷ്ക്കരിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകളുടെ ഉപയോഗത്തിനുള്ളതല്ല."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"അറിയിപ്പുകൾ ആക്സസ്സുചെയ്യുക"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"മറ്റ് അപ്ലിക്കേഷനുകൾ പോസ്റ്റുചെയ്തവയുൾപ്പെടെയുള്ള, അറിയിപ്പുകൾ വീണ്ടെടുക്കാനും പരിശോധിക്കാനും മായ്ക്കാനും അപ്ലിക്കേഷനുകളെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ഒരു അറിയിപ്പ് ലിസണർ സേവനവുമായി ബന്ധിപ്പിക്കുക"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ഒരു അറിയിപ്പ് ലിസണർ സേവനത്തിന്റെ ഉയർന്ന നിലയിലുള്ള ഇന്റർഫേസിലേക്ക് ബന്ധിപ്പിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"കണ്ടീഷൻ പ്രൊവൈഡർ സേവനവുമായി ബന്ധിപ്പിക്കുക"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"ഒരു കണ്ടീഷൻ പ്രൊവൈഡർ സേവനത്തിന്റെ ഉയർന്ന നിലയിലുള്ള ഇന്റർഫേസിലേക്ക് ബന്ധിപ്പിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"സ്വപ്നതുല്യമായ ഒരു സേവനത്തിലേക്ക് ബന്ധിപ്പിക്കുക"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"സ്വപ്നതുല്യമായ ഒരു സേവനത്തിന്റെ ഉയർന്ന നിലയിലുള്ള ഇന്റർഫേസിലേക്ക് ബന്ധിപ്പിക്കാൻ ദാതാവിനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"കാരിയർ നൽകിയ കോൺഫിഗറേഷൻ അപ്ലിക്കേഷൻ റദ്ദാക്കുക"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"കാരിയർ നൽകിയ കോൺഫിഗറേഷൻ അപ്ലിക്കേഷൻ റദ്ദാക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"നെറ്റ്വർക്ക് നിലകളിൽ നിരീക്ഷണത്തിനായി കേൾക്കുക"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"നെറ്റ്വർക്ക് അവസ്ഥകളിൽ നിരീക്ഷണങ്ങൾ ശ്രവിക്കാൻ ഒരു അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ഇൻപുട്ട് ഉപകരണ കാലിബ്രേഷൻ മാറ്റുക"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"ടച്ച് സ്ക്രീനിന്റെ കാലിബ്രേഷൻ പാരാമീറ്ററുകൾ പരിഷ്ക്കരിക്കുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM സർട്ടിഫിക്കറ്റുകൾക്കുള്ള ആക്സസ്സ്"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"പ്രൊവിഷൻ ചെയ്യുന്നതിനും DRM സർട്ടിഫിക്കറ്റുകൾ ഉപയോഗിക്കുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android ബീം കൈമാറൽ നില നേടുക"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"നിലവിലെ Android ബീം കൈമാറ്റങ്ങളെക്കുറിച്ച് വിവരങ്ങൾ നേടാൻ ഈ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM സർട്ടിഫിക്കറ്റുകൾ നീക്കം ചെയ്യുക"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM സർട്ടിഫിക്കറ്റുകൾ നീക്കംചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"കാരിയർ സന്ദേശമയയ്ക്കൽ സേവനത്തിലേക്ക് ബന്ധിപ്പിക്കുക"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"ഒരു കാരിയർ സന്ദേശമയയ്ക്കൽ സേവനത്തിന്റെ ഉയർന്ന നിലയിലുള്ള ഇന്റർഫേസിലേക്ക് ബന്ധിപ്പിക്കാൻ ദാതാവിനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"പാസ്വേഡ് നിയമങ്ങൾ സജ്ജീകരിക്കുക"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"സ്ക്രീൻ ലോക്ക് പാസ്വേഡുകളിലും PIN-കളിലും അനുവദിച്ചിരിക്കുന്ന ദൈർഘ്യവും പ്രതീകങ്ങളും നിയന്ത്രിക്കുക."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"സ്ക്രീൻ അൺലോക്ക് ശ്രമങ്ങൾ നിരീക്ഷിക്കുക"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"അൺലോക്ക് ചെയ്യുന്നതിനായി മെനു അമർത്തുക അല്ലെങ്കിൽ അടിയന്തര കോൾ വിളിക്കുക."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"അൺലോക്കുചെയ്യാൻ മെനു അമർത്തുക."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"അൺലോക്ക് ചെയ്യാൻ പാറ്റേൺ വരയ്ക്കുക"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"അടിയന്തിരാവശ്യം"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"കോളിലേക്ക് മടങ്ങുക"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ശരി!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"വീണ്ടും ശ്രമിക്കുക"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"കാൻഡിഡേറ്റുകൾ"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> തയ്യാറാകുന്നു"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"പിശകുകളുണ്ടോയെന്നു പരിശോധിക്കുന്നു"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"പുതിയ <xliff:g id="NAME">%s</xliff:g> എന്നതിനെ തിരിച്ചറിഞ്ഞു"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ഫോട്ടോകളും മീഡിയയും ട്രാൻസ്ഫർ ചെയ്യാൻ"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> കേടായി"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> കേടായി; അത് വീണ്ടും ഫോർമാറ്റുചെയ്യുന്നതിന് ശ്രമിക്കുക"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> അപ്രതീക്ഷിതമായി നീക്കംചെയ്തു"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"വിവരങ്ങൾ നഷ്ടപ്പെടുന്നത് ഒഴിവാക്കാൻ നീക്കംചെയ്യുന്നതിനുമുമ്പ് <xliff:g id="NAME">%s</xliff:g> അൺമൗണ്ടുചെയ്യുക"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> നീക്കംചെയ്തു"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> നീക്കംചെയ്തു; പുതിയതൊന്ന് ചേർക്കുക"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ഇപ്പോഴും <xliff:g id="NAME">%s</xliff:g> ഒഴിവാക്കപ്പെടുന്നു…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"നീക്കംചെയ്യരുത്"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"സജ്ജമാക്കുക"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"നിരസിക്കുക"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"പര്യവേക്ഷണം ചെയ്യുക"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"പൊരുത്തമുള്ള പ്രവർത്തനങ്ങളൊന്നും കണ്ടെത്തിയില്ല."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"മീഡിയ ഔട്ട്പുട്ട് റൂട്ടുചെയ്യുക"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"മീഡിയ ഔട്ട്പുട്ടിനെ മറ്റ് ബാഹ്യ ഉപകരണങ്ങളിലേക്ക് റൂട്ടുചെയ്യാൻ ഒരു അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
@@ -1188,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"ആന്തരിക സംഭരണം"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD കാർഡ്"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD കാർഡ്"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB ഡ്രൈവ്"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ഡ്രൈവ്"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB സംഭരണം"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"എഡിറ്റുചെയ്യുക"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ഡാറ്റ ഉപയോഗ മുന്നറിയിപ്പ്"</string>
@@ -1450,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"നിങ്ങൾ ഇത് ഓഫാക്കും വരെ"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ചുരുക്കുക"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"തടസ്സങ്ങൾ തടയുക"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"ശല്യപ്പെടുത്തരുത്"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"പ്രവർത്തനരഹിതമായ സമയം"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ശനിയാഴ്ചയും ഞായറാഴ്ചയും അല്ലാത്ത ദിവസങ്ങളിലെ രാത്രികൾ"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"വാരാന്ത്യങ്ങൾ"</string>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index c27de35..70d82d0 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Апп нь таны утас эсвэл SIM картанд хадгалагдсан SMS мессежийг унших боломжтой. Энэ нь апп-д бүх мессежийг контент эсвэл нууц эсэхээс нь үл хамааран унших боломжийг олгоно."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Апп-д таны телевиз болон Сим картийн SMS зурвасыг уншихыг зөвшөөрдөг. Энэ нь апп-д тухайн SMS зурвасуудын агуулга, нууцлалын зэргээс үл хамааран бүх зурвасуудыг уншихыг зөвшөөрдөг."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Апп нь таны утас эсвэл SIM картанд хадгалагдсан SMS мессежийг унших боломжтой. Энэ нь апп-д бүх мессежийг контент эсвэл нууц эсэхээс нь үл хамааран унших боломжийг олгоно."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"Текст мессежийг засах (SMS эсвэл MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Апп нь таны таблет эсвэл SIM картанд хадгалагдсан SMS мессежрүү бичих боломжтой. Хортой апп нь таны мессежүүдийг устгах боломжтой."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Апп-д таны телевиз эсвэл SIM картанд хадгалагдсан SMS зурвас руу бичихийг зөвшөөрдөг. Гэмт хэрийг шинжтэй аппликкэйшнүүд нь таны зурвасуудыг устгаж болох юм."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Апп нь таны утас эсвэл SIM картанд хадгалагдсан SMS мессежрүү бичих боломжтой. Хортой апп нь таны мессежүүдийг устгах боломжтой."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"текст мессеж(WAP) хүлээн авах"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Апп нь WAP мессежийг хүлээн авах болон биелүүлэх боломжтой. Энэ зөвшөөрөл нь танд илгээсэн мессежийг танд харуулалгүйгээр хянах эсвэл устгах боломжийг агуулна."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ажиллаж байгаа апп-г дуудах"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Хурууны хээг дутуу уншуулсан байна. Дахин оролдоно уу."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Хурууны хээ боловсруулж чадахгүй байна. Дахин оролдоно уу."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Хурууны хээ мэдрэгч бохирдсон байна. Та цэвэрлэсний дараагаар дахин оролдоно уу."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Хуруугаа хэт хурдан хөдөлгөсөн байна. Дахин оролдоно уу."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Хурууг хэт удаан уншуулсан байна. Та дахин уншуулна уу."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хурууны хээний тоног төхөөрөмж бэлэн бус байна."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Хурууны хээг хадгалах боломжгүй байна. Одоо байгаа хурууны хээг арилгана уу."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Хурууны хээ оруулах хугацаа өнгөрсөн байна. Дахин оруулна уу."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Хурууны хээний бүртгэл амжилтгүй боллоо."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Хэтэрхий олон оролдлоо. Түр хүлээгээд дахин оролдоно уу."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Дахин оролдно уу."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"синк тохиргоог унших"</string>
@@ -468,6 +459,48 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Апп нь SD картруу бичих боломжтой."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP дуудлага хийх/хүлээн авах"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Апп-д SIP дуудлага хийх болон хүлээн авахыг зөвшөөрөх."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"шинэ телеком SIM холболтуудыг бүртгэх"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Апп-д шинэ телеком SIM холболтуудыг бүртгэхийг зөвшөөрнө."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"шинэ телеком холболтуудыг бүртгэх"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Апп-д шинэ телеком холболтуудыг бүртгэхийг зөвшөөрнө."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"телеком холболтуудыг удирдах."</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Апп-д телеком холболтуудыг удирдахыг зөвшөөрнө."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"дуудлагын дэлгэцтэй харьцах"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Апп-д дуудлагын дэлгэцийг хэрэглэгчид хэзээ хэрхэн харуулахыг удирдахыг зөвшөөрнө."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"телефоны үйлчилгээтэй харилцах"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Апп-д телефон үйлчилгээтэй харилцаж дуудлага хийх/авахыг зөвшөөрнө."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"дуудлага хийж байгаа хэрэглэгчтэй харьцах"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Апп-д дуудлага хийж байгаа хэрэглэгчтэй харьцахыг зөвшөөрнө."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"сүлжээний ашиглалтын түүхийг унших"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Апп нь тусгай сүлжээ болон апп-н сүлжээ ашиглалтын түүхийг унших боломжтой."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"сүлжээний бодлогыг удирдах"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Апп нь сүлжээний бодлогыг удирдах болон апп-д зориулсан дүрмийг тогтоох боломжтой."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"сүлжээний хэрэглээний тайланг өөрчлөх"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Апп нь апп-уудын сүлжээ ашиглалтын талаарх тооцоог өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"мэдэгдэлд хандах"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Апп нь бусад апп-уудын илгээсэн мэдэгдлүүдийг дуудах, шалгах, болон цэвэрлэх боломжтой."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"мэдэгдэл сонсогч үйлчилгээтэй холбох"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Эзэмшигч нь мэдэгдэл сонсох үйлчилгээний дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"нөхцөл нийлүүлэгч үйлчилгээнд холбох"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Эзэмшигчид нөхцөл нийлүүлэгч үйлчилгээний дээд-түвшний интерфейстэй холбох боломж олгоно. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"дрийм үйлчилгээнд холбох"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Эзэмшигч нь дрийм үйлчилгээний дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"үүрэн компанийн нийлүүлсэн тохируулгын апп-г өдөөх"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Эзэмшигчид үүрэн компанийн нийлүүлсэн тохируулах апп-г өдөөх боломж олгоно. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Сүлжээний байдлын талаар ажиглалтуудыг хүлээн авах"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Аппликешнд сүлжээний байдлын талаар ажиглалтуудыг хүлээн авахыг зөвшөөрнө. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"оролтын төхөөрөмжийн калибрешныг өөрчлөх"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Мэдрэгчтэй дэлгэцний калибрешн параметрийг өөрчлөхийг апп-д зөвшөөрнө. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"хандалтын DRM сертификат"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Аппликешнд DRM сертификатыг ашиглах болон нийлүүлэхийг зөвшөөрнө. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Андройд Бийм дамжуулалтын статусыг хүлээн авах"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Одоогийн Андройд Бийм дамжуулалтын мэдээллийг хүлээн авахыг аппликешнд зөвшөөрөх"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM сертификатыг устгах"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Аппликешнд DRM сертификатыг устгахыг зөвшөөрнө. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"зөөгч зурвасын үйлчилгээнд холбох"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Эзэмшигчид зөөгч зурвасын үйлчилгээний түвшний интерфэйст холбогдохыг зөвшөөрдөг. Энгийн апп-д шаардлагагүй."</string>
+ <string name="permlab_bindCarrierConfigService" msgid="4110548389449423386">"дамжуулагчийн тохиргооны үйлчилгээ рүү холбогдох"</string>
+ <string name="permdesc_bindCarrierConfigService" msgid="1096888107671817447">"Эзэмшигчид дамжуулагчийн тохиргооны үйлчилгээнд холбогдохыг зөвшөөрнө. Энэ нь энгийн апп-уудад огт шаардлагагүй."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"Нууц үгний дүрмийг тохируулах"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Дэлгэц түгжих нууц үг болон ПИН кодны урт болон нийт тэмдэгтийн уртыг хянах."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Дэлгэц тайлах оролдлогыг хянах"</string>
@@ -1028,36 +1061,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"нэр дэвшигч"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ыг бэлдэж байна"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Алдааг шалгаж байна"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Шинэ <xliff:g id="NAME">%s</xliff:g> илэрлээ"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Зураг, медиа шилжүүлэхэд зориулсан"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> гэмтсэн"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> гэмтсэн байна; дахин хэлбэршүүлээд үзээрэй"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-ыг гэнэт гаргасан байна"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Өгөгдөл алдагдахаас сэргийлж <xliff:g id="NAME">%s</xliff:g>-ыг гаргахаас өмнө салга"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>-ыг гаргасан"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>-ыг гаргасан; шинийг оруулах"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>-ыг гаргаж байна..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Гаргаж болохгүй"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Тохируулга"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Салгах"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Судлах"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Таарах активити олдсонгүй."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Медиа гаралтыг чиглүүлэх"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Аппликешн нь медиа гаралтыг бусад гадаад төхөөрөмжрүү чиглүүлэх боломжтой."</string>
@@ -1187,6 +1205,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Дотоод сан"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD карт"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD карт"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB диск"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB диск"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB сан"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Засах"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Дата хэрэглээний анхааруулга"</string>
@@ -1447,7 +1468,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Таныг унтраах хүртэл"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Хумих"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Тасалдуулахгүй байх"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Бүү саад бол"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Сул зогсолт"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Ажлын өдрүүдэд орой"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Амралтын өдрүүд"</string>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 589feb6..9be27cc 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"आपल्या टॅब्लेटवर किंवा सिम कार्डवर संचयित केलेले SMS संदेश वाचण्यासाठी अॅप ला अनुमती देते. हे सामग्री किंवा गोपनीयतेकडे दुर्लक्ष करून, सर्व SMS संदेश वाचण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"आपल्या टीव्हीवर किंवा सिम कार्डवर संचयित केलेले SMS संदेश वाचण्यासाठी अॅपला अनुमती अनुमती देते. हे सामग्रीकडे किंवा गोपनीयतेकडे दुर्लक्ष करून, सर्व SMS संदेश वाचण्यासाठी अॅपला अनुमती देते."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"आपल्या फोनवर किंवा सिम कार्डवर संचयित केलेले SMS संदेश वाचण्यासाठी अॅप ला अनुमती देते. हे सामग्री किंवा गोपनीयतेकडे दुर्लक्ष करून, सर्व SMS संदेश वाचण्यासाठी अॅप ला अनुमती देते."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"आपले मजकूर संदेश सुधारित करा (SMS किंवा MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"आपल्या टॅब्लेटवर किंवा सिम कार्डवर संचयित केलेल्या SMS संदेशांवर लिहिण्यासाठी अॅप ला अनुमती देते. दुर्भावनापूर्ण अॅप्स आपले संदेश हटवू शकतात."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"आपल्या टीव्हीवर किंवा सिम कार्डवर संचयित केलेल्या SMS संदेशांवर लिहिण्यासाठी अॅपला अनुमती देते. दुर्भावनापूर्ण अॅप्स आपले संदेश हटवू शकतात."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"आपल्या फोनवर किंवा सिम कार्डवर संचयित केलेल्या SMS संदेशांवर लिहिण्यासाठी अॅप ला अनुमती देते. दुर्भावनापूर्ण अॅप्स आपले संदेश हटवू शकतात."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"मजकूर संदेश प्राप्त करा (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP संदेश प्राप्त करण्यास आणि त्यावर प्रक्रिया करण्यासाठी अॅप ला अनुमती देते. ही परवानगी आपल्याला पाठविलेले संदेश आपल्याला न दर्शविता त्यांचे परीक्षण करण्याची आणि ते हटविण्याची क्षमता समाविष्ट करते."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"चालणारे अॅप्स पुनर्प्राप्त करा"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"आंशिक फिंगरप्रिंट आढळली. कृपया पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"फिंगरप्रिंटवर प्रक्रिया करणे शक्य झाले नाही. कृपया पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"फिंगरप्रिंट सेन्सर खराब आहे. कृपया साफ करा आणि पुन्हा प्रयत्न करा."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"बोट खूप जलद हलविले. कृपया पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"बोट हळू हलविले. कृपया पुन्हा प्रयत्न करा."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फिंगरप्रिंट हार्डवेअर उपलब्ध नाही."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"फिंगरप्रिंट संचयित केले जाऊ शकत नाही. कृपया विद्यमान फिंगरप्रिंट काढा."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"फिंगरप्रिंट कालबाह्य झाले. पुन्हा प्रयत्न करा."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"फिंगरप्रिंट ऑपरेशन रद्द झाले."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"खूप प्रयत्न. नंतर पुन्हा प्रयत्न करा."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन्हा प्रयत्न करा."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"संकालन सेटिंग्ज वाचा"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD कार्डवर लिहिण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP कॉल करा/प्राप्त करा"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"अॅपला SIP कॉल करण्याची आणि प्राप्त करण्याची अनुमती देते."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"नवीन टेलिकॉम सिम कनेक्शनची नोंदणी करा"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"नवीन टेलिकॉम सिम कनेक्शनची नोंदणी करण्यासाठी अॅपला अनुमती देते."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"नवीन टेलिकॉम कनेक्शनची नोंदणी करा"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"नवीन टेलिकॉम कनेक्शनची नोंदणी करण्यासाठी अॅपला अनुमती देते."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"टेलिकॉम कनेक्शन व्यवस्थापित करा"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"टेलिकॉम कनेक्शन व्यवस्थापित करण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"कॉल-मधील स्क्रीनशी परस्परसंवाद करा"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"वापरकर्ता कॉल-मधील स्क्रीन केव्हा आणि कशी पाहतो ते नियंत्रित करण्याची अॅपला अनुमती देते."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"टेलिफोनी सेवांशी परस्परसंवाद साधा"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"कॉल करण्यासाठी/घेण्यासाठी टेलिफोनी सेवांशी परस्परसंवाद साधण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"एक कॉल-मधील वापरकर्ता अनुभव प्रदान करा"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"अॅप्सला कॉल-मधील वापरकर्ता अनुभव प्रदान करण्याची अनुमती देते."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ऐतिहासिक नेटवर्क वापर वाचा"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"विशिष्ट नेटवर्क आणि अॅप्सकरिता ऐतिहासिक नेटवर्क वापराचे वाचन करण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"नेटवर्क धोरण व्यवस्थापित करा"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"नेटवर्क धोरणे व्यवस्थापित करण्यासाठी आणि अॅप-विशिष्ट नियम परिभाषित करण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"नेटवर्क वापर हिशोब सुधारित करा"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"अॅप्स वर नेटवर्क वापराचा हिशोब कसा घेतला जातो हे सुधारित करण्यासाठी अॅप्स ला अनुमती देते. सामान्य अॅप्सद्वारे वापरण्यासाठी नाही."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"प्रवेश सूचना"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"अनुप्रयोगाला इतर अॅप्सद्वारे पोस्ट केलेल्यांसह पुनर्प्राप्त करण्याची, तपासण्याची आणि सूचना साफ करण्याची अनुमती देते."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"सूचना ऐकणार्या सेवेशी प्रतिबद्ध"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"होल्डरला सूचना ऐकणार्या सेवेच्या शीर्ष-दर्जाच्या इंटरफेसशी प्रतिबद्ध करण्याची अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यक नसावे."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"एका अट प्रदाता सेवेवर प्रतिबद्ध करा"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"स्थिती प्रदाता सेवेचा शीर्ष-स्तर इंटरफेस प्रतिबद्ध करण्यासाठी होल्डरला अनुमती देते. सामान्य अॅप्सकरिता कधीही आवश्यक नसते."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"स्वप्न सेवेवर प्रतिबद्ध करा"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"होल्डरला स्वप्नसेवेच्या शीर्ष-स्तराच्या इंटरफेसशी प्रतिबद्ध करण्यास अनुमती देते. सामान्य अॅप्सकरिता कधीही आवश्यक नसते."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"वाहकाद्वारे-प्रदान केलेल्या कॉन्फिगरेशन अॅपची विनंती करा"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"होल्डरला वाहकद्वारे-प्रदान केलेल्या कॉन्फिगरेशन अॅपची विनंती करण्याची अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यक नसावे."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"नेटवर्क स्थितींवरील निरीक्षणांसाठी ऐका"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"अनु्प्रयोगाला नेटवर्क स्थितींवरील निरीक्षणे ऐकण्यासाठी अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यक नसावे."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"इनपुट डिव्हाइस अंशांकन बदला"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"स्पर्श स्क्रीनची मापन प्राचले सुधारित करण्यासाठी अॅप ला अनुमती देते. सामान्य अॅप्स साठी कधीही आवश्यक नसते."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM प्रमाणपत्रांवर प्रवेश करा"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM प्रमाणपत्रांची तरतूद करण्यासाठी आणि वापरण्यासाठी अनुप्रयोगास अनुमती देते. सामान्य अॅप्सकरिता कधीही आवश्यकता नसते."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android बीम स्थानांतरण स्थिती प्राप्त करा"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"वर्तमान Android बीम स्थानांतरणांविषयी माहिती प्राप्त करण्यासाठी या अनुप्रयोगास अनुमती देते"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM प्रमाणपत्रे काढा"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM प्रमाणपत्रे काढण्यासाठी अनुप्रयोगास अनुमती देते. सामान्य अॅप्स साठी कधीही आवश्यकता नसते."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"एका वाहक संदेशन सेवेसाठी प्रतिबद्ध"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"वाहक संदेशन सेवेचा शीर्ष-स्तर इंटरफेस प्रतिबद्ध करण्यासाठी होल्डरला अनुमती देते. सामान्य अॅप्सकरिता कधीही आवश्यक नसते."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"संकेतशब्द नियम सेट करा"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"स्क्रीन लॉक संकेतशब्द आणि पिन मध्ये अनुमती दिलेली लांबी आणि वर्ण नियंत्रित करा."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"स्क्रीन-अनलॉक प्रयत्नांचे परीक्षण करा"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"अनलॉक करण्यासाठी मेनू दाबा किंवा आणीबाणीचा कॉल करा."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"अनलॉक करण्यासाठी मेनू दाबा."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"अनलॉक करण्यासाठी नमुना काढा"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"आणीबाणी"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"कॉलवर परत या"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"अचूक!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"पुन्हा प्रयत्न करा"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"उमेदवार"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> तयार करीत आहे"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटींसाठी तपासत आहे"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नवीन <xliff:g id="NAME">%s</xliff:g> आढळले"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फोटो आणि मीडिया स्थानांतरित करण्यासाठी"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> ची हानी झाली"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> ची हानी झाली; तो पुन्हा स्वरूपित करण्याचा प्रयत्न करा"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अनपेक्षितरित्या काढले"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा गमावणे टाळण्यासाठी काढण्यापूर्वी <xliff:g id="NAME">%s</xliff:g> अनमाउंट करा"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> काढले"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> काढले; एक नवीन घाला"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"अद्याप <xliff:g id="NAME">%s</xliff:g> ला बाहेर काढत आहे…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"काढू नका"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"सेटअप"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"बाहेर काढा"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"एक्सप्लोर करा"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"कोणतेही जुळणारे क्रियाकलाप आढळले नाहीत."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"मीडिया आउटपुट मार्गस्थ करा"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"अन्य बाह्य डिव्हाइसेसवरील रूट मीडिया आउटपुट वर अनुप्रयोगास अनुमती देते."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"अंतर्गत संचयन"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD कार्ड"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB संचयन"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"संपादित करा"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"डेटा वापर चेतावणी"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"आपण हे बंद करेपर्यंत"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त करा"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"व्यत्यय अवरोधित करा"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"व्यत्यय आणू नका"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"कार्य न करण्याचा कालावधी"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"आठवड्याच्या रात्री"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"सप्ताह अखेर"</string>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index d92107e..f13004d 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Membenarkan apl membaca mesej SMS yang tersimpan pada tablet atau kad SIM anda. Ini membenarkan apl membaca semua mesej SMS, tanpa mengira kandungan atau kerahsiaan."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Membenarkan apl membaca mesej SMS yang tersimpan kada TV atau kad SIM anda. Ini membenarkan apl untuk membaca semua mesej SMS, tanpa mengira kandungan atau kerahsiaan."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Membenarkan apl membaca mesej SMS yang tersimpan pada telefon atau kad SIM anda. Ini membenarkan apl membaca semua mesej SMS, tanpa mengira kandungan atau kerahsiaan."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"edit mesej teks (SMS atau MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Membenarkan apl untuk menulis kepada mesej SMS yang disimpan pada tablet atau kad SIM anda. Apl hasad boleh memadam mesej anda."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Membenarkan apl menulis kepada mesej SMS yang tersimpan pada TV atau kad SIM anda. Apl hasad mungkin memadam mesej anda."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Membenarkan apl untuk menulis kepada mesej SMS yang disimpan pada telefon atau kad SIM anda. Apl hasad boleh memadam mesej anda."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"terima mesej teks (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Membenarkan apl menerima dan memproses mesej WAP. Kebenaran ini termasuk keupayaan untuk memantau atau memadam mesej yang dihantar kepada anda tanpa menunjukkannya kepada anda."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"dapatkan semula apl yang sedang dijalankan"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Cap jari separa dikesan. Sila cuba lagi."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Tidak dapat memproses cap jari. Sila cuba lagi."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Penderia cap jari kotor. Sila bersihkan dan cuba lagi."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Jari digerakkan terlalu cepat. Sila cuba lagi."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Jari digerakkan terlalu perlahan. Sila cuba lagi."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Perkakasan cap jari tidak tersedia."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Cap jari tidak dapat disimpan. Sila alih keluar cap jari sedia ada."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tamat masa cap jari dicapai. Cuba lagi."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Pengendalian cap jari dibatalkan."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Terlalu banyak percubaan. Cuba sebentar lagi."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Cuba lagi."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"membaca tetapan penyegerakan"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Membenarkan apl menulis ke kad SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"buat/terima panggilan SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Membenarkan apl membuat dan menerima panggilan SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"daftar sambungan SIM telekom baharu"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Membenarkan apl mendaftarkan sambungan SIM telekom baharu."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"daftar sambungan telekom baharu"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Membenarkan apl mendaftarkan sambungan telekom baharu."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"urus sambungan telekomunikasi"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Membenarkan apl mengurus sambungan telekomunikasi."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"berinteraksi dengan skrin dalam panggilan"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Membenarkan apl mengawal masa dan cara pengguna melihat skrin dalam panggilan."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"berinteraksi dengan perkhidmatan telefoni"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Membenarkan apl berinteraksi dengan perkhidmatan telefoni untuk membuat/menerima panggilan."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"menyediakan pengalaman pengguna dalam panggilan"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Membenarkan apl menyediakan pengalaman pengguna dalam panggilan."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"baca sejarah penggunaan rangkaian"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Membenarkan apl membaca sejarah penggunaan rangkaian untuk rangkaian dan apl khusus."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"urus dasar rangkaian"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Membenarkan apl mengurus dasar rangkaian dan menentukan peraturan khusus apl."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ubah suai perakaunan penggunaan rangkaian"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Membenarkan apl untuk mengubah suai bagaimana penggunaan rangkaian diambil kira terhadap apl. Bukan untuk digunakan oleh apl biasa."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"pemberitahuan akses"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Membenarkan apl untuk mendapatkan semula, memeriksa dan memadam bersih pemberitahuan, termasuk yang disiarkan oleh apl lain."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ikat kepada perkhidmatan pendengar pemberitahuan"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan pendengar pemberitahuan. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"terikat kepada perkhidmatan pembekal keadaan"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan pembekal keadaan. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"terikat kepada perkhidmatan impian"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan impian. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"gunakan apl konfigurasi yang disediakan oleh pembawa"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Membenarkan pemegang menggunakan apl konfigurasi yang diberikan oleh pembawa. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"dengar pemerhatian mengenai keadaan rangkaian"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Membenarkan aplikasi mendengar pemerhatian tentang keadaan rangkaian. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"tukar penentukuran peranti input"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Membenarkan apl mengubah suai parameter penentukuran skrin sentuh. Ini tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"akses sijil DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Membenarkan aplikasi memperuntuk dan menggunakan sijil DRM. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Terima status pemindahan Pancaran Android"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Membenarkan aplikasi ini menerima maklumat mengenai pemindahan Pancaran Android semasa"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"alih keluar sijil DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Membenarkan aplikasi mengalih keluar sijil DRM. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"terikat kepada perkhidmatan pemesejan pembawa"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi perkhidmatan pemesejan pembawa. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Tetapkan peraturan kata laluan"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Mengawal panjang dan aksara yang dibenarkan dalam kata laluan dan PIN kunci skrin."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Memantau percubaan buka kunci skrin"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tekan Menu untuk menyahsekat atau membuat panggilan kecemasan."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tekan Menu untuk membuka kunci."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Lukiskan corak untuk membuka kunci"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Kecemasan"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Kembali ke panggilan"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Betul!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Cuba lagi"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"calon"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyediakan <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Menyemak untuk mengesan ralat"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> baharu dikesan"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Untuk memindahkan foto dan media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> rosak"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> rosak; cuba formatkannya"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ditanggalkan tanpa dijangka"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Nyahlekap <xliff:g id="NAME">%s</xliff:g> sebelum menanggalkannya untuk mengelakkan kehilangan data"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> dialih keluar"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ditanggalkan; masukkan yang baharu"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Masih menanggalkan <xliff:g id="NAME">%s</xliff:g>..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Jangan tanggalkan"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Persediaan"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Tanggalkan"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Teroka"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Tiada aktiviti yang sepadan ditemui."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Buat laluan output media"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Membenarkan apl untuk membuat laluan output media ke peranti luaran lain."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Storan dalaman"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Kad SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Storan USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Amaran penggunaan data"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Sehingga anda matikan"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Runtuhkan"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Halang gangguan"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Jangan ganggu"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Waktu gendala"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Malam hari bekerja"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Hujung minggu"</string>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 803109e..2c07406 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"အပလီကေးရှင်းအား တက်ဘလက် သို့မဟုတ် ဆင်းမ်ကဒ်မှာ သိမ်းဆည်းထားသော စာတိုများ ဖတ်ရှုခွင့်ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် အကြာင်းအရာ သို့မဟုတ် ယုံကြည်စိတ်ချရမှုကို ဂရုမပြုပဲ စာတိုအားလုံးကို ဖတ်နိုင်ပါလိမ်မည်။"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"သင့်တီဗွီ သို့မဟုတ် ဆင်းမ်ကဒ်တွင် သိမ်းထားသည့် SMS စာများကို app အား ဖတ်ခွင့်ပြုပါ။ ထိုသို့ခွင့်ပြုခြင်းဖြင့် app သည် အကြောင်းအရာ သို့မဟုတ် ယုံကြည်စိတ်ချရမှု တို့နှင့် မသက်ဆိုင်ဘဲ၊ SMS စာများအားလုံးကို ဖတ်နိုင်မည်ဖြစ်၏။"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"အပလီကေးရှင်းအား ဖုန်း သို့မဟုတ် ဆင်းမ်ကဒ်မှာ သိမ်းဆည်းထားသော စာတိုများ ဖတ်ရှုခွင့်ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် အကြာင်းအရာ သို့မဟုတ် ယုံကြည်စိတ်ချရမှုကို ဂရုမပြုပဲ စာတိုအားလုံးကို ဖတ်နိုင်ပါလိမ်မည်။"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"သင့်ရဲ့ စာပေးပို့ခြင်းများ ပြင်ခြင်း (စာတို နှင့် ရုပ်သံစာ)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"appအား သင်၏ တက်ဘလက် သို့မဟုတ် ဆင်းမ်ကဒ်ထဲမှာ သိုလှောင်ထားသည့် စာတိုများသို့ ရေးခွင့် ပြုသည်။ ကြံဖန် appများက သင်၏ စာတိုမျာကို ဖျက်ပစ်နိုင်သည်။"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"App အား သင့်တီဗွီ သို့မဟုတ် စင်းမ်ကဒ်တွင် သိမ်းထားသော SMS စာတိုများကို ရေးခွင့်ပြုပါ။ အန္တရာယ်ရှိသော app များက သင့် စာတိုများအား ဖျက်ပစ်နိုင်သည်။"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"appအား သင်၏ ဖုန်း သို့မဟုတ် ဆင်းမ်ကဒ်ထဲမှာ သိုလှောင်ထားသည့် စာတိုများသို့ ရေးခွင့် ပြုသည်။ ကြံဖန် appများက သင်၏ စာတိုမျာကို ဖျက်ပစ်နိုင်သည်။"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"စာပို့ခြင်းအား လက်ခံရယူခြင်း (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"အပလီကေးရှင်းအား WAP စာများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"အလုပ်လုပ်နေကြသည့် appများကို ရယူခြင်း"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"လက်ဗွေရဦ တစ်ပိုင်းတစ်စ တွေ့ရှိသည်။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"လက်ဗွေရာယူခြင်း မဆောင်ရွက်နိုင်ပါ။ ထပ်မံကြိုးစားပါ။"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"လက်ဗွေရာဖတ်ကိရိယာ ညစ်ပေနေသည်။ ကျေးဇူးပြု၍ ရှင်းလင်းကာ ထပ်မံကြိုးစားပါ။"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"လက်ညှိုး အလွန်မြန်ဆန်စွာ ရွေ့ခဲ့သည်။ ထပ်မံ ကြိုးစားပါ။"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"လက်ရွှေ့လျားခြင်း အလွန်နှေးသည်။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"လက်ဗွေရာ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"လက်ဗွေရာ သိုလှောင်၍မရပါ။ ကျေးဇူးပြု၍ ရှိပြီးလက်ဗွေရာအား ဖယ်ရှားပါ။"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"လက်ဗွေရာအချိန်ကုန် သွားပါသည်။ ထပ်မံကြိုးစားပါ။"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"လက်ဗွေရာ လုပ်ငန်း ဖျက်သိမ်းခဲ့၏။"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ကြိုးစာမှု အကြိမ်များနေ၏။ နောက်မှ ထပ်မံကြိုးစားပါ။"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ပြန်ကြိုးစားပါ"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ထပ်တူပြုအဆင်အပြင်အားဖတ်ခြင်း"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"appအား SD ကဒ်သို့ ရေးခွင့် ပြုသည်။"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP ခေါ်ဆိုမှုများ ခေါ်ရန်/လက်ခံရန်"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP ခေါ်ဆိုမှုများ ခေါ်ရန်နှင့် လက်ခံနိုင်ရန် app ကို ခွင့်ပြုပါ။"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"တယ်လီကွမ် ဆင်းမ် ချိတ်ဆက်မှုများကို မှတ်ပုံတင်ပါ"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"appအား တယ်လီကွမ် ဆင်းမ် ချိတ်ဆက်မှုကို မှတ်ပုံတင်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"တယ်လီကွမ် တယ်လီကွမ် ချိတ်ဆက်မှု အသစ်များကို မှတ်ပုံတင်ပါ"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"appအား တယ်လီကွမ် ချိတ်ဆက်မှု အသစ်များကို မှတ်ပုံတင်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"တယ်လီကွမ် ဆက်သွယ်မှုများကို စီမံရန်"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"appအား တယ်လီကွမ် ဆက်သွယ်မှုများကို စီမံခွင့် ပြုပါ။"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ခေါ်ဆိုမှု-အဝင် မျက်နှာပြင်နဲ့ တုံ့ပြန်လုပ်ကိုင်ရန်"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"appအား အသုံးပြုသူက ခေါ်ဆိုမှုအဝင် မျက်နှာပြင် ဘယ်အချိန်မှာ ဘယ်လို မြင်ရမှာကို ထိန်းချုပ်ခွင့်ပေးရန်"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှု"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"appအား ခေါ်ဆိုမှုများ လုပ်ခြင်း/လက်ခံခြင်း ပြုလုပ်နိုင်ရန် တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှုကို ခွင့်ပြုသည်။"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ပေးခြင်း"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"appအား အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ရာဇဝင်အလိုက် ကွန်ယက်သုံစွဲမှုအား ဖတ်ခြင်း"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"appအား အထူး ကွန်ရက်များ နှင့် appများ အတွက် ကွန်ရက် အသုံးပြုမှု မှတ်တမ်းကို ဖတ်ကြားခွင့် ပြုသည်။"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ကွန်ယက်မူဝါဒအား စီမံခြင်း"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"appအား ကွန်ရက် မူဝါဒများကို စီမံခန့်ခွဲခွင့် နှင့် app-ဆိုင်ရာ စည်းကမ်းချက်များကို ပြဌာန်းခွင့် ပြုသည်။"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ကွန်ယက်အသုံးပြုမှုစာရင်းအား မွမ်းမံခြင်း"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"အပလီကေးရှင်းအား တခြားအပလီကေးရှင်းများမှ ကွန်ရက်အသုံးပြုမှု တွက်ချက်ခြင်းအား ပြင်ဆင်ခွင့် ပြုပါ။ ပုံမှန် အပလီကေးရှင်းများအတွက် မလိုအပ်ပါ။"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"သတိပေးချက်များအား အသုံးပြုခွင့်"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"အပလီကေးရှင်းကို အကြောင်းကြားချက်များအား ထုတ်လုပ်ရန်၊ လေ့လာရန်၊ ဖျက်ပစ်ရန် ခွင့်ပြုခြင်း။ တခြား အပလီကေးရှင်းများမှ သတိပေးချက်များလည်း ပါဝင်ပါသည်"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"သတိပေးချက် နားထောင်ခြင်း ဆားဗစ် နှင့် ပူးပေါင်းခြင်း"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ဖုန်းကိုင်ထားသူနှင့် အကြောင်းကြားချက် နားစွင့်သော ဆားဗစ်မှ ထိပ်ပိုင်းအင်တာဖေ့စ် ကို ပူးပေါင်းခွင့်ပေးခြင်း။ ပုံမှန် အပလီကေးရှင်းများမှာ မလိုအပ်ပါ"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"အခြေအနေ စီမံပေးရေး ဝန်ဆောင်မှု တစ်ခုဆီသို့ ချိတ်တွဲခြင်း"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"စွဲကိုင်ထားသူအား အခြေအနေကို စီမံပေးသူ၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"အိပ်မက် ဝန်ဆောင်မှုသို့ ပေါင်းစည်းမည်"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"အိမ်မက်ဝန်ဆောင်မှု၏ ထိပ်တန်းအဆင့် မျက်နှာပြင်အား ကိုင်ဆောင်သူမှ ပေါင်းစည်းရန် ခွင့်ပြုမည်။ သာမန် အပလီကေးရှင်းများတွင် မလိုအပ်ပါ။"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"မိုဘိုင်းဆက်သွယ်ရေးဝန်ဆောင်မှုဌာန မှ ထည့်သွင်းပေးသော အခြေအနေများအား ပယ်ဖျက်ခြင်း"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ကိုင်ဆောင်သူအားမိုဘိုင်းဆက်သွယ်ရေးဝန်ဆောင်မှုဌာနမှ ထည့်သွင်းထားတဲ့ အပြင်အဆင်အား ပယ်ဖျက်ခွင့် ပေးခြင်း။ ပုံမှန် အပလီကေးရှင်းများမှာ မလိုပါ"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ကွန်ယက်အခြေအနေအား လေ့လာနေမှုအား နားထောင်ခွင့်"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"အပလီကေးရှင်းကို နက်ဝေါ့ ပေါ်က အခြေအနေကို သတိထားခွင့် ပေးခြင်း၊. ပုံမှန် အပလီကေးရှင်း များတွင် မလိုအပ်ပါ"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"change ထည့်သွင်းရေး ကိရိယာ တိုင်းထွာညှိနှိုင်းမှု ပြောင်းလဲခြင်း"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"appအား တို့ထိရေး မျက်နှာပြင် တိုင်းထွာစံညှိမှုကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM လက်မှတ်များကို ရယူသုံးခြင်း"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"အပလီကေးရှင်း တစ်ခုအား စီမံလုပ်ကိုင်ခွင့် DRM လက်မှတ်များ သုံးခွင့် ပြုသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"အန်ဒရွိုက်၏ အလင်းတန်းထိုး လွှဲပြောင်းမှု အခြေအနေကို ရယူရန်"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ဒီအပလီကေးရှင်းအား အန်ဒရွိုက်၏ လက်ရှိ အလင်းတန်းထိုး လွှဲပြောင်းမှု အကြောင်း အချက်အလက်ကို ရယူခွင့် ပြုသည်"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM လက်မှတ်များ ဖယ်ရှားရန်"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"အပလီကေးရှင်းအား DRM လက်မှတ်များကို ဖယ်ရှားခွင့် ပြုသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"စာပို့စာယူ ဆက်သွယ်ရေးဝန်ဆောင်မှုတစ်ခုအား ပူးပေါင်းခွင့်ပြုရန်"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"စာပို့စာယူဆက်သွယ်ရေးဝန်ဆောင်မှုတစ်ခု၏ ထိပ်ဆုံးရှိအင်တာဖေ့စ်ဖြင့် ပူးပေါင်းရန် ပိုင်ရှင်အားခွင့်ပြုပါ။ ပုံမှန် app များအတွက် မလိုအပ်ပါ။"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"စကားဝှက်စည်းမျဥ်းကိုသတ်မှတ်ရန်"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"မျက်နှာပြင်သော့ခတ်သည့် စကားဝှက်များနှင့် PINများရှိ ခွင့်ပြုထားသည့် စာလုံးအရေအတွက်နှင့် အက္ခရာများအား ထိန်းချုပ်ရန်။"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"မော်နီတာမျက်နှာပြင်ဖွင့်ရန် ကြိုးစားခွင့်များ"</string>
@@ -1028,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"ရွေးချယ်ခံမည့်သူ"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ပြင်ဆင်နေသည်"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"အမှားအယွင်းများ စစ်ဆေးနေသည်"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> အသစ်တွေ့ရှိပါသည်"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ဓာတ်ပုံနှင့် မီဒီယာများ လွှဲပြောင်းရန်အတွက်"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"ပျက်စီးသွားသော <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> ပျက်စီးသွားပါပြီ; ၎င်းကိုပြန်လည် ပုံစံချကြည့်ပါ"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> မမျှော်လင့်ဘဲ ဖယ်ရှားခဲ့သည်"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ဒေတာဆုံးရှုံးခြင်းမှ ကာကွယ်ရန် မဖယ်ရှားမှီ <xliff:g id="NAME">%s</xliff:g> ကိုဖြုတ်ပါ။"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ဖယ်ရှားလိုက်ပြီ"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ဖယ်ရှားလိုက်ပါပြီ; အသစ်တစ်ခု ထည့်သွင်းပါ"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> ထုတ်နေဆဲ…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"အဖယ်ရှားပါနှင့်"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"စဖွင့်သတ်မှတ်ရန်"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"ထုတ်မည်"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"စူးစမ်းရန်"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"တိုက်ဆိုင်သော ပြုလုပ်ချက် ရှာမတွေ့ပါ"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"မီဒီယာထွက်ပေါက်အား လမ်းလွှဲပြောင်းခြင်း"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"အပလီကေးရှင်းအား မီဒီယာ ထုတ်လွှတ်မှုကို အခြားပြင်ပ စက်ပစ္စည်းများသို့ လွှဲပြောင်းခွင့်ပြုပါ"</string>
@@ -1187,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s ၊ %2$s ၊ %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"စက်တွင်း သိုလှောင်ထားမှု"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD ကဒ်"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD ကဒ်"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB ဒရိုက်ဗ်"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ဒရိုက်ဗ်"</string>
<string name="storage_usb" msgid="3017954059538517278">"USBဖြင့် သိမ်းဆည်း"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ပြင်ဆင်ရန်"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ဒေတာအသုံးပြုမှုသတိပေးချက်"</string>
@@ -1449,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"သင်က ဒါကို ပိတ်မပစ်သည့် အထိ"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ခေါက်ရန်"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"ကြားဖြတ်ဝင်မှုများ ပိတ်ဆို့ရန်"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"မနှောက်ယှက်ပါနှင့်"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ကျချိန်"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ရုံးရက်ညများ"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"စနေတနင်္ဂနွေများ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 41045c4..1f370c6 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Lar appen lese tekstmeldinger lagret på nettbrettet eller SIM-kortet ditt. Dette lar appen lese alle tekstmeldingene dine, uavhengig av innhold og konfidensialitet."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Gjør at appen kan lese tekstmeldinger lagret på TV-en eller SIM-kortet. Dette gjør at appen også kan lese alle tekstmeldinger uavhengig av innhold eller konfidensialitet."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Lar appen lese tekstmeldinger lagret på telefonen eller SIM-kortet ditt. Dette lar appen lese alle tekstmeldingene dine, uavhengig av innhold og konfidensialitet."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"redigerer tekstmeldingene dine (SMS eller MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Lar appen skrive til SMS-meldinger som er lagret på nettbrettet eller SIM-kortet ditt. Ondsinnede apper kan komme til å slette meldingene dine."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Gjør at appen kan skrive til tekstmeldinger lagret på TV-en eller SIM-kortet. Skadelige apper kan slette meldingene dine."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Lar appen skrive til SMS-meldinger som er lagret på telefonen eller SIM-kortet ditt. Ondsinnede apper kan komme til å slette meldingene dine."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"motta tekstmeldinger (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Lar appen motta og behandle WAP-meldinger. Dette betyr at appen kan overvåke eller slette meldinger som er sendt til deg uten at du har sett dem."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"hente apper som kjører"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Deler av fingeravtrykket er registrert. Prøv på nytt."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Kunne ikke registrere fingeravtrykket. Prøv på nytt."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingeravtrykksensoren er skitten. Rengjør den og prøv på nytt."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Du flyttet fingeren for kjapt. Prøv på nytt."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Fingeren ble fjernet for sakte. Prøv på nytt."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maskinvare for fingeravtrykk er ikke tilgjengelig."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrykket kan ikke lagres. Fjern et eksisterende fingeravtrykk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsavbrudd for fingeravtrykk er nådd. Prøv på nytt."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingeravtrykk-operasjonen ble avbrutt."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"For mange forsøk. Prøve på nytt senere."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Prøv igjen."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lese synkroniseringsinnstillinger"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Lar appen skrive til SD-kortet."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"foreta/motta SIP-anrop"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Tillater at appen utfører og mottar SIP-anrop."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrere nye tilkoblinger for telekom-SIM-kort"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Lar appen registrere nye telekom-tilkoblinger for SIM-kort."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrere nye telekom-tilkoblinger"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Lar appen registrere nye telekom-tilkoblinger."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"administrere telekom-tilkoblinger"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Lar appen administrere telekom-tilkoblinger."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"samhandle med skjermen for innkommende anrop"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Lar appen styre når og hvordan brukeren ser skjermen for innkommende anrop."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"samhandle med telefonitjenester"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Gjør at appen kan samhandle med telefonitjenester for å foreta/motta anrop."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"levere en brukeropplevelse for innkommende anrop"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Lar appen levere en brukeropplevelse for innkommende anrop."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"lese tidligere nettverksbruk"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Lar appen lese tidligere nettverksbruk for bestemte nettverk og apper."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"administrer retningslinjene for nettverk"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Lar appen administrere retningslinjene for nettverket og definere appspesifikke regler."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"Modifisering av regnskapsføring av nettverksbruk"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Lar appen endre hvordan nettverksbruk regnes ut for apper. Ikke beregnet på vanlige apper."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"tilgang til varsler"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Lar appen hente, gjennomgå og fjerne varsler, inkludert de som sendes fra andre apper."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"binding til en varsellyttertjeneste"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Lar innehaveren binde seg til det øverste grensesnittnivået for en varsellyttertjeneste. Skal aldri være nødvendig for vanlige apper."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"binde seg til en leverandørtjeneste for betingelser"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Gir innehaveren tillatelse til å binde til toppnivået av brukergrensesnittet for en leverandørtjeneste for betingelser. Dette skal ikke være nødvendig for vanlige apper."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"binde til en drømmetjeneste"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Tillater eieren å binde seg til det øverste nivået av grensesnittet til en drømmetjeneste. Kreves aldri for vanlige apper."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"starte konfigurasjonsappen som ble levert av operatøren"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Gir innehaveren tillatelse til å kalle opp den konfigurasjonsappen som ble levert av operatøren. Dette skal ikke være nødvendig for vanlige apper."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"lytte etter observasjoner om nettverksforhold"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Gir appen tillatelse til å lytte etter observasjoner om nettverksforhold. Dette skal ikke være nødvendig for vanlige apper."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"endre kalibreringen av inndataenheter"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Lar appen endre kalibrasjonsparametrene for berøringsskjermen. Denne tillatelsen bør aldri være nødvendig for vanlige apper."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"tilgang til DRM-sertifikater"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Tillater at en app klargjøre og bruke DRM-sertifikater. Denne tillatelsen bør aldri være nødvendig for vanlige apper."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Motta overføringsstatus for Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Lar appen motta informasjon om aktuelle Android Beam-overføringer"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"fjern sertifikater for digital rettighetsadministrasjon"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Gir en app tillatelse til å fjerne sertifikater for digital rettighetsadministrasjon. Skal ikke være nødvendig for vanlige apper."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"bind til en operatørmeldingstjeneste"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Tillater at innehaveren binder seg til det øverste nivået av grensesnittet til en operatørtjeneste. Dette skal aldri være nødvendig for vanlige apper."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Angi passordregler"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Kontrollerer tillatt lengde og tillatte tegn i passord og PIN-koder for opplåsing av skjermen."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Overvåk forsøk på opplåsing av skjerm"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Trykk på menyknappen for å låse opp eller ringe et nødnummer."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Trykk på menyknappen for å låse opp."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Tegn mønster for å låse opp"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Nødsituasjon"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Tilbake til samtale"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Riktig!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Prøv på nytt"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
<string name="candidates_style" msgid="4333913089637062257">"TAG_FONT"<u>"kandidater"</u>"CLOSE_FONT"</string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sjekker for feil"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> ble oppdaget"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For overføring av bilder og media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Skadet <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> er skadet – prøv formatering"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ble uventet fjernet"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Løs ut <xliff:g id="NAME">%s</xliff:g> før du fjerner den for å unngå tap av data"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ble fjernet."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ble fjernet – sett inn et nytt et"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Løser ut <xliff:g id="NAME">%s</xliff:g> fremdeles …"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ikke fjern"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Konfigurering"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Løs ut"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Utforsk"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Finner ingen samsvarende aktiviteter."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Videresending av medieutdata"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Lar en app videresende medieutdata til andre eksterne enheter."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s – %2$s – %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Intern lagring"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kort"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-lagring"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Rediger"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Advarsel for høyt dataforbruk"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Inntil du slår av funksjonen"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Skjul"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokkér forstyrrelser"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"«Ikke forstyrr»"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Nedetid"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Kvelder på ukedager"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Helgedager"</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index c947168..d15a05a 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -219,15 +219,15 @@
<string name="user_owner_label" msgid="6465364741001216388">"व्यक्तिगत अनुप्रयोगहरू"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"काम"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"सम्पर्कहरू"</string>
- <string name="permgroupdesc_contacts" msgid="1437393511338346185">"तपाईँको सम्पर्कहरू पहुँच र परिमार्जन गर्नुहोस्"</string>
+ <string name="permgroupdesc_contacts" msgid="1437393511338346185">"तपाईँको सम्पर्कहरूका पहुँच गरी परिमार्जन गर्नुहोस्"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="536889867433972794">"तपाईँको स्थान पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_socialInfo" msgid="5799096623412043791">"तपाईँको सामाजिक सूचना"</string>
<string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"तपाईँको सम्पर्कहरू र सामाजिक जडानहरूको बारेको जानकारीमा सिधा पहुँच पुर्याउनुहोस्।"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"पात्रो"</string>
- <string name="permgroupdesc_calendar" msgid="2116049656685591803">"तपाईँको पात्रो पहुँच र परिमार्जन गर्नुहोस्"</string>
+ <string name="permgroupdesc_calendar" msgid="2116049656685591803">"तपाईँको पात्रोलाई पहुँच गरी परिमार्जन गर्नुहोस्"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="3695085582674524761">"SMS पहुँच र परिमार्जन गर्नुहोस्"</string>
+ <string name="permgroupdesc_sms" msgid="3695085582674524761">"SMS पहुँच गरी परिमार्जन गर्नुहोस्"</string>
<string name="permgrouplab_dictionary" msgid="8114410334955871144">"प्रयोगकर्ता शब्दकोश"</string>
<string name="permgroupdesc_dictionary" msgid="7586787746354378335">"प्रयोगकर्ता शब्दकोशमा शब्दहरू पढ्नुहोस् वा लेख्नुहोस्।"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"बुकमार्कहरू र इतिहास"</string>
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"तपाईँको ट्याब्लेट वा SIM कार्डमा भण्डारण भएका SMS सन्देशहरूलाई पढ्न अनुप्रयोगलाई अनुमति दिन्छ। यसले अनुप्रयोगलाई विषयवस्तु वा गोपनीयतालाई वेवास्ता गर्दै सबै SMS सन्देशहरू पढ्ने अनुमति दिन्छ।"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"अनुप्रयोगहरूलाई अनुमति दिन्छ तपाईँको TV वा SIM कार्डमा भण्डारण गरिएको SMS सन्देश पढ्न। यसले अनुप्रयोगलाई सम्पूर्ण SMS सन्देश पढ्न अनुमति दिन्छ, सामग्री वा गोपनीयताको पर्वाह नगरी।"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"तपाईँको फोन वा SIM कार्डमा भण्डारण भएका SMS सन्देशहरूलाई पढ्न अनुप्रयोगलाई अनुमति दिन्छ। यसले सबै SMS सन्देशहरूलाई पढ्नको लागि सामग्री वा विश्वसनियता बिना नै अनुप्रयोगलाई अनुमति दिन्छ।"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"तपाईँका पाठ सन्देशहरू सम्पादन गर्नुहोस् (SMS वा MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"अनुप्रयोगलाई तपाईंको ट्याब्लेट वा SIM कार्डमा भण्डार गरिएका SMS सन्देशहरू लेख्न अनुमति दिन्छ। खराब अनुप्रयोगहरूले तपाईंको सन्देशहरू मेटाउन सक्दछ।"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"तपाईँको TV वा SIM कार्डमा भण्डारण गरिएका SMS सन्देशमा लेख्न अनुप्रयोगलाई अनुमति दिन्छ।दुस्प्रभावी अनुप्रयोगले तपाईँका सान्देशहरू मेट्न सक्छन्।"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"तपाईँको फोन वा SIM कार्डमा भण्डारण भएका SMS सन्देशहरूलाई लेख्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। खराब अनुप्रयोगहरूले सायद तपाईँको सन्देशहरू मेटाउन सक्छन्।"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"पाठ सन्देशहरू (WAP) प्राप्त गर्नुहोस्"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP सन्देशहरू प्राप्त गर्न र प्रशोधन गर्न अनुप्रयोगलाई अनुमति दिन्छ। यो अनुमतिमा मोनिटर गर्ने वा तपाईँलाई पठाइएका सन्देशहरू तपाईँलाई नदेखाई मेट्ने क्षमता समावेश हुन्छ।"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"चलिरहेका अनुप्रयोगहरू पुनःबहाली गर्नुहोस्"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"आंशिक औठाछाप पत्ता लाग्यो। कृपया फेरि प्रयास गर्नुहोस्।"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"औठाछाप प्रशोधन गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"औँठाछाप सेन्सर फोहोर छ। कृपया सफा गरेर फेरि प्रयास गर्नुहोस्।"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"औंला धेरै छिटो चलाइयो। पुन: प्रयास गर्नुहोस्।"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"औंला निकै ढिला सारियो। कृपया फेरि प्रयास गर्नुहोस्।"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"औँठाछाप हार्डवेयर उपलब्ध छैन।"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"औँठाछाप भण्डारण गर्न सकिँदैन। कृपया अवस्थित औठाछाप हटाउनुहोस्।"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"औँठाछापको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"औँठाछाप सञ्चालन रद्द गरियो।"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"धेरै प्रयासहरू। केहि समय पछि पुन: प्रयास गर्नुहोला"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास गर्नुहोला।"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"समीकरण सेटिङहरू पढ्नुहोस्"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"अनुप्रयोगलाई SD कार्डमा लेख्न अनुमति दिन्छ।"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP कलहरू प्राप्त/बनाउन"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP कलहरू बनाउन र प्राप्त गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"नयाँ दूरसंचार सिम जडानहरू दर्ता गर्नुहोस्"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"अनुप्रयोगलाई नयाँ दूरसंचार SIM जडानहरू दर्ता गर्न अनुमति दिन्छ।"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"नयाँ दूरसंचार जडानहरू दर्ता गर्नुहोस्"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"अनुप्रयोगलाई नयाँ दूरसंचार सम्पर्क दर्ता गर्न अनुमति दिन्छ।"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"दूरसंचार जडान व्यवस्थापन गर्नुहोस्"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"अनुप्रयोगलाई टेलिकम जडान व्यवस्थापन गर्न अनुमति दिन्छ।"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"आगमन कल स्क्रिन संग अन्तर्क्रिया गर्नुहोस्"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"कहिले र कसरी प्रयोगकर्ताले आगमन कल स्क्रीन हेर्न सक्दछ भनेर नियन्त्रण गर्न अनुप्रयोगलाई अनुमति दिनुहोस्।"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"टेलिफोनी सेवा अन्तरक्रिया"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"अनुप्रयोगलाई कल बनाउन/प्राप्त गर्न टेलीफोनी सेवा साथ अन्तरक्रिया गर्न अनुमति दिन्छ।"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"आउने-कल प्रयोगकर्ता अनुभव प्रदान गर्नुहोस्"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"अनुप्रयोगलाई आउने-कल प्रयोगकर्ता अनुभव प्रदान गर्न अनुमति दिन्छ।"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"नेटवर्क उपयोगको इतिहास पढ्नुहोस्"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"निश्चित नेटवर्कहरू र अनुप्रयोगहरूको लागि ऐतिहासिक नेटवर्क उपयोग पढ्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"नेटवर्क नीति प्रबन्ध गर्नुहोस्"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"नेटवर्क नीतिहरू व्यवस्थापन गर्न र अनुप्रयोग-विशेष नियमहरू परिभाषित गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"नेटवर्क उपयोग लेखालाई परिमार्जन गर्नुहोस्"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"अनुप्रयोगलाई कसरी अनुप्रयोगहरूको विरूद्धमा कसरी नेटवर्क उपयोगी अकाउन्टेड छ भनेर परिमार्जन गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूद्वारा प्रयोगको लागि होइन।"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"सूचनाहरू पहुँच गर्नुहोस्"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"अन्य अनुप्रयोगहरूबाट पोस्ट गरिएकासहित पुनःप्राप्त गर्न, परीक्षण गर्न र सूचनाहरू हटाउन अनुप्रयोगहरूलाई अनुमति दिन्छ।"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"जानकारी श्रोता सेवामा बाँध्नुहोस्"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"होल्डरलाई सूचना श्रोता सेवाको शीर्ष-स्तरको इन्टरफेस बाँध्न अनुमति दिन्छ। सामान्य अनुप्रयोगहरूलाई कहिले पनि आवश्यक नपर्न सक्दछ।"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"सर्त प्रदायक सेवामा जोड्न"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"सर्त प्रदायक सेवाको माथिल्लो स्तरको इन्टरफेसमा जोड्न बाहकलाई अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै पनि आवश्यक पर्दैन।"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"सपना सेवामा बाँध्नुहोस्"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"होल्डरलाई सपना सेवाको माथिल्लो स्तरको इन्टरफेसमा बाँध्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै पनि आवश्यक पर्दैन।"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"वाहक-प्रदान विन्यास अनुप्रयोग सुरु गर्नुहोस्"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"प्रयोगकर्तालाई वाहक-प्रदान विन्यास अनुप्रयोग सुरु गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूलाई कहिल्यै आवश्यक पर्ने छैन।"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"सञ्जाल अवस्थाका पर्यवेक्षणका लागि सुन्नुहोस्"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"सञ्जाल अवस्थाका पर्यवेक्षण सुन्नका लागि अनुप्रयोगलाई अनुमति दिन्छ।सामान्य अनुप्रयोगलाई चाँहिदै नचाँहिन सक्छ।"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"इनपुट उपकरण क्यालिब्रेसन परिवर्तन गर्नुहोस्"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"अनुप्रयोगलाई टच स्क्रीनको प्यारामिटरहरू क्यालिब्रेसन परिमार्जन गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै आवश्यक पर्दैन।"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM प्रमाणपत्रको पहुँच"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM प्रमाणपत्रहरू प्रावधान र प्रयोग गर्ने निवेदनको अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै पनि आवश्यक पर्दैन।"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam स्थानान्तरण अवस्था प्राप्त गर्नुहोस्"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"यस आवेदनले वर्तमान Android Beam स्थानान्तरण बारेमा जानकारी प्राप्त गर्न अनुमति दिन्छ"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM प्रमाणपत्रहरू हटाउनुहोस्"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM प्रमाणपत्रहरू हटाउन अनुप्रयोगलाई अनुमति दिन्छ। सामान्य अनुप्रयोगहरूको लागि कहिल्यै आवश्यकता पर्दैन।"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"वाहक मेसेजिङ सेवामा आबद्ध हुनुहोस्"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"धारकलाई वाहक मेसेजिङ सेवाको उच्च-स्तरको इन्टरफेसमा आबद्ध हुन अनुमति दिनुहोस्। सामान्य एपहरूको लागि कहिल्यै आवश्यकता पर्दैन।"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"पासवर्ड नियमहरू मिलाउनुहोस्"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"स्क्रिन लक पासवर्ड र PIN हरूमा अनुमति दिइएको लम्बाइ र वर्णहरूको नियन्त्रण गर्नुहोस्।"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"मोनिटर स्क्रिन-अनलक प्रयत्नहरू"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"अनलक वा आपतकालीन कल गर्न मेनु थिच्नुहोस्।"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"अनलक गर्न मेनु थिच्नुहोस्।"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"अनलक गर्नु ढाँचा खिच्नुहोस्"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"आकस्मिक"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"कलमा फर्किनुहोस्"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"सही!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"फेरि प्रयास गर्नुहोस्"</string>
@@ -1035,36 +1069,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"उम्मेदवार"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"तयारी गर्दै <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटिहरूको लागि जाँच गर्दै"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नयाँ <xliff:g id="NAME">%s</xliff:g> भेटियो"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फोटोहरू र मिडिया स्थानान्तरणका लागि"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> बिग्रेको छ।"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> बिग्रेको छ; यसलाई पुनः फर्म्याट गर्न प्रयास गर्नुहोस्"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूपमा निकालियो"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा नोक्सानबाट बच्न निकाल्नु अघि <xliff:g id="NAME">%s</xliff:g> अनमाउन्ट गर्नुहोस्"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"निकालियो <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> निकालियो; नयाँ हाल्नुहोस्"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"अझै निकाल्दै <xliff:g id="NAME">%s</xliff:g>..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"नहटाउनुहोस्"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"सेटअप"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"निकाल्नुहोस्"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"अन्वेषण गर्नुहोस्"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"कुनै मिल्ने गतिविधि पाइएन।"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"मिडिया परिणाम दिशानिर्देश गर्नुहोस्"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"मिडिया परिणामलाई अन्य बाहिरी उपकरणहरूसँग लैजानको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string>
@@ -1194,6 +1213,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"आन्तरिक भण्डारण"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD कार्ड"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB भण्डारण"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"सम्पादन गर्नुहोस्"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"डेटा प्रयोग चेतावनी"</string>
@@ -1456,7 +1481,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"तपाईँले यसलाई बन्द नगरेसम्म"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त पार्नुहोस्"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"अवरोधहरू रोक्नुहोस्"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"अवरोध नपुर्याउँनुहोस्"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"डाउनटाइम"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"सप्ताह रातहरू"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"सप्ताहन्त"</string>
@@ -1469,9 +1494,9 @@
<string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS अनुरोध DIAL अनुरोधमा परिमार्जन गरिएको छ।"</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS अनुरोध USSD अनुरोधमा परिमार्जन गरिएको छ।"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS अनुरोध नयाँ SS अनुरोधमा परिमार्जन गरिएको छ।"</string>
- <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB परिधीय पोर्ट"</string>
+ <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB पेरिफेरल पोर्ट"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
- <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB परिधीय पोर्ट"</string>
+ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB पेरिफेरल पोर्ट"</string>
<string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"थप विकल्पहरू"</string>
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ओभरफ्लो बन्द गर्नुहोस्"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 9e876a0..ddac7b0 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op uw tablet of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op uw tv of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op uw telefoon of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"uw tekstberichten (SMS of MMS) bewerken"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Hiermee kan de app naar de op uw tablet of simkaart opgeslagen sms\'jes schrijven. Schadelijke apps kunnen uw berichten mogelijk verwijderen."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Hiermee kan de app naar de op uw tv of simkaart opgeslagen sms\'jes schrijven. Schadelijke apps kunnen uw berichten mogelijk verwijderen."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Hiermee kan de app naar de op uw telefoon of simkaart opgeslagen sms\'jes schrijven. Schadelijke apps kunnen uw berichten mogelijk verwijderen."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"tekstberichten (WAP) ontvangen"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Hiermee kan de app WAP-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar uw apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"actieve apps ophalen"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Gedeeltelijke vingerafdruk gedetecteerd. Probeer het opnieuw."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Kan vingerafdruk niet verwerken. Probeer het opnieuw."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"De vingerafdruksensor moet worden schoongemaakt. Probeer het daarna opnieuw."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Vinger te snel bewogen. Probeer het opnieuw."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Vinger te langzaam bewogen. Probeer het opnieuw."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware voor vingerafdruk niet beschikbaar."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan niet worden opgeslagen. Verwijder een bestaande vingerafdruk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Time-out bereikt voor vingerafdruk. Probeer het opnieuw."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Vingerafdrukbewerking geannuleerd."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Te veel pogingen. Probeer het later opnieuw."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probeer het opnieuw."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"synchronisatie-instellingen lezen"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Hiermee kan de app schrijven naar de SD-kaart."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-oproepen plaatsen/ontvangen"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Toestaan dat de app SIP-oproepen plaatst en ontvangt."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"nieuwe telecom-sim-verbindingen registreren"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Hiermee kan de app nieuwe telecom-sim-verbindingen registreren."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"nieuwe telecomverbindingen registreren"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Hiermee kan de app nieuwe telecomverbindingen registreren."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"telecomverbindingen beheren"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Hiermee kan de app telecomverbindingen beheren."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interactie met scherm in actieve oproep"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Hiermee kan de app bepalen wanneer en hoe de gebruiker het scherm in een actieve oproep te zien krijgt."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"communicatie met telefonische diensten"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Hiermee kan de app met telefonische diensten communiceren om oproepen te plaatsen/ontvangen."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"een gebruikerservaring bieden tijdens een gesprek"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Hiermee kan de app een gebruikerservaring bieden tijdens een gesprek."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"historisch netwerkgebruik lezen"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Hiermee kan de app historisch netwerkgebruik voor specifieke netwerken en apps lezen."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"netwerkbeleid beheren"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Hiermee kan de app het netwerkbeleid beheren en app-specifieke regels definiëren."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"verrekening van netwerkgebruik aanpassen"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Hiermee kan een app aanpassen hoe het netwerkgebruik wordt toegekend aan apps. Dit wordt niet gebruikt door normale apps."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"toegang tot meldingen"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Hiermee kan de app meldingen ophalen, onderzoeken en wissen, waaronder meldingen die zijn verzonden door andere apps."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"koppelen aan een listener-service voor meldingen"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Hiermee kan de houder koppelen aan de hoofdinterface van een listener-service voor meldingen. Nooit vereist voor normale apps."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"binden aan de service van een provider van voorwaarden"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Hiermee kan de houder binden aan de hoofdinterface van de service van een provider van voorwaarden. Nooit vereist voor normale apps."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"verbinding maken met een droomservice"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Hiermee wordt de houder toegestaan verbinding te maken met de hoofdinterface van een droomservice. Nooit vereist voor normale apps."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"de door de provider geleverde configuratie-app aanroepen"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Hiermee kan de houder de door de provider geleverde configuratie-app aanroepen. Nooit vereist voor normale apps."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"controleren op waarnemingen met betrekking tot netwerkomstandigheden"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Hiermee kan een app controleren op waarnemingen met betrekking tot netwerkomstandigheden. Nooit vereist voor normale apps."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"kalibratie van invoerapparaat wijzigen"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Hiermee kan de app de kalibratieparameters van het aanraakscherm aanpassen. Nooit vereist voor normale apps."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"toegang tot DRM-certificaten"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Toestaan dat een app DRM-certificaten registreert en gebruikt. Nooit vereist voor normale apps."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam-overdrachtsstatus ontvangen"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Hiermee kan deze app informatie over huidige Android Beam-overdrachten ontvangen"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM-certificaten verwijderen"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Toestaan dat een app DRM-certificaten verwijdert. Nooit vereist voor normale apps."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"binden aan de berichtenservice van een provider"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Hiermee wordt de houder toegestaan te binden aan de berichteninterface van een provider. Nooit vereist voor normale apps."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Wachtwoordregels instellen"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"De lengte en het aantal tekens beheren die zijn toegestaan in wachtwoorden en pincodes voor schermvergrendeling."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Pogingen voor schermontgrendeling bijhouden"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Druk op \'Menu\' om te ontgrendelen of noodoproep te plaatsen."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Druk op \'Menu\' om te ontgrendelen."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Patroon tekenen om te ontgrendelen"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Noodgevallen"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Terug naar gesprek"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Juist!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Opnieuw proberen"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidaten"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> voorbereiden"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Controleren op fouten"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nieuwe <xliff:g id="NAME">%s</xliff:g> gedetecteerd"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Voor het overzetten van foto\'s en media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> is beschadigd"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> is beschadigd. Probeer deze opnieuw te formatteren."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> is onverwacht verwijderd"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ontkoppel <xliff:g id="NAME">%s</xliff:g> voordat u deze verwijdert om gegevensverlies te voorkomen"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> verwijderd"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> verwijderd. Plaats een nieuwe."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Bezig met uitwerpen van <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Niet verwijderen"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configuratie"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Uitwerpen"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Verkennen"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Geen overeenkomende activiteiten gevonden."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Media-uitvoer aansturen"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Hiermee kan een app media-uitvoer naar andere externe apparaten doorsturen."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Interne opslag"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kaart"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-opslag"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Bewerken"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Waarschuwing v. gegevensgebruik"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Totdat u dit uitschakelt"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Samenvouwen"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Onderbrekingen blokkeren"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Niet storen"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Doordeweekse avonden"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekends"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 7a13e98..e6c90be 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -272,10 +272,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Pozwala aplikacji na odczyt SMS-ów zapisanych na tablecie lub na karcie SIM. Aplikacja z tym uprawnieniem może czytać wszystkie SMS-y niezależnie od ich treści lub poufności."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Pozwala aplikacji odczytywać SMS-y zapisane na telewizorze lub karcie SIM. Umożliwia to aplikacji odczytanie wszystkich SMS-ów, niezależnie od ich treści czy poufności."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Pozwala aplikacji na odczyt SMS-ów zapisanych na telefonie lub na karcie SIM. Aplikacja z tym uprawnieniem może czytać wszystkie SMS-y niezależnie od ich treści lub poufności."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"edytowanie wiadomości tekstowych (SMS i MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Pozwala aplikacji na zapisywanie wiadomości SMS przechowywanych w tablecie lub na karcie SIM. Złośliwe aplikacje mogą usunąć wiadomości."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Pozwala aplikacji zapisywać w SMS-ach zapisanych w telewizorze lub na karcie SIM. Złośliwe aplikacje mogą usuwać Twoje SMS-y."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Pozwala aplikacji na zapisywanie wiadomości SMS przechowywanych w telefonie lub na karcie SIM. Szkodliwe aplikacje mogą usunąć wiadomości."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"odbieranie wiadomości tekstowych (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Pozwala aplikacji na odbieranie i przetwarzanie wiadomości WAP. To oznacza, że aplikacja będzie mogła bez Twojej wiedzy monitorować i usuwać wiadomości wysyłane do Twojego urządzenia."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"pobieranie uruchomionych aplikacji"</string>
@@ -431,21 +427,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Odcisk palca został odczytany tylko częściowo. Spróbuj ponownie."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nie udało się przetworzyć linii papilarnych. Spróbuj ponownie."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Czytnik linii papilarnych jest zabrudzony. Wyczyść go i spróbuj ponownie."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Palec został uniesiony zbyt szybko. Spróbuj ponownie."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Palec został przesunięty zbyt wolno. Spróbuj ponownie."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Czytnik linii papilarnych nie jest dostępny."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nie można zapisać odcisku palca. Usuń istniejący odcisk palca."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Osiągnięto limit czasu odczytu linii papilarnych. Spróbuj ponownie."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Odczyt odcisku palca został anulowany."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zbyt wiele prób. Spróbuj ponownie później."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Spróbuj ponownie."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"czytanie ustawień synchronizacji"</string>
@@ -470,6 +461,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Pozwala aplikacji na zapis na karcie SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"wykonywanie/odbieranie połączeń SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Pozwala aplikacji na wykonywanie i odbieranie połączeń SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"rejestrowanie nowych połączeń telekomunikacyjnych SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Zezwala aplikacji na rejestrowanie nowych połączeń telekomunikacyjnych SIM."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"rejestrowanie nowych połączeń telekomunikacyjnych"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Zezwala aplikacji na rejestrowanie nowych połączeń telekomunikacyjnych."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"zarządzanie połączeniami telekomunikacyjnymi"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Zezwala aplikacji na zarządzanie połączeniami telekomunikacyjnymi."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcje z ekranem połączenia"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Zezwala aplikacji na kontrolowanie, kiedy i w jaki sposób użytkownik widzi ekran połączenia."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"korzystanie z usług telefonii"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Pozwala aplikacji na korzystanie z usług telefonii oraz wykonywanie i odbieranie połączeń."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"udostępnianie użytkownikowi funkcji połączenia"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Zezwala aplikacji na udostępnianie użytkownikowi funkcji połączenia."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"odczyt historii wykorzystania sieci"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Pozwala aplikacji na odczyt historii wykorzystania określonych sieci przez poszczególne aplikacje."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"zarządzanie zasadami dotyczącymi sieci"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Pozwala aplikacji na zarządzanie zasadami dotyczącymi sieci i definiowanie reguł aplikacji."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modyfikowanie sposobu naliczania użycia sieci"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Pozwala aplikacji na zmienianie sposobu rozliczania wykorzystania sieci przez aplikacje. Nieprzeznaczone dla zwykłych aplikacji."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"dostęp do powiadomień"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Umożliwia aplikacji pobieranie, sprawdzanie i usuwanie powiadomień, także tych, które pochodzą z innych aplikacji."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"utwórz połączenie z usługą odbiornika powiadomień"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi odbiornika powiadomień. Nie powinno być nigdy potrzebne dla zwykłych aplikacji."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"powiąż z usługą dostawcy warunków"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi dostawcy warunków. Nieprzeznaczone dla zwykłych aplikacji."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"powiąż z usługą wygaszacza ekranu"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi wygaszacza ekranu. Nie powinno być nigdy potrzebne dla zwykłych aplikacji."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"wywoływanie aplikacji konfiguracyjnej udostępnionej przez operatora"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Zezwala na wywoływanie aplikacji konfiguracyjnej udostępnionej przez operatora. Nieprzeznaczone dla zwykłych aplikacji."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"śledź stan sieci"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Pozwala aplikacji śledzić stan sieci. Nieprzeznaczone dla zwykłych aplikacji."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"zmiana kalibracji urządzenia wejściwego"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Zezwala aplikacji na modyfikowanie parametrów kalibracji ekranu dotykowego. Nieprzeznaczone dla zwykłych aplikacji."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"dostęp do certyfikatów DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Zezwala aplikacji na dodanie i używanie certyfikatów DRM. Nieprzeznaczone dla zwykłych aplikacji."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Uzyskiwanie informacji o stanie transmisji Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Zezwala tej aplikacji na otrzymywanie informacji o aktualnych transmisjach Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"usuwanie certyfikatów DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Zezwala aplikacji na usuwanie certyfikatów DRM. Nie powinno być nigdy potrzebne w zwykłych aplikacjach."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"powiąż z usługą przesyłania wiadomości przez operatora"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Zezwala posiadaczowi na tworzenie powiązania z interfejsem najwyższego poziomu w usłudze przesyłania wiadomości przez operatora. Nie powinno być nigdy potrzebne dla zwykłych aplikacji."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Określ reguły hasła"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Kontrolowanie długości haseł blokady ekranu i kodów PIN oraz dozwolonych w nich znaków."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Monitoruj próby odblokowania ekranu"</string>
@@ -630,8 +665,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Naciśnij Menu, aby odblokować lub wykonać połączenie alarmowe."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Naciśnij Menu, aby odblokować."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Narysuj wzór, aby odblokować"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Alarmowe"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Powrót do połączenia"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Poprawnie!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Spróbuj ponownie."</string>
@@ -1043,35 +1077,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandydaci"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Przygotowuję: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sprawdzanie w poszukiwaniu błędów"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Wykryto nowy nośnik: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Do przenoszenia zdjęć i multimediów"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Uszkodzony nośnik: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Nośnik <xliff:g id="NAME">%s</xliff:g> jest uszkodzony. Spróbuj go ponownie sformatować"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>: nieoczekiwane wyjęcie"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Odłącz nośnik <xliff:g id="NAME">%s</xliff:g> przed jego wyjęciem, by uniknąć utraty danych"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Wyjęto: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Wyjęto nośnik <xliff:g id="NAME">%s</xliff:g>. Włóż nowy"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Nadal wysuwam: <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Nie wyjmuj"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Skonfiguruj"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Wysuń"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Przeglądaj"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nie znaleziono pasujących działań."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Kierowanie wyjścia multimediów"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Pozwala aplikacji na kierowanie wyjściowych danych multimedialnych do innych urządzeń zewnętrznych."</string>
@@ -1203,6 +1223,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Pamięć wewnętrzna"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Karta SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Nośnik USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edytuj"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Ostrzeżenie o transmisji danych"</string>
@@ -1475,7 +1501,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Dopóki nie wyłączysz"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Zwiń"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokuj powiadomienia"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nie przeszkadzać"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Powiadomienia wyłączone"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noce poza weekendem"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekendy"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 7579ee9..0df5239 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permite que a aplicação leia mensagens SMS guardadas no tablet ou no cartão SIM. Permite que a aplicação leia todas as mensagens SMS, independentemente do conteúdo ou da confidencialidade das mesmas."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permite à aplicação ler mensagens SMS armazenadas na sua TV ou no seu cartão SIM. Isto permite à aplicação ler todas as mensagens SMS, independentemente do conteúdo ou da confidencialidade."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permite que a aplicação leia mensagens SMS guardadas no telemóvel ou no cartão SIM. Permite que a aplicação leia todas as mensagens SMS, independentemente do conteúdo ou da confidencialidade das mesmas."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"editar as mensagens de texto (SMS ou MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permite que a aplicação escreva mensagens SMS armazenadas no tablet ou no cartão SIM. As aplicações maliciosas podem eliminar as suas mensagens."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permite à aplicação escrever em mensagens SMS armazenadas na sua TV ou no seu cartão SIM. As aplicações maliciosas podem eliminar as suas mensagens."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permite que a aplicação escreva mensagens SMS armazenadas no telemóvel ou no cartão SIM. As aplicações maliciosas podem eliminar as suas mensagens."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"receber mensagens de texto (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permite que a aplicação receba e processe mensagens WAP. Esta autorização inclui a capacidade de monitorizar ou eliminar mensagens enviadas para si sem as apresentar."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"obter aplicações em execução"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Impressão digital detetada. Tente novamente."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Não foi possível processar a impressão digital. Tente novamente."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"O sensor de impressões digitais está sujo. Limpe-o e tente novamente."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"O dedo moveu-se demasiado rápido. Tente novamente."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"O dedo moveu-se demasiado devagar. Tente novamente."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não é possível armazenar a impressão digital. Remova uma impressão digital existente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Foi atingido o limite de tempo da impressão digital. Tente novamente."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operação de impressão digital cancelada."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiadas tentativas. Tente novamente mais tarde."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler definições de sincronização"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite que a aplicação escreva no cartão SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"efetuar/receber chamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que a aplicação efetue e receba chamadas SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registar novas ligações SIM de telecomunicações"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que a aplicação registe novas ligações SIM de telecomunicações."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registar novas ligações de telecomunicações"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que a aplicação registe novas ligações de telecomunicação."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"gerir ligações de telecomunicação"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que a aplicação faça a gestão das ligações de telecomunicação."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interagir com o ecrã durante uma chamada"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permite que a aplicação controle quando e como o utilizador vê o ecrã durante uma chamada."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"Interagir com serviços telefónicos"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permite à aplicação interagir com serviços telefónicos e fazer/receber chamadas."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"proporcionar uma experiência de utilizador em chamada"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permite que a aplicação proporcione uma experiência de utilizador em chamada."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ler utilização histórica da rede"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permite que a aplicação leia utilização histórica da rede para redes e aplicações específicas."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gerir a política de rede"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permite que a aplicação faça a gestão de políticas de rede e defina regras específicas de aplicações."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modificar contabilização da utilização da rede"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permite que a aplicação modifique o modo como a utilização da rede é contabilizada em relação a aplicações. Nunca é necessário para aplicações normais."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"aceder às notificações"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite que a aplicação obtenha, examine e limpe notificações, incluindo as que foram publicadas por outras aplicações."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"vincular a um serviço de escuta de notificações"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite que o titular vincule a interface de nível superior de um serviço de escuta de notificações. Nunca deverá ser necessário para aplicações normais."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"vincular a um serviço de fornecedor de condição"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite que o titular vincule a interface de nível superior de um serviço de fornecedor de condição. Nunca deverá ser necessário para aplicações normais."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"vincular-se a um serviço de sonho"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permite ao detentor ficar vinculado à interface de nível superior de um serviço de sonho. Nunca deverá ser necessário para aplicações normais."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invocar a aplicação de configuração fornecida pela operadora"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite que o titular invoque a aplicação de configuração fornecida pela operadora. Nunca deverá ser necessário para aplicações normais."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ouvir observações sobre as condições da rede"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permite que uma aplicação ouça observações sobre as condições da rede. Nunca deverá ser necessário para aplicações normais."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"alterar a calibragem de entrada do dispositivo"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permite à aplicação modificar os parâmetros de calibragem do ecrã tátil. Esta funcionalidade nunca deverá ser necessária para aplicações normais."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"Aceder a certificados DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permite que uma aplicação forneça e utilize certificados DRM. Nunca deverá ser necessário para aplicações normais."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Receber estado de transferência do Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite que esta aplicação receba informações acerca das transferências atuais do Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"remover certificados DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permite que uma aplicação remova certificados DRM. Nunca deverá ser necessário para aplicações normais."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"ligar ao serviço de mensagens de um operador"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permite ao titular ligar à interface de nível superior do serviço de mensagens de um operador. Nunca deve ser necessário para aplicações normais."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Definir regras de palavra-passe"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Controlar o comprimento e os carateres permitidos nos PINs e nas palavras-passe do bloqueio de ecrã."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Monitorizar tentativas de desbloqueio do ecrã"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Prima Menu para desbloquear ou efectuar uma chamada de emergência."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Prima Menu para desbloquear."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Desenhar padrão para desbloquear"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Emergência"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Regressar à chamada"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcto!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Tentar novamente"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"A preparar o <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"A verificar a presença de erros"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detetado"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e conteúdos multimédia"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> danificado"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> está danificado. Experimente reformatá-lo"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desmontar o <xliff:g id="NAME">%s</xliff:g> antes da remoção para evitar a perda de dados"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> removido"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> removido; insira um novo"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ainda a ejetar <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Não remover"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configuração"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Ejetar"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Não foi encontrada nenhuma atividade correspondente."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Encaminhar saída de som multimédia"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que a aplicação encaminhe a saída de som multimédia para outros dispositivos externos."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"memória de armazenamento interno"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Cartão SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Aviso de utilização de dados"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Até que o utilizador desative"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Reduzir"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloquear interrupções"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Não incomodar"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Período de inatividade"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noites de dias úteis"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fins de semana"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index f23de25..85edfc5 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permite que o app leia mensagens SMS armazenadas no tablet ou cartão SIM. Isso permite que o app leia todas as mensagens SMS, independentemente de seu conteúdo ou confidencialidade."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permite que o app leia as mensagens SMS armazenadas na sua TV ou no cartão SIM. Isso permite que o app leia todas as mensagens SMS, independentemente do seu conteúdo ou confidencialidade."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permite que o app leia mensagens SMS armazenadas no telefone ou cartão SIM. Isso permite que o app leia todas as mensagens SMS, independentemente de seu conteúdo ou confidencialidade."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"editar suas mensagens de texto (SMS ou MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permite que o app grave mensagens SMS armazenadas em seu tablet ou cartão SIM. Apps maliciosos pode excluir suas mensagens."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permite que o app grave mensagens SMS armazenadas na sua TV ou cartão SIM. Apps maliciosos podem excluir suas mensagens."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permite que o app grave mensagens SMS armazenadas no telefone ou cartão SIM. Apps maliciosos podem excluir suas mensagens."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"receber mensagens de texto (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permite que o app receba e processe mensagens WAP. Esta permissão inclui a capacidade de monitorar ou excluir mensagens enviadas para você sem mostrá-las para você."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"recuperar apps em execução"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Impressão digital parcial detectada. Tente novamente."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Não foi possível processar a impressão digital. Tente novamente."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"O sensor de impressão digital está sujo. Limpe-o e tente novamente."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"O dedo foi retirado rápido demais. Tente novamente."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"O movimento do dedo está muito lento. Tente novamente."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não foi possível armazenar a impressão digital. Remova uma impressão digital já existente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operação de impressão digital cancelada."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Excesso de tentativas. Tente novamente mais tarde."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite que o app grave em seu cartão SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"fazer/receber chamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que o app faça e receba chamadas SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrar novas conexões SIM de telecomunicações"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que o app registre novas conexões SIM de telecomunicações."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrar novas conexões de telecomunicações"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que o app registre novas conexões de telecomunicações."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"gerenciar conexões de telecomunicações"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que o app gerencie conexões de telecomunicações."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interagir com chamada na tela"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permite que o app controle quando e como o usuário visualiza a chamada na tela."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interagir com os serviços de telefonia"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permite ao app interagir com os serviços de telefonia para fazer/receber chamadas."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"fornecer uma experiência de usuário em chamada"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permite ao app fornecer uma experiência de usuário em chamada."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ler histórico de uso da rede"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permite que o app leia o histórico de uso da rede para redes e apps específicos."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gerenciar a política de rede"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permite que o app gerencie políticas de rede e definia regras específicas para o app."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modificar contagem de uso da rede"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permite que o app modifique como o uso da rede é contabilizado em relação aos apps. Não deve ser usado em apps normais."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"acessar notificações"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite que o app recupere, examine e limpe notificações, inclusive as postadas por outros apps."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"sujeitar a um serviço ouvinte de notificações"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite que o proprietário sujeite a interface de nível superior a um serviço ouvinte de notificações. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"associar a um serviço provedor de condições"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite que o proprietário use a interface de nível superior de um serviço provedor de condições. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"conectar-se a um serviço de sonho"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permite que o sistema autorizado se conecte à interface de nível superior de um serviço de sonho. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invocar o app de configuração fornecido pela operadora"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite que o proprietário invoque o app de configuração fornecido pela operadora. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"detectar observações nas condições da rede"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permite que o app detecte observações nas condições da rede. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"alterar calibragem do dispositivo de entrada"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permite que o app modifique os parâmetros de calibragem da tela sensível ao toque. Não deve ser necessário para apps normais."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"acessar certificados de DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permite que o app provisione e use certificados de DRM. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Receber status de transferência do Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite que este app receba informações sobre as atuais transferências do Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"remover certificados de DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permite que um app remova certificados de DRM. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"vincular a um serviço de mensagens de operadora"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permite que o proprietário use a interface de nível superior de um serviço de mensagens de operadora. Não deve ser necessária para apps comuns."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Definir regras para senha"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Controla o tamanho e os caracteres permitidos nos PINs e nas senhas do bloqueio de tela."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Monitorar tentativas de desbloqueio da tela"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Pressione Menu para desbloquear ou fazer uma chamada de emergência."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pressione Menu para desbloquear."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Desenhe o padrão para desbloquear"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Emergência"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Retornar à chamada"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correto!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Tente novamente"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Procurando erros"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detectado"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e mídia"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> danificada"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"A mídia <xliff:g id="NAME">%s</xliff:g> está danificada. Tente reformatá-la"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desconecte <xliff:g id="NAME">%s</xliff:g> antes da remoção para evitar a perda de dados"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mídia <xliff:g id="NAME">%s</xliff:g> removida."</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Mídia <xliff:g id="NAME">%s</xliff:g> removida. Insira uma nova"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ainda ejetando <xliff:g id="NAME">%s</xliff:g>..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Não remova"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configurar"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Ejetar"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nenhum atividade correspondente foi encontrada."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Rotear saída de mídia"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que um app faça o roteamento de saída de mídia para outros dispositivos externos."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Armazenamento interno"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Cartão SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Aviso sobre uso de dados"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Até você desativar"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Recolher"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bloquear interrupções"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Não perturbe"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tempo de inatividade"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noites em dias úteis"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Finais de semana"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 2fee857..5e35ebc 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -271,10 +271,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permite aplicației să citească mesajele SMS stocate pe tabletă sau pe cardul SIM. În acest fel, aplicația poate citi toate mesajele SMS, indiferent de conţinutul sau de gradul de confidenţialitate al acestora."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Permite aplicației să citească mesajele SMS stocate pe televizor sau pe cardul SIM. Cu această permisiune, aplicația poate citi toate mesajele SMS, indiferent de conținutul sau de gradul de confidențialitate al acestora."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permite aplicației să citească mesajele SMS stocate pe telefon sau pe cardul SIM. În acest fel, aplicația poate citi toate mesajele SMS, indiferent de conţinutul sau de gradul de confidenţialitate al acestora."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"editează mesajele text (SMS sau MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permite aplicației să scrie în mesajele SMS stocate pe tabletă sau pe cardul SIM. Aplicaţiile rău intenţionate pot să vă şteargă mesajele."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Permite aplicației să scrie în mesajele SMS stocate pe televizor sau pe cardul SIM. Aplicațiile rău-intenționate pot să vă șteargă mesajele."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permite aplicației să scrie în mesajele SMS stocate pe telefon sau pe cardul SIM. Aplicaţiile rău intenţionate pot să vă şteargă mesajele."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"primeşte mesaje text (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permite aplicației să primească și să proceseze mesaje WAP. Această permisiune include capacitatea de a monitoriza sau şterge mesajele care v-au fost trimise fără a vi le arăta."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"preluare aplicații care rulează"</string>
@@ -430,21 +426,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"S-a detectat parțial amprenta. Încercați din nou."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Amprenta nu a putut fi procesată. Încercați din nou."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzorul pentru amprente este murdar. Curățați-l și încercați din nou."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Ați mișcat degetul prea repede. Încercați din nou."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Ați mișcat degetul prea încet. Încercați din nou."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware-ul pentru amprentă nu este disponibil."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Amprenta nu poate fi stocată. Eliminați o amprentă existentă."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timpul pentru amprentare a expirat. Încercați din nou."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operațiunea privind amprenta a fost anulată."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Prea multe încercări. Încercați din nou mai târziu."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Încercați din nou."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"citire setări sincronizare"</string>
@@ -469,6 +460,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite aplicației să scrie pe cardul SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"efectuarea/primirea apelurilor SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite aplicației să efectueze și să primească apeluri SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"se înregistrează conexiuni noi de telecomunicații pentru SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite aplicației să înregistreze conexiuni noi de telecomunicații pentru SIM."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"se înregistrează conexiuni noi de telecomunicații"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite aplicației să înregistreze conexiuni noi de telecomunicații."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"gestionarea conexiunilor de telecomunicații"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite aplicației să gestioneze conexiuni de telecomunicații."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interacțiune cu ecranul în timpul unui apel"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Permite aplicației să controleze când și cum vede utilizatorul ecranul în timpul unui apel."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"să interacționeze cu servicii de telefonie"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Permite aplicației să interacționeze cu servicii de telefonie pentru a da / a primi apeluri."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"oferă o experiență de utilizare în timpul unui apel"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permite aplicației să ofere o experiență de utilizare în timpul unui apel."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"citeşte utilizarea statistică a reţelei"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permite aplicației să citească utilizarea statistică a reţelei pentru anumite reţele și aplicații."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gestionează politica de reţea"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permite aplicației să gestioneze politicile de reţea și să definească regulile specifice aplicațiilor."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modificaţi modul de calcul al utilizării reţelei"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permite aplicației să modifice modul în care este calculată utilizarea reţelei pentru aplicații. Nu se utilizează de aplicațiile obişnuite."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"accesare notificări"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite aplicației să recupereze, să examineze și să șteargă notificări, inclusiv pe cele postate de alte aplicații."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"conectare la un serviciu de citire a notificărilor"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite proprietarului să se conecteze la interfața de nivel superior a unui serviciu de citire a notificărilor. În mod normal aplicațiile nu ar trebui să aibă nevoie de această permisiune."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"conectare la un serviciu furnizor de condiții"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite proprietarului să se conecteze la interfața de nivel superior a unui serviciu furnizor de condiții. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"se conectează la un serviciu de vis"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permite deținătorului să se conecteze la interfața superioară a unui serviciu de vis. Această opțiune nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"apelarea aplicației de configurare furnizată de operator"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite proprietarului să apeleze aplicația de configurare furnizată de operator. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ascultă observații despre starea rețelei"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permite unei aplicații să asculte observații despre starea rețelei. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"schimbați calibrarea dispozitivului de intrare"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permite aplicației să modifice parametrii de calibrare a ecranului tactil. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"accesează certificatele DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permite unei aplicații să furnizeze și să utilizeze certificate DRM. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Primiți starea transferului prin Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite acestei aplicații să primească informații despre transferurile actuale Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"eliminarea certificatelor DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permite unei aplicații să elimine certificatele DRM. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"se conectează la un serviciu de mesagerie oferit de operator"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permite aplicației să se conecteze la interfața de nivel superior a unui serviciu de mesagerie oferit de operator. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<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>
@@ -629,8 +664,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Apăsaţi Meniu pentru a debloca sau pentru a efectua apeluri de urgenţă."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Apăsaţi Meniu pentru deblocare."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Desenaţi modelul pentru a debloca"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Urgență"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Reveniţi la apel"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Corect!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Încercaţi din nou"</string>
@@ -1036,36 +1070,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidaţi"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Se pregătește <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Se verifică dacă există erori"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"A fost detectat un nou <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pentru a transfera fotografii și fișiere media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> deteriorat"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> este deteriorat; încercați să îl formatați"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> scos pe neașteptate"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Demontați <xliff:g id="NAME">%s</xliff:g> înainte de a-l scoate pentru a nu pierde datele"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> scos"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> scos; introduceți unul nou"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Se scoate <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Nu scoateți"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Configurați"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Scoateți"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Explorați"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nu s-a găsit nicio activitate potrivită."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Direcţionează rezultatele media"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite unei aplicații să direcţioneze rezultate media către alte dispozitive externe."</string>
@@ -1196,6 +1215,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Stocare internă"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Card SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Dsipozitiv de stocare USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editaţi"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Avertisment de utiliz. a datelor"</string>
@@ -1463,7 +1488,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Până la dezactivare"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Restrângeți"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blocați întreruperile"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nu deranja"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Inactivitate"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Serile zilelor lucrătoare"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekenduri"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 9bafb16..1da0b36 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -221,15 +221,15 @@
<string name="user_owner_label" msgid="6465364741001216388">"Персональные приложения"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"Работа"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакты"</string>
- <string name="permgroupdesc_contacts" msgid="1437393511338346185">"доступ к контактам и внесение в них изменений"</string>
+ <string name="permgroupdesc_contacts" msgid="1437393511338346185">"доступ к контактам и их изменение"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Местоположение"</string>
<string name="permgroupdesc_location" msgid="536889867433972794">"доступ к данным о местоположении"</string>
<string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Информация о моих контактах"</string>
<string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Прямой доступ к информации о моих контактах и социальных связях."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календарь"</string>
- <string name="permgroupdesc_calendar" msgid="2116049656685591803">"доступ к календарю и внесение в него изменений"</string>
+ <string name="permgroupdesc_calendar" msgid="2116049656685591803">"доступ к календарю и его изменение"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="3695085582674524761">"доступ к SMS и внесение в них изменений"</string>
+ <string name="permgroupdesc_sms" msgid="3695085582674524761">"доступ к SMS и их изменение"</string>
<string name="permgrouplab_dictionary" msgid="8114410334955871144">"Пользовательский словарь"</string>
<string name="permgroupdesc_dictionary" msgid="7586787746354378335">"Чтение слов в пользовательском словаре или их запись."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Закладки и история"</string>
@@ -272,10 +272,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Приложение сможет просматривать SMS-сообщения, сохраненные на устройстве или SIM-карте, независимо от содержания или настроек конфиденциальности."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Доступ к SMS, сохраненным на телевизоре или SIM-карте, в том числе конфиденциальным."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Приложение сможет просматривать SMS-сообщения, сохраненные на устройстве или SIM-карте, независимо от содержания или настроек конфиденциальности."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"Изменение SMS и MMS"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Приложение сможет изменять SMS, сохраненные на планшетном ПК или SIM-карте. Вредоносные программы смогут удалять ваши сообщения."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Изменение SMS, сохраненных в памяти телевизора или на SIM-карте. Вредоносные приложения могут использовать это разрешение, чтобы удалять сообщения."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Приложение сможет изменять SMS, сохраненные на телефоне или SIM-карте. Вредоносные программы смогут удалять ваши сообщения."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"Прием WAP-сообщений"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Приложение сможет получать и обрабатывать WAP-сообщения. Это значит, что оно сможет отслеживать и удалять отправленные на ваше устройство сообщения, не показывая их."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"Получение данных о запущенных приложениях"</string>
@@ -431,21 +427,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Отсканирована только часть пальца. Повторите попытку."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Не удалось распознать отпечаток. Повторите попытку."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Очистите сканер и повторите попытку."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Вы слишком быстро убрали палец. Повторите попытку."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Вы слишком долго удерживали палец. Повторите попытку."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Сканер недоступен"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Чтобы сохранить новый отпечаток, удалите существующий."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Превышено время ожидания. Повторите попытку."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Операция по отпечатку отменена."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Слишком много попыток. Повторите позже."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторите попытку."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"Просмотр настроек синхронизации"</string>
@@ -470,6 +461,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Приложение сможет записывать данные на SD-карту."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"Входящие и исходящие вызовы SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Разрешить вызовы по протоколу SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"регистрация новых SIM-карт"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Регистрация новых SIM-карт."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"регистрация новых операторов связи"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Регистрация новых операторов связи."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"управление подключениями"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Управление сетевыми подключениями."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"Управление экраном во время разговора"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Управление экраном во время разговора."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"доступ к службам телефонии"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Доступ к службам телефонии для совершения и приема вызовов."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"Работа с приложением во время разговора"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Работа с приложением во время разговора."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"Просмотр журнала использования сети"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Приложение сможет считывать сохраненную историю использования определенных сетей и приложений."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"Управление сетевой политикой"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Приложение сможет управлять сетевыми политиками и определять правила для отдельных приложений."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"Изменение учета использования сети"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Приложение сможет изменять порядок расчета использования сетевых ресурсов различными программами. Это разрешение не используется обычными приложениями."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"Доступ к уведомлениям"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Приложение сможет получать, проверять и удалять уведомления, включая те, что опубликованы другими приложениями."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"Подключение к службе просмотра уведомлений"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Приложение сможет подключаться к базовому интерфейсу службы просмотра уведомлений. Это разрешение не используется обычными приложениями."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"Подключение к серверам поставщиков условий"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Приложение сможет подключаться к базовому интерфейсу поставщиков условий. Это разрешение обычно используется только специальными приложениями."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"Подключение к службе экранных заставок"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Подключение к базовому интерфейсу службы экранных заставок. Это разрешение не используется обычными приложениями."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"Запуск приложения настроек, предоставленного оператором"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Владелец сможет запускать приложение настроек, предоставленное оператором. Это разрешение не используется обычными приложениями."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Использование данных о состоянии сети"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Приложение сможет использовать данные о состоянии сети. Это разрешение обычно используется только специальными приложениями."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"изменение параметров калибровки экрана"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Приложение сможет изменять параметры калибровки сенсорного экрана. Это разрешение обычно используется только специальными приложениями."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"Доступ к сертификатам DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Приложение сможет синхронизировать и использовать сертификаты DRM (разрешение актуально только для специальных приложений)."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Получение статуса передачи Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Получение информации о текущих передачах Android Beam."</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"удаление сертификатов DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Удаление сертификатов DRM. Большинству приложений это разрешение не требуется."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"Подключение к службе обмена сообщениями"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Подключение к базовому интерфейсу службы обмена сообщениями, предоставляемой оператором связи. Это разрешение обычно используется только специальными приложениями."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Правила выбора паролей"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Контролировать длину и символы при вводе пароля и PIN-кода."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Отслеживать попытки снятия блокировки экрана"</string>
@@ -630,8 +665,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Нажмите \"Меню\", чтобы разблокировать экран или вызвать службу экстренной помощи."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Для разблокировки нажмите \"Меню\"."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Введите графический ключ"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Экстренный вызов"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Вернуться к вызову"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Правильно!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Повторите попытку"</string>
@@ -1043,35 +1077,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"варианты"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Подготовка карты \"<xliff:g id="NAME">%s</xliff:g>\"…"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Поиск ошибок"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Обнаружена новая карта \"<xliff:g id="NAME">%s</xliff:g>\""</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для переноса фотографий и других файлов"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" повреждена"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Попробуйте отформатировать карту \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена неправильно"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Перед тем как извлечь карту \"<xliff:g id="NAME">%s</xliff:g>\", отключите ее, чтобы избежать потери данных."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена. Вставьте другую."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Извлечение карты \"<xliff:g id="NAME">%s</xliff:g>\"…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не извлекать"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Настроить"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Извлечь"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Обзор"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Подходящих действий не найдено."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Перенаправление мультимедийных данных"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Приложение сможет направлять поток мультимедиа на другие внешние устройства."</string>
@@ -1203,6 +1223,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Внутренняя память"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-карта"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-накопитель"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Изменить"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Осталось мало трафика"</string>
@@ -1475,8 +1501,8 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Пока я не отключу"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Свернуть"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Блокировать уведомления"</string>
- <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Режим уведомления"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не беспокоить"</string>
+ <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Режим оповещения"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Будние вечера"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Выходные дни"</string>
<string name="muted_by" msgid="6147073845094180001">"Звук отключен приложением \"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>\""</string>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index 2f0181c..b7a5ea2 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ඔබගේ ටැබ්ලටයේ හෝ SIM පතේ ආචයනය කර ඇති SMS පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. අන්තර්ගතය හෝ විශවාසදයි බවින් තොරවම සියලු SMS පණිවිඩ කියවීමට මෙමගින් යෙදුමට අවසර දෙයි."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"ඔබගේ රූපවාහිනියේ හෝ SIM කාඩ්පතේ ගබඩා කර ඇති SMS පණිවිඩ කියවීමට යෙදුම ඉඩ දෙන්න. නොසලකන හෝ රහසිගත සියළුම SMS පණිවිඩ, කියවීමට යෙදුමට මෙයින් අවසර ලැබේ."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ඔබගේ දුරකථනයේ හෝ SIM පතේ ආචයනය කරන ලද SMS පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. අන්තර්ගතය හෝ විශ්වාසදායී බවින් තොරවම සියලු SMS පණිවිඩ කියවීමට මෙමගින් යෙදුමට අවසර දෙයි."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"ඔබගේ කෙටි පණිවිඩ සංස්කරණය කිරීම (SMS හෝ MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ඔබගේ ටැබ්ලටයේ හෝ SIM පතේ ගබඩා කර ඇති SMS පණිවිඩ වෙත ලිවීමට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් ඔබගේ පණිවිඩ මකා දැමිය හැක."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"යෙදුමට ඔබගේ රූපවාහිනියේ හෝ SIM කාඩ්පතෙහි ගබඩා කර ඇති SMS පණිවිඩ වෙත ලිවීමට අවසර දෙයි. අශිෂ්ට යෙදුම් ඔබගේ පණිවිඩ මකා දමනු ඇත."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ඔබගේ ටැබ්ලටයේ හෝ SIM පතේ ආචයනය කරන ලද SMS පණිවිඩ ලිවීමට යෙදුමට අවසර දෙන්න. අනිෂ්ට යෙදුම් ඔබගේ පණිවිඩ මකා දැමිය හැක."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"පෙළ පණිවිඩ ලබාගැනීම (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP පණිවිඩ ලැබීමට සහ ක්රියාවලි කිරීමට යෙදුමට අවසර දෙන්න. මෙම අවසරයෙහි ඔබව ඒවාට පෙන්වීමකින් තොරව ඔබට පණිවිඩ නිරීක්ෂණයට හෝ මැකීමට හැකියාව ඇතුළත් වේ."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ධාවනය වන යෙදුම් ලබාගැනීම"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ඇඟිලි සලකුණ අඩ වශයෙන් අනාවරණය කර ගැනිණි. කරුණාකර නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ඇඟිලි සලකුණ පිරිසැකසීමට නොහැකි විය. කරුණාකර නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ඇඟිලි සලකුණු සංවේදකය අපිරිසිදුයි. කරුණාකර පිරිසිදු කර නැවත උත්සාහ කරන්න."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"ඇඟිල්ල ඉතා වේගයෙන් ගෙන යන ලදී. කරුණාකර නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"ඇඟිල්ල සෙමින් ගෙන යන ලදී. කරුණාකර නැවත උත්සාහ කරන්න."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ඇඟිලි සලකුණු දෘඪාංගය ලද නොහැකිය."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ඇඟිලි සලකුණ ගබඩා කළ නොහැක. දැනට පවතින ඇඟිලි සලකුණක් ඉවත් කරන්න."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ඇඟිලි සලකුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ඇඟිලි සලකුණු මෙහෙයුම අවලංගු කරන ලදී."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"උත්සාහයන් ඉතා වැඩි ගණනකි. කරුණාකර පසුව නැවත උත්සාහ කරන්න."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"නැවත උත්සාහ කරන්න."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"සමමුහුර්ත සැකසීම් කියවන්න"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD පත වෙත ලිවීමට යෙදුමට අවසර දෙන්න."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP ඇමතුම් සිදුකිරීමට/ලබාගැනීමට"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP ඇමතුම් සිදුකිරීමට සහ ලබාගැනීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"අලුත් විදුලි සංදේශ SIM සම්බන්ධතාවක් ලියාපදිංචි කරන්න"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"අලුත් විදුලි සංදේශ SIM සම්බන්ධතාවක් ලියාපදිංචි කිරීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"අලුත් විදුලි සංදේශ සම්බන්ධතාවක් ලියාපදිංචි කරන්න"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"අලුත් විදුලි සංදේශන සම්බන්ධතා ලියාපදිංචි කිරීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"විදුලි සංදේශන සම්බන්ධතා කළමණාකරණය කරන්න"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"විදුලි සංදේශන සම්බන්ධතා කළමණාකරණය කිරීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ලැබෙන ඇමතුම් තිරය සමග අන්තර් ක්රියාකාරී වන්න"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ලැබෙන ඇමතුම් තිරය පරිශීලකයාට පෙනෙන්නේ කෙදිනද සහ කෙසේද යැයි පාලනය කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"දුරකථන සේවාවන් සමඟ සම්බන්ධ වීම"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"ඇමතුම් ගැනීමට/ලැබීමට දුරකථන සේවාවන් සමඟ සම්බන්ධ වීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"එන-ඇමතුම් පරිශීලක අත්දැකීම සපයන්න"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"එන-ඇමතුම් පරිශීලක අත්දැකීම සැපයීමට යෙදුම් වෙත ඉඩ දෙන්න."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ඉතිහාසගත ජාල භාවිතය කියවන්න"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"විශේෂිත ජාල සහ යෙදුම් සඳහා ඉතිහාසගත ජාල භාවිතය කියවීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ජාල ප්රතිපත්තිය කළමනාකරණය කිරීම"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ජාල කොන්දේසි සහ සඳහන් යෙදුම් විශේෂීත රීති කළමනාකරණය කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ජාල භාවිත ගිණුම් කිරීම වෙනස් කිරීම"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"යෙදුම්වලට ජාල භාවිතයෙන් වන බලපෑම කෙසේද යන්න වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. සාමාන්ය යෙදුම්වල භාවිතය සඳහා නොවේ."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"ප්රවේශ දැනුම්දීම්"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"වෙනත් යෙදුම් විසින් කළ පල කිරීම්ද ඇතුළත්ව දැන්වීම් ලබා ගැනීමට, පරීක්ෂා කිරීමට සහ හිස් කිරීමට යෙදුමට අවසර දෙන්න."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"දැනුම්දීම ඇහුම්කන් දීම් සේවාවක් වෙත බඳින්න"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"දැනුම්දීම් අසන්නාගේ සේවාවේ ඉහළ මට්ටමේ අතුරුමුහුණතට බැඳීමට දරන්නාට අවසර දේ. සාමාන්ය යෙදුම් සඳහා කිසිසේත් අවශ්ය නොවේ."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"තත්ත්වය සපයන්නාගේ සේවාවට බඳින්න"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"තත්ත්වය සපයන්නාගේ සේවාවට ඉහළ-මට්ටමේ අතුරු මුහුණතක් බැඳිමට ධාරකයාට අවසර දෙන්න. සාමාන්ය යෙදුම් සඳහා කවදාවත් අවශ්යය නොවෙයි."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"ඩ්රීම් සේවාවකට බැඳීම"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"ඩ්රීම් සේවාව ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට ධාරකයාට අවසර දෙන්න. සාමාන්ය යෙදුම්වලට කිසි විටෙක අවශ්ය නොවෙයි."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"වාහකය සැපයු වින්යාසය යෙදුම ඉල්ලා සිටින්න"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"වාහකයා ලබාදුන් සැකසුම් යෙදුම් උත්පාදනයට ධාරකයාට අවසර දෙන්න. සාමාන්ය යෙදුම් සඳහා කිසිදා අවශ්ය නොවෙයි."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ජාල තත්ව මත නිරීක්ෂණ වෙත ඇහුම්කන් දීම"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"යෙදුමකට ජාල තත්ව මත නිරීක්ෂණ වෙත ඇහුම්කන් දීමට අවසර දේ. සාමාන්ය යෙදුම් සඳහා කිසිදා අවශ්ය නොවේ."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ආදාන උපාංග ක්රමාංකනය වෙනස් කිරීම"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"යෙදුම් වලට ස්පර්ශ තිරයේ ක්රමාංකන පරාමිති වෙනස් කිරීමට ඉඩ දේ. සාමාන්ය යෙදුම් වලට කිසිදා අවශ්ය නොවේ."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM සහතික ප්රවේශය"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"යෙදුමකට DRM සහතික වෙන් කර භාවිතා කිරීමට ඉඩ දේ. සාමාන්ය යෙදුම් වලට කිසිදා අවශ්ය නොවේ."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android බීම් හුවමාරු තත්ත්වය ලබාගන්න"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"දැනට තිබෙන Android බීම් හුවමාරු පිළිබඳ තොරතුරු ලබාගැනීමට මෙම යෙදුමට ඉඩ දෙන්න"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM සහතික ඉවත් කරන්න"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"යෙදුමකට DRM සහතික ඉවත් කිරීමට ඉඩ දේ. සාමාන්ය යෙදුම් වලට කිසිදා අවශ්ය නොවේ."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"වාහක පණිවිඩ යැවීමේ සේවාවට බදින්න"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"වාහක සේවාව ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට ධාරකයාට අවසර දෙන්න. සාමාන්ය යෙදුම්වලට කිසි විටෙක අවශ්ය නොවෙයි."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"මුරපද නීති සකස් කිරීම"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"තිර අගුලු මුරපද සහ PIN තුළ ඉඩ දෙන දිග සහ අනුලකුණු පාලනය කිරීම."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"තිරය අගුළු ඇරීමේ උත්සාහයන් නිරීක්ෂණය කරන්න"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"අගුළු හැරීමට මෙනුව ඔබන්න හෝ හදිසි ඇමතුම ලබාගන්න."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"අගුළු හැරීමට මෙනු ඔබන්න."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"අගුළු ඇරීමට රටාව අඳින්න"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"හදිසි"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"ඇමතුම වෙත නැවත යන්න"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"නිවැරදියි!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"නැවත උත්සාහ කරන්න"</string>
@@ -1031,36 +1065,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"අපේක්ෂකයන්"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> සූදානම් කරමින්"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"වැරදි සඳහා පරීක්ෂා කරමින්"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"නව <xliff:g id="NAME">%s</xliff:g> අනාවරණය කරන ලදි"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ඡායාරූප සහ මාධ්ය හුවමාරු කිරීම සඳහා"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"හානි වූ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> හානි වී ඇත; එය නැවත ෆෝමැට් ගැන්වීමට උත්සහ කරන්න."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> අනපේක්ෂිතව ඉවත් කරන ලදි"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"දත්ත නැතිවීම වැළක්වීමට <xliff:g id="NAME">%s</xliff:g> ආචයනය ඉවත්කිරීමට පෙර ගලවන්න."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ඉවත් කරන ලදි"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ඉවත් කරන ලදි; අලුත් එකක් ඇතුළත් කරන්න"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> තවමත් ගලවමින්…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ඉවත් නොකරන්න"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"ස්ථාපනය"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"ගැලවීම"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"ගවේෂණය කරන්න"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"ගැලපෙන ක්රියාකාරකම් හමු නොවුණි."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"මාධ්ය ප්රතිදානයේ මාර්ගගත කිරීම"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"වෙනත් බාහිර උපාංග වෙත මාධ්ය ප්රතිදානය යැවීමට යෙදුමට අවසර දෙන්න."</string>
@@ -1190,6 +1209,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"අභ්යන්තර ආචයනය"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD පත"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD කාඩ්පත"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB ධාවකය"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ධාවකය"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB ආචයනය"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"සංස්කරණය කරන්න"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"දත්ත භාවිතා අවවාදය"</string>
@@ -1452,7 +1474,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"ඔබ මෙය අක්රිය කරන තුරු"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"හකුළන්න"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"බාධා අවහිර කරන්න"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"බාධා නොකරන්න"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"බිඳවැටුම් කාලය"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"සතියේ රාත්රි වල"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"සති අන්ත"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 0442115..281f2f5 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -272,10 +272,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Umožňuje aplikácii čítať správy SMS uložené v tablete alebo na karte SIM. Toto povolenie umožňuje aplikácii čítať správy SMS bez ohľadu na ich obsah alebo dôvernosť."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Umožňuje aplikácii čítať správy SMS uložené vo vašom televízore alebo SIM karte. Toto nastavenie umožňuje aplikácii čítať všetky správy SMS bez ohľadu na ich obsah alebo dôvernosť."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Umožňuje aplikácii čítať správy SMS uložené v telefóne alebo na karte SIM. Toto povolenie umožňuje aplikácii čítať správy SMS bez ohľadu na ich obsah alebo dôvernosť."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"upraviť textové správy (SMS alebo MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Umožňuje aplikácii písať správy SMS uložené v tablete alebo na karte SIM. Škodlivé aplikácie môžu vaše správy odstrániť."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Umožňuje aplikácii zapisovať do správ SMS uložených vo vašom televízore alebo SIM karte. Škodlivé aplikácie môžu odstrániť vaše správy."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Umožňuje aplikácii písať do správ SMS uložených v telefóne alebo na karte SIM. Škodlivé aplikácie môžu vaše správy odstrániť."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"prijímať textové správy (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Umožňuje aplikácii prijímať a spracovávať správy WAP. Toto povolenie zahŕňa možnosť sledovať vaše správy alebo ich odstrániť bez toho, aby sa vám zobrazili."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"načítať spustené aplikácie"</string>
@@ -431,21 +427,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Podarilo sa rozpoznať iba časť odtlačku prsta. Skúste to znova."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Odtlačok prsta sa nepodarilo spracovať. Skúste to znova."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Snímač odtlačkov je špinavý. Vyčistite ho a skúste to znova."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Pohli ste prstom príliš rýchlo. Skúste to znova."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Pohli ste prstom príliš pomaly. Skúste to znova."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardvér na snímanie odtlačku prsta nie je k dispozícii"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Odtlačok prsta nie je možné uložiť. Odstráňte existujúci odtlačok."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit rozpoznania odtlačku vypršal. Skúste to znova."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operácia týkajúca sa odtlačku prsta bola zrušená"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Príliš veľa pokusov. Skúste to znova neskôr."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Skúste to znova"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"čítať nastavenia synchronizácie"</string>
@@ -470,6 +461,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Umožňuje aplikácii zápis na kartu SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"uskutočňovanie/príjem hovorov SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Umožňuje aplikácii uskutočňovať a prijímať hovory SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrácia nových pripojení telekomunikačnej siete SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Povoľuje aplikácii registrovať nové pripojenia telekomunikačnej siete SIM."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrácia nových pripojení telekomunikačnej siete"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Povoľuje aplikácii registrovať nové pripojenia telekomunikačnej siete."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"správa pripojení telefonických sietí"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Povoľuje aplikácii spravovať pripojenia telekomunikačnej siete."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcia s obrazovkou hovoru"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Umožňuje aplikácii ovládať, kedy a ako sa používateľovi zobrazí obrazovka hovoru."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"komunikovať s telefonickými službami"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Umožňuje aplikácii komunikovať s telefonickými službami a uskutočňovať a prijímať hovory."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"zobrazenie používateľského prostredia počas hovoru"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Umožňuje aplikácii zobraziť používateľské prostredie počas hovoru."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"čítať históriu používania siete"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Umožňuje aplikácii čítať históriu používania siete pre určité siete a aplikácie."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"spravovať pravidlá siete"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Umožňuje aplikácii spravovať pravidlá siete a definovať pravidlá pre konkrétnu aplikáciu."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"zmeniť kontrolu používania siete"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Umožňuje aplikácii upraviť používanie siete jednotlivými aplikáciami. Bežné aplikácie toto nastavenie nepoužívajú."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"prístup k upozorneniam"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Umožňuje aplikácii načítať, zobrazovať a mazať upozornenia vrátane tých, ktoré boli uverejnené inými aplikáciami."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"naviazanie sa na službu na počúvanie upozornení"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Umožňuje držiteľovi naviazať sa na najvyššiu úroveň služby na počúvanie upozornení. Bežné aplikácie by toto nastavenie nemali nikdy požadovať."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"viazanie na službu poskytovateľa podmienky"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby poskytovateľa podmienky. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"viazať sa so službou Dream service"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby Dream service. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"vyvolanie aplikácie pre konfiguráciu poskytnutú operátorom"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Umožňuje držiteľovi vyvolať aplikáciu pre konfiguráciu poskytnutú operátorom. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"zachytávať informácie o stave siete"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Umožňuje aplikácii zachytávať informácie o stave siete. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"zmeniť kalibráciu vstupného zariadenia"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Umožňuje aplikácii upraviť parametre kalibrácie dotykovej obrazovky. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"prístup k certifikátom DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Umožňuje aplikácii vydávať a používať certifikáty DRM. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Prijímať stav prenosu funkcie Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Povoľuje tejto aplikácii prijímať informácie o aktuálnych prenosoch funkcie Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"odstránenie certifikátov DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Umožňuje aplikácii odstraňovať certifikáty DRM. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"viazať sa na službu na odosielanie správ SMS a MMS operátora"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby na odosielanie správ SMS a MMS operátora. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Nastaviť pravidlá pre heslo"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Nastavte dĺžku hesiel na odomknutie obrazovky aj kódov PIN a v nich používané znaky."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Sledovať pokusy o odomknutie obrazovky"</string>
@@ -630,8 +665,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Ak chcete odomknúť telefón alebo uskutočniť tiesňové volanie, stlačte Menu."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Telefón odomknete stlačením tlačidla Menu."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Odomknite nakreslením vzoru"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Tiesňové volanie"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Zavolať späť"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Správne!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Skúsiť znova"</string>
@@ -1043,36 +1077,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidáti"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Pripravuje sa úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Prebieha kontrola chýb"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Bolo zistené nové úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Na prenos fotiek a médií"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Úložisko <xliff:g id="NAME">%s</xliff:g> je poškodené"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Úložisko <xliff:g id="NAME">%s</xliff:g> je poškodené. Skúste ho opätovne naformátovať."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Úl. <xliff:g id="NAME">%s</xliff:g> bolo neočakávane odobraté"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ak chcete zabrániť strate údajov, úložisko <xliff:g id="NAME">%s</xliff:g> pred odobratím odpojte"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Úložisko <xliff:g id="NAME">%s</xliff:g> bolo odobraté"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Úložisko <xliff:g id="NAME">%s</xliff:g> bolo odobraté. Vložte nové."</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Úložisko <xliff:g id="NAME">%s</xliff:g> sa stále odpája…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Neodoberajte"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Nastavenie"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Odpojiť"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Preskúmať"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nenašli sa žiadne zodpovedajúce aktivity."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Smerovanie výstupu médií"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Umožňuje aplikácii smerovať výstup médií do ďalších externých zariadení."</string>
@@ -1204,6 +1223,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Interné úložisko"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Karta SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Ukladací priestor USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Upraviť"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Upozornenie o využití dát"</string>
@@ -1476,7 +1501,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Dokým túto funkciu nevypnete"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Zbaliť"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokovanie prerušení"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nerušiť"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Odstávka"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noci cez týždeň"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Víkendy"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index da65244..61975d2 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -272,10 +272,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Aplikaciji omogoča branje SMS-ov, shranjenih v tabličnem računalniku ali na kartici SIM. S tem lahko aplikacija bere vse SMS-e, ne glede na njihovo vsebino ali zaupnost."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Aplikaciji dovoljuje branje sporočil SMS, shranjenih v televizorju ali na kartici SIM. To aplikaciji omogoča branje vseh sporočil SMS, ne glede na njihovo vsebino ali zaupnost."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Aplikaciji omogoča branje SMS-ov, shranjenih v telefonu ali na kartici SIM. S tem lahko aplikacija bere vse SMS-e, ne glede na njihovo vsebino ali zaupnost."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"urejanje sporočil (SMS ali MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Aplikaciji omogoča pisanje v sporočila SMS, shranjena v tabličnem računalniku ali na kartici SIM. Zlonamerne aplikacije lahko izbrišejo vaša sporočila."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Aplikaciji dovoljuje pisanje sporočilom SMS, shranjenim v televizorju ali na kartici SIM. Zlonamerne aplikacije lahko izbrišejo vaša sporočila."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Aplikaciji omogoča pisanje v sporočila SMS, shranjena v telefonu ali na kartici SIM. Zlonamerne aplikacije lahko izbrišejo vaša sporočila."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"prejemanje sporočil (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Aplikaciji omogoča prejemanje in obdelavo sporočil WAP. S tem lahko aplikacija nadzoruje ali izbriše sporočila, poslana v napravo, ne da bi vam jih pokazala."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"dobivanje aplikacij, ki se izvajajo"</string>
@@ -431,21 +427,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Zaznan delni prstni odtis. Poskusite znova."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Prstnega odtisa ni bilo mogoče obdelati. Poskusite znova."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Tipalo prstnih odtisov je umazano. Očistite ga in poskusite znova."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Prehiter premik prsta. Poskusite znova."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Prepočasen premik prsta. Poskusite znova."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Strojna oprema za prstne odtise ni na voljo."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Prstnega odtisa ni mogoče shraniti. Odstranite obstoječi prstni odtis."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Dosežena časovna omejitev za prstni odtis. Poskusite znova."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Dejanje s prstnim odtisom je bilo preklicano."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Preveč poskusov. Poskusite znova pozneje."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Poskusite znova."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"branje nastavitev sinhronizacije"</string>
@@ -470,6 +461,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Aplikaciji omogoča pisanje na kartico SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"opravljanje/sprejemanje klicev SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Aplikaciji omogoča opravljanje in sprejemanje klicev SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registriranje novih telekomunikacijskih povezav s kartico SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Aplikaciji omogoča registriranje novih telekomunikacijskih povezav s kartico SIM."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registriranje novih telekomunikacijskih povezav"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Aplikaciji omogoča registriranje novih telekomunikacijskih povezav."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"upravljanje telekomunikacijskih povezav"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Aplikaciji omogoča upravljanje telekomunikacijskih povezav."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcija z zaslonom pri klicu"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Aplikaciji omogoča nadzor nad tem, kdaj in kako uporabnik vidi zaslon pri klicu."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"uporaba telefonskih storitev"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Aplikaciji omogoča uporabo telefonskih storitev za klicanje/sprejemanje klicev."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"zagotavljanje uporabniške izkušnje med klicem"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Aplikaciji omogoča zagotavljanje uporabniške izkušnje med klicem."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"branje prejšnje uporabe omrežja"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Aplikaciji omogoča branje pretekle uporabe omrežja za določena omrežja in aplikacije."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"upravljanje pravilnika o omrežju"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Aplikaciji omogoča upravljanje pravilnikov o omrežju in določanje pravil za aplikacijo."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"spremeni obračunavanje uporabe omrežja"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Aplikaciji omogoča, da spremeni uporabo omrežja na podlagi aplikacij. Ni za uporabo z navadnimi aplikacijami."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"dostop do obvestil"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Dovoli aplikaciji, da prenese, razišče in izbriše obvestila, tudi tista, ki so jih objavile druge aplikacije."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"poveži se s storitvijo poslušalca obvestil"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Lastniku omogoča povezovanje z vmesnikom storitve poslušalca obvestil najvišje ravni. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"povezovanje s storitvijo ponudnika pogojev"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Imetniku omogoča povezovanje z vmesnikom storitve ponudnika pogojev najvišje ravni. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"povezava s storitvijo sanjarjenja"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Imetniku omogoča povezovanje z vmesnikom storitve sanjarjenja najvišje ravni. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"sprožitev operaterjeve aplikacije za konfiguracijo"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Lastniku omogoča sproženje operaterjeve aplikacije za konfiguracijo. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"spremljanje razmer v omrežju"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Aplikaciji omogoča spremljanje razmer v omrežju. Pri navadnih aplikacijah to ne bi smelo biti potrebno."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"sprememba umerjanja vhodne naprave"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Aplikaciji dovoli spreminjanje parametrov za umerjanje zaslona na dotik. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"dostop do potrdil za upravljanje digitalnih pravic"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Aplikaciji omogoča pripravo in uporabo potrdil za upravljanje digitalnih pravic. To naj ne bi bilo nikoli potrebno za običajne aplikacije."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Prejemanje stanja prenosov s funkcijo Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Omogoči tej aplikaciji prejemanje podatkov o trenutnih prenosih s funkcijo Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"odstranjevanje potrdil za upravljanje digitalnih pravic"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Aplikaciji omogoča odstranjevanje potrdil za upravljanje digitalnih pravic. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"povezovanje z operaterjevo sporočilno storitvijo"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Imetniku omogoča povezovanje z vmesnikom operaterjeve sporočilne storitve najvišje ravni. To naj ne bi bilo nikoli potrebno za navadne aplikacije."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Nastavitev pravil za geslo"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Nadzor nad dolžino in znaki, ki so dovoljeni v geslih in kodah PIN za odklepanje zaslona."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"nadzor nad poskusi odklepanja zaslona"</string>
@@ -630,8 +665,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Če želite odkleniti napravo ali opraviti klic v sili, pritisnite meni."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Če želite odkleniti, pritisnite meni."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Če želite odkleniti, narišite vzorec"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Klic v sili"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Nazaj na klic"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Pravilno."</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Poskusi znova"</string>
@@ -1043,36 +1077,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidati"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Pripravljanje shrambe <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Iskanje napak"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Zaznana je bila nova shramba <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prenos fotografij in predstavnosti"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Poškodovana shramba <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Shramba <xliff:g id="NAME">%s</xliff:g> je poškodovana; poskusite jo znova formatirati"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Shramba <xliff:g id="NAME">%s</xliff:g> nepričak. odstranjena"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Izpnite shrambo <xliff:g id="NAME">%s</xliff:g>, preden jo odstranite, da se izognete izgubi podatkov."</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Shramba <xliff:g id="NAME">%s</xliff:g> je bila odstranjena"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Shramba <xliff:g id="NAME">%s</xliff:g> je bila odstranjena; vstavite novo"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Izvrženje shrambe <xliff:g id="NAME">%s</xliff:g> še poteka …"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne odstranite je"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Nastavitev"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Izvrzite"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Raziščite"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Ni ustreznih dejavnosti."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Preusmeritev predstavnosti"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Aplikaciji omogoča preusmerjanje predstavnosti v druge zunanje naprave."</string>
@@ -1204,6 +1223,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Notranji pomnilnik"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Kartica SD"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"Kartica SD <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"Pogon USB"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"Pogon USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Pomnilnik USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Uredi"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Opozorilo o uporabi podatkov"</string>
@@ -1476,7 +1498,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Dokler tega ne izklopite"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Strni"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blokiranje motenj"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne moti"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Čas nedelovanja"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noči med tednom"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Vikendi"</string>
@@ -1491,7 +1513,7 @@
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Zahteva SS je spremenjena v novo zahtevo SS."</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Vrata USB za dodatno opremo za Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
- <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Vvrata USB za dodatno opremo"</string>
+ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Vrata USB za dodatno opremo"</string>
<string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Več možnosti"</string>
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zapri presežni element"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 1dad5c5..18f47d8 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -271,10 +271,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Дозвољава апликацији да чита SMS поруке ускладиштене на таблету или SIM картици. Ово омогућава апликацији да чита све SMS поруке, без обзира на садржај или поверљивост."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Дозвољава апликацији да чита SMS поруке које чувате на ТВ-у или SIM картици. То значи да апликација може да чита све SMS поруке, независно од садржаја или поверљивости."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Дозвољава апликацији да чита SMS поруке ускладиштене на телефону или SIM картици. Ово омогућава апликацији да чита све SMS поруке, без обзира на садржај или поверљивост."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"измена текстуалних порука (SMS или MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Дозвољава апликацији да уписује податке у SMS поруке сачуване на таблету или SIM картици. Злонамерне апликације могу да избришу поруке."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Дозвољава апликацији да уписује податке у SMS поруке које чувате на ТВ-у или SIM картици. Злонамерне апликације могу да избришу поруке."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Дозвољава апликацији да уписује податке у SMS поруке сачуване на телефону или SIM картици. Злонамерне апликације могу да избришу поруке."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"пријем текстуалних порука (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Дозвољава апликацији да прима и обрађује WAP поруке. Ова дозвола укључује могућност праћења или брисања порука које вам се шаљу, а које вам се не приказују."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"преузимање покренутих апликација"</string>
@@ -430,21 +426,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Откривен је делимични отисак прста. Покушајте поново."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Није успела обрада отиска прста. Покушајте поново."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Сензор за отиске прстију је прљав. Очистите га и покушајте поново."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Пребрзо сте померили прст. Покушајте поново."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Превише споро сте померили прст. Покушајте поново."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отиске прстију није доступан."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Није могуће сачувати отисак прста. Уклоните неки од постојећих отисака прстију."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Временско ограничење за отисак прста је истекло. Покушајте поново."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Радња са отиском прста је отказана."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Превише покушаја. Покушајте поново касније."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Покушајте поново."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"читање подешавања синхронизације"</string>
@@ -469,6 +460,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Дозвољава апликацији да уписује податке на SD картицу."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"упућивање/пријем SIP позива"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Омогућава апликацији да упућује и прима SIP позиве."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"региструје нове везе са телекомуникационим мрежама преко SIM картице"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Дозвољава апликацији да региструје нове везе са телекомуникационим мрежама преко SIM картице."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"региструје нове везе са телекомуникационим мрежама"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Дозвољава апликацији да региструје нове везе са телекомуникационим мрежама."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"управљање везама са телекомуникационим мрежама"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Дозвољава апликацији да управља везама са телекомуникационим мрежама."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"комуницирај са екраном током позива"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Дозвољава апликацији да контролише када и како се кориснику приказује екран током позива."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"да ступа у интеракцију са телефонским услугама"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Дозвољава интеракцију апликације са телефонским услугама ради упућивања/примања позива."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"пружај кориснички доживљај током позива"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Дозвољава апликацији да пружа кориснички доживљај током позива."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"чита историју коришћења мреже"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Дозвољава апликацији да чита историју коришћења мреже за посебне мреже и апликације."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"управљање смерницама за мрежу"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Дозвољава апликацији да управља смерницама за мрежу и одређује посебна правила за апликацију."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"измените обрачунавање коришћења мреже"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Дозвољава апликацији да измени начин на који апликације користе мрежу. Не користе је уобичајене апликације."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"приступ обавештењима"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Дозвољава апликацији да преузима, испитује и брише обавештења, укључујући она која постављају друге апликације."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"повезивање са услугом монитора обавештења"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Дозвољава власнику да се повеже са интерфејсом услуге монитора обавештења највишег нивоа. Уобичајене апликације никада не би требало да је користе."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"повежи са услугом добављача услова"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Дозвољава власнику да се повеже са интерфејсом највишег нивоа услуге добављача услова. Не би требало никада да буде потребно за уобичајене апликације."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"повезивање са услугом сањарења"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Дозвољава власнику да се повеже са интерфејсом услуге сањарења највишег нивоа. Уобичајене апликације никада не би требало да је користе."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"позивање апликације са конфигурацијом коју одређује оператер"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Дозвољава власнику да позива апликацију са конфигурацијом коју одређује оператер. Уобичајене апликације никада не би требало да је користе."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"праћење података о условима на мрежи"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Дозвољава апликацији да прати податке о условима на мрежи. Не би никада требало да буде потребно за нормалне апликације."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"промени калибрацију улазног уређаја"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Дозвољава апликацији да модификује параметре калибрације додирног екрана. Не би требало да буде потребно за нормалне апликације."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"приступ DRM сертификатима"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Дозвољава апликацији да додељује и користи DRM сертификате. Никада не би требало да се користи за уобичајене апликације."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Пријем статуса пребацивања помоћу Android пребацивања"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Дозвољава овој апликацији да прима информације о актуелним пребацивањима помоћу Android пребацивања"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"уклањај DRM сертификате"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Дозвољава апликацији да уклања DRM сертификате. Никада не би требало да се користи за обичне апликације."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"повезивање са услугом за размену порука мобилног оператера"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Дозвољава власнику да се повеже са интерфејсом највишег нивоа за услугу за размену порука мобилног оператера. Никада не би требало да буде потребно за стандардне апликације."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Подешавање правила за лозинку"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за закључавање екрана."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Надгледање покушаја откључавања екрана"</string>
@@ -629,8 +664,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Притисните „Мени“ да бисте откључали телефон или упутите хитан позив."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Притисните „Мени“ за откључавање."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Унесите шаблон за откључавање"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Хитне службе"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Назад на позив"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Тачно!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Покушајте поново"</string>
@@ -1036,36 +1070,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> се припрема"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверава се да ли постоје грешке"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Нови уређај <xliff:g id="NAME">%s</xliff:g> је откривен"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За пренос слика и медија"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Уређај <xliff:g id="NAME">%s</xliff:g> је оштећен"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Уређај <xliff:g id="NAME">%s</xliff:g> је оштећен; покушајте да га поново форматирате"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Уређај <xliff:g id="NAME">%s</xliff:g> је неочекивано уклоњен"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Искључите уређај <xliff:g id="NAME">%s</xliff:g> пре уклањања да не бисте изгубили податке"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Уређај <xliff:g id="NAME">%s</xliff:g> је уклоњен"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Уређај <xliff:g id="NAME">%s</xliff:g> је уклоњен; уметните нови"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> се још увек избацује…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не уклањајте"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Подешавање"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Избаци"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Истражи"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Није пронађена ниједна подударна активност."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Усмеравање излаза медија"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Дозвољава апликацији да усмерава излаз медија на друге спољне уређаје."</string>
@@ -1196,6 +1215,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Интерна меморија"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD картица"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB меморија"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Измени"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Упозорење о потрошњи података"</string>
@@ -1463,8 +1488,8 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Док не искључите"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Скупи"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Блокирање прекида"</string>
- <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Време неактивности"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не узнемиравај"</string>
+ <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Одмор"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Радним данима увече"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Викендима"</string>
<string name="muted_by" msgid="6147073845094180001">"Звук је искључио/ла <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 3aa4da5..1db2cf9 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tillåter att appen läser SMS som sparats på surfplattan eller på SIM-kortet. Med den här behörigheten tillåts appen att läsa alla SMS oavsett innehåll eller sekretess."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Tillåter att appen läser sms som har sparats på tv:n eller SIM-kortet. På så sätt kan appen läsa alla sms oavsett innehåll eller sekretess."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Tillåter att appen läser SMS som sparats på mobilen eller på SIM-kortet. Med den här behörigheten tillåts appen att läsa alla SMS oavsett innehåll eller sekretess."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"redigera dina textmeddelanden (SMS eller MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Tillåter att appen skriver till SMS som lagras på surfplattan eller SIM-kortet. Skadliga appar kan radera dina meddelanden."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Tillåter att appen skriver till sms som har sparats på tv:n eller SIM-kortet. Skadliga appar kan ta bort dina meddelanden."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Tillåter att appen skriver till SMS som lagras på mobilen eller SIM-kortet. Skadliga appar kan radera dina meddelanden."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ta emot textmeddelanden (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Tillåter att appen tar emot och hanterar WAP-meddelanden. Med den här behörigheten kan appen övervaka eller ta bort meddelanden som skickats till dig utan att visa dem för dig."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"hämta appar som körs"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Ofullständigt fingeravtryck. Försök igen."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Det gick inte att bearbeta fingeravtrycket. Försök igen."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingeravtryckssensorn är smutsig. Rengör den och försök igen."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Du rörde fingret för snabbt. Försök igen"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Du flyttade fingret för långsamt. Försök igen."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Det finns ingen maskinvara för fingeravtryck."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrycket kan inte lagras. Ta bort ett befintligt fingeravtryck."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsgränsen för fingeravtrycket har uppnåtts. Försök igen."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingeravtrycksåtgärden avbröts."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Du har gjort för många försök. Försök igen senare."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Försök igen."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"läsa synkroniseringsinställningar"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Tillåter att appen skriver till SD-kortet."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"gör/ta emot SIP-anrop"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Tillåter att appen gör och tar emot SIP-anrop."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrera nya telekommunikationsanslutningar för SIM-kortet"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Tillåter att appen registrerar nya telekommunikationsanslutningar för SIM-kortet."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrera nya telekommunikationsanslutningar"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Tillåter att appen registrerar nya telekommunikationsanslutningar."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"hantera telekommunikationsanslutningar"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Tillåter att appen hanterar telekommunikationsanslutningar."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interagera med skärmen för inkommande samtal"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Tillåter att appen kontrollerar hur och när användaren ser skärmen för inkommande samtal."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"samverka med telefonitjänster"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Tillåter appen att använda telefonitjänster för att ringa/ta emot samtal."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"förbättra användarupplevelsen för inkommande samtal."</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Tillåter att appen förbättrar användarupplevelsen för inkommande samtal."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"läsa historisk nätverksanvändning"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Tillåter att appen läser den historiska nätverksanvändningen för specifika nätverk och appar."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"hantera nätverkspolicy"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Tillåter att appen hanterar nätverkspolicyer och definierar appspecifika regler."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ändra nätverksredovisningen"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Tillåter att appen ändrar hur nätverksanvändning redovisas för appar. Används inte av vanliga appar."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"få åtkomst till meddelanden"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Tillåter att appen hämtar, granskar och raderar meddelanden, även sådana som skickats av andra appar."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"binda till en meddelandelyssnare"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en meddelandelyssnare. Ska inte behövas för vanliga appar."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"bind till en leverantörstjänst"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en leverantörstjänst. Ska inte behövas för vanliga appar."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"binda till en drömtjänst"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en drömtjänst. Ska inte behövas för vanliga appar."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"anropa konfigurationsappen från operatören"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Innehavaren tillåts att anropa konfigurationsappen från operatören. Ska inte behövas för vanliga appar."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"lyssna efter information om nätverksförhållanden"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Tillåter att appen lyssnar efter information om nätverksförhållanden. Vanliga appar bör aldrig behöva den här behörigheten."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ändra kalibreringen för inmatningsenheten"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Tillåter att appen ändrar kalibreringsparametrarna för pekskärmen. Detta behövs aldrig för vanliga appar."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"tillgång till DRM-certifikat"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Tillåter att en app tillhandahåller och använder DRM-certifikat. Behövs inte för vanliga appar."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Ta emot status för Android Beam-överföring"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Tillåter att appen tar emot information om aktuella Android Beam-överföringar"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"ta bort DRM-certifikat"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Tillåter ett program att ta bort DRM-certifikat. Behövs inte för vanliga appar."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"binda till en operatörs meddelandetjänst"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en operatörs meddelandetjänst. Ska inte behövas för vanliga appar."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Ange lösenordsregler"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Styr tillåten längd och tillåtna tecken i lösenord och pinkoder för skärmlåset."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Övervaka försök att låsa upp skärmen"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryck på Menu om du vill låsa upp eller ringa nödsamtal."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryck på Menu om du vill låsa upp."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Rita grafiskt lösenord för att låsa upp"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Nödsamtal"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Tillbaka till samtal"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Korrekt!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Försök igen"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidater"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Förbereder ditt <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Söker efter fel"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nytt <xliff:g id="NAME">%s</xliff:g> har hittats"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"För överföring av foton och media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Skadat <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Ditt <xliff:g id="NAME">%s</xliff:g> har skadats, testa att formatera om det"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> togs bort oväntat"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Montera bort <xliff:g id="NAME">%s</xliff:g> före borttagningen för att undvika dataförlust"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Ditt <xliff:g id="NAME">%s</xliff:g> har tagits bort"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> togs bort. Mata in ett nytt"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ditt <xliff:g id="NAME">%s</xliff:g> matas fortfarande ut …"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ta inte bort"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Konfiguration"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Mata ut"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Utforska"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Det gick inte att hitta några matchande aktiviteter."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Omdirigera medieuppspelning"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Tillåter att appen omdirigerar medieuppspelningar till andra externa enheter."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Internminne"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD-kort"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB-lagring"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Redigera"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Varning angående dataanvändning"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Tills du inaktiverar detta"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Komprimera"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Blockera avbrott"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Stör ej"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Avbrottstid"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Veckodagskvällar"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Helger"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index cb99ff0..3bc954b 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Inaruhusu programu kusoma ujumbe wa SMS uliohifadhiwa kwenye kompyuta kibao yako au SIM kadi. Hii inaruhusu programu kusoma ujumbe wote wa SMS, bila kujali maudhui au usiri."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Huruhusu programu kusoma ujumbe wa SMS uliohifadhiwa kwenye runinga yako au SIM kadi. Hii inaruhusu programu kusoma ujumbe wote wa SMS, licha ya maudhui au usiri."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Inaruhusu programu kusoma ujumbe wa SMS uliohifadhiwa kwenye simu yako au SIM kadi. Hii inaruhusu programu kusoma ujumbe wote wa SMS, bila kujali maudhui au usiri."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"Hariri SMS au MMS zako"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Huruhusu programu kuandikia SMS zinazohifadhiwa kwenye kompyuta yako kibao au SIM kadi. Programu hasidi zinaweza kufuta SMS zako."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Huruhusu programu kuandika kwa ujumbe wa SMS uliohifadhiwa katika runinga yako au SIM kadi. Programu hasidi zinaweza kufuta ujumbe wako."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Huruhusu programu kuandika SMS zinazohifadhiwa kwenye simu yako au SIM kadi. programu hasidi zinaweza kufuta SMS zako."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"pokea ujumbe wa maandishi wa WAP"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Inaruhusu programu kupokea na kuchakata ujumbe wa WAP. Idhini hii inajumuisha uwezo wa kuchunguza na kufuta ujumbe uliotumwa kwako bila ya kukuonyesha."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"rudisha programu zinazoendeshwa"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Kihisi kimegundua sehemu ya kitambulisho. Tafadhali jaribu tena."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Haikuweza kuchakata kitambulisho. Tafadhali jaribu tena."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Kihisi kitambulisho ni kichafu. Tafadhali kisafishe na ujaribu tena."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Ulisogeza kidole kwa kasi mno. Tafadhali jaribu tena."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Ulisogeza kidole pole pole mno. Tafadhali jaribu tena."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maunzi ya kitambulisho hayapatikani."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Kitambulisho hakiwezi kuhifadhiwa. Tafadhali ondoa kitambulisho kilichopo."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Muda wa kitambulisho umekwisha. Jaribu tena."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operesheni ya kitambulisho imeghairiwa."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Majaribio mengi mno. Jaribu tena baadaye."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Jaribu tena."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"kusoma mipangilio ya usawazishaji"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Inaruhusu programu kuandikia kadi ya SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"piga/pokea simu za SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ruhusu programu ipige na kupokea simu za SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"andikisha miunganisho mipya ya SIM ya mawasiliano ya simu"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Huruhusu programu kuandikisha miunganisho mipya ya SIM ya mawasiliano ya simu."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"andikisha miunganisho mipya ya mawasiliano ya simu"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Huruhusu programu kuandikisha miunganisho mipya ya mawasiliano ya simu."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"dhibiti miunganisho ya mawasiliano ya simu"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Huruhusu programu kudhibiti miunganisho ya mawasiliano ya simu."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"wezesha mwingiliano na skrini ya simu inayoingia"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Huruhusu programu kudhibiti wakati na jinsi mtumiaji anavyoona skrini ya simu inayoingia."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"shirikiana na huduma za simu"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Huruhusu programu kushirikiana na huduma za simu ili kupiga au kupokea simu."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"wasilisha hali ya skrini ya simu inayoingia"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Huruhusu programu kuwasilisha maboresho ya matumizi ya skrini ya simu inayoingia."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"soma matumizi ya historia ya mtandao"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Inaruhusu programu kusoma historia ya matumizi ya mtandao kwa mitandao maalum na programu."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"dhibiti sera ya mtandao"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Inaruhusu programu kudhibiti sera za mtandao na kufafanua sheria maalum za programu."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"badilisha uthibitishaji wa matumizi ya mtandao"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Huruhusu programu kurekebisha jinsi matumizi ya mtandao yana hesabika dhidi ya programu. Sio ya matumizi na programu za kawaida."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"fikia arifa"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Huruhusu programu kurejesha, kuchunguza, na kuondoa arifa, ikiwa ni pamoja na zile zilizochapishwa na programu nyingine."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"unganisha kwenye huduma ya kisikilizi cha arifa"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Inaruhusu kishikilizi kuunganishwa kwenye kusano cha kiwango cha juu cha huduma ya kisikilizi cha arifa. Haipaswi kuhitajika tena kwa programu za kawaida."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"bandika kwenye huduma ya mtoa masharti"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Humruhusu mmiliki kubandika kwenye kiolesura cha kiwango cha juu cha huduma ya mtoa masharti. Isihitajike kamwe kwa pogramu za kawaida."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"shurutisha kwa huduma murua"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Huruhusu mmiliki kushurutisha kwenye kiolesura cha kiwango cha juu cha huduma murua. Haipaswi kuhitajika kwa programu za kawaida."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"omba programu ya usakinishaji inayotolewa na mtoa huduma."</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Inaruhusu kishikiliaji kuomba programu ya usakinishaji inayotolewa na mto huduma. Haipaswi kuhitajika kwa programu za kawaida."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"sikiliza matukio katika hali za mtandao"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Huruhusu programu kusikiliza matukio katika hali za mtandao. Haipaswi kuhitajika kamwe kwa programu za kawaida."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"badilisha urekebishaji wa kifaa cha kuingiza data"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Huruhusu programu kubadilisha vigezo vya urekebishaji vya skrini ya kugusa. Havipaswi kuhitajika kamwe kwa programu za kawaida."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"fikia vyeti vya DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Huruhusu programu kwa utoaji na matumizi ya vyeti vya DRM. Havifahi kuhitajika kwa ajili ya programu za kawaida."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Pokea hali ya uhamisho wa Boriti ya Android"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Huruhusu programu hii kupokea taarifa kuhusu uhamisho wa Boriti ya Android"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"ondoa vyeti vya DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Huruhusu programu kuondoa vyeti vya DRM. Haipaswi kuhitajika kwa programu za kawaida kamwe."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"Shurutisha kwa huduma ya ujumbe ya mtoa huduma"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Huruhusu kishikiliaji kushurutisha kwa kiolesura cha hali ya juu cha huduma ya ujumbe ya mtoa huduma. Haipaswi kuhitajika kwa programu za kawaida."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Kuweka kanuni za nenosiri"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Dhibiti urefu na maandishi yanayokubalika katika nenosiri la kufunga skrini na PIN."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Kuhesabu mara ambazo skrini inajaribu kufunguliwa"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Bonyeza Menyu ili kufungua au kupiga simu ya dharura."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Bonyeza Menyu ili kufungua."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Chora ruwaza ili kufungua"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Dharura"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Rudi kwa kupiga simu"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Sahihi!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Jaribu tena"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"wagombeaji"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Inaandaa <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Inakagua hitilafu"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> mpya imegunduliwa"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Kwa ajili ya kuhamisha picha na maudhui"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> imeharibika."</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> imeharibika. Jaribu kuipanga upya."</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> imeondolewa bila kutarajiwa"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ondoa <xliff:g id="NAME">%s</xliff:g> kabla ya kuchomoa ili kuepuka kupoteza data"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> imeondolewa"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> imeondolewa, weka nyingine mpya"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Bado inaondoa <xliff:g id="NAME">%s</xliff:g>..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Usiondoe"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Sanidi"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Ondoa"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Chunguza"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Hakuna shughuli zinazolingana zilizopatikana."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Fuatalia utoaji wa habari"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Inaruhusu programu kufuatilia utoaji wa habari kwa vifaa vingine vya nje."</string>
@@ -1188,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Hifadhi ya mfumo"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Kadi ya SD"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"Kadi ya SD iliyotengenezwa na <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"Hifadhi ya USB"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"Hifadhi ya USB iliyotengenezwa na <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Hifadhi ya USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Badilisha"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Onyo la matumizi ya data"</string>
@@ -1450,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Hadi utakapozima hili"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Kunja"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Zuia ukatizaji"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Usinisumbue"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Wakati wa hali tuli"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Usiku wa siku za wiki"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Wikiendi"</string>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index eee78df..b618338 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -229,7 +229,7 @@
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="3695085582674524761">"SMSஐ அணுகும், மாற்றும்"</string>
<string name="permgrouplab_dictionary" msgid="8114410334955871144">"பயனர் அகராதி"</string>
- <string name="permgroupdesc_dictionary" msgid="7586787746354378335">"பயனர் அகராதியில் வார்த்தைகளைப் படிக்கும் அல்லது எழுதும்."</string>
+ <string name="permgroupdesc_dictionary" msgid="7586787746354378335">"பயனர் அகராதியில் சொற்களைப் படிக்கும் அல்லது எழுதும்."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"புத்தகக்குறிகள் மற்றும் வரலாறு"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"புத்தகக்குறிகள் மற்றும் உலாவியின் வரலாற்றுக்கான நேரடி அணுகல்."</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"மைக்ரோஃபோன்"</string>
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"உங்கள் டேப்லெட் அல்லது சிம் கார்டில் சேமிக்கப்பட்ட SMS குறுஞ்செய்திகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது. SMS குறுஞ்செய்திகளின் உள்ளடக்கம் அல்லது ரகசியத்தன்மை ஆகியவற்றைப் பொருட்படுத்தாமல் அச்செய்திகளைப் படிக்க பயன்பாட்டை இது அனுமதிக்கிறது."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"டிவி அல்லது சிம் கார்டில் சேமிக்கப்பட்ட SMS செய்திகளைப் படிக்க, பயன்பாட்டை அனுமதிக்கிறது. உள்ளடக்கம் அல்லது ரகசியத்தன்மையைப் பொருட்படுத்தாமல் எல்லா SMS செய்திகளையும் பார்க்க, இது பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"உங்கள் மொபைல் அல்லது சிம் கார்டில் சேமிக்கப்பட்ட SMS குறுஞ்செய்திகளைப் படிக்கப் பயன்பாட்டை அனுமதிக்கிறது. SMS குறுஞ்செய்திகளின் உள்ளடக்கம் அல்லது ரகசியத்தன்மை ஆகியவற்றைப் பொருட்படுத்தாமல் அச்செய்திகளைப் படிக்க பயன்பாட்டை இது அனுமதிக்கிறது."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"உங்கள் உரைச் செய்திகளைத் (SMS அல்லது MMS) திருத்துதல்"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"டேப்லெட் அல்லது சிம் கார்டில் சேமிக்கப்பட்ட SMS செய்திகளை எழுத, பயன்பாட்டை அனுமதிக்கிறது. தீங்குவிளைவிக்கும் பயன்பாடுகள் செய்திகளை நீக்கலாம்."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"டிவி அல்லது சிம் கார்டில் சேமிக்கப்பட்ட SMS செய்திகளில் எழுத, பயன்பாட்டை அனுமதிக்கிறது. தீங்கு விளைவிக்கும் பயன்பாடுகள் உங்கள் செய்திகளை நீக்கலாம்."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ஃபோன் அல்லது சிம் கார்டில் சேமிக்கப்பட்ட SMS செய்திகளை எழுத, பயன்பாட்டை அனுமதிக்கிறது. தீங்குவிளைவிக்கும் பயன்பாடுகள் செய்திகளை நீக்கலாம்."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"உரைச் செய்திகளைப் (WAP) பெறுதல்"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP செய்திகளைப் பெற, செயற்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது. உங்களுக்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்க அல்லது நீக்குவதற்கான திறன் இந்த அனுமதியில் உள்ளடங்கும்."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"இயங்கும் பயன்பாடுகளை மீட்டெடுத்தல்"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"கைரேகையை ஓரளவுதான் கண்டறிய முடிந்தது. மீண்டும் முயலவும்."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"கைரேகையைச் செயலாக்க முடியவில்லை. மீண்டும் முயலவும்."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"கைரேகை உணர்வியில் தூசி உள்ளது. சுத்தம் செய்து, முயலவும்."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"விரலை வேகமாக எடுத்துவிட்டீர்கள். மீண்டும் முயற்சிக்கவும்."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"விரலை மெதுவாக எடுத்துவிட்டீர்கள். மீண்டும் முயலவும்."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"கைரேகை வன்பொருள் இல்லை."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"கைரேகையைச் சேமிக்க முடியவில்லை. ஏற்கனவே உள்ள கைரேகையை அகற்றவும்."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"கைரேகைக்கான நேரம் முடிந்தது. மீண்டும் முயலவும்."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"கைரேகை செயல்பாடு ரத்துசெய்யப்பட்டது."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"அதிகமான முயற்சிகள். பிறகு முயற்சிக்கவும்."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"மீண்டும் முயற்சிக்கவும்."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ஒத்திசைவு அமைப்புகளைப் படித்தல்"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD கார்டில் எழுத, பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP அழைப்புகளைச் செய்தல்/பெறுதல்"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP அழைப்புகளைச் செய்ய/பெற, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"புதிய நிறுவன சிம் இணைப்புகளைப் பதிவுசெய்தல்"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"புதிய நிறுவன சிம் இணைப்புகளைப் பதிவுசெய்ய, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"புதிய நிறுவன இணைப்புகளைப் பதிவுசெய்தல்"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"புதிய தொலைத்தொடர்பு இணைப்புகளைப் பதிவுசெய்ய, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"தொலைத்தொடர்பு இணைப்புகளை நிர்வகி"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"தொலைத்தொடர்பு இணைப்புகளை நிர்வகிக்க, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"உள்வரும் அழைப்பிற்கான திரையுடன் ஊடாடுதல்"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"உள்வரும் அழைப்பிற்கான திரையைப் பயனர் எப்போது மற்றும் எப்படிக் காணவேண்டும் என்பதைக் கட்டுப்படுத்துவதற்குப் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"டெலிஃபோனி சேவைகளுடனான ஊடாடல்"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"அழைப்புகளைச் செய்ய/பெற, டெலிஃபோனி சேவைகளுடன் ஊடாட பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"அழைப்பின் பயனர் அனுபவத்தை வழங்குதல்"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"அழைப்பின் பயனர் அனுபவத்தை வழங்க பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"பிணைய பயன்பாட்டு வரலாற்றைப் படித்தல்"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"குறிப்பிட்ட நெட்வொர்க்குகள் மற்றும் பயன்பாடுகளுக்கான நெட்வொர்க் பயன்பாட்டின் வரலாற்றைப் படிக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"பிணைய கொள்கையை நிர்வகித்தல்"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"நெட்வொர்க் கொள்கைகளை நிர்வகிக்க மற்றும் பயன்பாடு சார்ந்த விதிகளை வரையறுக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"பிணைய பயன்பாட்டு கணக்கிடுதலை மாற்றுதல்"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"பயன்பாடுகளுக்கு எதிராக நெட்வொர்க் பயன்பாடு எவ்வாறு கணக்கிடப்படுகிறது என்பதை மாற்ற பயன்பாட்டை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளால் பயன்படுத்தப்படுவதற்காக அல்ல."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"அறிவிப்புகளின் அணுகல்"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"பிற பயன்பாடுகளால் இடுகையிடப்பட்ட அறிவிப்புகள் உள்பட எல்லா அறிவிப்புகளையும் பெற, பார்க்க மற்றும் அழிக்கப் பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"அறிவிப்புகளைக் கண்காணிக்கும் சேவையுடன் இணைத்தல்"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"அறிவிப்புகளைக் கண்காணிக்கும் சேவையின் உயர் நிலை இடைமுகத்துடன் இணைப்பதற்கு ஹோல்டரை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"நிபந்தனை வழங்குநர் சேவையுடன் இணைத்தல்"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"நிபந்தனை வழங்குநர் சேவையின் உயர் நிலை இடைமுகத்துடன் இணைப்பதற்கு ஹோல்டரை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"டிரீம் சேவையுடன் இணை"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"டிரீம் சேவையின் உயர் நிலை இடைமுகத்துடன் இணைப்பதற்கு ஹோல்டரை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"மொபைல் நிறுவனம் வழங்கிய உள்ளமைவு பயன்பாட்டை செயலாக்குதல்"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"மொபைல் நிறுவனம் வழங்கிய உள்ளமைவு பயன்பாட்டைச் செயல்படுத்த ஹோல்டரை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"பிணைய நிலைகள் பற்றிய அறிவிப்புகளைக் கவனித்தல்"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"பிணைய நிலைகள் பற்றிய அறிவிப்புகளைக் கவனிக்க பயன்பாட்டை அனுமதிக்கிறது. இயல்பான பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"உள்ளீட்டுச் சாதனத்தின் அளவுத்திருத்தத்தை மாற்றுதல்"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"தொடுதல் திரையின் அளவு திருத்த அளபுருக்களை மாற்ற, பயன்பாட்டை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்குத் தேவைப்படாது."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM சான்றிதழ்களை அணுகுதல்"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM சான்றிதழ்களை வழங்க மற்றும் பயன்படுத்த, பயன்பாட்டை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்கு எப்போதும் தேவைப்படாது."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android பீம் பரிமாற்ற நிலையைப் பெறுக"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"நடப்பு Android பீம் பரிமாற்றங்கள் குறித்த தகவலைப் பெற, பயன்பாட்டை அனுமதிக்கிறது"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM சான்றிதழ்களை அகற்று"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM சான்றிதழ்களை அகற்ற, பயன்பாட்டை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"மொபைல் நிறுவனச் செய்தியிடல் சேவையுடன் இணைத்தல்"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"மொபைல் நிறுவனச் செய்தியிடல் சேவையின் உயர்-நிலை இடைமுகத்துடன் ஹோல்டரை இணைக்க அனுமதிக்கும். இயல்பான பயன்பாடுகளுக்குத் தேவைப்படாது."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"கடவுச்சொல் விதிகளை அமைக்கவும்"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"திரைப் பூட்டின் கடவுச்சொற்கள் மற்றும் பின்களில் அனுமதிக்கப்படும் நீளத்தையும் எழுத்துக்குறிகளையும் கட்டுப்படுத்தும்."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"திரைத் திறக்க முயற்சிகளைக் கண்காணித்தல்"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"தடைநீக்க மெனுவை அழுத்தவும் அல்லது அவசர அழைப்பை மேற்கொள்ளவும்."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"திறக்க, மெனுவை அழுத்தவும்."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"திறக்க வடிவத்தை வரையவும்"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"அவசர அழைப்பு"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"அழைப்பிற்குத் திரும்பு"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"சரி!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"மீண்டும் முயற்சிக்கவும்"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"கேன்டிடேட்ஸ்"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> தயாராகிறது"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"பிழைகள் உள்ளதா எனப் பார்க்கிறது"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"புதிய <xliff:g id="NAME">%s</xliff:g> கண்டறியப்பட்டது"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"படங்களையும் மீடியாவையும் மாற்றலாம்"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> சேதமடைந்துள்ளது"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> சேதமடைந்துள்ளது. அதை மறுபடியும் மீட்டமைக்க முயற்சிக்கவும்"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"தரவு இழப்பைத் தவிர்க்க, <xliff:g id="NAME">%s</xliff:g>ஐ அகற்றுவதற்கு முன் இணைப்பு நீக்கவும்"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது. புதியதைச் செருகவும்"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"இன்னும் <xliff:g id="NAME">%s</xliff:g>ஐ வெளியேற்றுகிறது…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"அகற்ற வேண்டாம்"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"அமைவு"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"வெளியேற்று"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"உலாவுக"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"பொருந்தும் செயல்பாடுகள் கண்டறியப்படவில்லை."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"மீடியா அவுட்புட்டை வழிசெலுத்துதல்"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"மீடியாவைப் பிற வெளிப்புறச் சாதனங்களுக்கு வெளியீடாக வழிகாட்ட பயன்பாட்டை அனுமதிக்கிறது."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"அகச் சேமிப்பிடம்"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD கார்டு"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB சேமிப்பிடம்"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"திருத்து"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"தரவு பயன்பாட்டு எச்சரிக்கை"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"இதை முடக்கும்வரை"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"சுருக்கு"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"குறுக்கீடுகளைத் தடு"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"தொந்தரவு செய்ய வேண்டாம்"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"செயலற்ற நேரம்"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"வார நாட்களின் இரவுகள்"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"வார இறுதி நாட்கள்"</string>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index ec3107d..a63dcbe 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"మీ టాబ్లెట్ లేదా సిమ్ కార్డులో నిల్వ చేయబడిన SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది కంటెంట్ లేదా గోప్యతతో సంబంధం లేకుండా అన్ని SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"మీ టీవీ లేదా SIM కార్డ్లో నిల్వ చేసిన SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది కంటెంట్ లేదా గోప్యతతో సంబంధం లేకుండా అన్ని SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"మీ ఫోన్ లేదా సిమ్ కార్డులో నిల్వ చేయబడిన SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది కంటెంట్ లేదా గోప్యతతో సంబంధం లేకుండా అన్ని SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"మీ వచన సందేశాలను (SMS లేదా MMS) సవరించడం"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"మీ టాబ్లెట్లో లేదా సిమ్ కార్డులో నిల్వ చేసిన SMS సందేశాలను వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన అనువర్తనాలు మీ సందేశాలను తొలగించవచ్చు."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"మీ టీవీ లేదా SIM కార్డ్లో నిల్వ చేయబడిన SMS సందేశాలను వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన అనువర్తనాలు మీ సందేశాలను తొలగించవచ్చు."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"మీ ఫోన్లో లేదా సిమ్ కార్డులో నిల్వ చేసిన SMS సందేశాలను వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన అనువర్తనాలు మీ సందేశాలను తొలగించవచ్చు."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"వచన సందేశాలను (WAP) స్వీకరించడం"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఈ అనుమతి మీకు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగల లేదా తొలగించగల సామర్థ్యాన్ని కలిగి ఉంటుంది."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"అమలవుతున్న అనువర్తనాలను పునరుద్ధరించడం"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"పాక్షిక వేలిముద్ర గుర్తించబడింది. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"వేలిముద్రను ప్రాసెస్ చేయడం సాధ్యపడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"వేలిముద్ర సెన్సార్ మురికిగా ఉంది. దయచేసి శుభ్రపరిచి, మళ్లీ ప్రయత్నించండి."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"వేలిని చాలా వేగంగా తీసేసారు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"వేలిని చాలా నిదానంగా కదిలించారు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"వేలిముద్ర హార్డ్వేర్ అందుబాటులో లేదు."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"వేలిముద్రను నిల్వ చేయడం సాధ్యపడదు. దయచేసి ఇప్పటికే ఉన్న వేలిముద్రను తీసివేయండి."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"వేలిముద్ర గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"వేలిముద్ర కార్యాచరణ రద్దయింది."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"మళ్లీ ప్రయత్నించండి."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"సమకాలీకరణ సెట్టింగ్లను చదవడం"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD కార్డుకి వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP కాల్లను చేయడానికి/స్వీకరించడానికి"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP కాల్లను చేయడానికి మరియు స్వీకరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"కొత్త టెలికామ్ SIM కనెక్షన్లను నమోదు చేయడం"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"కొత్త టెలికామ్ SIM కనెక్షన్లను నమోదు చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"కొత్త టెలికామ్ కనెక్షన్లను నమోదు చేయడం"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"కొత్త టెలికామ్ కనెక్షన్లను నమోదు చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"టెలికామ్ కనెక్షన్లను నిర్వహించడం"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"టెలికామ్ కనెక్షన్లను నిర్వహించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"ఇన్-కాల్ స్క్రీన్తో పరస్పర చర్య చేయడం"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడం"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"కాల్లు చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ఇన్-కాల్ వినియోగదారు అనుభవాన్ని అందించడం"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"ఇన్-కాల్ వినియోగదారుని అనుభవాన్ని అందించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"చారిత్రక నెట్వర్క్ వినియోగాన్ని చదవడం"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"నిర్దిష్ట నెట్వర్క్లు మరియు అనువర్తనాలు కోసం చారిత్రాత్మక నెట్వర్క్ వినియోగాన్ని చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"నెట్వర్క్ విధానాన్ని నిర్వహించడం"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"నెట్వర్క్ విధానాలను నిర్వహించడానికి మరియు అనువర్తన-నిర్దిష్ట నిబంధనలను నిర్వచించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"నెట్వర్క్ వినియోగ అకౌంటింగ్ను సవరించడం"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"అనువర్తనాల్లో నెట్వర్క్ వినియోగం ఎలా గణించాలనే దాన్ని సవరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాల ద్వారా ఉపయోగించడానికి ఉద్దేశించినది కాదు."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"నోటిఫికేషన్లను ప్రాప్యత చేయడం"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"నోటిఫికేషన్లను, ఇతర అనువర్తనాల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"నోటిఫికేషన్ పరిశీలన సేవకు అనుబంధించడం"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"షరతు ప్రదాత సేవకు అనుబంధించడం"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"డ్రీమ్ సేవకి అనుబంధించడం"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"క్యారియర్ అందించిన కాన్ఫిగరేషన్ అనువర్తనాన్ని అభ్యర్థించడం"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"క్యారియర్ అందించిన కాన్ఫిగరేషన్ అనువర్తనాన్ని అభ్యర్థించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"నెట్వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడం"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"నెట్వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండకూడదు."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ఇన్పుట్ పరికరం క్రమాంకనాన్ని మార్చండి"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM ప్రమాణపత్రాలను ప్రాప్యత చేయడం"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam బదిలీ స్థితిని స్వీకరించండి"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ప్రస్తుత Android Beam బదిలీలకు సంబంధించిన సమాచారాన్ని స్వీకరించడానికి ఈ అనువర్తనాన్ని అనుమతిస్తుంది"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM ప్రమాణపత్రాలను తీసివేయడం"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"DRM ప్రమాణపత్రాలను తీసివేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"క్యారియర్ సందేశ సేవకు అనుబంధించడం"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్ఫేస్కు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"పాస్వర్డ్ నియమాలను సెట్ చేయండి"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"స్క్రీన్ లాక్ పాస్వర్డ్లు మరియు PINల్లో అనుమతించబడిన పొడవు మరియు అక్షరాలను నియంత్రిస్తుంది."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"స్క్రీన్-అన్లాక్ ప్రయత్నాలను పర్యవేక్షించండి"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"అన్లాక్ చేయడానికి లేదా అత్యవసర కాల్ చేయడానికి మెను నొక్కండి."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"అన్లాక్ చేయడానికి మెను నొక్కండి."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"అన్లాక్ చేయడానికి నమూనాను గీయండి"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"అత్యవసరం"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"కాల్కు తిరిగి వెళ్లు"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"సరైనది!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"మళ్లీ ప్రయత్నించండి"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"క్యాండిడేట్లు"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ని సిద్ధం చేస్తోంది"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"లోపాల కోసం తనిఖీ చేస్తోంది"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"కొత్త <xliff:g id="NAME">%s</xliff:g> గుర్తించబడింది"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ఫోటోలు మరియు మీడియాను బదిలీ చేయడానికి"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> పాడైంది"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> పాడైంది; దీన్ని మళ్లీ ఫార్మాట్ చేయడానికి ప్రయత్నించండి"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ఊహించని విధంగా తీసివేయబడింది"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"డేటా కోల్పోకుండా ఉండటానికి <xliff:g id="NAME">%s</xliff:g>ని తీసివేయడానికి ముందు అన్మౌంట్ చేయండి"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> తీసివేయబడింది"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> తీసివేయబడింది; కొత్తదాన్ని చొప్పించండి"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ఇంకా <xliff:g id="NAME">%s</xliff:g>ని తొలగిస్తూనే ఉంది…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"తీసివేయవద్దు"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"సెటప్ చేయి"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"తొలగించు"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"విశ్లేషించు"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"సరిపోలే కార్యాచరణలు కనుగొనబడలేదు."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"ప్రసార మాధ్యమ అవుట్పుట్ను మళ్లించడం"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"మీడియా అవుట్పుట్ను ఇతర బాహ్య పరికరాలకు మళ్లించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
@@ -1188,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"అంతర్గత నిల్వ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD కార్డు"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD కార్డ్"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB డ్రైవ్"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB డ్రైవ్"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB నిల్వ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"సవరించు"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"డేటా వినియోగం హెచ్చరిక"</string>
@@ -1450,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"మీరు దీన్ని ఆఫ్ చేసే వరకు"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"కుదించండి"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"అంతరాయాలకు అడ్డుకట్ట వేయండి"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"అంతరాయం కలిగించవద్దు"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ముఖ్యమైన పనిలో ఉన్నప్పుడు"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"వారపురాత్రులు"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"వారాంతాలు"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index a4daf01..097486ec 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"อนุญาตให้แอปพลิเคชันอ่านข้อความ SMS ที่จัดเก็บไว้ในแท็บเล็ตหรือซิมการ์ด ซึ่งจะทำให้แอปพลิเคชันสามารถอ่านข้อความ SMS ทั้งหมดได้ไม่ว่าจะเป็นเนื้อหาใดหรือมีการรักษาข้อมูลที่เป็นความลับแบบใด"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"อนุญาตให้แอปอ่านข้อความ SMS ที่เก็บไว้ในทีวีหรือซิมการ์ด ซึ่งทำให้แอปสามารถอ่านข้อความ SMS ทั้งหมด ไม่ว่าจะเป็นข้อมูลแบบใดหรือเป็นความลับไหม"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"อนุญาตให้แอปพลิเคชันอ่านข้อความ SMS ที่จัดเก็บไว้ในโทรศัพท์หรือซิมการ์ด ซึ่งจะทำให้แอปพลิเคชันสามารถอ่านข้อความ SMS ทั้งหมดได้ไม่ว่าจะเป็นเนื้อหาใดหรือมีการรักษาข้อมูลที่เป็นความลับแบบใด"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"แก้ไขข้อความของคุณ (SMS หรือ MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"อนุญาตให้แอปพลิเคชันเขียนลงในข้อความ SMS ที่เก็บไว้ในแท็บเล็ตหรือซิมการ์ดของคุณ แอปพลิเคชันที่เป็นอันตรายอาจลบข้อความของคุณทิ้ง"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"อนุญาตให้แอปเขียนข้อความ SMS ที่เก็บไว้ในทีวีหรือซิมการ์ดของคุณ แอปที่เป็นอันตรายอาจลบข้อความของคุณได้"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"อนุญาตให้แอปพลิเคชันเขียนลงในข้อความ SMS ที่เก็บไว้ในโทรศัพท์หรือซิมการ์ดของคุณ แอปพลิเคชันที่เป็นอันตรายอาจลบข้อความของคุณทิ้ง"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"รับข้อความ (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"อนุญาตให้แอปพลิเคชันรับและประมวลผลข้อความ WAP การอนุญาตนี้รวมถึงความสามารถในการตรวจสอบหรือลบข้อความที่ส่งมาให้คุณโดยไม่ต้องแสดงให้คุณเห็น"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"เรียกแอปพลิเคชันที่ทำงานอยู่"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ตรวจพบลายนิ้วมือเพียงบางส่วน โปรดลองอีกครั้ง"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ไม่สามารถประมวลผลลายนิ้วมือได้ โปรดลองอีกครั้ง"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"เซ็นเซอร์ลายนิ้วมือไม่สะอาด โปรดทำความสะอาดและลองอีกครั้ง"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"เคลื่อนนิ้วเร็วเกินไป โปรดลองอีกครั้ง"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"เคลื่อนนิ้วช้าเกินไป โปรดลองอีกครั้ง"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ฮาร์ดแวร์ลายนิ้วมือไม่พร้อมใช้งาน"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ไม่สามารถเก็บลายนิ้วมือได้ โปรดนำลายนิ้วมือที่มีอยู่ออก"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"หมดเวลาใช้ลายนิ้วมือแล้ว โปรดลองอีกครั้ง"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ยกเลิกการทำงานของลายนิ้วมือ"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ลองอีกครั้ง"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"อ่านการตั้งค่าการซิงค์แล้ว"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"อนุญาตให้แอปพลิเคชันเขียนลงบนการ์ด SD"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"โทร/รับสาย SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"อนุญาตให้แอปโทรและรับสาย SIP"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ลงทะเบียนการเชื่อมต่อซิมโทรคมนาคมใหม่"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"อนุญาตให้แอปลงทะเบียนการเชื่อมต่อซิมโทรคมนาคมใหม่"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ลงทะเบียนการเชื่อมต่อโทรคมนาคมใหม่"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"อนุญาตให้แอปลงทะเบียนการเชื่อมต่อโทรคมนาคมใหม่"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"จัดการการเชื่อมต่อโทรคมนาคม"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"อนุญาตให้แอปจัดการการเชื่อมต่อโทรคมนาคม"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"โต้ตอบกับหน้าจอขณะกำลังใช้สาย"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"อนุญาตให้แอปควบคุมเวลาและลักษณะที่ผู้ใช้เห็นหน้าจอขณะกำลังใช้สาย"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"โต้ตอบกับบริการโทรศัพท์"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"อนุญาตให้แอปโต้ตอบกับบริการโทรศัพท์เพื่อโทรออก/รับสาย"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"มอบประสบการณ์ของผู้ใช้ขณะกำลังใช้สาย"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"อนุญาตให้แอปมอบประสบการณ์ของผู้ใช้ขณะกำลังใช้สาย"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"อ่านประวัติการใช้เครือข่าย"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"อนุญาตให้แอปพลิเคชันอ่านประวัติการใช้เครือข่ายสำหรับเครือข่ายและแอปพลิเคชันเฉพาะ"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"จัดการนโยบายเครือข่าย"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"อนุญาตให้แอปพลิเคชันจัดการนโยบายเครือข่ายและกำหนดกฎเฉพาะแอปพลิเคชัน"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"แก้ไขการบันทึกบัญชีการใช้งานเครือข่าย"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"อนุญาตให้แอปพลิเคชันแก้ไขวิธีการบันทึกบัญชีการใช้งานเครือข่ายของแอปพลิเคชัน ไม่ใช้สำหรับแอปพลิเคชันทั่วไป"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"เข้าถึงการแจ้งเตือน"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ทำให้แอปสามารถเรียกดู ตรวจสอบ และล้างการแจ้งเตือนได้ ซึ่งรวมถึงการแจ้งเตือนที่โพสต์โดยแอปอื่นๆ ด้วย"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"เชื่อมโยงกับบริการตัวฟังการแจ้งเตือน"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"อนุญาตให้เจ้าของเชื่อมโยงกับอินเตอร์เฟซระดับสูงสุดของบริการตัวฟังการแจ้งเตือน ซึ่งไม่มีความจำเป็นสำหรับแอปธรรมดา"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"เชื่อมโยงกับบริการของผู้เสนอเงื่อนไข"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"อนุญาตให้ผู้ใช้อุปกรณ์เชื่อมโยงกับอินเทอร์เฟซระดับบนสุดของบริการของผู้เสนอเงื่อนไข ไม่จำเป็นสำหรับแอปทั่วไป"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"เชื่อมโยงกับบริการที่ต้องการ"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"อนุญาตให้แอปพลิเคชันเชื่อมโยงกับอินเทอร์เฟซระดับบนสุดของบริการที่ต้องการ ไม่จำเป็นสำหรับแอปทั่วไป"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"เรียกใช้แอปการกำหนดค่าของผู้ให้บริการ"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"อนุญาตให้ผู้ใช้สามารถเรียกใช้แอปการกำหนดค่าของผู้ให้บริการ ซึ่งแอปทั่วไปไม่จำเป็นต้องใช้"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ฟังข้อสังเกตเกี่ยวกับสภาวะของเครือข่าย"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"อนุญาตให้แอปพลิเคชันฟังข้อสังเกตเกี่ยวกับสภาวะของเครือข่าย ไม่จำเป็นสำหรับแอปปกติ"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"เปลี่ยนการเทียบมาตรฐานอุปกรณ์อินพุต"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"อนุญาตให้แอปสามารถปรับพารามิเตอร์การเทียบมาตรฐานของหน้าจอสัมผัส ไม่ควรใช้สำหรับแอปทั่วไป"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"เข้าถึงใบรับรอง DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"ช่วยให้แอปพลิเคชันสามารถจัดสรรและใช้ใบรับรอง DRM ได้ ไม่จำเป็นสำหรับแอปปกติทั่วไป"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"รับสถานะการโอน Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"อนุญาตให้แอปพลิเคชันนี้รับข้อมูลเกี่ยวกับการโอน Android Beam ปัจจุบัน"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"นำใบรับรอง DRM ออก"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"อนุญาตให้แอปพลิเคชันนำใบรับรอง DRM ออก แอปทั่วไปไม่จำเป็นต้องใช้"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"เชื่อมโยงกับบริการรับส่งข้อความของผู้ให้บริการ"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"อนุญาตให้แอปพลิเคชันเชื่อมโยงกับอินเทอร์เฟซระดับบนสุดของบริการรับส่งข้อความของผู้ให้บริการ ไม่ควรใช้สำหรับแอปธรรมดาทั่วไป"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"ตั้งค่ากฎรหัสผ่าน"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"ควบคุมความยาวและอักขระที่สามารถใช้ในรหัสผ่านของการล็อกหน้าจอและ PIN"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"ตรวจสอบความพยายามในการปลดล็อกหน้าจอ"</string>
@@ -1028,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"ตัวเลือก"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"กำลังเตรียม <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"กำลังตรวจหาข้อผิดพลาด"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ตรวจพบ <xliff:g id="NAME">%s</xliff:g> ใหม่"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"สำหรับการโอนรูปภาพและสื่อ"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> เสียหาย"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> เสียหาย ลองฟอร์แมตอีกครั้ง"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ถูกนำออกไปโดยไม่คาดคิด"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ยกเลิกการต่อเชื่อม <xliff:g id="NAME">%s</xliff:g> ก่อนนำออกเพื่อหลีกเลี่ยงข้อมูลสูญหาย"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"นำ <xliff:g id="NAME">%s</xliff:g> ออกแล้ว"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> ถูกนำออก โปรดใส่ใหม่"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ยังคงนำ <xliff:g id="NAME">%s</xliff:g> ออก…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"ห้ามนำออก"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"ตั้งค่า"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"นำอุปกรณ์ออก"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"สำรวจ"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"ไม่พบกิจกรรมที่ตรงกัน"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"กำหนดเส้นทางเอาต์พุตของสื่อ"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"อนุญาตให้แอปพลิเคชันกำหนดเส้นทางเอาต์พุตของสื่อไปยังอุปกรณ์ภายนอกอื่นๆ"</string>
@@ -1187,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"ที่จัดเก็บข้อมูลภายใน"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"การ์ด SD"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"การ์ด SD ของ <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"ไดรฟ์ USB"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"ไดรฟ์ USB ของ <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"ที่เก็บข้อมูล USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"แก้ไข"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"คำเตือนการใช้ข้อมูล"</string>
@@ -1449,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"จนกว่าคุณจะปิดฟังก์ชันนี้"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ยุบ"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"บล็อกเสียงรบกวน"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"ห้ามรบกวน"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ช่วงเวลาเครื่องไม่ทำงาน"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"คืนวันจันทร์-ศุกร์"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"วันหยุดสุดสัปดาห์"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 4a4d852..e4f1b54 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Pinapayagan ang app na magbasa ng mga mensaheng SMS na naka-imbak sa iyong tablet o SIM card. Pinapayagan nito ang app na basahin ang lahat ng mensaheng SMS, ano pa man ang nilalaman at katayuan sa pagiging kumpedensyal ng mga ito."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Pinapayagan ang app na mabasa ang mga mensaheng SMS na nakaimbak sa iyong TV o SIM card. Nagbibigay-daan ito sa app na mabasa ang lahat ng mensaheng SMS, kahit ano pang content nito o kung kumpidensyal ito."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Pinapayagan ang app na magbasa ng mga mensaheng SMS na naka-imbak sa iyong telepono o SIM card. Pinapayagan nito ang app na basahin ang lahat ng mensaheng SMS, ano pa man ang nilalaman at katayuan sa pagiging kumpedensyal ng mga ito."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"i-edit ang iyong mga text message (SMS o MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Pinapayagan ang app na magsulat sa mga mensaheng SMS na nakaimbak sa iyong tablet o SIM card. Maaaring tanggalin ng nakakahamak na apps ang iyong mga mensahe."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Nagbibigay-daan sa app na magsulat sa mga mensaheng SMS na nakaimbak sa iyong TV o SIM card. Maaaring i-delete ng mga nakakahamak na app ang iyong mga mensahe."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Pinapayagan ang app na magsulat sa mga mensaheng SMS na nakaimbak sa iyong telepono o SIM card. Maaaring tanggalin ng nakakahamak na apps ang iyong mga mensahe."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"tumanggap ng mga text message (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Pinapayagan ang app na tumanggap at magproseso ng mga mensaheng WAP. Kabilang sa pahintulot na ito ang kakayahang sumubaybay o magtanggal ang app ng mga mensaheng ipinapadala sa iyo nang hindi ipinapakita ang mga ito sa iyo."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"bawiin ang tumatakbong apps"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Hindi buo ang natukoy na fingerprint. Pakisubukang muli."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Hindi maproseso ang fingerprint. Pakisubukang muli."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Marumi ang sensor ng fingerprint. Pakilinis at subukang muli."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Masyadong mabilis ang paggalaw ng daliri. Pakisubukang muli."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Masyadong mabagal ang paggalaw ng daliri. Pakisubukang muli."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hindi available ang hardware na ginagamitan ng fingerprint."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Hindi maiimbak ang fingerprint. Mangyaring mag-alis ng umiiral nang fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Nag-time out ang fingerprint. Subukang muli."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Nakansela ang operasyong ginagamitan ng fingerprint."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Masyadong maraming beses sumubok. Subukang muli sa ibang pagkakataon."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Subukang muli."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"basahin ang mga setting ng sync"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Pinapayagan ang app na magsulat sa SD card."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"magsagawa/tumanggap ng mga tawag sa SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Pinapayagan ang app na magsagawa at makatanggap ng mga tawag sa SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"magrehistro ng mga bagong koneksyon sa SIM ng telecom"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Pinapayagan ang app na magrehistro ng mga bagong koneksyon sa SIM ng telecom."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"magrehistro ng mga bagong koneksyon sa telecom"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Pinapayagan ang app na magrehistro ng mga bagong koneksyon sa telecom."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"papamahalaan ang mga koneksyon sa telecom"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Pinapayagan ang app na mamahala ng mga koneksyon sa telecom."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"makipag-ugnayan sa in-call na screen"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Nagbibigay-daan sa app na kontrolin kung kailan at kung paano makikita ng user ang in-call na screen."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"makipag-ugnayan sa mga serbisyo sa telephony"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Pinapayagan ang app na makipag-ugnayan sa mga serbisyo sa telephony upang tumawag/makatanggap ng mga tawag."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"magbigay ng in-call na karanasan sa user"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Nagbibigay-daan sa app na magbigay ng in-call na karanasan sa user."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"basahin ang makasaysayang paggamit ng network"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Pinapayagan ang app na basahin ang makasaysayang paggamit network para sa mga tukoy na network at apps."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"pamahalaan ang patakaran ng network"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Pinapayagan ang app na pamahalaan ang mga patakaran ng network at ilarawan ang mga patakarang tukoy sa app."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"baguhin ang pagkukuwenta sa paggamit ng network"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Pinapayagan ang app na baguhin kung paano isinasaalang-alang ang paggamit ng network laban sa apps. Hindi para sa paggamit ng normal na apps."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"i-access ang mga notification"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Pinapayagan ang app na kumuha, sumuri, at mag-clear ng mga notification, kabilang ang mga na-post ng iba pang apps."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"mapailalim sa isang serbisyo ng notification listener"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Nagbibigay-daan sa may-ari na mapailalim sa interface sa tuktok na antas ng isang serbisyo ng notification listener. Hindi dapat kailanganin para sa karaniwang apps kahit kailan."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"i-bind sa isang serbisyo sa pagbibigay ng kundisyon"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Nagbibigay-daan sa naghahawak na i-bind ang top-level na interface ng isang serbisyo sa pagbibigay ng kundisyon. Hindi kailanman dapat kailanganin ng mga normal na app."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"sumailalim sa isang serbisyo ng dream"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Pinapayagan ang may-ari na sumailalim sa interface ng serbisyo ng dream na nasa nangungunang antas. Hindi kailanman dapat na kailanganin para sa mga normal na app."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"paganahin ang app ng configuration na ibinigay ng carrier"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Nagbibigay-daan sa may-ari na paganahin ang app ng configuration na ibinigay ng carrier. Hindi dapat kailanganin para sa normal na apps kahit kailan."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"makinig sa mga obserbasyon sa mga kundisyon ng network"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Nagbibigay-daan sa isang application na makinig sa mga obserbasyon sa mga kundisyon ng network. Dapat na hindi kailanman kakailanganin para sa normal na apps."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"baguhin ang pag-calibrate ng input device"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Pinapayagan ang app na baguhin ang mga parameter sa pag-calibrate ng touch screen. Hindi dapat kailanganin sa normal na apps."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"access sa Mga DRM certificate"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Nagbibigay-daan sa isang application na makapagbigay at gumamit ng mga DRM certficate. Hindi dapat kailanman kailanganin para sa mga normal na app."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Tanggapin ang status ng paglilipat ng Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Pinapayagan ang application na ito na tumanggap ng impormasyon tungkol sa mga kasalukuyang paglilipat ng Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"alisin ang mga DRM certificate"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Nagbibigay-daan sa isang application na alisin ang mga DRM certficate. Hindi dapat kailanman kailanganin para sa karaniwang apps."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"sumailalim sa isang serbisyo ng pagmemensahe ng carrier"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Binibigyang-daan ang may-ari na sumailalim sa interface sa nangungunang antas ng isang serbisyo ng pagmemensahe ng carrier. Hindi kailanman dapat kailanganin para sa mga normal na app."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Magtakda ng mga panuntunan sa password"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Kontrolin ang haba at ang mga character na pinapayagan sa mga password at PIN sa lock ng screen."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Subaybayan ang mga pagsubok sa pag-unlock ng screen"</string>
@@ -1028,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"mga kandidato"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Inihahanda ang <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sinusuri para sa mga error"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Na-detect ang bagong <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para sa paglilipat ng mga larawan at media"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Nasira ang <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Nasira ang <xliff:g id="NAME">%s</xliff:g>; Subukan itong i-reformat"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Hindi inaasahang naalis ang <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"I-unmount ang <xliff:g id="NAME">%s</xliff:g> bago alisin upang maiwasan ang pagkawala ng data"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Inalis ang <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Inalis ang <xliff:g id="NAME">%s</xliff:g>; maglagay ng bago"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Ine-eject pa rin ang <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Huwag alisin"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"I-setup"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"I-eject"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"I-explore"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Walang nahanap na mga tumutugmang aktibidad."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"I-route ang output ng media"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Pinapayagan ang application na mag-route ng output ng media sa iba pang mga panlabas na device."</string>
@@ -1187,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Panloob na storage"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD card"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD card"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB drive"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"I-edit"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Babala sa paggamit ng data"</string>
@@ -1449,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Hanggang sa i-off mo ito"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"I-collapse"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"I-block ang mga pagkaantala"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Huwag istorbohin"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Walang serbisyo"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Mga Weeknight"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Sabado at Linggo"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index e91d1cb..95474d8 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Uygulamaya tabletinizde veya SIM kartta saklanan SMS iletilerini okuma izni verir. Bu izin, uygulamanın tüm SMS iletilerini içeriğinden veya gizliliğinden bağımsız olarak okumasına olanak sağlar."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Uygulamaya, TV\'nizde veya SIM kartta depolanmış SMS iletilerini okuma izni verir. Bu izin, uygulamanın içeriğe veya gizliliğe bakılmaksızın tüm SMS iletilerini okumasına olanak sağlar."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Uygulamaya telefonunuzda veya SIM kartta saklanan SMS iletilerini okuma izni verir. Bu izin, uygulamanın tüm SMS iletilerini içeriğinden veya gizliliğinden bağımsız olarak okumasına olanak sağlar."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"kısa mesajlarımı (SMS veya MMS) düzenle"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Uygulamaya, tabletinizde veya SIM kartınızda depolanan SMS iletilerine yazma izni verir. Kötü amaçlı uygulamalar iletilerinizi silebilir."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Uygulamaya, TV\'niz ya da SIM kartınızda saklanan SMS iletilerine yazma izni verir. Kötü amaçlı uygulamalar iletilerinizi silebilir."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Uygulamaya, telefonunuzdaki veya SIM kartınızdaki SMS iletilerine yazma izni verir. Kötü amaçlı uygulamalar iletilerinizi silebilir."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"kısa mesajları (WAP) al"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Uygulamaya WAP mesajlarını alma ve işleme izni verir. Buna, size gönderilen mesajları takip edip size göstermeden silebilme izni de dahildir."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"çalışan uygulamaları al"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Parmak izinin tümü algılanamadı. Lütfen tekrar deneyin."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Parmak izi işlenemedi. Lütfen tekrar deneyin."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Parmak izi sensörü kirli. Lütfen temizleyin ve tekrar deneyin."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Parmak hareketi çok hızlıydı. Lütfen tekrar deneyin."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Parmak hareketi çok yavaştı. Lütfen tekrar deneyin."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Parmak izi donanımı kullanılamıyor."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Parmak izi depolanamıyor. Lütfen mevcut parmak izlerinden birini kaldırın."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Parmak izi için zaman aşımı oluştu. Tekrar deneyin."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Parmak izi işlemi iptal edildi."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tekrar deneyin."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"senk. ayarlarını okuma"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Uygulamaya, SD karta yazma izni verir."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP çağrıları yapma/alma"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Uygulamanın SIP çağrıları yapmasına ve almasına izin verir."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"yeni telekomünikasyon SIM bağlantılarını kaydettir"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Uygulamanın yeni telekomünikasyon SIM bağlantıları kaydettirmesine izin verir."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"yeni telekomünikasyon bağlantıları kaydettir"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Uygulamanın yeni telekomünikasyon bağlantıları kaydettirmesine izin verir."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"telekomunikasyon bağlantılarını yönet"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Uygulamanın telekomünikasyon bağlantılarını yönetmesine izin verir."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"çağrı ekranıyla etkileşimde bulunma"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Uygulamaya, kullanıcının çağrı ekranını ne zaman ve nasıl göreceğini denetleme izni verir."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"telefon hizmetleriyle etkileşimde bulunma"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Uygulamanın çağrı yapmak/almak için telefon hizmetleriyle etkileşimde bulunmasına izin verir."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"çağrı içi kullanıcı deneyimi sağlama"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Uygulamaya, çağrı içi kullanım deneyimi sağlama izin verir."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"geçmiş ağ kullanımını oku"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Uygulamaya, özel ağlar ve uygulamalar için ağ kullanım geçmişini okuma izni verir."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ağ politikasını yönet"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Uygulamaya, ağ politikalarını yönetme ve uygulamaya özgü kuralları tanımlama izni verir."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ağ kullanım hesaplamasını değiştir"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Uygulamaya, ağın uygulamalara göre nasıl kullanılacağını değiştirme izni verir. Normal uygulamalar tarafından kullanılmak için değildir."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"bildirimlere eriş"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Uygulamanın bildirimler almasına, bildirimleri incelemesine ve temizlemesine izin verir. Buna diğer uygulamalar tarafından yayınlanan bildirimler de dahildir."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bildirim dinleyici hizmetine bağlan"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"İzin sahibine bir bildirim dinleyici hizmetinin en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"bir durum sağlayıcı hizmetine bağlanma"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"İzin sahibinin, bir durum sağlayıcı hizmete ait üst düzey arayüze bağlanmasına izin verir. Normal uygulamalar için hiçbir zaman gerekli değildir."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"bir dream hizmetine bağla"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"İzin sahibine bir dream hizmetinin üst seviye arayüzüne bağlanma olanağı sunar. Normal uygulamalarda hiçbir zaman ihtiyaç duyulmamalıdır."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"operatör tarafından sağlanan yapılandırma uygulamasını çalıştır"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"İzin sahibine, operatör tarafından sağlanan yapılandırma uygulamasını çalıştırma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ağ koşullarındaki gözlemleri dinle"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Bir uygulamaya, ağ koşullarındaki gözlemleri dinleme izni verir. Normal uygulamalar için hiçbir zaman gerekmez."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"giriş cihazı kalibrasyonunu değiştir"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Uygulamaya, dokunmatik ekranın kalibrasyon parametrelerini değiştirme izni verir. Normal uygulamalar için hiçbir zaman gerekmez."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM sertifikalarına eriş"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Bir uygulamanın DRM sertifikaları için temel hazırlık yapmasına ve bunları kullanmasına izin verir. Normal uygulamalar için hiçbir zaman gerekmez."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam aktarım durumunu al"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Bu uygulamanın mevcut Android Beam aktarımlarıyla ilgili bilgi almasına izin verir"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM sertifikalarını kaldırma"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Uygulamaya, DRM sertifikalarını kaldırma izin verir. Normal uygulamalar için asla gerekmemelidir."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"operatör mesajlaşma hizmetine bağlan"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"İzin sahibinin, operatör mesajlaşma hizmetinin üst düzey arayüzüne bağlanmasına olanak verir. Normal uygulamalarda hiçbir zaman gerekmez."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Şifre kuralları ayarla"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Ekran kilidini açma şifrelerinde ve PIN\'lerde izin verilen uzunluğu ve karakterleri denetleyin."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Ekran kilidini açma denemelerini izle"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Kilidi açmak veya acil çağrı yapmak için Menü\'ye basın."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Kilidi açmak için Menü\'ye basın."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Kilit açmak için deseni çizin"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Acil durum çağrısı"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Çağrıya dön"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Doğru!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Tekrar deneyin"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"adaylar"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> hazırlanıyor"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hatalar denetleniyor"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yeni <xliff:g id="NAME">%s</xliff:g> algılandı"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotoğraf ve medya aktarmak için"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> zarar görmüş"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> zarar görmüş, tekrar biçimlendirmeyi deneyin"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> beklenmedik şekilde çıkartıldı"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Veri kaybı olmaması için <xliff:g id="NAME">%s</xliff:g> birimini kaldırmadan önce bağlantısını kesin"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> kaldırıldı"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> kaldırıldı; yeni bir tane takın"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> çıkarma işlemi devam ediyor…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Kaldırma"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Kurulum"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Çıkar"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Keşfedin"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Eşleşen hiçbir etkinlik bulunamadı."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Medya çıktısını yönlendir"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Uygulamaya medya çıktısını başka harici cihazlara yönlendirme izni verir."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Dahili depolama birimi"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD kart"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB bellek"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Düzenle"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Veri kullanım uyarısı"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Siz bunu kapatana kadar"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Daralt"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Kesintileri engelle"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Rahatsız etmeyin"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Bildirim istenmeyen zaman"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Hafta içi her gece"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Hafta sonu"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 382d235..4bc1826 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -272,10 +272,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Дозволяє програмі читати SMS повідомлення, збережені в планшетному ПК чи на SIM-карті. Це дозволяє програмі читати всі SMS повідомлення, незалежно від вмісту чи конфіденційності."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Додаток може читати SMS-повідомлення, збережені в телевізорі чи на SIM-карті. Завдяки цьому додаток може читати всі SMS-повідомлення, незалежно від їх вмісту чи конфіденційності."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Дозволяє програмі читати SMS повідомлення, збережені в телефоні чи на SIM-карті. Це дозволяє програмі читати всі SMS повідомлення, незалежно від вмісту чи конфіденційності."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"редагувати текстові повідомлення (SMS або MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Дозволяє програмі писати в SMS повідомлення, збережені в планшетному ПК чи на SIM-карті. Шкідливі програми можуть видаляти ваші повідомлення."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Додаток може записувати в SMS-повідомлення, збережені в телевізорі чи на SIM-карті. Шкідливі додатки можуть видаляти ваші повідомлення."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Дозволяє програмі писати в SMS повідомлення, збережені в телефоні чи на SIM-карті. Шкідливі програми можуть видаляти ваші повідомлення."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"отримувати текстові повідомлення (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Дозволяє програмі отримувати й обробляти WAP-повідомлення. Це означає, що програма може відстежувати чи видаляти повідомлення, надіслані на ваш пристрій, навіть не показуючи їх вам."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"отримувати запущені програми"</string>
@@ -431,21 +427,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Відбиток розпізнано частково. Повторіть спробу."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Не вдалось обробити відбиток. Повторіть спробу."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Датчик відбитків забруднився. Очистьте його та повторіть спробу."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Ви забрали палець надто швидко. Повторіть спробу."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Ви забрали палець надто повільно. Повторіть спробу."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Апаратне забезпечення для сканування відбитка недоступне."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Не вдалося зберегти відбиток. Видаліть наявний відбиток."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час очікування відбитка минув. Повторіть спробу."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Дію з відбитком скасовано."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Забагато спроб. Спробуйте пізніше."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторіть спробу."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"читати налаштування синхронізації"</string>
@@ -470,6 +461,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Дозволяє програмі записувати на карту SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"здійснювати й отримувати дзвінки через протокол SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Додаток зможе здійснювати й отримувати дзвінки через протокол SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"реєструвати нові телекомунікаційні з’єднання SIM-карт"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Додаток може реєструвати нові телекомунікаційні з’єднання SIM-карт."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"реєструвати нові телекомунікаційні з’єднання"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Додаток може реєструвати нові телекомунікаційні з’єднання."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"керування телекомунікаційними з’єднаннями"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Додаток може керувати телекомунікаційними з’єднаннями."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"взаємодіяти з екраном вхідного дзвінка"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Додаток може контролювати, коли та як користувач бачить екран вхідного дзвінка."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"взаємодіяти з телефонними службами"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Дозволяє додатку взаємодіяти з телефонними службами, щоб здійснювати/приймати дзвінки."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"працювати під час розмови"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Додаток може працювати під час розмови."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"читати історію використання мережі"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Дозволяє програмі читати історію використання мережі для певних мереж і програм."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"керувати політикою мережі"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Дозволяє програмі керувати політикою мережі та визначити спеціальні правила для програм."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"змінювати облік використання мережі"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Дозволяє програмі змінювати метод підрахунку того, як програми використовують мережу. Не для використання звичайними програмами."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"отримувати доступ до сповіщень"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Дозволяє програмі отримувати, перевіряти й очищати сповіщення, зокрема опубліковані іншими програмами."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"прив’язуватися до служби читання сповіщень"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Дозволяє власнику прив’язуватися до інтерфейсу верхнього рівня служби читання сповіщень. Ніколи не застосовується для звичайних програм."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"підключитися до служби постачання умов"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Додаток зможе підключатися до інтерфейсу верхнього рівня служби постачання умов. Звичайні додатки ніколи не використовують цей дозвіл."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"підключення до служби заставок"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Додаток зможе підключатися до інтерфейсу верхнього рівня служби заставок. Звичайні додатки ніколи не використовують цей дозвіл."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"викликати надану оператором програму конфігурації"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Дозволяє власнику викликати надану оператором програму конфігурації. Ніколи не застосовується для звичайних програм."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"прослуховувати дані спостережень за станом мережі"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Дозволяє програмі прослуховувати дані спостережень за станом мережі. Ніколи не застосовується для звичайних програм."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"змінювати калібрування пристрою введення"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Програма може змінювати параметри калібрування сенсорного екрана. Ніколи не застосовується для звичайних програм."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"отримувати доступ до сертифікатів DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Дозволяє додатку надавати та використовувати сертифікати DRM. Ніколи не застосовується для звичайних додатків."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Отримувати інформацію про стан функції Передавання даних Android."</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Додаток може отримувати інформацію про поточне передавання даних за допомогою функції Передавання даних Android"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"видаляти сертифікати DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Власник може видаляти сертифікати DRM. Ніколи не застосовується для звичайних додатків."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"підключатися до служби надсилання повідомлень через оператора"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Додаток зможе підключатися до інтерфейсу верхнього рівня служби надсилання повідомлень через оператора. Звичайні додатки ніколи не використовують цей дозвіл."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Устан. правила пароля"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Укажіть максимальну довжину та кількість символів для паролів розблокування екрана та PIN-кодів."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Відстежув. спроби розблок. екрана"</string>
@@ -630,8 +665,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Натис. меню, щоб розбл. чи зробити авар. виклик."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Натисн. меню, щоб розбл."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Намал. ключ, щоб розбл."</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Екстрені служби"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Поверн. до дзвін."</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Правильно!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Повторіть спробу"</string>
@@ -1043,36 +1077,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Підготовка пристрою пам’яті <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Виявлення помилок"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Виявлено новий пристрій пам’яті (<xliff:g id="NAME">%s</xliff:g>)"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для перенесення фотографій і медіафайлів"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Пристрій пам’яті <xliff:g id="NAME">%s</xliff:g> пошкоджено"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"Пристрій пам’яті <xliff:g id="NAME">%s</xliff:g> пошкоджено. Спробуйте переформатувати його"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> несподівано вийнято"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Перш ніж виймати пристрій пам’яті <xliff:g id="NAME">%s</xliff:g>, відключіть його, щоб не втратити дані"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Ви вийняли пристрій пам’яті <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Ви вийняли пристрій пам’яті <xliff:g id="NAME">%s</xliff:g>. Вставте новий пристрій"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Відключення пристрою пам’яті <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не виймайте пристрій пам’яті"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Налаштувати"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Відключити"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Переглянути"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Відповідні дії не знайдено."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Скеровувати вивід медіа-даних"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Дозволяє програмі скеровувати вивід медіа-даних на інші зовнішні пристрої."</string>
@@ -1204,6 +1223,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Внутрішня пам’ять"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Карта SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Носій USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Редагувати"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Застереження про використ. даних"</string>
@@ -1476,7 +1501,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Доки ви не вимкнете"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Згорнути"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Блокування сповіщень"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не турбувати"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Простій"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Увечері в робочі дні"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"У вихідні"</string>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index c25a9ab..33d8927 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ایپ کو آپ کے ٹیبلٹ یا SIM کارڈ میں اسٹور کردہ SMS پیغامات کو پڑھنے کی اجازت دیتا ہے۔ یہ ایپ کو مواد اور رازداری سے قطع نظر سبھی SMS پیغامات پڑھنے کی اجازت دیتا ہے۔"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"ایپ کو آپ کے TV یا SIM کارڈ میں اسٹور کردہ SMS پیغامات پڑھنے کی اجازت دیتا ہے۔ یہ ایپ کو مواد یا رازداری سے قطع نظر سبھی SMS پیغامات پڑھنے کی اجازت دیتا ہے۔"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ایپ کو آپ کے فون یا SIM کارڈ میں اسٹور کردہ SMS پیغامات کو پڑھنے کی اجازت دیتا ہے۔ یہ ایپ کو مواد اور رازداری سے قطع نظر سبھی SMS پیغامات پڑھنے کی اجازت دیتا ہے۔"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"اپنے متنی پیغامات (SMS یا MMS) میں ترمیم کریں"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ایپ کو آپ کے ٹیبلیٹ یا SIM کارڈ پر اسٹور کردہ SMS پیغامات کو لکھنے کی اجازت دیتا ہے۔ نقصان دہ ایپس آپ کے پیغامات کو حذف کر سکتی ہیں۔"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"ایپ کو آپ کے TV یا SIM کارڈ پر اسٹور کردہ SMS پیغامات کو جواب لکھنے کی اجازت دیتا ہے۔ نقصان دہ ایپس آپ کے پیغامات کو حذف کر سکتی ہیں۔"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ایپ کو آپ کے فون یا SIM کارڈ پر اسٹور کردہ SMS پیغامات کو لکھنے کی اجازت دیتا ہے۔ نقصان دہ ایپس آپ کے پیغامات کو حذف کر سکتی ہیں۔"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"متنی پیغامات (WAP) حاصل کریں"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"ایپ کو WAP پیغامات حاصل اور ان پر کارروائی کرنے کی اجازت دیتا ہے۔ اس اجازت میں آپ کو مرسلہ پیغامات آپ کو دکھائے بغیر ان پر نگاہ رکھنے یا انہیں حذف کرنے کی اہلیت شامل ہے۔"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"چل رہی ایپس کی بازیافت کریں"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"جزوی فنگر پرنٹ کی شناخت ہوئی۔ براہ کرم دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"فنگر پرنٹ پر کارروائی نہیں کی جا سکی۔ براہ کرم دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"فنگر پرنٹ سینسر گندا ہے۔ براہ کرم صاف کریں اور دوبارہ کوشش کریں۔"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"انگلی کو کافی تیزی سے ہٹا لیا گیا۔ براہ کرم دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"انگلی کو بہت آہستہ ہٹا لیا گیا۔ براہ کرم دوبارہ کوشش کریں۔"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"فنگر پرنٹ ہارڈ ویئر دستیاب نہیں ہے۔"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"فنگر پرنٹ اسٹور نہیں کیا جا سکتا ہے۔ براہ کرم ایک موجودہ فنگر پرنٹ ہٹائیں۔"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"فنگر پرنٹ کی میعاد ختم ہوگئی۔ دوبارہ کوشش کریں۔"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"فنگر پرنٹ کی کارروائی منسوخ ہوگئی۔"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"کافی زیادہ کوششیں کی گئیں۔ بعد میں دوباہ کوشش کریں۔"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"دوبارہ کوشش کریں۔"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"مطابقت پذیری کی ترتیبات پڑھیں"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"ایپ کو SD کارڈ پر لکھنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP کالز کریں/موصول کریں"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"ایپ کو SIP کالز کرنے اور موصول کرنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"نئے ٹیلی کام SIM کنکشنز رجسٹر کریں"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"ایپ کو نئے ٹیلی کام SIM کنکشنز کو رجسٹر کرنے کی اجازت دیتی ہے۔"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"نئے ٹیلی کام کنکشنز رجسٹر کریں"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ایپ کو نئے ٹیلی کام کنکشنز کو رجسٹر کرنے کی اجازت دیتی ہے۔"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"ٹیلی کام کنکشنز کا نظم کریں"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"ایپ کو ٹیلی کام کنکشنز کا نظم کرنے کی اجازت دیتی ہے۔"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"درون کال اسکرین کے ساتھ تعامل کریں"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"ایپ کو صارف کے درون کال اسکرین دیکھنے کے وقت اور طریقے کو کنٹرول کرنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"ٹیلیفونی سروسز کے ساتھ تعامل کریں"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"کالز کرنے/وصول کرنے کیلئے ایپ کو ٹیلیفونی سروسز کے ساتھ تعامل کرنے دیتا ہے۔"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"ایک درون کال صارف تجربہ فراہم کریں"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"ایپ کو ایک درون کال صارف تجربہ فراہم کرنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"تاریخی نیٹ ورک کا استعمال پڑھیں"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"ایپ کو مخصوص نیٹ ورکس اور ایپس کیلئے نیٹ ورک کے استعمال کی سرگزشت پڑھنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"نیٹ ورک کی پالیسی کا نظم کریں"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ایپ کو نیٹ ورک پالیسیوں کا نظم کرنے اور ایپ کیلئے مخصوص اصولوں کی وضاحت کرنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"نیٹ ورک کے استعمال کی اکاؤنٹنگ میں ترمیم کریں"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ایپ کو ایپس کے برخلاف حساب کیے جانے والے نیٹ ورک کے استعمال کے طریقے میں ترمیم کرنے کی اجازت دیتا ہے۔ عام ایپس کے ذریعہ استعمال کیلئے نہیں ہے۔"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"اطلاعات تک رسائی حاصل کریں"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"دوسرے ایپس کے ذریعے شائع کردہ کے بشمول ایپ کو اطلاعات کی بازیابی، تفتیش اور انہیں صاف کرنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"اطلاع سننے والی سروس کے پابند بنیں"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"حامل کو اطلاع سننے والی سروس کے اعلی سطحی انٹرفیس کا پابند ہونے کی اجازت دیتا ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہيں ہونی چاہئے۔"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"شرط فراہم کرنے والی ایک سروس کے پابند بنیں"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"حامل کو شرط فراہم کنندہ کی سروس کے اعلی سطحی انٹرفیس کا پابند ہونے کی اجازت دیتا ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہيں ہونی چاہئے۔"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"ایک ڈریم سروس کا پابند بنیں"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"حامل کو ڈریم سروس کے اعلی سطحی انٹرفیس کا پابند ہونے کی اجازت دیتی ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہيں ہونی چاہیے۔"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"کیریئر کے ذریعے فراہم کردہ کنفگریشن ایپ طلب کریں"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"حامل کو کیریئر کے ذریعے فراہم کردہ کنفگریشن ایپ طلب کرنے کی اجازت دیتا ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہيں ہونی چاہئے۔"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"نیٹ ورک کی صورت حال کے بارے میں مشاہدے سنیں"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"کسی ایپلیکیشن کو نیٹ ورک حالات پر مشاہدوں کو سننے دیتا ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہيں ہونی چاہئے۔"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ان پٹ آلہ کا کیلیبریشن تبدیل کریں"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"ایپ کو ٹچ اسکرین کے کیلیبریشن پیرامیٹرز میں ترمیم کرنے کی اجازت دیتا ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہيں ہونی چاہئے۔"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM سرٹیفکیٹس تک رسائی حاصل کریں"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"ایک ایپ کو DRM سرٹیفکیٹس فراہم کرنے اور ان کا استعمال کرنے کی اجازت دیتا ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہیں ہوتی ہے۔"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam منتقلی کی صورت حال موصول کریں"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"اس ایپلیکیشن کو Android Beam کی حالیہ منتقلیوں کے بارے میں معلومات موصول کرنے کی اجازت دیتا ہے"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM سرٹیفکیٹس کو ہٹائیں"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"ایک ایپلیکیشن کو DRM سرٹیفکیٹس کو ہٹانے کی اجازت دیتا ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہیں ہونی چاہیے۔"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"ایک کیریئر پیغام رسانی سروس کا پابند بنیں"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"حامل کو ایک کیریئر پیغام رسانی سروس کے اعلی سطحی انٹرفیس کا پابند ہونے کی اجازت دیتی ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہیں ہونی چاہیے۔"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"پاس ورڈ کے اصول سیٹ کریں"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"اسکرین لاک پاس ورڈز اور PINs میں اجازت یافتہ لمبائی اور حروف کو کنٹرول کریں۔"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"اسکرین غیر مقفل کرنے کی کوششیں مانیٹر کریں"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"غیر مقفل کرنے کیلئے مینو دبائیں یا ہنگامی کال کریں۔"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"غیر مقفل کرنے کیلئے مینو دبائیں۔"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"غیر مقفل کرنے کیلئے پیٹرن کو ڈرا کریں"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"ہنگامی"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"کال پر واپس جائیں"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"صحیح!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"دوبارہ کوشش کریں"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"امیدواران"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> تیار کیا جا رہا ہے"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"خرابیوں کیلئے چیک کیا جا رہا ہے"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"نئے <xliff:g id="NAME">%s</xliff:g> کا پتا چلا"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"تصاویر اور میڈیا منتقل کرنے کیلئے"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> خراب ہے"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> خراب ہے؛ اسے دوبارہ فارمیٹ کرنے کی کوشش کریں"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> غیر متوقع طور پر ہٹا دیا گیا"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ڈیٹا ضائع ہونے سے بچانے کیلئے ہٹانے سے پہلے <xliff:g id="NAME">%s</xliff:g> کو اَن ماؤنٹ کریں"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> کو ہٹا دیا گیا"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> کو ہٹا دیا گیا؛ ایک نیا داخل کریں"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"ابھی بھی <xliff:g id="NAME">%s</xliff:g> کو خارج کر رہا ہے…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"نہ ہٹائیں"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"ترتیب دیں"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"خارج کریں"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"دریافت کریں"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"کوئی مماثل سرگرمیاں نہیں ملیں۔"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"میڈیا آؤٹ پٹ کی سمت طے کریں"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"کسی ایپلیکیشن کو دوسرے خارجی آلات تک میڈیا آؤٹ پٹ کا راستہ بنانے کی اجازت دیتا ہے۔"</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"داخلی اسٹوریج"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD کارڈ"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB اسٹوریج"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ترمیم کریں"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ڈیٹا کے استعمال کی وارننگ"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"جب تک آپ اسے آف نہ کر دیں"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"سکیڑیں"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"مداخلتیں مسدود کریں"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"ڈسٹرب نہ کریں"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ڈاؤن ٹائم"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ہفتہ کی راتوں کو"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"ویک اینڈز کو"</string>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 2cd0b5f..8e721c5 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Ilovaga planshetingiz yoki SIM kartangizga zaxiralangan SMS xabarlarini o‘qish uchun ruxsat beradi. Bu huquq ilovaga tarkibi va maxfiyligidan qat’iy nazar har qanday SMS xabarlarni o‘qish imkonini beradi."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Ilovaga televizor yoki SIM kartangizga saqlangan SMS xabarlarni o‘qish huquqini beradi. Bu ilovaga barcha SMS xabarlarni, ularning tarkibi yoki maxfiyligidan qat’i nazar, o‘qish huquqini beradi."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Ilovaga telefoningiz yoki SIM kartangizga zaxiralangan SMS xabarlarini o‘qish uchun ruxsat beradi. Bu huquq ilovaga tarkibi va maxfiyligidan qat’iy nazar har qanday SMS xabarlarni o‘qish imkonini beradi."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"(SMS yoki MMS) matn xabarlarini tahrirlash"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Ilova planshet xotirasi yoki SIM kartaga saqlangan SMS xabarlarni o‘zgartirishi mumkin. Zararli dasturlar uning yordamida xabarlaringizni o‘chirib tashlashi mumkin."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Ilovaga televizor yoki SIM kartangizga saqlangan SMS xabarlar ustiga yozish huquqini beradi. Zararli ilovalar xabarlaringizni o‘chirib tashlashi mumkin."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Ilova telefon xotirasi yoki SIM kartaga saqlangan SMS xabarlarni o‘zgartirishi mumkin. Zararli dasturlar uning yordamida xabarlaringizni o‘chirib tashlashi mumkin."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"matn xabarlarini qabul qilish (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Ilovaga WAP xabarlarni qabul qilish va ularni qayta ishlash uchun ruxsat beradi. Ushbu huquq sizga ko‘rsatmasdan sizga yuborilgan xabarlarni kuzatish yoki o‘chirish xususiyatiga ham ega."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"ishlab turgan ilovalar to‘g‘risida ma’lumot olish"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Barmoq izi qisman aniqlandi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Barmoq izi aniqlanmadi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Barmoq izi sensori kirlangan. Uni tozalab, keyin qayta urinib ko‘ring."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Barmoq juda tez harakatlandi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Barmoq juda sekin harakatlandi. Qayta urinib ko‘ring."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmoq izi sensori ish holatida emas."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmoq izini saqlab bo‘lmadi. Mavjud barmoq izlaridan birini o‘chirib tashlang."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Barmoq izi tekshiruvi bekor qilindi."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Juda ko‘p noto‘g‘ri urinishlar bo‘ldi. Keyinroq yana urinib ko‘ring."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Qayta urinib ko‘ring."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx-sh sozlamalarini o‘qish"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ilova SD kartaga ma’lumot yozishi mumkin."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP qo‘ng‘iroqlarini amalga oshirish/qabul qilish"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ilovaga SIP qo‘ng‘iroqlarini amalga oshirish va qabul qilish uchun ruxsat beradi."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"yangi SIM kartali telekommunikatsiya aloqalarini ro‘yxatga olish"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Ilovaga yangi SIM kartali telekommunikatsiya aloqalarini ro‘yxatga olish uchun ruxsat beradi."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"yangi telekommunikatsiya aloqalarini ro‘yxatga olish"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Ilovaga yangi telekommunikatsiya aloqalarini ro‘yxatga olish uchun ruxsat beradi."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"telekommunikatsiya aloqalarini boshqarish"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Ilovaga telekommunikatsiya aloqalarini boshqarish uchun ruxsat beradi."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"suhbat vaqtida ekranni boshqarish"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Ilova suhbat vaqtida ekranni boshqarishi mumkin."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"telefoniya xizmatlarini bilan aloqa qilish"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Ilovaga qo‘ng‘iroqlarni amalga oshirish/qabul qilish uchun telefoniya xizmatlari bilan aloqa qilishga ruxsat beradi."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"suhbat vaqtida foydalanuvchi bilan aloqa qilish"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Ilova suhbat vaqtida foydalanuvchi bilan aloqa qilishi mumkin."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"tarixiy tarmoq sarfi ma‘lumotlarini o‘qish"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Ilova muayyan tarmoqlardan va ilovalardan foydalanish tarixini o‘qishi mumkin."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"tarmoq siyosatini boshqarish"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Ilova tarmoq siyosatini boshqarishi va alohida ilovalar uchun qoidalarni o‘rnatishi mumkin."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"tarmoqdan foydalanishni hisoblashni o‘zgartirish"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Ilovaga ilovalarga nisbadan hisoblanadigan tarmoqdan foydalanish ma’lumotlarini o‘zgartirishga ruxsat beradi. Oddiy ilovalar tomonidan foydalanilmaydi."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"ruxsat bildirishnomalari"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Dasturga bildirishnomalar va boshqa dasturlar jo‘natgan xabarlarni qabul qilish, ko‘rib chiqish hamda tozalash imkonini beradi."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bildirishnomani tinglash xizmatiga bog‘lash"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Foydalanuvchiga bildirishnomani eshituvchi xizmat yuqori darajali interfeysini bog‘lash imkonini beradi. Oddiy dasturlar uchun hech qachon kerak bo‘lmaydi."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"shartlarni taqdim etuvchilarning serveriga ulanish"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Ilova shartlarni taqdim etuvchining yuqori darajali interfeysiga ulanishi mumkin. Oddiy ilovalar uchun talab qilinmaydi."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"Ekran lavhalari xizmatiga ulanish"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Ekran lavhalari xizmatining yuqori darajali interfeysiga ulanish. Oddiy ilovalar tomonidan ishlatilmaydi."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"aloqa operatorining sozlash dasturini so‘rash"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Foydalanuvchiga aloqa operatori bergan sozlash dasturini ishga tushirish imkonini beradi. Oddiy dasturlar uchun hech qachon kerak bo‘lmaydi."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"tarmoq sharoitidagi kuzatuvlarni tinglash"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Dasturga tarmoq sharoitiga ko‘ra kuzatuvlarni eshitish imkonini beradi. Oddiy dasturlar uchun hech qachon kerak bo‘lmaydi."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"ekran muvozanati ko‘rsatkichlarini o‘zgartirish"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Ilova sensorli ekranning muvozanat ko‘rsatkichlarini o‘zgartirishi mumkin. Oddiy ilovalar uchun talab qilinmaydi."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM sertifikatlariga kirish"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Ilova DRM sertifikatlarini sinxronlashi va ulardan foydalanishi mumkin. Ushbu ruxsatnoma faqat maxsus ilovalar uchun talab qilinadi."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Android Beam uzatish holatini olish"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Ushbu ilovaga joriy Android Beam uzatishlari haqida ma\'lumotlarni olish ruxsati berilsin."</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM sertifikatlarini o‘chirib tashlash"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Ilovaga DRM sertifikatlarini o‘chirib tashlash uchun ruxsat beradi. Oddiy ilovalar uchun talab qilinmaydi."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"aloqa operatorining xabar almashinuv xizmatiga bog‘lanish"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Egasiga aloqa operatorining xabar almashinuv xizmatining yuqori darajali interfeysiga bog‘lanish uchun ruxsat beradi. Oddiy ilovalar uchun hech qachon kerak bo‘lmaydi."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Parol qoidalarini o‘rnatish"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Ekran qulfi paroli va PIN kodlari uchun qo‘yiladigan talablarni (belgilar soni va uzunligi) nazorat qiladi."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Ekranni qulfdan chiqarish urinishlarini nazorat qilish"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Qulfdan chiqarish yoki favqulodda qo‘ng‘iroqni amalga oshirish uchun \"Menyu\"ni bosing."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Qulfni ochish uchun \"Menyu\"ga bosing."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Qulfni ochish uchun namuna ustiga chizing"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Tez yordam"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Qo‘ng‘iroqni qaytarish"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"To‘g‘ri!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Qaytadan urining"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"nomzodlar"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> tayyorlanmoqda"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Xatolarni tekshirish"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yangi <xliff:g id="NAME">%s</xliff:g> aniqlandi"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Rasmlar va media fayllarni uzatish uchun"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"Buzilgan <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> buzilgan; qayta formatlab ko‘ring"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> kutilmaganda chiqarilgan"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ma’lumotlar yo‘qolishining oldini olish uchun <xliff:g id="NAME">%s</xliff:g>ni chiqarishdan oldin uni uzing"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Olingan <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g> chiqarilgan; yangisini kiriting"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g>} hali ham chiqarilmoqda…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Olmang"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Sozlash"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Chiqarish"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"O‘rganish"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Hech qanday mos faoliyat topilmadi."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Media chiqishni yo‘naltirish"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Ilovaga media chiqish ovozini boshqa tashqi qurilmalarga yo‘naltirish uchun ruxsat beradi."</string>
@@ -1188,6 +1207,9 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Ichki xotira"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD xotira kartasi"</string>
+ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD karta"</string>
+ <string name="storage_usb_drive" msgid="6261899683292244209">"USB qurilma"</string>
+ <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB qurilma"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB xotira"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Tahrirlash"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Ma’lumotlardan foydalanish ogohlantirilishi"</string>
@@ -1450,7 +1472,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Men o‘chirmaguncha"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Yig‘ish"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Bezovta qilinishlar"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Bezovta qilinmasin"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Nofaol vaqt"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Ish kunlari kechasi"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Dam olish kunlari"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index c5b67d6..a59275f 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Cho phép ứng dụng đọc tin nhắn SMS được lưu trữ trên máy tính bảng hoặc thẻ SIM của bạn. Việc này cho phép ứng dụng đọc tất cả tin nhắn SMS, bất kể nội dung hay tính bí mật là gì."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Cho phép ứng dụng đọc tin nhắn SMS được lưu trữ trên TV hoặc thẻ SIM của bạn. Quyền này cho phép ứng dụng đọc tất cả tin nhắn SMS, bất kể nội dung hay mức độ bảo mật."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Cho phép ứng dụng đọc tin nhắn SMS được lưu trữ trên điện thoại hoặc thẻ SIM của bạn. Việc này cho phép ứng dụng đọc tất cả tin nhắn SMS, bất kể nội dung hay tính bí mật là gì."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"chỉnh sửa tin nhắn văn bản của bạn (SMS hoặc MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Cho phép ứng dụng ghi vào tin nhắn SMS được lưu trữ trên máy tính bảng hoặc thẻ SIM của bạn. Ứng dụng độc hại có thể xóa tin nhắn của bạn."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Cho phép ứng dụng ghi vào tin nhắn SMS được lưu trữ trên TV hoặc thẻ SIM của bạn. Các ứng dụng độc hại có thể xóa tin nhắn của bạn."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Cho phép ứng dụng ghi vào tin nhắn SMS được lưu trữ trên điện thoại hoặc thẻ SIM của bạn. Ứng dụng độc hại có thể xóa tin nhắn của bạn."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"nhận tin nhắn văn bản (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Cho phép ứng dụng nhận và xử lý tin nhắn WAP. Quyền này bao gồm khả năng giám sát hoặc xóa tin nhắn được gửi cho bạn mà không hiển thị chúng cho bạn."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"truy xuất các ứng dụng đang chạy"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Đã phát hiện được một phần vân tay. Vui lòng thử lại."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Không thể xử lý vân tay. Vui lòng thử lại."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Cảm biến vân tay bị bẩn. Hãy làm sạch và thử lại."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Di chuyển ngón tay quá nhanh. Vui lòng thử lại."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Ngón tay đã di chuyển quá chậm. Vui lòng thử lại."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Phần cứng vân tay không khả dụng."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Không thể lưu vân tay. Vui lòng xóa vân tay hiện có."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Đã hết thời gian chờ vân tay. Hãy thử lại."</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Thao tác dùng dấu vân tay bị hủy."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Quá nhiều lần thử. Hãy thử lại sau."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Thử lại."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"đọc cài đặt đồng bộ hóa"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Cho phép ứng dụng ghi vào thẻ SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"thực hiện/nhận các cuộc gọi qua SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Cho phép ứng dụng thực hiện và nhận các cuộc gọi qua SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"đăng ký kết nối SIM viễn thông mới"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Cho phép ứng dụng đăng ký kết nối SIM viễn thông mới."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"đăng ký kết nối viễn thông mới"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Cho phép ứng dụng đăng ký kết nối viễn thông mới."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"quản lý kết nối viễn thông"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Cho phép ứng dụng quản lý kết nối viễn thông."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"tương tác với màn hình trong cuộc gọi"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Cho phép ứng dụng kiểm soát thời gian và cách người dùng nhìn thấy màn hình trong cuộc gọi."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"tương tác với dịch vụ điện thoại"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Cho phép ứng dụng tương tác với dịch vụ điện thoại để thực hiện/nhận cuộc gọi."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"cung cấp trải nghiệm người dùng trong cuộc gọi"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Cho phép ứng dụng cung cấp trải nghiệm người dùng trong cuộc gọi."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"đọc quá trình sử dụng mạng trước đây"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Cho phép ứng dụng đọc thông tin lịch sử sử dụng mạng của các mạng và ứng dụng cụ thể."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"quản lý chính sách mạng"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Cho phép ứng dụng quản lý chính sách mạng và xác định quy tắc dành riêng cho ứng dụng."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"sửa đổi hạch toán sử dụng mạng"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Cho phép ứng dụng sửa đổi cách tính mức sử dụng mạng so với ứng dụng. Không dành cho các ứng dụng thông thường."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"truy cập thông báo"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Cho phép ứng dụng truy xuất, kiểm tra và xóa thông báo, bao gồm những thông báo được đăng bởi các ứng dụng khác."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"liên kết với dịch vụ trình xử lý thông báo"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ trình xử lý thông báo. Không cần thiết cho các ứng dụng thông thường."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"liên kết với dịch vụ trình cung cấp điều kiện"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ trình cung cấp điều kiện. Không cần thiết cho các ứng dụng thông thường."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"liên kết với dịch vụ dream"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ dream. Không cần thiết cho các ứng dụng thông thường."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"gọi ra ứng dụng cấu hình do nhà cung cấp dịch vụ cung cấp"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Cho phép chủ sở hữu gọi ra ứng dụng cấu hình do nhà cung cấp dịch vụ cung cấp. Không cần thiết cho các ứng dụng thông thường."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"quan sát các điều kiện mạng"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Cho phép ứng dụng quan sát các điều kiện mạng. Không bao giờ cần cho ứng dụng thông thường."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"thay đổi hiệu chỉnh thiết bị đầu vào"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Cho phép ứng dụng sửa đổi các thông số hiệu chỉnh của màn hình cảm ứng. Không cần cho ứng dụng thông thường."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"truy cập chứng chỉ DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Cho phép ứng dụng cung cấp và sử dụng chứng chỉ DRM. Không cần thiết cho các ứng dụng thông thường."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Nhận trạng thái chuyển của Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Cho phép ứng dụng này nhận thông tin về các lần chuyển hiện tại của Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"xóa chứng chỉ DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Cho phép ứng dụng xóa chứng chỉ DRM. Không cần thiết cho các ứng dụng thông thường."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"liên kết với dịch vụ nhắn tin của nhà cung cấp dịch vụ"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ nhắn tin của nhà cung cấp dịch vụ. Không cần thiết cho các ứng dụng thông thường."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Đặt quy tắc mật khẩu"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Kiểm soát độ dài và ký tự được phép trong mật khẩu khóa màn hình và mã PIN."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Giám sát những lần thử mở khóa màn hình"</string>
@@ -1028,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"ứng viên"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Đang chuẩn bị <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Đang kiểm tra lỗi"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Đã phát hiện <xliff:g id="NAME">%s</xliff:g> mới"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Để chuyển ảnh và phương tiện"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g> bị hỏng"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g> bị hỏng; hãy thử định dạng lại"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Đã tháo đột ngột <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ngắt kết nối <xliff:g id="NAME">%s</xliff:g> trước khi tháo nhằm tránh mất dữ liệu"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Đã tháo <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Đã tháo <xliff:g id="NAME">%s</xliff:g>; hãy lắp phương tiện mới"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Vẫn đang ngắt kết nối <xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Không tháo"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Thiết lập"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Tháo"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Khám phá"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Không tìm thấy hoạt động nào phù hợp."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Định tuyến thiết bị ra phương tiện"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Cho phép ứng dụng định tuyến thiết bị ra phương tiện đến các thiết bị bên ngoài khác."</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Bộ nhớ trong"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Thẻ SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Bộ lưu trữ USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Chỉnh sửa"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Cảnh báo sử dụng dữ liệu"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Cho đến khi bạn tắt tính năng này"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Thu gọn"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Chặn gián đoạn"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Không làm phiền"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Thời gian ngừng hoạt động"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Đêm trong tuần"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Ngày cuối tuần"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 020d1bd..ac2d472 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"允许该应用读取您平板电脑或SIM卡上存储的短信。此权限可让该应用读取所有短信,而不考虑短信内容或机密性。"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"允许应用读取您的电视或 SIM 卡上存储的短信。此权限会允许应用读取所有短信,而不论短信内容是什么或是否属于机密内容。"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"允许该应用读取您手机或SIM卡上存储的短信。此权限可让该应用读取所有短信,而不考虑短信内容或机密性。"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"编辑您的讯息(短信或彩信)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"允许应用对平板电脑或SIM卡上存储的短信执行写入操作。恶意应用可能会删除您的短信。"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"允许应用对您的电视或 SIM 卡上存储的短信执行写入操作。恶意应用可能会借此删除您的短信。"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"允许应用对手机或SIM卡上存储的短信执行写入操作。恶意应用可能会删除您的短信。"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"接收讯息 (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"允许该应用接收和处理 WAP 消息。此权限包括监视发送给您的消息或删除发送给您的消息而不向您显示的功能。"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"检索正在运行的应用"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"仅检测到部分指纹,请重试。"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"无法处理指纹,请重试。"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指纹传感器有脏污。请擦拭干净,然后重试。"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"手指移动太快,请重试。"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"手指移动太慢,请重试。"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指纹硬件无法使用。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"无法存储指纹。请移除一个现有的指纹。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指纹录入操作超时,请重试。"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"指纹操作已取消。"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"尝试次数过多,请稍后重试。"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"请重试。"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"读取同步设置"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"允许应用写入SD卡。"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"拨打/接听SIP电话"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"允许该应用拨打和接听SIP电话。"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"注册新的电信 SIM 卡连接"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"允许该应用注册新的电信 SIM 卡连接。"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"注册新的电信网络连接"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"允许该应用注册新的电信网络连接。"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"管理电信网络连接"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"允许该应用管理电信网络连接。"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"与通话屏幕互动"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"允许应用控制用户看到通话屏幕的时机和方式。"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"与电话服务交互"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"允许该应用与电话服务交互以便接打电话。"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"向用户提供通话体验"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"允许应用向用户提供通话体验。"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"读取网络使用情况历史记录"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"允许应用读取特定网络和应用的网络使用情况历史记录。"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"管理网络政策"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"允许应用管理网络规范和定义专门针对应用的规则。"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"修改网络使用情况记录方式"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"允许该应用修改对于各应用的网络使用情况的统计方式。普通应用不应使用此权限。"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"访问通知"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"允许该应用检索、检查并清除通知,包括其他应用发布的通知。"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"绑定到通知侦听器服务"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"允许应用绑定到通知侦听器服务的顶级接口(普通应用绝不需要此权限)。"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"绑定到条件提供程序服务"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"允许应用绑定到条件提供程序服务的顶级接口。普通应用绝不需要此权限。"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"绑定到互动屏保服务"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"允许应用绑定到互动屏保服务的顶级接口。普通应用绝不需要此权限。"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"调用运营商提供的配置应用"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"允许应用调用运营商提供的配置应用。普通应用绝不需要此权限。"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"监听网络状况的观测信息"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"允许应用监听网络状况的观测信息。普通应用绝不需要此权限。"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"更改输入设备校准设置"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"允许应用修改触摸屏的校准参数。普通应用绝不需要此权限。"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"访问DRM证书"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"允许应用配置和使用DRM证书。普通应用绝不需要此权限。"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"接收Android Beam的传输状态"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"允许此应用接收Android Beam当前传输内容的相关信息"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"移除DRM证书"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"允许应用移除DRM证书。普通应用绝不需要此权限。"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"绑定到运营商消息传递服务"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"允许应用绑定到运营商消息传递服务的顶级接口。普通应用绝不需要此权限。"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"设置密码规则"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"控制锁屏密码和 PIN 码所允许的长度和字符。"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"监视屏幕解锁尝试次数"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"按 Menu 解锁或进行紧急呼救。"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"按 MENU 解锁。"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"绘制解锁图案"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"紧急呼救"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"返回通话"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"正确!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"重试"</string>
@@ -1029,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"候选"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在准备<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"检查是否有错误"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"检测到新的<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"可用于传输照片和媒体文件"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g>已损坏"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g>已损坏,请尝试重新格式化"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>已意外移除"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"请先卸载<xliff:g id="NAME">%s</xliff:g>,再将其移除,以防数据丢失。"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"<xliff:g id="NAME">%s</xliff:g>已移除,请插入新的外部媒体"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"仍然弹出<xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"请勿移除"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"设置"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"弹出"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"浏览"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"未找到匹配的活动。"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"更改媒体输出线路"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"允许该应用将媒体输出线路更改到其他外部设备。"</string>
@@ -1187,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s - %2$s:%3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"内部存储设备"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD卡"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB存储器"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"修改"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"流量警告"</string>
@@ -1449,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"直到您将其关闭"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"收起"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"屏蔽打扰内容"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"勿扰"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"休息时间"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"工作日夜间"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"周末"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 037076b..fcf3707 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"允許應用程式讀取平板電腦或 SIM 卡上儲存的短訊。這項權限允許應用程式不論內容及機密程度,均可讀取所有短訊。"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"允許應用程式讀取電視或 SIM 卡上儲存的短訊。這允許應用程式不論內容及機密程度,均可讀取所有短訊。"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"允許應用程式讀取手機或 SIM 卡上儲存的短訊。這項權限允許應用程式不論內容及機密程度,均可讀取所有短訊。"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"編輯您的短訊 (SMS 或 MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"允許應用程式寫入平板電腦或 SIM 卡中儲存的短訊。惡意應用程式可能會藉此刪除您的訊息。"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"允許應用程式寫入電視或 SIM 卡中儲存的短訊。惡意應用程式可能會刪除您的訊息。"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"允許應用程式寫入手機或 SIM 卡中儲存的短訊。惡意應用程式可能會藉此刪除您的訊息。"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"接收短訊 (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"允許應用程式接收和處理 WAP 訊息。這項權限也能讓應用程式監控訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"擷取執行中的應用程式"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"只偵測到部分指紋。請再試一次。"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"無法處理指紋。請再試一次。"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指紋感應器不乾淨。請清潔後再試一次。"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"手指移動太快。請再試一次。"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"手指移動太慢。請再試一次。"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"無法使用指紋軟件。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋無法儲存。請移除現有指紋。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋已逾時。請再試一次。"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋操作已取消。"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"嘗試次數過多,請稍後再試。"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"再試一次。"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"允許應用程式寫入 SD 記憶卡。"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"撥打/接聽 SIP 電話"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"允許應用程式撥打及接聽 SIP 電話。"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"註冊新的電訊 SIM 卡連接"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"允許應用程式註冊新的電訊 SIM 卡連接。"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"註冊新的電訊連接"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"允許應用程式註冊新的電訊連接。"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"管理電訊連接"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"允許應用程式管理電訊連接。"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"與通話畫面互動"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"允許應用程式控制通話畫面的顯示時間和方式。"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"與電話語音服務互動"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"允許應用程式與電話語音服務互動以收發電話。"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"提供通話使用者體驗"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"允許應用程式提供通話使用者體驗。"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"讀取網絡用量記錄"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"允許應用程式讀取特定網絡和應用程式的網絡使用量記錄。"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"管理網絡政策"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"允許應用程式管理網絡政策並定義應用程式專用規則。"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"修改網絡使用量計算方式"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"允許應用程式修改應用程式網絡使用量的計算方式 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"存取通知"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"允許應用程式擷取、檢查及清除通知 (包括由其他應用程式發佈的通知)。"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"繫結至通知接聽器服務"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"允許應用程式繫結至通知接聽器服務的頂層介面 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"繫結至條件供應商服務"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"允許應用程式繫結至條件供應商服務的頂層介面,但一般應用程式並不需要使用。"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"繫結至 Dream 服務"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"允許應用程式繫結至 Dream 服務的頂層介面 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"調用流動網絡供應商提供的設定應用程式"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"允許應用程式調用流動網絡供應商提供的設定應用程式 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"監聽對網絡狀況的觀察"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"允許應用程式監聽對網絡狀況的觀察 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"變更輸入裝置校正設定"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"允許應用程式修改觸控式螢幕的校正參數,而一般應用程式並不需要作出類似修改。"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"存取 DRM 憑證"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"允許應用程式準備和使用 DRM 憑證,但一般應用程式並不需要使用。"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"接收 Android Beam 的傳送狀態"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"允許應用程式接收 Android Beam 目前傳送的資料"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"移除 DRM 憑證"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"允許應用程式移除 DRM 憑證 (一般應用程式並不需要)。"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"繫結至流動網絡供應商短訊服務"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"允許應用程式繫結至流動網絡供應商短訊服務的頂層介面 (不建議一般應用程式使用)。"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"設定密碼規則"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"控制螢幕鎖定密碼和 PIN 所允許的長度和字元。"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"監控螢幕解鎖嘗試次數"</string>
@@ -628,7 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"按選單鍵解鎖或撥打緊急電話。"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"按選單鍵解鎖。"</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"畫出解鎖圖形以解除鎖定螢幕"</string>
- <string name="lockscreen_emergency_call" msgid="5298642613417801888">"緊急撥號"</string>
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"緊急電話"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"返回通話"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"正確!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"再試一次"</string>
@@ -1028,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"待選項目"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"已偵測到新<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"用於傳輸相片和媒體"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"<xliff:g id="NAME">%s</xliff:g>已損壞"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"<xliff:g id="NAME">%s</xliff:g>}已損壞;請嘗試重新格式化"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>意外移除"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"請先卸載<xliff:g id="NAME">%s</xliff:g>,再將其移除,以免失去資料。"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"已移除<xliff:g id="NAME">%s</xliff:g>;請插入新的外部儲存空間"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"仍在移除<xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"不要移除"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"設定"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"移除"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"探索"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"找不到相符的活動。"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"轉送媒體輸出"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"允許應用程式將媒體輸出轉送至其他外部裝置。"</string>
@@ -1186,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s (%2$s):%3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"內部儲存空間"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD 記憶卡"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB 儲存裝置"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"編輯"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"資料用量警告"</string>
@@ -1448,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"直至您關閉這項設定"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"收合"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"封鎖干擾"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"請勿干擾"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"停機時間"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"星期一至星期五晚"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"週末"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index a0b0fc2..a9f8391 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"允許應用程式讀取平板電腦或 SIM 卡上儲存的簡訊。這項權限可讓應用程式讀取所有簡訊,包括各種內容及機密簡訊。"</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"允許應用程式讀取電視或 SIM 卡上儲存的簡訊。應用程式可藉此讀取所有簡訊 (不論內容為何或是否含機密資料)。"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"允許應用程式讀取手機或 SIM 卡上儲存的簡訊。這項權限可讓應用程式讀取所有簡訊,包括各種內容及機密簡訊。"</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"編輯簡訊 (SMS 或 MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"允許應用程式編寫平板電腦或 SIM 卡中儲存的 SMS 簡訊。請注意,惡意應用程式可能利用此功能刪除您的簡訊。"</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"允許應用程式寫入電視或 SIM 卡上儲存的簡訊。惡意應用程式可能會藉此刪除您的訊息。"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"允許應用程式寫入手機或 SIM 卡中儲存的 SMS 簡訊。請注意,惡意應用程式可能利用此功能刪除您的簡訊。"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"接收簡訊 (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"允許應用程式接收和處理 WAP 訊息。這項權限也能讓應用程式監控訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"擷取執行中的應用程式"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"僅偵測到部分指紋,請再試一次。"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"無法處理指紋,請再試一次。"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指紋感應器有髒汙。請清潔感應器,然後再試一次。"</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"手指移動速度過快,請再試一次。"</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"手指移動速度過慢,請再試一次。"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋硬體無法使用。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"無法儲存指紋,請先移除現有指紋。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋處理作業逾時,請再試一次。"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋作業已取消。"</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"嘗試次數過多,請稍後再試。"</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"請再試一次。"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"允許應用程式寫入 SD 卡。"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"撥打/接聽 SIP 通話"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"允許應用程式撥打及接聽 SIP 通話。"</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"註冊新的電信 SIM 卡連線"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"允許應用程式註冊新的電信 SIM 卡連線。"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"註冊新的電信連線"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"允許應用程式註冊新的電信連線。"</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"管理電信連線"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"允許應用程式管理電信連線。"</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"與通話螢幕互動"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"允許應用程式控制使用者看到通話螢幕的時機和方式。"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"與電話語音服務互動"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"允許應用程式與電話語音服務互動以撥接電話。"</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"為使用者提供通話體驗"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"允許應用程式向使用者提供通話體驗。"</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"讀取網路用量紀錄"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"允許應用程式讀取特定網路和應用程式的網路使用記錄。"</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"管理網路政策"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"允許應用程式管理網路政策並定義應用程式專用規則。"</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"修改網路使用量計算方式"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"允許應用程式修改應用程式網路使用量的計算方式 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"存取通知"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"允許應用程式擷取、檢查及清除通知 (包括由其他應用程式發佈的通知)。"</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"繫結至通知接聽器服務"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"允許應用程式繫結至通知接聽器服務的頂層介面 (一般應用程式不需使用)。"</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"繫結至條件提供者服務"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"允許應用程式繫結至條件提供者服務的頂層介面 (一般應用程式並不需要)。"</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"繫結至 Dream 服務"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"允許應用程式繫結至 Dream 服務的頂層介面 (一般應用程式不需使用)。"</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"叫用行動通訊業者提供的設定應用程式"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"允許應用程式叫用行動通訊業者提供的設定應用程式 (一般應用程式並不需要)。"</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"監聽網路狀況觀察資訊"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"允許應用程式監聽網路狀況觀察資訊 (一般應用程式並不需要)。"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"變更輸入裝置校正設定"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"允許應用程式修改觸控螢幕的校正參數 (一般應用程式並不需要)。"</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"存取 DRM 憑證"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"允許應用程式佈建及使用 DRM 憑證 (一般應用程式並不需要)。"</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"接收 Android Beam 的傳輸狀態"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"允許應用程式接收 Android Beam 目前傳輸的資訊"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"移除 DRM 憑證"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"允許應用程式移除 DRM 憑證 (一般應用程式並不需要)。"</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"與行動通訊業者簡訊服務繫結"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"允許應用程式與行動通訊業者簡訊服務的頂層介面繫結 (一般應用程式並不需要)。"</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"設定密碼規則"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"管理螢幕鎖定密碼和 PIN 碼支援的字元和長度上限。"</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"監視螢幕解鎖嘗試次數"</string>
@@ -1028,35 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"待選項目"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備「<xliff:g id="NAME">%s</xliff:g>」"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string>
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"偵測到新的「<xliff:g id="NAME">%s</xliff:g>」"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"可用於傳輸相片和媒體"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"「<xliff:g id="NAME">%s</xliff:g>」已損壞"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"「<xliff:g id="NAME">%s</xliff:g>」已損壞。請嘗試重新格式化。"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"意外移除「<xliff:g id="NAME">%s</xliff:g>」"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"請先卸載「<xliff:g id="NAME">%s</xliff:g>」,再將其移除,以免資料遺失。"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除「<xliff:g id="NAME">%s</xliff:g>」"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"已移除「<xliff:g id="NAME">%s</xliff:g>」;請插入新的媒體"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"依然退出「<xliff:g id="NAME">%s</xliff:g>」..."</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"請勿移除"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"設定"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"退出"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"探索"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"找不到相符的活動。"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"轉送媒體輸出"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"允許應用程式將媒體輸出轉送至其他外部裝置。"</string>
@@ -1186,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s - %2$s:%3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"內部儲存空間"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD 卡"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"USB 儲存裝置"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"編輯"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"數據用量警告"</string>
@@ -1448,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"手動關閉這項設定前一律啟用"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"收合"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"封鎖干擾"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"零打擾"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"停機"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"週一至週五夜間"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"週末"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 6ea4375..74f0a0e 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -270,10 +270,6 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Ivumela uhlelo lokusebenza ukufunda imilayezo ye-SMS elondolozwe kuthebulethi noma ekhadini lakho le-SIM. Lokhu kuvumela uhlelo lokusebenza ukufunda yonke imilayezo ye-SMS, ngaphandle kokuqukethwe noma ukugcinwa kuyimfihlo."</string>
<string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Ivumela uhlelo lokusebenza ukuthi lifunde imilayezo ye-SMS egcinwe ku-TV yakho noma kukhadi le-SIM. Lokhu kuvumela uhlelo lokusebenza ukuthi lifunde yonke imilayezo ye-SMS, ngokunganaki okuqukethwe noma ubumfihlo."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Ivumela uhlelo lokusebenza ukufunda imilayezo ye-SMS elondolozwe efonini noma ekhadini lakho le-SIM. Lokhu kuvumela uhlelo lokusebenza ukufunda yonke imilayezo ye-SMS, ngaphandle kokuqukethwe noma ukugcinwa kuyimfihlo."</string>
- <string name="permlab_writeSms" msgid="3216950472636214774">"hlela imiyalezo yakho yombhalo (i-SMS noma i-MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Ivumela uhlelo lokusebenza ukuthi ibhale imiylezo ye-SMS egcinwe ekhompyutheni yakho yepeni noma kwikhadi lakho le-SIM. Izuhlelo lokusebenza ezinobungozi zingayisusa imiyalezo yakho."</string>
- <string name="permdesc_writeSms" product="tv" msgid="955871498983538187">"Ivumela uhlelo lokusebenza ukuthi lubhale imilayezo ye-SMS egcinwe ku-TV yakho noma kukhadi le-SIM. Izinhlelo zokusebenza ezinobungozi zingasusa imilayezo yakho."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Ivumela uhlelo lokusebenza ukuthi ibhale imiylezo ye-SMS egcinwe ocingweni lwakh noma kwikhadi lakho le-SIM. Izuhlelo lokusebenza ezinobungozi zingayisusa imiyalezo yakho."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"thola imiyalezo ebhaliwe (i-WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Ivumela uhlelo lokusebenza ukuthola nokucubungula imilayezo ye-WAP. Le mvume ifaka phakathi amandla okungamela noma okwesusa imilayezo ethunyelwe kuwe ngaphandle kokukubonisa."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"thola izinhlelo zokusebenza ezisebenzayo"</string>
@@ -429,21 +425,16 @@
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Izigxivizo zeminwe ezincane zitholiwe. Sicela uzame futhi."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Ayikwazanga ukucubungula izigxivizo zeminwe. Sicela uzame futhi."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Inzwa yezigxivizo zeminwe ingcolile. Sicela uyihlanze uphinde uzame futhi."</string>
- <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
- <skip />
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Umunwe uhanjiswe ngokushesha kakhulu. Sicela uzame futhi."</string>
<string name="fingerprint_acquired_too_slow" msgid="7381891107120721078">"Umunwe uhanjiswe kancane kakhulu. Sicela uzame futhi."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
- <skip />
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Izingxenyekazi zekhompuyutha zezingxivizo zeminwe azitholakali."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Izigxivizo zeminwe azikwazi ukugcinwa. Sicela ususe izigxivizo zeminwe ezikhona."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Kufinyelelwe isikhathi sokuvala sezigxivizo zeminwe. Zama futhi"</string>
- <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
- <skip />
- <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
- <skip />
- <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
- <skip />
+ <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Ukusebenza kwezingxivizo zeminwe kukhanseliwe."</string>
+ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string>
+ <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Zama futhi."</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"funda izilungiselelo zokuvumelanisa"</string>
@@ -468,6 +459,50 @@
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ivumela uhlelo lokusebenza ukuthi ibhalele ekhadini le-SD."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"yenza/thola amakholi we-SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ivumela uhlelo lokusebenza ukwenza nokuthola amakholi we-SIP."</string>
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"bhalisa uxhumo le-SIM le-telecom olusha"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Ivumela uhlelo lokusebenza ukubhalisa uxhumo olusha le-telecom."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"bhalisa uxhumo olusha le-telecom"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Ivumela uhlelo lokusebenza ukubhalisa uxhumo olusha le-telecom."</string>
+ <string name="permlab_connection_manager" msgid="1116193254522105375">"phatha ukuxhumana kwezokuxhumana kwefoni"</string>
+ <string name="permdesc_connection_manager" msgid="5925480810356483565">"Ivumela uhlelo lokusebenza ukuthi luphathe ukuxhumana kwezokuxhumana kwefoni."</string>
+ <string name="permlab_bind_incall_service" msgid="6773648341975287125">"hlanganyela neskrini esingaphakathi kwekholi"</string>
+ <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Ivumela uhlelo lokusebenza ukuthi lulawule ukuthi umsebenzisi ubona kanjani isikrini esingaphakathi kwekholi."</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"sebenzisana namasevisi wefoni"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Ivumela uhlelo lokusebenza ukusebenzisana namasevisi wefoni ukwenza/ukwamukela amakholi."</string>
+ <string name="permlab_control_incall_experience" msgid="9061024437607777619">"nikezela ngomuzwa womsebenzisi ongaphakathi kwekholi"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Ivumela uhlelo lokusebenza ukunikezela ngomuzwa ongaphakathi kwekholi."</string>
+ <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"funda ukusetshenziswa komlando wohleloxhumano"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Ivumela uhlelo lokusebenza ukuthi ifunde umlando wokusetshenziswa kwenethiwekhi emanethiwekhini athize kanye nasezinsizeni."</string>
+ <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"phatha inqubomgomo yenethiwekhi"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Ivumela uhlelo lokusebenza ukuthi yengamele iigomo iphinde ichaze imithetho ehambisana ngqo nensiza."</string>
+ <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"lungisa ukubala kokusebenza kohleloxhumano"</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Ivumela uhlelo lokusebenza ukuthi iguqule ukuthii ukusetshenziswa kwenethiwekhi kumiswa kanjani ezinsizeni. Ayisetshenziswa izinhlelo zokusebenza ezijwayelekile."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"finyelela kuzaziso"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Ivumela uhlelo lokusebenza ukuthi lithole, lihlole, liphinde lisuse izaziso, ezifaka lezo ezithunyelwe ezinye izinhlelo zokusebenza."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bophezela kwisevisi yomlaleli wesaziso"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Ivumela umbambi ukubophezela kwisixhumi esibonakalayo sezinga eliphezulu lesevisi yomlaleli wesaziso. Akusoze kwadingeka kwizinhlelo zokusebenza ezivamile."</string>
+ <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"hlanganisa kwisevisi yomhlinzeki wesimo"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Ivumela umbambi ukuhlanganisa isixhumi esibonakalayo seleveli ephezulu sesevisi yomhlinzeki wesimo. Akufanele kudingekele izinhlelo zokusebenza ezivamile."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"bophezela kusevisi yephupho"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Ivumela isiphathi ukuthi sibophezele ukusebenzisana kwezinga eliphezulu kwesevisi yephupho. Akumele kudingelwe izinhlelo zokusebenza ezijwayelekile."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"buyisela uhlelo lokusebenza lokulungiselelwa okunikezwe yinkampani yenethiwekhi"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Ivumela umnikazi ukuthi abuyisele uhlelo lokusebenza lokulungiselelwa. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
+ <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Lalela okubonwayo kuzimo zenethiwekhi"</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Ivumela uhlelo lokusebenza ukuthi lulalele okubonwa kuzimo zenethiwekhi. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"guqula ukulinganisa kokufaka kwedivayisi"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Ivumela uhlelo lokusebenza ukuthi lushintshe imingcele yokulinganisa yesikrini esithintwayo. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
+ <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"finyelela izitifiketi ze-DRM"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Ivumela uhlelo lokusebenza ekunikezweni nokusetshenziswa kwezitifiketi ze-DRM. Akufanele kudingeke kuzinhlelo zokusebenza ezivamile."</string>
+ <string name="permlab_handoverStatus" msgid="1159132046126626731">"Thola isimo sokundlulisa se-Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Ivumela lolu hlelo lokusebenza ukuthi luthole ulwazi mayelana nokundluliswa kwamanje kwe-Android Beam"</string>
+ <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"susa izitifiketi ze-DRM"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Ivumela uhlelo lokusebenza ukususa izitifiketi ze-DRM. Akufanele idingeke ngezinhlelo zokusebenza ezivamile."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"bophezela kusevisi yomlayezo yenkampani yenethiwekhi"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Ivumela isibambi ukuhlanganisa isixhumanisi sokubona esiphezulu sesevisi yomlayezo yenkampani yenethiwekhi. Akufanele idingeke kuzinhlelo zokusebenza ezivamile."</string>
+ <!-- no translation found for permlab_bindCarrierConfigService (4110548389449423386) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierConfigService (1096888107671817447) -->
+ <skip />
<string name="policylab_limitPassword" msgid="4497420728857585791">"Misa imithetho yephasiwedi"</string>
<string name="policydesc_limitPassword" msgid="2502021457917874968">"Lawula ubude nezinhlamvu ezivunyelwe kumaphasiwedi wokukhiya isikrini nama-PIN."</string>
<string name="policylab_watchLogin" msgid="914130646942199503">"Gaka imizamo yokuvula isikrini"</string>
@@ -628,8 +663,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Chofoza Menyu ukuvula noma ukwenza ikholi ephuthumayo."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Chofoza Menyu ukuvula."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dweba iphathini ukuvula"</string>
- <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
- <skip />
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Isimo esiphuthumayo"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Buyela ekholini"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Lungile!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Zama futhi"</string>
@@ -1029,36 +1063,21 @@
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"abahlanganyeli"</u></string>
- <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
- <skip />
- <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
- <skip />
- <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
- <skip />
- <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_title (4863279349863279603) -->
- <skip />
- <!-- no translation found for ext_media_unmountable_notification_message (7391672496565685690) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
- <skip />
- <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
- <skip />
- <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
- <skip />
- <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
- <skip />
- <!-- no translation found for ext_media_init_action (8317198948634872507) -->
- <skip />
- <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
- <skip />
- <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
- <skip />
+ <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Ilungiselela i-<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ihlolela amaphutha"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"I-<xliff:g id="NAME">%s</xliff:g> entsha itholiwe"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Ukuze kudluliselwe izithombe nemidiya"</string>
+ <string name="ext_media_unmountable_notification_title" msgid="4863279349863279603">"I-<xliff:g id="NAME">%s</xliff:g> emoshekile"</string>
+ <string name="ext_media_unmountable_notification_message" msgid="7391672496565685690">"I-<xliff:g id="NAME">%s</xliff:g> imoshekile; zama ukuphinda uyifomethe"</string>
+ <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"I-<xliff:g id="NAME">%s</xliff:g> isuswe ngokungalindelekile"</string>
+ <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Yehlisa i-<xliff:g id="NAME">%s</xliff:g> ngaphambi kokususa ukuze ugweme ukulahleka kwedatha"</string>
+ <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"I-<xliff:g id="NAME">%s</xliff:g> isusiwe"</string>
+ <string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"I-<xliff:g id="NAME">%s</xliff:g> isusiwe; faka entsha"</string>
+ <string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"Isakhipha i-<xliff:g id="NAME">%s</xliff:g>…"</string>
+ <string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ungayisusi"</string>
+ <string name="ext_media_init_action" msgid="8317198948634872507">"Ukusetha"</string>
+ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Khipha"</string>
+ <string name="ext_media_browse_action" msgid="8322172381028546087">"Hlola"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Ayikho imisebenzi efanayo etholakele"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Yenza umzila wemidiya wokukhiphayo"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Ivumela uhlelo lokusebenza ukwenza umzila wokukhiphayo wemidiya kuya kumadivayisi angaphandle."</string>
@@ -1188,6 +1207,12 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"Isitoreji sangaphakathi"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"Ikhadi le-SD"</string>
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
<string name="storage_usb" msgid="3017954059538517278">"Isitoreji se-USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Hlela"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"Isexwayiso sokusetshenziswa kwedatha"</string>
@@ -1450,7 +1475,7 @@
<string name="zen_mode_forever" msgid="7420011936770086993">"Uze uvale lokhu"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Goqa"</string>
- <string name="zen_mode_feature_name" msgid="289097150786114338">"Vimba iziphazamiso"</string>
+ <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ungaphazamisi"</string>
<string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Isikhathi sokuphumula"</string>
<string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Ubusuku beviki"</string>
<string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Izimpelasonto"</string>
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index f6df01f..5bc0e03 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -352,9 +352,8 @@
<item>@drawable/ratingbar_small_material</item>
<item>@drawable/ratingbar_indicator_material</item>
<item>@drawable/scrollbar_handle_material</item>
- <item>@drawable/scrubber_control_material_anim</item>
- <item>@drawable/scrubber_control_selector_material</item>
- <item>@drawable/scrubber_progress_horizontal_material</item>
+ <item>@drawable/seekbar_thumb_material_anim</item>
+ <item>@drawable/seekbar_track_material</item>
<item>@drawable/spinner_background_material</item>
<item>@drawable/spinner_textfield_background_material</item>
<item>@drawable/switch_thumb_material_anim</item>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index a623d0c..674c695 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -4322,6 +4322,10 @@
<!-- Line breaking stratgegy balances line lengths. -->
<enum name="balanced" value="2" />
</attr>
+ <!-- Array of indents, one dimension value per line, left side. -->
+ <attr name="leftIndents" format="reference" />
+ <!-- Array of indents, one dimension value per line, right side. -->
+ <attr name="rightIndents" format="reference" />
</declare-styleable>
<declare-styleable name="TextViewAppearance">
<!-- Base text color, typeface, size, and style. -->
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 5ffe57e..12d7e60 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -501,9 +501,16 @@
<attr name="excludeFromRecents" format="boolean" />
<!-- Specify that an Activity should be shown over the lock screen and,
- in a multiuser environment, across all users' windows -->
+ in a multiuser environment, across all users' windows.
+ @deprecated use {@link android.R.attr#showForAllUsers} instead. -->
<attr name="showOnLockScreen" format="boolean" />
+ <!-- Specify that an Activity should be shown even if the current/foreground user
+ is different from the user of the Activity. This will also force the
+ <code>android.view.LayoutParams.FLAG_SHOW_WHEN_LOCKED</code> flag
+ to be set for all windows of this activity -->
+ <attr name="showForAllUsers" format="boolean" />
+
<!-- Specify the authorities under which this content provider can be
found. Multiple authorities may be supplied by separating them
with a semicolon. Authority names should use a Java-style naming
@@ -907,10 +914,11 @@
what gets persisted. -->
<attr name="persistableMode">
<!-- The default. If this activity forms the root of a task then that task will be
- persisted across reboots but only the launching intent will be used. All
- activities above this activity in the task will not be persisted. In addition
- this activity will not be passed a PersistableBundle into which it could have
- stored its state. -->
+ persisted across reboots but only the launching intent will be used. If the task
+ relinquishes its identity then the intent used is that of the topmost inherited
+ identity. All activities above this activity in the task will not be persisted.
+ In addition this activity will not be passed a PersistableBundle into which it
+ could have stored its state. -->
<enum name="persistRootOnly" value="0" />
<!-- If this activity forms the root of a task then that task will not be persisted
across reboots -->
@@ -1038,6 +1046,47 @@
activity. -->
<attr name="resizeableActivity" format="boolean" />
+ <!-- This value indicates how tasks rooted at this activity will behave in lockTask mode.
+ While in lockTask mode the system will not launch non-permitted tasks until
+ lockTask mode is disabled.
+ <p>While in lockTask mode with multiple permitted tasks running, each launched task is
+ permitted to finish, transitioning to the previous locked task, until there is only one
+ task remaining. At that point the last task running is not permitted to finish. -->
+ <attr name="lockTaskMode">
+ <!-- This is the default value. Tasks will not launch into lockTask mode but can be
+ placed there by calling {@link android.app.Activity#startLockTask}. If a task with
+ this mode has been whitelisted using {@link
+ android.app.admin.DevicePolicyManager#setLockTaskPackages} then calling startLockTask
+ will enter lockTask mode immediately, otherwise the user will be presented with a
+ dialog to approve entering lockTask mode.
+ <p>If the system is already in lockTask mode when a new task rooted at this activity
+ is launched that task will or will not start depending on whether the package of this
+ activity has been whitelisted.
+ <p>Tasks rooted at this activity can only exit lockTask mode using stopLockTask(). -->
+ <enum name="lockTaskModeDefault" value="0"/>
+ <!-- Tasks will not launch into lockTask mode and cannot be placed there using
+ {@link android.app.Activity#startLockTask} or be pinned from the Overview screen.
+ If the system is already in lockTask mode when a new task rooted at this activity is
+ launched that task will not be started.
+ <p>Note: This mode is only available to system and privileged applications.
+ Non-privileged apps with this value will be treated as lockTaskModeDefault.
+ -->
+ <enum name="lockTaskModeNever" value="1"/>
+ <!-- Tasks rooted at this activity will always launch into lockTask mode. If the system is
+ already in lockTask mode when this task is launched then the new task will be launched
+ on top of the current task. Tasks launched in this mode are capable of exiting
+ lockTask mode using finish(), whereas tasks entering lockTask mode using
+ startLockTask() must use stopLockTask() to exit.
+ <p>Note: This mode is only available to system and privileged applications.
+ Non-privileged apps with this value will be treated as lockTaskModeDefault.
+ -->
+ <enum name="lockTaskModeAlways" value="2"/>
+ <!-- If the DevicePolicyManager (DPM) authorizes this package ({@link
+ android.app.admin.DevicePolicyManager#setLockTaskPackages}) then this mode is
+ identical to lockTaskModeAlways. If the DPM does not authorize this package then this
+ mode is identical to lockTaskModeDefault. -->
+ <enum name="lockTaskModeIfWhitelisted" value="3"/>
+ </attr>
<!-- When set installer will extract native libraries. If set to false
libraries in the apk must be stored and page-aligned. -->
<attr name="extractNativeLibs" format="boolean"/>
@@ -1684,7 +1733,7 @@
{@link android.app.Activity} class that is available
as part of the package's application components, implementing
a part of the application's user interface.
-
+
<p>Zero or more {@link #AndroidManifestIntentFilter intent-filter}
tags can be included inside of an activity, to specify the Intents
that it can handle. If none are specified, the activity can
@@ -1719,6 +1768,7 @@
<attr name="alwaysRetainTaskState" />
<attr name="stateNotNeeded" />
<attr name="excludeFromRecents" />
+ <!-- @deprecated use {@link android.R.attr#showForAllUsers} instead. -->
<attr name="showOnLockScreen" />
<!-- Specify whether the activity is enabled or not (that is, can be instantiated by the system).
It can also be specified for an application as a whole, in which case a value of "false"
@@ -1746,12 +1796,14 @@
<attr name="relinquishTaskIdentity" />
<attr name="resumeWhilePausing" />
<attr name="resizeableActivity" />
+ <attr name="lockTaskMode" />
+ <attr name="showForAllUsers" />
</declare-styleable>
-
+
<!-- The <code>activity-alias</code> tag declares a new
name for an existing {@link #AndroidManifestActivity activity}
tag.
-
+
<p>Zero or more {@link #AndroidManifestIntentFilter intent-filter}
tags can be included inside of an activity-alias, to specify the Intents
that it can handle. If none are specified, the activity can
@@ -1769,7 +1821,7 @@
must be in the same manifest as the alias, and have been defined
in that manifest before the alias here. This must use a Java-style
naming convention to ensure the name is unique, for example
- "com.mycompany.MyName". -->
+ "com.mycompany.MyName". -->
<attr name="targetActivity" format="string" />
<attr name="label" />
<attr name="description" />
@@ -1785,7 +1837,7 @@
<attr name="exported" />
<attr name="parentActivityName" />
</declare-styleable>
-
+
<!-- The <code>meta-data</code> tag is used to attach additional
arbitrary data to an application component. The data can later
be retrieved programmatically from the
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index b9825c5..f1d2242 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -174,4 +174,8 @@
<color name="Pink_800">#ffad1457</color>
<color name="Red_700">#ffc53929</color>
<color name="Red_800">#ffb93221</color>
+
+ <!-- Floating toolbar colors -->
+ <color name="floating_toolbar_text_color">#DD000000</color>
+ <color name="floating_toolbar_background_color">#FAFAFA</color>
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 8c78e74..07f8c60 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -423,6 +423,9 @@
point on the move. A value of 0 means no periodic scans will be used in the framework. -->
<integer translatable="false" name="config_wifi_framework_scan_interval">300000</integer>
+ <!-- Integer indicating disconnect mode scan interval in milliseconds -->
+ <integer translatable="false" name="config_wifi_disconnected_scan_interval">15000</integer>
+
<!-- Integer indicating associated partial scan interval in milliseconds -->
<integer translatable="false" name="config_wifi_framework_associated_scan_interval">20000</integer>
@@ -472,6 +475,9 @@
<!-- Wifi driver supports batched scan -->
<bool translatable="false" name="config_wifi_batched_scan_supported">false</bool>
+ <!-- Wifi HAL supported PNO -->
+ <bool translatable="false" name="config_wifi_hal_pno_enable">false</bool>
+
<!-- Idle Receive current for wifi radio. 0 by default-->
<integer translatable="false" name="config_wifi_idle_receive_cur_ma">1</integer>
@@ -1962,8 +1968,10 @@
string that's stored in 8-bit unpacked format) characters.-->
<bool translatable="false" name="config_sms_decode_gsm_8bit_data">false</bool>
- <!-- Package name providing WebView implementation. -->
- <string name="config_webViewPackageName" translatable="false">com.android.webview</string>
+ <!-- List of package names (ordered by preference) providing WebView implementations. -->
+ <string-array name="config_webViewPackageNames" translatable="false">
+ <item>com.android.webview</item>
+ </string-array>
<!-- If EMS is not supported, framework breaks down EMS into single segment SMS
and adds page info " x/y". This config is used to set which carrier doesn't
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 100b161..bbba712 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -387,12 +387,14 @@
<!-- Floating toolbar dimensions -->
<dimen name="floating_toolbar_height">48dp</dimen>
- <dimen name="floating_toolbar_menu_button_side_padding">8dp</dimen>
+ <dimen name="floating_toolbar_menu_button_side_padding">16dp</dimen>
+ <dimen name="floating_toolbar_overflow_side_padding">18dp</dimen>
<dimen name="floating_toolbar_text_size">14sp</dimen>
<dimen name="floating_toolbar_menu_button_minimum_width">48dp</dimen>
- <dimen name="floating_toolbar_default_width">250dp</dimen>
- <dimen name="floating_toolbar_minimum_overflow_height">192dp</dimen>
- <dimen name="floating_toolbar_overflow_width">130dp</dimen>
- <dimen name="floating_toolbar_margin">2dp</dimen>
+ <dimen name="floating_toolbar_default_width">264dp</dimen>
+ <dimen name="floating_toolbar_minimum_overflow_height">144dp</dimen>
+ <dimen name="floating_toolbar_horizontal_margin">16dp</dimen>
+ <dimen name="floating_toolbar_vertical_margin">8dp</dimen>
+
<dimen name="chooser_grid_padding">0dp</dimen>
</resources>
diff --git a/core/res/res/values/dimens_material.xml b/core/res/res/values/dimens_material.xml
index 92d5aa1..b980777 100644
--- a/core/res/res/values/dimens_material.xml
+++ b/core/res/res/values/dimens_material.xml
@@ -118,7 +118,9 @@
<!-- Padding above and below selection dialog lists. -->
<dimen name="dialog_list_padding_vertical_material">8dp</dimen>
- <dimen name="scrubber_track_height_material">2dp</dimen>
+ <dimen name="seekbar_track_background_height_material">2dp</dimen>
+ <dimen name="seekbar_track_progress_height_material">2dp</dimen>
+
<dimen name="progress_bar_height_material">4dp</dimen>
<!-- Material time picker dimensions. -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index c2f2c6d..c157d4c 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2641,6 +2641,8 @@
<public type="style" name="Theme.Material.DayNight.Panel" />
<public type="style" name="Theme.Material.Light.LightStatusBar" />
<public type="style" name="ThemeOverlay.Material.Dialog" />
+ <public type="style" name="TextAppearance.Material.Widget.Button.Inverse" />
+ <public type="style" name="ThemeOverlay.Material.Dialog.Alert" />
<public type="id" name="pasteAsPlainText" />
<public type="id" name="undo" />
@@ -2663,4 +2665,11 @@
<!-- Animation -->
<public type="attr" name="durationScaleHint" />
+
+ <public type="attr" name="lockTaskMode" />
+
+ <public type="attr" name="leftIndents" />
+ <public type="attr" name="rightIndents" />
+
+ <public type="attr" name="showForAllUsers" />
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 3d1fd7c..7123cc0 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -685,21 +685,6 @@
SMS messages, regardless of content or confidentiality.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permlab_writeSms">edit your text messages (SMS or MMS)</string>
- <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permdesc_writeSms" product="tablet">Allows the app to write
- to SMS messages stored on your tablet or SIM card. Malicious apps
- may delete your messages.</string>
- <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permdesc_writeSms" product="tv">Allows the app to write
- to SMS messages stored on your TV or SIM card. Malicious apps
- may delete your messages.</string>
- <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permdesc_writeSms" product="default">Allows the app to write
- to SMS messages stored on your phone or SIM card. Malicious apps
- may delete your messages.</string>
-
- <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_receiveWapPush">receive text messages (WAP)</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_receiveWapPush">Allows the app to receive and process
@@ -1323,6 +1308,108 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_use_sip">Allows the app to make and receive SIP calls.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_register_sim_subscription">register new telecom SIM connections</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_register_sim_subscription">Allows the app to register new telecom SIM connections.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_register_call_provider">register new telecom connections</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_register_call_provider">Allows the app to register new telecom connections.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_connection_manager">manage telecom connections</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_connection_manager">Allows the app to manage telecom connections.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_bind_incall_service">interact with in-call screen</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bind_incall_service">Allows the app to control when and how the user sees the in-call screen.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_bind_connection_service">interact with telephony services</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bind_connection_service">Allows the app to interact with telephony services to make/receive calls.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_control_incall_experience">provide an in-call user experience</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_control_incall_experience">Allows the app to provide an in-call user experience.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_readNetworkUsageHistory">read historical network usage</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_readNetworkUsageHistory">Allows the app to read historical network usage for specific networks and apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_manageNetworkPolicy">manage network policy</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_manageNetworkPolicy">Allows the app to manage network policies and define app-specific rules.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_modifyNetworkAccounting">modify network usage accounting</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_modifyNetworkAccounting">Allows the app to modify how network usage is accounted against apps. Not for use by normal apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_accessNotifications">access notifications</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_accessNotifications">Allows the app to retrieve, examine, and clear notifications, including those posted by other apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_bindNotificationListenerService">bind to a notification listener service</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bindNotificationListenerService">Allows the holder to bind to the top-level interface of a notification listener service. Should never be needed for normal apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_bindConditionProviderService">bind to a condition provider service</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bindConditionProviderService">Allows the holder to bind to the top-level interface of a condition provider service. Should never be needed for normal apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_bindDreamService">bind to a dream service</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bindDreamService">Allows the holder to bind to the top-level interface of a dream service. Should never be needed for normal apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_invokeCarrierSetup">invoke the carrier-provided configuration app</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_invokeCarrierSetup">Allows the holder to invoke the carrier-provided configuration app. Should never be needed for normal apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_accessNetworkConditions">listen for observations on network conditions</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_accessNetworkConditions">Allows an application to listen for observations on network conditions. Should never be needed for normal apps.</string>
+
+ <string name="permlab_setInputCalibration">change input device calibration</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_setInputCalibration">Allows the app to modify the calibration parameters of the touch screen. Should never be needed for normal apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_accessDrmCertificates">access DRM certificates</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_accessDrmCertificates">Allows an application to provision and use DRM certficates. Should never be needed for normal apps.</string>
+
+ <string name="permlab_handoverStatus">Receive Android Beam transfer status</string>
+ <string name="permdesc_handoverStatus">Allows this application to receive information about current Android Beam transfers</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_removeDrmCertificates">remove DRM certificates</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_removeDrmCertificates">Allows an application to remove DRM certficates. Should never be needed for normal apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_bindCarrierMessagingService">bind to a carrier messaging service</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bindCarrierMessagingService">Allows the holder to bind to the top-level interface of a carrier messaging service. Should never be needed for normal apps.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_bindCarrierConfigService">bind to a carrier config service</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bindCarrierConfigService">Allows the holder to bind to a carrier config service. Should never be needed for normal apps.</string>
+
<!-- Policy administration -->
<!-- Title of policy access to limiting the user's password choices -->
@@ -3254,8 +3341,15 @@
<!-- Storage description for internal storage. [CHAR LIMIT=NONE] -->
<string name="storage_internal">Internal storage</string>
- <!-- Storage description for the SD card. [CHAR LIMIT=NONE] -->
+ <!-- Storage description for a generic SD card. [CHAR LIMIT=NONE] -->
<string name="storage_sd_card">SD card</string>
+ <!-- Storage description for a SD card from a specific manufacturer. [CHAR LIMIT=NONE] -->
+ <string name="storage_sd_card_label"><xliff:g id="manufacturer" example="SanDisk">%s</xliff:g> SD card</string>
+
+ <!-- Storage description for a generic USB drive. [CHAR LIMIT=NONE] -->
+ <string name="storage_usb_drive">USB drive</string>
+ <!-- Storage description for a USB drive from a specific manufacturer. [CHAR LIMIT=NONE] -->
+ <string name="storage_usb_drive_label"><xliff:g id="manufacturer" example="Seagate">%s</xliff:g> USB drive</string>
<!-- Storage description for USB storage. [CHAR LIMIT=NONE] -->
<string name="storage_usb">USB storage</string>
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index 88cac72..29b4ecc7 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -289,6 +289,10 @@
<style name="TextAppearance.Material.Widget"/>
<style name="TextAppearance.Material.Widget.Button" parent="TextAppearance.Material.Button" />
+ <style name="TextAppearance.Material.Widget.Button.Inverse">
+ <item name="textColor">?attr/textColorPrimaryInverse</item>
+ </style>
+
<style name="TextAppearance.Material.Widget.EditText">
<item name="textColor">?attr/textColorPrimaryInverse</item>
<item name="textColorHint">?attr/textColorHintInverse</item>
@@ -461,7 +465,8 @@
<!-- Colored bordered ink button -->
<style name="Widget.Material.Button.Colored">
- <item name="backgroundTint">@color/btn_colored_material</item>
+ <item name="background">@drawable/btn_colored_material</item>
+ <item name="textAppearance">@style/TextAppearance.Material.Widget.Button.Inverse</item>
</style>
<!-- Small bordered ink button -->
@@ -714,9 +719,9 @@
<style name="Widget.Material.SeekBar">
<item name="indeterminateOnly">false</item>
- <item name="progressDrawable">@drawable/scrubber_progress_horizontal_material</item>
- <item name="indeterminateDrawable">@drawable/scrubber_progress_horizontal_material</item>
- <item name="thumb">@drawable/scrubber_control_material_anim</item>
+ <item name="progressDrawable">@drawable/seekbar_track_material</item>
+ <item name="indeterminateDrawable">@drawable/seekbar_track_material</item>
+ <item name="thumb">@drawable/seekbar_thumb_material_anim</item>
<item name="splitTrack">true</item>
<item name="focusable">true</item>
<item name="paddingStart">16dip</item>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index e5b1cb5..7e24150 100755
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -378,7 +378,9 @@
<java-symbol type="integer" name="config_shortPressOnSleepBehavior" />
<java-symbol type="integer" name="config_wifi_framework_scan_interval" />
<java-symbol type="integer" name="config_wifi_supplicant_scan_interval" />
+ <java-symbol type="integer" name="config_wifi_disconnected_scan_interval" />
<java-symbol type="integer" name="config_wifi_scan_interval_p2p_connected" />
+ <java-symbol type="bool" name="config_wifi_hal_pno_enable" />
<java-symbol type="integer" name="db_connection_pool_size" />
<java-symbol type="integer" name="db_journal_size_limit" />
<java-symbol type="integer" name="db_wal_autocheckpoint" />
@@ -1163,11 +1165,10 @@
<java-symbol type="drawable" name="expander_open_holo_dark" />
<java-symbol type="drawable" name="ic_audio_alarm" />
<java-symbol type="drawable" name="ic_audio_alarm_mute" />
- <java-symbol type="drawable" name="ic_audio_bt" />
- <java-symbol type="drawable" name="ic_audio_bt_mute" />
+ <java-symbol type="drawable" name="ic_audio_media" />
+ <java-symbol type="drawable" name="ic_audio_media_mute" />
<java-symbol type="drawable" name="ic_audio_notification" />
<java-symbol type="drawable" name="ic_audio_notification_mute" />
- <java-symbol type="drawable" name="ic_audio_phone" />
<java-symbol type="drawable" name="ic_audio_ring_notif" />
<java-symbol type="drawable" name="ic_audio_ring_notif_mute" />
<java-symbol type="drawable" name="ic_audio_ring_notif_vibrate" />
@@ -1995,7 +1996,7 @@
<java-symbol type="attr" name="actionModeWebSearchDrawable" />
<java-symbol type="string" name="websearch" />
<java-symbol type="drawable" name="ic_media_video_poster" />
- <java-symbol type="string" name="config_webViewPackageName" />
+ <java-symbol type="array" name="config_webViewPackageNames" />
<!-- From SubtitleView -->
<java-symbol type="dimen" name="subtitle_corner_radius" />
@@ -2213,6 +2214,9 @@
<java-symbol type="string" name="storage_internal" />
<java-symbol type="string" name="storage_sd_card" />
+ <java-symbol type="string" name="storage_sd_card_label" />
+ <java-symbol type="string" name="storage_usb_drive" />
+ <java-symbol type="string" name="storage_usb_drive_label" />
<java-symbol type="string" name="storage_usb" />
<!-- Floating toolbar -->
@@ -2223,12 +2227,13 @@
<java-symbol type="layout" name="floating_popup_overflow_list_item" />
<java-symbol type="dimen" name="floating_toolbar_height" />
<java-symbol type="dimen" name="floating_toolbar_menu_button_side_padding" />
+ <java-symbol type="dimen" name="floating_toolbar_overflow_side_padding" />
<java-symbol type="dimen" name="floating_toolbar_text_size" />
<java-symbol type="dimen" name="floating_toolbar_menu_button_minimum_width" />
<java-symbol type="dimen" name="floating_toolbar_default_width" />
<java-symbol type="dimen" name="floating_toolbar_minimum_overflow_height" />
- <java-symbol type="dimen" name="floating_toolbar_overflow_width" />
- <java-symbol type="dimen" name="floating_toolbar_margin" />
+ <java-symbol type="dimen" name="floating_toolbar_horizontal_margin" />
+ <java-symbol type="dimen" name="floating_toolbar_vertical_margin" />
<java-symbol type="drawable" name="ic_chevron_left" />
<java-symbol type="drawable" name="ic_chevron_right" />
@@ -2240,4 +2245,6 @@
<java-symbol type="layout" name="chooser_grid" />
<java-symbol type="layout" name="resolve_grid_item" />
<java-symbol type="id" name="title_icon" />
+ <java-symbol type="id" name="day_picker_view_pager" />
+ <java-symbol type="layout" name="day_picker_content_material" />
</resources>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index 9931d00..a413d91 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -182,7 +182,7 @@
<item name="dialogPreferredPadding">@dimen/dialog_padding_material</item>
<!-- AlertDialog attributes -->
- <item name="alertDialogTheme">@style/ThemeOverlay.Material.Dialog</item>
+ <item name="alertDialogTheme">@style/ThemeOverlay.Material.Dialog.Alert</item>
<item name="alertDialogStyle">@style/AlertDialog.Material</item>
<item name="alertDialogCenterButtons">false</item>
<item name="alertDialogIcon">@drawable/ic_dialog_alert_material</item>
@@ -538,7 +538,7 @@
<item name="dialogPreferredPadding">@dimen/dialog_padding_material</item>
<!-- AlertDialog attributes -->
- <item name="alertDialogTheme">@style/ThemeOverlay.Material.Dialog</item>
+ <item name="alertDialogTheme">@style/ThemeOverlay.Material.Dialog.Alert</item>
<item name="alertDialogStyle">@style/AlertDialog.Material.Light</item>
<item name="alertDialogCenterButtons">false</item>
<item name="alertDialogIcon">@drawable/ic_dialog_alert_material</item>
@@ -882,6 +882,11 @@
<item name="preferencePanelStyle">@style/PreferencePanel.Dialog</item>
</style>
+ <style name="ThemeOverlay.Material.Dialog.Alert">
+ <item name="windowMinWidthMajor">@dimen/dialog_min_width_major</item>
+ <item name="windowMinWidthMinor">@dimen/dialog_min_width_minor</item>
+ </style>
+
<!-- Variant of the material (dark) theme with no action bar. -->
<style name="Theme.Material.NoActionBar">
<item name="windowActionBar">false</item>
diff --git a/core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.mk b/core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.mk
index 5fa2405..6ee6ffa 100644
--- a/core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.mk
+++ b/core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.mk
@@ -5,7 +5,6 @@
LOCAL_PACKAGE_NAME := install_jni_lib_open_from_apk
-LOCAL_JNI_SHARED_LIBRARIES_ZIP_OPTIONS := -0
LOCAL_PAGE_ALIGN_JNI_SHARED_LIBRARIES := true
include $(FrameworkCoreTests_BUILD_PACKAGE)
diff --git a/core/tests/coretests/src/android/content/pm/AppCacheTest.java b/core/tests/coretests/src/android/content/pm/AppCacheTest.java
index aae55e8..54316d5 100644
--- a/core/tests/coretests/src/android/content/pm/AppCacheTest.java
+++ b/core/tests/coretests/src/android/content/pm/AppCacheTest.java
@@ -490,7 +490,7 @@
PackageDataObserver observer = new PackageDataObserver();
//wait on observer
synchronized(observer) {
- getPm().freeStorageAndNotify(idealStorageSize, observer);
+ getPm().freeStorageAndNotify(null, idealStorageSize, observer);
long waitTime = 0;
while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
observer.wait(WAIT_TIME_INCR);
@@ -515,7 +515,7 @@
try {
// Spin lock waiting for call back
synchronized(r) {
- getPm().freeStorage(idealStorageSize, pi.getIntentSender());
+ getPm().freeStorage(null, idealStorageSize, pi.getIntentSender());
long waitTime = 0;
while(!r.isDone() && (waitTime < MAX_WAIT_TIME)) {
r.wait(WAIT_TIME_INCR);
diff --git a/docs/html-intl/intl/ko/distribute/index.jd b/docs/html-intl/intl/ko/distribute/index.jd
new file mode 100644
index 0000000..1765673
--- /dev/null
+++ b/docs/html-intl/intl/ko/distribute/index.jd
@@ -0,0 +1,16 @@
+page.title=Google Play 에서 앱을 배달하는
+page.viewport_width=970
+section.landing=true
+header.hide=1
+nonavpage=true
+page.metaDescription=Google Play 잘 이용되고있는 Android 앱 스토어입니다. 클라우드와 동기화 된 강력한 기반하여 사용자가 쉽게 안드로이드를 찾아 다운로드 할 수 있습니다.
+
+@jd:body
+
+ <div class="resource-widget resource-flow-layout col-16"
+ style="margin-top:20px"
+ data-query="collection:launch/static/ko"
+ data-sortOrder=""
+ data-cardSizes="6x6,6x6,6x2x3,12x6,6x6,6x2x3,6x6,6x6,12x6,6x6"
+ data-maxResults="24"></div>
+
diff --git a/docs/html/distribute/index.jd b/docs/html/distribute/index.jd
index da960ce..d0ea661 100644
--- a/docs/html/distribute/index.jd
+++ b/docs/html/distribute/index.jd
@@ -7,15 +7,20 @@
@jd:body
- <div class="resource-widget resource-carousel-layout col-16"
+ <div class="resource-widget resource-carousel-layout col-16"
style="height:420px;margin-top:20px;padding-top:0"
- data-query="type:youtube+tag:googleplay+tag:developerstory+tag:featured, type:blog+tag:googleplay+tag:distribute+tag:featured"
+ data-query="type:youtube+tag:googleplay+tag:developerstory+tag:featured"
data-sortOdrder="-timestamp"
data-maxResults="4"></div>
-
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="type:blog+tag:googleplay+tag:distribute+tag:featured"
+ data-sortOrder=""
+ data-cardSizes="9x6"
+ data-maxResults="2"></div>
+
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:launch/static"
data-sortOrder=""
- data-cardSizes="6x6,6x6,6x2x3,12x6,6x6,6x2x3,6x6,6x6,12x6,6x6"
+ data-cardSizes="6x2x3,6x6,6x6,6x6,6x6,6x2x3,6x2x3,6x6,6x6,6x6,6x6,6x6"
data-maxResults="24"></div>
-
diff --git a/docs/html/guide/topics/manifest/application-element.jd b/docs/html/guide/topics/manifest/application-element.jd
index b5af9c3..d6ad656 100644
--- a/docs/html/guide/topics/manifest/application-element.jd
+++ b/docs/html/guide/topics/manifest/application-element.jd
@@ -32,6 +32,7 @@
android:<a href="#testOnly">testOnly</a>=["true" | "false"]
android:<a href="#theme">theme</a>="<i>resource or theme</i>"
android:<a href="#uioptions">uiOptions</a>=["none" | "splitActionBarWhenNarrow"]
+ android:<a href="#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]
android:<a href="#vmSafeMode">vmSafeMode</a>=["true" | "false"] >
. . .
</application></pre></dd>
@@ -446,6 +447,32 @@
<p>This attribute was added in API level 14.</p>
</dd>
+<dt><a name="usesCleartextTraffic"></a>{@code android:usesCleartextTraffic}</dt>
+<dd>Indicates whether the app intends to use cleartext network traffic, such as cleartext HTTP.
+The default value is {@code "true"}.
+
+<p>When the attribute is set to {@code "false"}, platform components (for example, HTTP and FTP
+stacks, {@link android.webkit.WebView}, {@link android.app.DownloadManager},
+{@link android.media.MediaPlayer}) will refuse the app's requests to use cleartext traffic.
+Third-party libraries are strongly encouraged to honor this setting as well. The key reason for
+avoiding cleartext traffic is the lack of confidentiality, authenticity, and protections against
+tampering: a network attacker can eavesdrop on transmitted data and also modify it without being
+detected.
+
+<p>This flag is honored on a best effort basis because it's impossible to prevent all cleartext
+traffic from Android applications given the level of access provided to them. For example, there's
+no expectation that the {@link java.net.Socket} API will honor this flag because it cannot
+determine whether its traffic is in cleartext. However, most network traffic from applications is
+handled by higher-level network stacks/components which can honor this flag by either reading it
+from {@link android.content.pm.ApplicationInfo#flags ApplicationInfo.flags} or
+{@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted() NetworkSecurityPolicy.isCleartextTrafficPermitted()}.
+
+<p>During app development, StrictMode can be used to identify any cleartext traffic from the app: see
+{@link android.os.StrictMode.VmPolicy.Builder#detectCleartextNetwork() StrictMode.VmPolicy.Builder.detectCleartextNetwork()}.
+
+<p>This attribute was added in API level 23.</p>
+</dd>
+
<dt><a name="vmSafeMode"></a>{@code android:vmSafeMode}</dt>
<dd>Indicates whether the app would like the virtual machine (VM) to operate
in safe mode. The default value is {@code "false"}.
diff --git a/docs/html/images/tools/hierarchicalviewer-icon.png b/docs/html/images/tools/hierarchicalviewer-icon.png
new file mode 100644
index 0000000..061f952
--- /dev/null
+++ b/docs/html/images/tools/hierarchicalviewer-icon.png
Binary files differ
diff --git a/docs/html/images/tools/studio-DDMS-open-perspective-icon.png b/docs/html/images/tools/studio-DDMS-open-perspective-icon.png
new file mode 100644
index 0000000..f8e6d1a
--- /dev/null
+++ b/docs/html/images/tools/studio-DDMS-open-perspective-icon.png
Binary files differ
diff --git a/docs/html/images/tools/studio-gradle-panel.png b/docs/html/images/tools/studio-gradle-panel.png
deleted file mode 100644
index 4a76a8d..0000000
--- a/docs/html/images/tools/studio-gradle-panel.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/tools/studio-gradle-tab.png b/docs/html/images/tools/studio-gradle-tab.png
deleted file mode 100644
index b0f302c..0000000
--- a/docs/html/images/tools/studio-gradle-tab.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/jd_collections.js b/docs/html/jd_collections.js
index 99b9dd1..e2d0eb9 100644
--- a/docs/html/jd_collections.js
+++ b/docs/html/jd_collections.js
@@ -40,20 +40,21 @@
"launch/static": {
"title": "",
"resources": [
- "http://www.youtube.com/watch?v=1RIz-cmTQB4",
- "http://www.youtube.com/watch?v=MVBMWDzyHAI",
- "http://android-developers.blogspot.com/2013/11/app-translation-service-now-available.html",
- "http://android-developers.blogspot.com/2013/10/more-visibility-for-tablet-apps-in.html",
- "http://android-developers.blogspot.com/2013/11/bring-your-apps-into-classroom-with.html",
- "distribute/essentials/quality/tablets.html",
- "distribute/users/build-buzz.html",
- "distribute/monetize/premium.html",
+ "distribute/googleplay/about.html",
+ "distribute/googleplay/guide.html",
+ "about/versions/lollipop.html",
+ "distribute/googleplay/wear.html",
+ "distribute/googleplay/tv.html",
+ "distribute/googleplay/edu/about.html",
+ "distribute/googleplay/families/about.html",
+ "distribute/monetize/subscriptions.html",
"distribute/monetize/freemium.html",
"distribute/monetize/ads.html",
- "distribute/essentials/best-practices/apps.html",
- "distribute/essentials/best-practices/games.html",
- "distribute/users/know-your-user.html",
- "distribute/googleplay/developer-console.html"
+ "distribute/users/promote-with-ads.html",
+ "distribute/engage/deep-linking.html",
+ "distribute/engage/game-services.html",
+ "distribute/essentials/optimizing-your-app.html",
+ "distribute/engage/easy-signin.html",
]
},
"launch/static/ja": {
@@ -75,6 +76,25 @@
"intl/ja/distribute/monetize/ads.html"
]
},
+ "launch/static/ko": {
+ "title": "",
+ "resources": [
+ "https://www.youtube.com/watch?v=7X9Ue0Nfdh4&index=2&list=PL_WJkTbDHdBksDBRoqfeyLchEQqBAOlNl",
+ "https://www.youtube.com/watch?v=83FpwuschCQ",
+ "http://googledevkr.blogspot.com/2014/11/android50guidefordevelopers.html",
+ "http://googledevkr.blogspot.com/2014/10/material-design-on-android-checklist.html",
+ "http://googledevkr.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html",
+ "intl/ko/distribute/googleplay/developer-console.html#alpha-beta",
+ "intl/ko/distribute/googleplay/guide.html",
+ "intl/ko/distribute/essentials/quality/core.html",
+ "https://support.google.com/googleplay/android-developer/answer/4430948?hl=ko",
+ "intl/ko/support.html",
+ "intl/ko/distribute/essentials/quality/wear.html",
+ "intl/ko/tv/index.html",
+ "intl/ko/google/play-services/games.html",
+ "intl/ko/distribute/monetize/ads.html"
+ ]
+ },
"distribute/gp/gplanding": {
"resources": [
"distribute/googleplay/about.html",
diff --git a/docs/html/jd_extras.js b/docs/html/jd_extras.js
index bad0e14..f91550f 100644
--- a/docs/html/jd_extras.js
+++ b/docs/html/jd_extras.js
@@ -2144,5 +2144,173 @@
"tags": [],
"image": "distribute/images/advertising.jpg",
"type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "구글 플레이 2015년 비전",
+ "titleFriendly": "",
+ "summary": "G-Star 구글 컨퍼런스",
+ "url": "https://www.youtube.com/watch?v=7X9Ue0Nfdh4&index=2&list=PL_WJkTbDHdBksDBRoqfeyLchEQqBAOlNl",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "http://img.youtube.com/vi/7X9Ue0Nfdh4/hqdefault.jpg",
+ "type": "youtube"
+ },
+ {
+ "lang": "ko",
+ "title": "구글 플레이 게임",
+ "titleFriendly": "",
+ "summary": "게임 프로필, 퀘스트, 세이브드 게임 등의 신기능 소개",
+ "url": "https://www.youtube.com/watch?v=83FpwuschCQ",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "http://img.youtube.com/vi/83FpwuschCQ/hqdefault.jpg",
+ "type": "youtube"
+ },
+ {
+ "lang": "ko",
+ "title": "안드로이드 5.0 롤리팝을 맞이하는 개발자를 위한 안내서",
+ "titleFriendly": "",
+ "summary": "",
+ "url": "http://googledevkr.blogspot.com/2014/11/android50guidefordevelopers.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "https://lh5.googleusercontent.com/0Gx4Ob_WvIgNOMv3hVMuUm4O7KuSWyxCEFIvy39_6fgXh2q2azqjZf3bpZoEk-LMW-K8GwYMfyYfMUAwp38hhPQ6WFNnddhN2E2_GF3-XBQI_qjhISviz10h_mGgDWsZKA",
+ "type": "blog"
+ },
+ {
+ "lang": "ko",
+ "title": "안드로이드 앱을 위한 머티리얼 디자인 체크 리스트",
+ "titleFriendly": "",
+ "summary": "",
+ "url": "http://googledevkr.blogspot.com/2014/10/material-design-on-android-checklist.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "https://lh4.googleusercontent.com/JKoxeDdmsj6gYHV8rmp96U1jHj7FKeMzGBaaFu35kXp5EpJR9Ei9MQFAYghjwJoycdgydw-FZTuFNY8pDx63MWhy37rKC96ajoDXEMzvo9W0sj5yC2-uSYJdhpazVOP2cA",
+ "type": "blog"
+ },
+ {
+ "lang": "ko",
+ "title": "App Compat 라이브러리",
+ "titleFriendly": "",
+ "summary": "",
+ "url": "http://googledevkr.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "http://2.bp.blogspot.com/-7fF9ayZ6PgI/U9iFpk5FNEI/AAAAAAAAAs0/4P4SCvdB_4M/s640/image00.png",
+ "type": "blog"
+ },
+ {
+ "lang": "ko",
+ "title": "Alpha and Beta Testing",
+ "titleFriendly": "",
+ "summary": "출시 전에 완벽한 사전 테스트 [영문]",
+ "url": "intl/ko/distribute/googleplay/developer-console.html#alpha-beta",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "images/gp-dc-ab.png",
+ "type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "Finding Success on Google Play",
+ "titleFriendly": "",
+ "summary": "구글 플레이에서 성공하는 비결 [영문]",
+ "url": "intl/ko/distribute/googleplay/guide.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "distribute/images/play_dev_guide_b.jpg",
+ "type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "Core App Quality",
+ "titleFriendly": "",
+ "summary": "고품질 안드로이드 앱 개발 가이드 [영문]",
+ "url": "intl/ko/distribute/essentials/quality/core.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "images/gp-core-quality.png",
+ "type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "Policy Guidelines and Practices",
+ "titleFriendly": "",
+ "summary": "숙지해야할 중요한 정책 [영문]",
+ "url": "https://support.google.com/googleplay/android-developer/answer/4430948?hl=ko",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "https://storage.googleapis.com/support-kms-prod/SNP_712EA2784949DDF085C46E3BE7B1DC618A09_4389356_en_v0",
+ "type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "Developer Support",
+ "titleFriendly": "",
+ "summary": "개발자 지원 센터 활용 [영문]",
+ "url": "intl/ko/support.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "https://lh3.googleusercontent.com/-mGTYed3Uh-E/AAAAAAAAAAI/AAAAAAAAF58/qNYbk4mMhI0/s120-c/photo.jpg",
+ "type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "Wear App Quality",
+ "titleFriendly": "",
+ "summary": "웨어러블 앱 개발 가이드 [영문]",
+ "url": "intl/ko/distribute/essentials/quality/wear.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "distribute/images/gp-wear-quality.png",
+ "type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "Android TV 어플리케이션 개발",
+ "titleFriendly": "",
+ "summary": "앱과 게임을 거실에서 가족과 함께 [영문]",
+ "url": "intl/ko/tv/index.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "design/tv/images/atv-home.jpg",
+ "type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "구글 플레이 게임 서비스",
+ "titleFriendly": "",
+ "summary": "다양한 구글 플레이 게임 서비스 기능 알아보기 [영문]",
+ "url": "intl/ko/google/play-services/games.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "https://developers.google.com/games/services/images/gamescreen3.jpg",
+ "type": "distribute"
+ },
+ {
+ "lang": "ko",
+ "title": "Monetize with Ads",
+ "titleFriendly": "",
+ "summary": "광고로 수익 창출하기 [영문]",
+ "url": "intl/ko/distribute/monetize/ads.html",
+ "group": "",
+ "keywords": [],
+ "tags": [],
+ "image": "distribute/images/advertising.jpg",
+ "type": "distribute"
}
]);
\ No newline at end of file
diff --git a/docs/html/tools/building/building-studio.jd b/docs/html/tools/building/building-studio.jd
index 68800da..4431194 100644
--- a/docs/html/tools/building/building-studio.jd
+++ b/docs/html/tools/building/building-studio.jd
@@ -67,26 +67,13 @@
<a href="{@docRoot}sdk/installing/studio-build.html">Build System</a> guide.</p>
<p>To view the list of all available build tasks in Android Studio, click <strong>Gradle</strong>
-on the right side of the IDE window. The <em>Gradle tasks</em> panel appears as shown in
-figure 2. Double-click any build task to run it in Android Studio. To hide the <em>Gradle tasks</em>
-panel, click <strong>Gradle</strong> again.</p>
+on the right side of the IDE window. The <em>Gradle tasks</em> panel appears.</p>
-<img src="{@docRoot}images/tools/studio-gradle-panel.png" alt="" />
-<p class="img-caption"><strong>Figure 2.</strong> The list of build tasks in Android Studio.</p>
<h3 id="buildRelease">Build a release version</h3>
-<p>You can now build the release version of your application for distribution. To build it from Android
-Studio:</p>
-
-<ol>
- <li>Click <strong>Gradle</strong> on the right side of the IDE window.</li>
- <li>On the <em>All tasks</em> section of the sidebar that appears, expand
- <strong>BuildSystemExample</strong>.</li>
- <li>Expand <strong>:app</strong> and double-click <strong>assembleRelease</strong>.</li>
-</ol>
-
-<p>You can use this procedure to invoke any build task from Android Studio.</p>
+<p>You can now use the <strong>Build</strong> menu options to build the release version of your
+application for distribution. </p>
<p>The build generates an APK for each build variant:
the <code>app/build/apk/</code> directory contains packages named
diff --git a/docs/html/tools/building/configuring-gradle.jd b/docs/html/tools/building/configuring-gradle.jd
index 8379508..7cca5b4 100644
--- a/docs/html/tools/building/configuring-gradle.jd
+++ b/docs/html/tools/building/configuring-gradle.jd
@@ -470,7 +470,11 @@
<li>fullRelease</li>
</ul>
-<p>To build this example, invoke the <code>assemble</code> task from Android Studio or from the
-command line.</p>
+<p>To build this example, click the <strong>Build</strong> menu option in Android Studio or invoke
+the <code>assemble</code> task from the command line. </p>
+
+<p class="note"><strong>Note:</strong> The <strong>Build > Make Project</strong> option compiles
+all the source files in the entire project that have been modified since the last compilation. The
+<strong>Build > Rebuild Project</strong> option recomplies all the source files in the project.</p>
<p>Separate output folders are created for each build variant. </p>
diff --git a/docs/html/tools/building/plugin-for-gradle.jd b/docs/html/tools/building/plugin-for-gradle.jd
index 54a03fd..a497c1b 100644
--- a/docs/html/tools/building/plugin-for-gradle.jd
+++ b/docs/html/tools/building/plugin-for-gradle.jd
@@ -15,7 +15,7 @@
<li><a href="{@docRoot}sdk/installing/studio-build.html">
Build System Overview</a></li>
<li><a href="{@docRoot}tools/building/index.html">
-Buidling and Running</a></li>
+Building and Running</a></li>
<li><a href="{@docRoot}tools/building/building-studio.html">
Building and Running from Android Studio</a></li>
</ul>
@@ -273,16 +273,9 @@
<dd><p>Performs the clean.</p></dd>
</dl>
-<p>The Android plugin provides additional tasks for <em>connectedCheck</em> and <em>deviceCheck</em>
+<p>The Android plugin provides the <em>connectedCheck</em> and <em>deviceCheck</em> tasks
for checks run on connected, emulated, and remote devices. Gradle tasks can be viewed by clicking
-the Gradle tab</a> in the right margin.
-<img src="{@docRoot}images/tools/studio-gradle-tab.png"></p>
-<p class="img-caption"><strong>Figure 1:</strong> Gradle tab</p>
-
-<p>Running a top-level task, runs all the dependent tasks. For example, the <em>assemble</em> task
-has dependent tasks for <em>assembleDebug</em> and <em>assembleRelease</em> to make the debug and
-release APKs. The <em>assemble</em> task depends on these tasks so calling it builds both APKs.
-These tasks can also be called independently to build the debug or release APK separately. </p>
+the Gradle tab</a> in the right margin.</p>
<p>You can view the list of available tasks and invoke any task from Android Studio and from
the command line, as described in
diff --git a/docs/html/tools/help/hierarchy-viewer.jd b/docs/html/tools/help/hierarchy-viewer.jd
index 4a346e0..da4cc1e 100644
--- a/docs/html/tools/help/hierarchy-viewer.jd
+++ b/docs/html/tools/help/hierarchy-viewer.jd
@@ -3,16 +3,27 @@
parent.link=index.html
@jd:body
-<p>Hierarchy Viewer allows you to debug and optimize your user
-interface. It provides a visual representation of the layout's View hierarchy
-(the Layout View) and a magnified inspector of the display (the Pixel Perfect View).
+<p>The Hierarchy Viewer allows you to debug and optimize your user
+interface. It provides a visual representation of the layout's View hierarchy
+(the Layout View) and a magnified inspector of the display (the Pixel Perfect View). </p>
+
+<p>To start the Hierarchy Viewer, do one of the following: </p>
+
+<ul>
+<li> From Android Studio, choose <strong>Tools > Android Device Monitor</strong> or click the
+Android Device Monitor icon
+<img src="{@docRoot}images/tools/hierarchicalviewer-icon.png" alt=""/>. Click the Open Perspectives
+icon <img src="{@docRoot}images/tools/studio-DDMS-open-perspective-icon.png" alt=""/> and select
+<strong>Hierarchy View</strong>. </li>
+<li>From the SDK <code>tools/</code> directory, enter:
+ <pre>monitor</pre> </li>
+</ul>
+
+<p>For more information on how to use the Hierarchy Viewer, see
+<a href="{@docRoot}tools/debugging/debugging-ui.html">Optimizing Your UI</a>.
</p>
-<p>To start Hierarchy Viewer, enter the following command from the SDK <code>tools/</code> directory:</p>
- <pre>hierarchyviewer</pre>
-</ol>
+<p class="note"><strong>Note:</strong> The command line version of Hierarchy Viewer has been
+deprecated. </p>
-<p>For more information on how to use Hierarchy Viewer, see
-<a href="{@docRoot}tools/debugging/debugging-ui.html">Debugging and Profiling UIs</a>
-</p>
diff --git a/docs/html/tools/help/hprof-conv.jd b/docs/html/tools/help/hprof-conv.jd
index f96def2..982f337 100644
--- a/docs/html/tools/help/hprof-conv.jd
+++ b/docs/html/tools/help/hprof-conv.jd
@@ -8,9 +8,13 @@
generated by the Android SDK tools to a standard format so you
can view the file in a profiling tool of your choice. </p>
-<pre> hprof-conv <infile> <outfile></pre>
+<pre> hprof-conv [-z] <infile> <outfile></pre>
<p>
You can use "-" for <code><infile></code> or <code><outfile></code>
to specify stdin or stdout.
</p>
+
+<p>
+You can use "-z" to filter out zygote allocations shared by all applications.
+</p>
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 76d6edf..e2f7799 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -1573,15 +1573,6 @@
return mSkBitmapPtr;
}
- /**
- * Refs the underlying SkPixelRef and returns a pointer to it.
- *
- * @hide
- * */
- public final long refSkPixelRef() {
- return nativeRefPixelRef(mSkBitmapPtr);
- }
-
private static class BitmapFinalizer {
private long mNativeBitmap;
@@ -1670,5 +1661,4 @@
private static native boolean nativeHasMipMap(long nativeBitmap);
private static native void nativeSetHasMipMap(long nativeBitmap, boolean hasMipMap);
private static native boolean nativeSameAs(long nativeBitmap0, long nativeBitmap1);
- private static native long nativeRefPixelRef(long nativeBitmap);
}
diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java
index bd74bc8..f2f890e 100644
--- a/graphics/java/android/graphics/BitmapShader.java
+++ b/graphics/java/android/graphics/BitmapShader.java
@@ -42,7 +42,8 @@
mBitmap = bitmap;
mTileX = tileX;
mTileY = tileY;
- init(nativeCreate(bitmap, tileX.nativeInt, tileY.nativeInt));
+ final long b = bitmap.getSkBitmap();
+ init(nativeCreate(b, tileX.nativeInt, tileY.nativeInt));
}
/**
@@ -55,6 +56,6 @@
return copy;
}
- private static native long nativeCreate(Bitmap bitmap, int shaderTileModeX,
+ private static native long nativeCreate(long native_bitmap, int shaderTileModeX,
int shaderTileModeY);
}
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 2acb8ba..48afcbf 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -81,6 +81,10 @@
*/
protected int mScreenDensity = Bitmap.DENSITY_NONE;
+ // Used by native code
+ @SuppressWarnings("UnusedDeclaration")
+ private int mSurfaceFormat;
+
/**
* Flag for drawTextRun indicating left-to-right run direction.
* @hide
@@ -133,7 +137,7 @@
public Canvas() {
if (!isHardwareAccelerated()) {
// 0 means no native bitmap
- mNativeCanvasWrapper = initRaster(null);
+ mNativeCanvasWrapper = initRaster(0);
mFinalizer = new CanvasFinalizer(mNativeCanvasWrapper);
} else {
mFinalizer = null;
@@ -154,7 +158,7 @@
throw new IllegalStateException("Immutable bitmap passed to Canvas constructor");
}
throwIfCannotDraw(bitmap);
- mNativeCanvasWrapper = initRaster(bitmap);
+ mNativeCanvasWrapper = initRaster(bitmap.getSkBitmap());
mFinalizer = new CanvasFinalizer(mNativeCanvasWrapper);
mBitmap = bitmap;
mDensity = bitmap.mDensity;
@@ -211,7 +215,7 @@
}
if (bitmap == null) {
- native_setBitmap(mNativeCanvasWrapper, null);
+ native_setBitmap(mNativeCanvasWrapper, 0, false);
mDensity = Bitmap.DENSITY_NONE;
} else {
if (!bitmap.isMutable()) {
@@ -219,7 +223,7 @@
}
throwIfCannotDraw(bitmap);
- native_setBitmap(mNativeCanvasWrapper, bitmap);
+ native_setBitmap(mNativeCanvasWrapper, bitmap.getSkBitmap(), true);
mDensity = bitmap.mDensity;
}
@@ -227,6 +231,13 @@
}
/**
+ * setBitmap() variant for native callers with a raw bitmap handle.
+ */
+ private void setNativeBitmap(long bitmapHandle) {
+ native_setBitmap(mNativeCanvasWrapper, bitmapHandle, false);
+ }
+
+ /**
* Set the viewport dimensions if this canvas is GL based. If it is not,
* this method is ignored and no exception is thrown.
*
@@ -1965,9 +1976,10 @@
*/
public static native void freeTextLayoutCaches();
- private static native long initRaster(Bitmap bitmap);
+ private static native long initRaster(long nativeBitmapOrZero);
private static native void native_setBitmap(long canvasHandle,
- Bitmap bitmap);
+ long bitmapHandle,
+ boolean copyState);
private static native boolean native_isOpaque(long canvasHandle);
private static native int native_getWidth(long canvasHandle);
private static native int native_getHeight(long canvasHandle);
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index e8b8c77..22ff3e74 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -572,7 +572,7 @@
* Specifies a tint blending mode for this drawable.
* <p>
* Defines how this drawable's tint color should be blended into the drawable
- * before it is drawn to screen. Default tint mode is {@link PorterDuff.Mode#MULTIPLY}.
+ * before it is drawn to screen. Default tint mode is {@link PorterDuff.Mode#SRC_IN}.
* </p>
* <p class="note"><strong>Note:</strong> Setting a color filter via
* {@link #setColorFilter(ColorFilter)} or
diff --git a/keystore/java/android/security/AndroidKeyStore.java b/keystore/java/android/security/AndroidKeyStore.java
index 1c068be..c259c25 100644
--- a/keystore/java/android/security/AndroidKeyStore.java
+++ b/keystore/java/android/security/AndroidKeyStore.java
@@ -535,6 +535,12 @@
args.addInt(KeymasterDefs.KM_TAG_USER_AUTH_TYPE,
KeyStoreKeyProperties.UserAuthenticator.allToKeymaster(
params.getUserAuthenticators()));
+ long secureUserId = GateKeeper.getSecureUserId();
+ if (secureUserId == 0) {
+ throw new IllegalStateException("Secure lock screen must be enabled"
+ + " to import keys requiring user authentication");
+ }
+ args.addLong(KeymasterDefs.KM_TAG_USER_SECURE_ID, secureUserId);
}
if (params.isInvalidatedOnNewFingerprintEnrolled()) {
// TODO: Add the invalidate on fingerprint enrolled constraint once Keymaster supports
diff --git a/keystore/java/android/security/GateKeeper.java b/keystore/java/android/security/GateKeeper.java
new file mode 100644
index 0000000..c9f06e9
--- /dev/null
+++ b/keystore/java/android/security/GateKeeper.java
@@ -0,0 +1,30 @@
+package android.security;
+
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.service.gatekeeper.IGateKeeperService;
+
+/**
+ * Convenience class for accessing the gatekeeper service.
+ *
+ * @hide
+ */
+public abstract class GateKeeper {
+
+ private GateKeeper() {}
+
+ public static IGateKeeperService getService() {
+ return IGateKeeperService.Stub.asInterface(
+ ServiceManager.getService("android.service.gatekeeper.IGateKeeperService"));
+ }
+
+ public static long getSecureUserId() throws IllegalStateException {
+ try {
+ return GateKeeper.getService().getSecureUserId(UserHandle.myUserId());
+ } catch (RemoteException e) {
+ throw new IllegalStateException(
+ "Failed to obtain secure user ID from gatekeeper", e);
+ }
+ }
+}
diff --git a/keystore/java/android/security/KeyStoreCipherSpi.java b/keystore/java/android/security/KeyStoreCipherSpi.java
index 7bc6378..37e00b2 100644
--- a/keystore/java/android/security/KeyStoreCipherSpi.java
+++ b/keystore/java/android/security/KeyStoreCipherSpi.java
@@ -547,18 +547,12 @@
if (mIvRequired) {
// IV is needed
if ((mIv == null) && (mEncrypting)) {
- // TODO: Switch to keymaster-generated IV code below once keymaster supports
- // that.
- // IV is needed but was not provided by the caller -- generate an IV.
- mIv = new byte[mBlockSizeBytes];
- SecureRandom rng = (mRng != null) ? mRng : new SecureRandom();
- rng.nextBytes(mIv);
-// // IV was not provided by the caller and thus will be generated by keymaster.
-// // Mix in some additional entropy from the provided SecureRandom.
-// if (mRng != null) {
-// mAdditionalEntropyForBegin = new byte[mBlockSizeBytes];
-// mRng.nextBytes(mAdditionalEntropyForBegin);
-// }
+ // IV was not provided by the caller and thus will be generated by keymaster.
+ // Mix in some additional entropy from the provided SecureRandom.
+ if (mRng != null) {
+ mAdditionalEntropyForBegin = new byte[mBlockSizeBytes];
+ mRng.nextBytes(mAdditionalEntropyForBegin);
+ }
}
}
}
diff --git a/keystore/java/android/security/KeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/KeyStoreKeyGeneratorSpi.java
index 72c485a..d1abe12 100644
--- a/keystore/java/android/security/KeyStoreKeyGeneratorSpi.java
+++ b/keystore/java/android/security/KeyStoreKeyGeneratorSpi.java
@@ -167,6 +167,12 @@
args.addInt(KeymasterDefs.KM_TAG_USER_AUTH_TYPE,
KeyStoreKeyProperties.UserAuthenticator.allToKeymaster(
spec.getUserAuthenticators()));
+ long secureUserId = GateKeeper.getSecureUserId();
+ if (secureUserId == 0) {
+ throw new IllegalStateException("Secure lock screen must be enabled"
+ + " to generate keys requiring user authentication");
+ }
+ args.addLong(KeymasterDefs.KM_TAG_USER_SECURE_ID, secureUserId);
}
if (spec.isInvalidatedOnNewFingerprintEnrolled()) {
// TODO: Add the invalidate on fingerprint enrolled constraint once Keymaster supports
diff --git a/keystore/java/android/security/KeyStoreKeyProperties.java b/keystore/java/android/security/KeyStoreKeyProperties.java
index b1f330f..206103f 100644
--- a/keystore/java/android/security/KeyStoreKeyProperties.java
+++ b/keystore/java/android/security/KeyStoreKeyProperties.java
@@ -217,7 +217,7 @@
}
@Retention(RetentionPolicy.SOURCE)
- @IntDef({Origin.GENERATED, Origin.IMPORTED})
+ @IntDef({Origin.GENERATED, Origin.IMPORTED, Origin.UNKNOWN})
public @interface OriginEnum {}
/**
@@ -233,14 +233,22 @@
public static final int IMPORTED = 1 << 1;
/**
+ * Origin of the key is unknown. This can occur only for keys backed by an old TEE
+ * implementation which does not record origin information.
+ */
+ public static final int UNKNOWN = 1 << 2;
+
+ /**
* @hide
*/
public static @OriginEnum int fromKeymaster(int origin) {
switch (origin) {
- case KeymasterDefs.KM_ORIGIN_HARDWARE:
+ case KeymasterDefs.KM_ORIGIN_GENERATED:
return GENERATED;
case KeymasterDefs.KM_ORIGIN_IMPORTED:
return IMPORTED;
+ case KeymasterDefs.KM_ORIGIN_UNKNOWN:
+ return UNKNOWN;
default:
throw new IllegalArgumentException("Unknown origin: " + origin);
}
diff --git a/libs/hwui/AssetAtlas.cpp b/libs/hwui/AssetAtlas.cpp
index 882826e..4d2e3a0 100644
--- a/libs/hwui/AssetAtlas.cpp
+++ b/libs/hwui/AssetAtlas.cpp
@@ -82,12 +82,12 @@
///////////////////////////////////////////////////////////////////////////////
AssetAtlas::Entry* AssetAtlas::getEntry(const SkBitmap* bitmap) const {
- ssize_t index = mEntries.indexOfKey(bitmap->pixelRef());
+ ssize_t index = mEntries.indexOfKey(bitmap);
return index >= 0 ? mEntries.valueAt(index) : nullptr;
}
Texture* AssetAtlas::getEntryTexture(const SkBitmap* bitmap) const {
- ssize_t index = mEntries.indexOfKey(bitmap->pixelRef());
+ ssize_t index = mEntries.indexOfKey(bitmap);
return index >= 0 ? mEntries.valueAt(index)->texture : nullptr;
}
@@ -120,7 +120,7 @@
const float height = float(mTexture->height);
for (int i = 0; i < count; ) {
- SkPixelRef* pixelRef = reinterpret_cast<SkPixelRef*>(map[i++]);
+ SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(map[i++]);
// NOTE: We're converting from 64 bit signed values to 32 bit
// signed values. This is guaranteed to be safe because the "x"
// and "y" coordinate values are guaranteed to be representable
@@ -131,21 +131,21 @@
bool rotated = map[i++] > 0;
// Bitmaps should never be null, we're just extra paranoid
- if (!pixelRef) continue;
+ if (!bitmap) continue;
const UvMapper mapper(
- x / width, (x + pixelRef->info().width()) / width,
- y / height, (y + pixelRef->info().height()) / height);
+ x / width, (x + bitmap->width()) / width,
+ y / height, (y + bitmap->height()) / height);
Texture* texture = new DelegateTexture(caches, mTexture);
- texture->blend = !SkAlphaTypeIsOpaque(pixelRef->info().alphaType());
- texture->width = pixelRef->info().width();
- texture->height = pixelRef->info().height();
+ texture->blend = !bitmap->isOpaque();
+ texture->width = bitmap->width();
+ texture->height = bitmap->height();
- Entry* entry = new Entry(pixelRef, x, y, rotated, texture, mapper, *this);
+ Entry* entry = new Entry(bitmap, x, y, rotated, texture, mapper, *this);
texture->uvMapper = &entry->uvMapper;
- mEntries.add(entry->pixelRef, entry);
+ mEntries.add(entry->bitmap, entry);
}
}
diff --git a/libs/hwui/AssetAtlas.h b/libs/hwui/AssetAtlas.h
index 17c5281..1772eff 100644
--- a/libs/hwui/AssetAtlas.h
+++ b/libs/hwui/AssetAtlas.h
@@ -48,8 +48,24 @@
* Entry representing the position and rotation of a
* bitmap inside the atlas.
*/
- class Entry {
- public:
+ struct Entry {
+ /**
+ * The bitmap that generated this atlas entry.
+ */
+ SkBitmap* bitmap;
+
+ /**
+ * Location of the bitmap inside the atlas, in pixels.
+ */
+ int x;
+ int y;
+
+ /**
+ * If set, the bitmap is rotated 90 degrees (clockwise)
+ * inside the atlas.
+ */
+ bool rotated;
+
/*
* A "virtual texture" object that represents the texture
* this entry belongs to. This texture should never be
@@ -64,6 +80,11 @@
const UvMapper uvMapper;
/**
+ * Atlas this entry belongs to.
+ */
+ const AssetAtlas& atlas;
+
+ /**
* Unique identifier used to merge bitmaps and 9-patches stored
* in the atlas.
*/
@@ -72,37 +93,10 @@
}
private:
- /**
- * The pixel ref that generated this atlas entry.
- */
- SkPixelRef* pixelRef;
-
- /**
- * Location of the bitmap inside the atlas, in pixels.
- */
- int x;
- int y;
-
- /**
- * If set, the bitmap is rotated 90 degrees (clockwise)
- * inside the atlas.
- */
- bool rotated;
-
- /**
- * Atlas this entry belongs to.
- */
- const AssetAtlas& atlas;
-
- Entry(SkPixelRef* pixelRef, int x, int y, bool rotated,
- Texture* texture, const UvMapper& mapper, const AssetAtlas& atlas)
- : texture(texture)
- , uvMapper(mapper)
- , pixelRef(pixelRef)
- , x(x)
- , y(y)
- , rotated(rotated)
- , atlas(atlas) {
+ Entry(SkBitmap* bitmap, int x, int y, bool rotated,
+ Texture* texture, const UvMapper& mapper, const AssetAtlas& atlas):
+ bitmap(bitmap), x(x), y(y), rotated(rotated),
+ texture(texture), uvMapper(mapper), atlas(atlas) {
}
~Entry() {
@@ -184,7 +178,7 @@
const bool mBlendKey;
const bool mOpaqueKey;
- KeyedVector<const SkPixelRef*, Entry*> mEntries;
+ KeyedVector<const SkBitmap*, Entry*> mEntries;
}; // class AssetAtlas
}; // namespace uirenderer
diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h
index aa24673..7ad0683 100644
--- a/libs/hwui/Canvas.h
+++ b/libs/hwui/Canvas.h
@@ -29,7 +29,7 @@
public:
virtual ~Canvas() {};
- static Canvas* create_canvas(const SkBitmap& bitmap);
+ static Canvas* create_canvas(SkBitmap* bitmap);
/**
* Create a new Canvas object which delegates to an SkCanvas.
@@ -52,7 +52,7 @@
*/
virtual SkCanvas* asSkCanvas() = 0;
- virtual void setBitmap(const SkBitmap& bitmap) = 0;
+ virtual void setBitmap(SkBitmap* bitmap, bool copyState) = 0;
virtual bool isOpaque() = 0;
virtual int width() = 0;
@@ -87,8 +87,7 @@
virtual bool quickRejectRect(float left, float top, float right, float bottom) const = 0;
virtual bool quickRejectPath(const SkPath& path) const = 0;
- virtual bool clipRect(float left, float top, float right, float bottom,
- SkRegion::Op op = SkRegion::kIntersect_Op) = 0;
+ virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) = 0;
virtual bool clipPath(const SkPath* path, SkRegion::Op op) = 0;
virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) = 0;
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index ff698f5..53fd1ad 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -138,7 +138,7 @@
// ----------------------------------------------------------------------------
virtual SkCanvas* asSkCanvas() override;
- virtual void setBitmap(const SkBitmap& bitmap) override {
+ virtual void setBitmap(SkBitmap* bitmap, bool copyState) override {
LOG_ALWAYS_FATAL("DisplayListRenderer is not backed by a bitmap.");
}
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index aa722d0..d06534e 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -1009,12 +1009,13 @@
TextureVertex::set(mesh++, r->left, r->bottom, u1, v2);
TextureVertex::set(mesh++, r->right, r->bottom, u2, v2);
}
+ Rect modelRect = Rect(rect.getWidth(), rect.getHeight());
Glop glop;
GlopBuilder(mRenderState, mCaches, &glop)
.setMeshTexturedIndexedQuads(&quadVertices[0], count * 6)
.setFillLayer(layer->getTexture(), layer->getColorFilter(), getLayerAlpha(layer), layer->getMode(), Blend::ModeOrderSwap::NoSwap)
.setTransform(currentSnapshot()->getOrthoMatrix(), *currentTransform(), false)
- .setModelViewOffsetRectSnap(0, 0, rect)
+ .setModelViewOffsetRectSnap(rect.left, rect.top, modelRect)
.setRoundRectClipState(currentSnapshot()->roundRectClipState)
.build();
DRAW_DOUBLE_STENCIL_IF(!layer->hasDrawnSinceUpdate, renderGlop(glop));
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index a323065..8b11757 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -31,7 +31,7 @@
// Holds an SkCanvas reference plus additional native data.
class SkiaCanvas : public Canvas {
public:
- explicit SkiaCanvas(const SkBitmap& bitmap);
+ explicit SkiaCanvas(SkBitmap* bitmap);
/**
* Create a new SkiaCanvas.
@@ -49,7 +49,7 @@
return mCanvas.get();
}
- virtual void setBitmap(const SkBitmap& bitmap) override;
+ virtual void setBitmap(SkBitmap* bitmap, bool copyState) override;
virtual bool isOpaque() override;
virtual int width() override;
@@ -145,7 +145,19 @@
SkAutoTDelete<SkDeque> mSaveStack; // lazily allocated, tracks partial saves.
};
-Canvas* Canvas::create_canvas(const SkBitmap& bitmap) {
+// Construct an SkCanvas from the bitmap.
+static SkCanvas* createCanvas(SkBitmap* bitmap) {
+ if (bitmap) {
+ return SkNEW_ARGS(SkCanvas, (*bitmap));
+ }
+
+ // Create an empty bitmap device to prevent callers from crashing
+ // if they attempt to draw into this canvas.
+ SkBitmap emptyBitmap;
+ return new SkCanvas(emptyBitmap);
+}
+
+Canvas* Canvas::create_canvas(SkBitmap* bitmap) {
return new SkiaCanvas(bitmap);
}
@@ -153,8 +165,8 @@
return new SkiaCanvas(skiaCanvas);
}
-SkiaCanvas::SkiaCanvas(const SkBitmap& bitmap) {
- mCanvas.reset(new SkCanvas(bitmap));
+SkiaCanvas::SkiaCanvas(SkBitmap* bitmap) {
+ mCanvas.reset(createCanvas(bitmap));
}
// ----------------------------------------------------------------------------
@@ -179,11 +191,11 @@
SkCanvas* m_dstCanvas;
};
-void SkiaCanvas::setBitmap(const SkBitmap& bitmap) {
- SkCanvas* newCanvas = new SkCanvas(bitmap);
+void SkiaCanvas::setBitmap(SkBitmap* bitmap, bool copyState) {
+ SkCanvas* newCanvas = createCanvas(bitmap);
SkASSERT(newCanvas);
- if (!bitmap.isNull()) {
+ if (copyState) {
// Copy the canvas matrix & clip state.
newCanvas->setMatrix(mCanvas->getTotalMatrix());
if (NULL != mCanvas->getDevice() && NULL != newCanvas->getDevice()) {
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index d15fa39..cc87241 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -293,11 +293,11 @@
return (void*) success;
}
-bool RenderProxy::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap& bitmap) {
+bool RenderProxy::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) {
SETUP_TASK(copyLayerInto);
args->context = mContext;
args->layer = layer;
- args->bitmap = &bitmap;
+ args->bitmap = bitmap;
return (bool) postAndWait(task);
}
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index cc475fa..29c6f08 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -83,7 +83,7 @@
ANDROID_API DeferredLayerUpdater* createTextureLayer();
ANDROID_API void buildLayer(RenderNode* node);
- ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap& bitmap);
+ ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
ANDROID_API void pushLayerUpdate(DeferredLayerUpdater* layer);
ANDROID_API void cancelLayerUpdate(DeferredLayerUpdater* layer);
ANDROID_API void detachSurfaceTexture(DeferredLayerUpdater* layer);
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 9e1e055..3e771f4 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -901,21 +901,48 @@
* the parameters don't resolve to valid data and indexes.
* The number of bytes will not exceed sizeInBytes.
*/
- public int read(byte[] audioData, int offsetInBytes, int sizeInBytes) {
- if (mState != STATE_INITIALIZED) {
+ public int read(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes) {
+ return read(audioData, offsetInBytes, sizeInBytes, READ_BLOCKING);
+ }
+
+ /**
+ * Reads audio data from the audio hardware for recording into a byte array.
+ * The format specified in the AudioRecord constructor should be
+ * {@link AudioFormat#ENCODING_PCM_8BIT} to correspond to the data in the array.
+ * @param audioData the array to which the recorded audio data is written.
+ * @param offsetInBytes index in audioData from which the data is written expressed in bytes.
+ * @param sizeInBytes the number of requested bytes.
+ * @param readMode one of {@link #READ_BLOCKING}, {@link #READ_NON_BLOCKING}.
+ * <br>With {@link #READ_BLOCKING}, the read will block until all the requested data
+ * is read.
+ * <br>With {@link #READ_NON_BLOCKING}, the read will return immediately after
+ * reading as much audio data as possible without blocking.
+ * @return the number of bytes that were read or {@link #ERROR_INVALID_OPERATION}
+ * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if
+ * the parameters don't resolve to valid data and indexes.
+ * The number of bytes will not exceed sizeInBytes.
+ */
+ public int read(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes,
+ @ReadMode int readMode) {
+ if (mState != STATE_INITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) {
return ERROR_INVALID_OPERATION;
}
+ if ((readMode != READ_BLOCKING) && (readMode != READ_NON_BLOCKING)) {
+ Log.e(TAG, "AudioRecord.read() called with invalid blocking mode");
+ return ERROR_BAD_VALUE;
+ }
+
if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0)
|| (offsetInBytes + sizeInBytes < 0) // detect integer overflow
|| (offsetInBytes + sizeInBytes > audioData.length)) {
return ERROR_BAD_VALUE;
}
- return native_read_in_byte_array(audioData, offsetInBytes, sizeInBytes);
+ return native_read_in_byte_array(audioData, offsetInBytes, sizeInBytes,
+ readMode == READ_BLOCKING);
}
-
/**
* Reads audio data from the audio hardware for recording into a short array.
* The format specified in the AudioRecord constructor should be
@@ -928,18 +955,46 @@
* the parameters don't resolve to valid data and indexes.
* The number of shorts will not exceed sizeInShorts.
*/
- public int read(short[] audioData, int offsetInShorts, int sizeInShorts) {
- if (mState != STATE_INITIALIZED) {
+ public int read(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts) {
+ return read(audioData, offsetInShorts, sizeInShorts, READ_BLOCKING);
+ }
+
+ /**
+ * Reads audio data from the audio hardware for recording into a short array.
+ * The format specified in the AudioRecord constructor should be
+ * {@link AudioFormat#ENCODING_PCM_16BIT} to correspond to the data in the array.
+ * @param audioData the array to which the recorded audio data is written.
+ * @param offsetInShorts index in audioData from which the data is written expressed in shorts.
+ * @param sizeInShorts the number of requested shorts.
+ * @param readMode one of {@link #READ_BLOCKING}, {@link #READ_NON_BLOCKING}.
+ * <br>With {@link #READ_BLOCKING}, the read will block until all the requested data
+ * is read.
+ * <br>With {@link #READ_NON_BLOCKING}, the read will return immediately after
+ * reading as much audio data as possible without blocking.
+ * @return the number of shorts that were read or {@link #ERROR_INVALID_OPERATION}
+ * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if
+ * the parameters don't resolve to valid data and indexes.
+ * The number of shorts will not exceed sizeInShorts.
+ */
+ public int read(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts,
+ @ReadMode int readMode) {
+ if (mState != STATE_INITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) {
return ERROR_INVALID_OPERATION;
}
+ if ((readMode != READ_BLOCKING) && (readMode != READ_NON_BLOCKING)) {
+ Log.e(TAG, "AudioRecord.read() called with invalid blocking mode");
+ return ERROR_BAD_VALUE;
+ }
+
if ( (audioData == null) || (offsetInShorts < 0 ) || (sizeInShorts < 0)
|| (offsetInShorts + sizeInShorts < 0) // detect integer overflow
|| (offsetInShorts + sizeInShorts > audioData.length)) {
return ERROR_BAD_VALUE;
}
- return native_read_in_short_array(audioData, offsetInShorts, sizeInShorts);
+ return native_read_in_short_array(audioData, offsetInShorts, sizeInShorts,
+ readMode == READ_BLOCKING);
}
/**
@@ -950,22 +1005,33 @@
* @param offsetInFloats index in audioData from which the data is written.
* @param sizeInFloats the number of requested floats.
* @param readMode one of {@link #READ_BLOCKING}, {@link #READ_NON_BLOCKING}.
- * <BR>With {@link #READ_BLOCKING}, the read will block until all the requested data
+ * <br>With {@link #READ_BLOCKING}, the read will block until all the requested data
* is read.
- * <BR>With {@link #READ_NON_BLOCKING}, the read will return immediately after
+ * <br>With {@link #READ_NON_BLOCKING}, the read will return immediately after
* reading as much audio data as possible without blocking.
* @return the number of floats that were read or {@link #ERROR_INVALID_OPERATION}
* if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if
* the parameters don't resolve to valid data and indexes.
* The number of floats will not exceed sizeInFloats.
*/
- public int read(float[] audioData, int offsetInFloats, int sizeInFloats,
+ public int read(@NonNull float[] audioData, int offsetInFloats, int sizeInFloats,
@ReadMode int readMode) {
- if (mState != STATE_INITIALIZED) {
+ if (mState == STATE_UNINITIALIZED) {
+ Log.e(TAG, "AudioRecord.read() called in invalid state STATE_UNINITIALIZED");
return ERROR_INVALID_OPERATION;
}
- if ( (audioData == null) || (offsetInFloats < 0 ) || (sizeInFloats < 0)
+ if (mAudioFormat != AudioFormat.ENCODING_PCM_FLOAT) {
+ Log.e(TAG, "AudioRecord.read(float[] ...) requires format ENCODING_PCM_FLOAT");
+ return ERROR_INVALID_OPERATION;
+ }
+
+ if ((readMode != READ_BLOCKING) && (readMode != READ_NON_BLOCKING)) {
+ Log.e(TAG, "AudioRecord.read() called with invalid blocking mode");
+ return ERROR_BAD_VALUE;
+ }
+
+ if ((audioData == null) || (offsetInFloats < 0) || (sizeInFloats < 0)
|| (offsetInFloats + sizeInFloats < 0) // detect integer overflow
|| (offsetInFloats + sizeInFloats > audioData.length)) {
return ERROR_BAD_VALUE;
@@ -992,19 +1058,49 @@
* The number of bytes will not exceed sizeInBytes.
* The number of bytes read will truncated to be a multiple of the frame size.
*/
- public int read(ByteBuffer audioBuffer, int sizeInBytes) {
+ public int read(@NonNull ByteBuffer audioBuffer, int sizeInBytes) {
+ return read(audioBuffer, sizeInBytes, READ_BLOCKING);
+ }
+
+ /**
+ * Reads audio data from the audio hardware for recording into a direct buffer. If this buffer
+ * is not a direct buffer, this method will always return 0.
+ * Note that the value returned by {@link java.nio.Buffer#position()} on this buffer is
+ * unchanged after a call to this method.
+ * The representation of the data in the buffer will depend on the format specified in
+ * the AudioRecord constructor, and will be native endian.
+ * @param audioBuffer the direct buffer to which the recorded audio data is written.
+ * @param sizeInBytes the number of requested bytes. It is recommended but not enforced
+ * that the number of bytes requested be a multiple of the frame size (sample size in
+ * bytes multiplied by the channel count).
+ * @param readMode one of {@link #READ_BLOCKING}, {@link #READ_NON_BLOCKING}.
+ * <br>With {@link #READ_BLOCKING}, the read will block until all the requested data
+ * is read.
+ * <br>With {@link #READ_NON_BLOCKING}, the read will return immediately after
+ * reading as much audio data as possible without blocking.
+ * @return the number of bytes that were read or {@link #ERROR_INVALID_OPERATION}
+ * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if
+ * the parameters don't resolve to valid data and indexes.
+ * The number of bytes will not exceed sizeInBytes.
+ * The number of bytes read will truncated to be a multiple of the frame size.
+ */
+ public int read(@NonNull ByteBuffer audioBuffer, int sizeInBytes, @ReadMode int readMode) {
if (mState != STATE_INITIALIZED) {
return ERROR_INVALID_OPERATION;
}
+ if ((readMode != READ_BLOCKING) && (readMode != READ_NON_BLOCKING)) {
+ Log.e(TAG, "AudioRecord.read() called with invalid blocking mode");
+ return ERROR_BAD_VALUE;
+ }
+
if ( (audioBuffer == null) || (sizeInBytes < 0) ) {
return ERROR_BAD_VALUE;
}
- return native_read_in_direct_buffer(audioBuffer, sizeInBytes);
+ return native_read_in_direct_buffer(audioBuffer, sizeInBytes, readMode == READ_BLOCKING);
}
-
//--------------------------------------------------------------------------
// Initialization / configuration
//--------------------
@@ -1186,15 +1282,16 @@
private native final void native_stop();
private native final int native_read_in_byte_array(byte[] audioData,
- int offsetInBytes, int sizeInBytes);
+ int offsetInBytes, int sizeInBytes, boolean isBlocking);
private native final int native_read_in_short_array(short[] audioData,
- int offsetInShorts, int sizeInShorts);
+ int offsetInShorts, int sizeInShorts, boolean isBlocking);
private native final int native_read_in_float_array(float[] audioData,
int offsetInFloats, int sizeInFloats, boolean isBlocking);
- private native final int native_read_in_direct_buffer(Object jBuffer, int sizeInBytes);
+ private native final int native_read_in_direct_buffer(Object jBuffer,
+ int sizeInBytes, boolean isBlocking);
private native final int native_get_native_frame_count();
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index fac69ea..44455fa 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -1540,6 +1540,8 @@
/**
* Writes the audio data to the audio sink for playback (streaming mode),
* or copies audio data for later playback (static buffer mode).
+ * The format specified in the AudioTrack constructor should be
+ * {@link AudioFormat#ENCODING_PCM_8BIT} to correspond to the data in the array.
* In streaming mode, will block until all data has been written to the audio sink.
* In static buffer mode, copies the data to the buffer starting at offset 0.
* Note that the actual playback of this data might occur after this function
@@ -1556,13 +1558,49 @@
* {@link AudioManager#ERROR_DEAD_OBJECT} if the AudioTrack is not valid anymore and
* needs to be recreated.
*/
+ public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes) {
+ return write(audioData, offsetInBytes, sizeInBytes, WRITE_BLOCKING);
+ }
- public int write(byte[] audioData, int offsetInBytes, int sizeInBytes) {
+ /**
+ * Writes the audio data to the audio sink for playback (streaming mode),
+ * or copies audio data for later playback (static buffer mode).
+ * The format specified in the AudioTrack constructor should be
+ * {@link AudioFormat#ENCODING_PCM_8BIT} to correspond to the data in the array.
+ * In streaming mode, will block until all data has been written to the audio sink.
+ * In static buffer mode, copies the data to the buffer starting at offset 0.
+ * Note that the actual playback of this data might occur after this function
+ * returns. This function is thread safe with respect to {@link #stop} calls,
+ * in which case all of the specified data might not be written to the audio sink.
+ *
+ * @param audioData the array that holds the data to play.
+ * @param offsetInBytes the offset expressed in bytes in audioData where the data to play
+ * starts.
+ * @param sizeInBytes the number of bytes to read in audioData after the offset.
+ * @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. It has no
+ * effect in static mode.
+ * <br>With {@link #WRITE_BLOCKING}, the write will block until all data has been written
+ * to the audio sink.
+ * <br>With {@link #WRITE_NON_BLOCKING}, the write will return immediately after
+ * queuing as much audio data for playback as possible without blocking.
+ * @return the number of bytes that were written or {@link #ERROR_INVALID_OPERATION}
+ * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if
+ * the parameters don't resolve to valid data and indexes, or
+ * {@link AudioManager#ERROR_DEAD_OBJECT} if the AudioTrack is not valid anymore and
+ * needs to be recreated.
+ */
+ public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes,
+ @WriteMode int writeMode) {
if (mState == STATE_UNINITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) {
return ERROR_INVALID_OPERATION;
}
+ if ((writeMode != WRITE_BLOCKING) && (writeMode != WRITE_NON_BLOCKING)) {
+ Log.e(TAG, "AudioTrack.write() called with invalid blocking mode");
+ return ERROR_BAD_VALUE;
+ }
+
if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0)
|| (offsetInBytes + sizeInBytes < 0) // detect integer overflow
|| (offsetInBytes + sizeInBytes > audioData.length)) {
@@ -1570,7 +1608,7 @@
}
int ret = native_write_byte(audioData, offsetInBytes, sizeInBytes, mAudioFormat,
- true /*isBlocking*/);
+ writeMode == WRITE_BLOCKING);
if ((mDataLoadMode == MODE_STATIC)
&& (mState == STATE_NO_STATIC_DATA)
@@ -1582,10 +1620,11 @@
return ret;
}
-
/**
* Writes the audio data to the audio sink for playback (streaming mode),
* or copies audio data for later playback (static buffer mode).
+ * The format specified in the AudioTrack constructor should be
+ * {@link AudioFormat#ENCODING_PCM_16BIT} to correspond to the data in the array.
* In streaming mode, will block until all data has been written to the audio sink.
* In static buffer mode, copies the data to the buffer starting at offset 0.
* Note that the actual playback of this data might occur after this function
@@ -1602,20 +1641,57 @@
* {@link AudioManager#ERROR_DEAD_OBJECT} if the AudioTrack is not valid anymore and
* needs to be recreated.
*/
+ public int write(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts) {
+ return write(audioData, offsetInShorts, sizeInShorts, WRITE_BLOCKING);
+ }
- public int write(short[] audioData, int offsetInShorts, int sizeInShorts) {
+ /**
+ * Writes the audio data to the audio sink for playback (streaming mode),
+ * or copies audio data for later playback (static buffer mode).
+ * The format specified in the AudioTrack constructor should be
+ * {@link AudioFormat#ENCODING_PCM_16BIT} to correspond to the data in the array.
+ * In streaming mode, will block until all data has been written to the audio sink.
+ * In static buffer mode, copies the data to the buffer starting at offset 0.
+ * Note that the actual playback of this data might occur after this function
+ * returns. This function is thread safe with respect to {@link #stop} calls,
+ * in which case all of the specified data might not be written to the audio sink.
+ *
+ * @param audioData the array that holds the data to play.
+ * @param offsetInShorts the offset expressed in shorts in audioData where the data to play
+ * starts.
+ * @param sizeInShorts the number of shorts to read in audioData after the offset.
+ * @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. It has no
+ * effect in static mode.
+ * <br>With {@link #WRITE_BLOCKING}, the write will block until all data has been written
+ * to the audio sink.
+ * <br>With {@link #WRITE_NON_BLOCKING}, the write will return immediately after
+ * queuing as much audio data for playback as possible without blocking.
+ * @return the number of shorts that were written or {@link #ERROR_INVALID_OPERATION}
+ * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if
+ * the parameters don't resolve to valid data and indexes, or
+ * {@link AudioManager#ERROR_DEAD_OBJECT} if the AudioTrack is not valid anymore and
+ * needs to be recreated.
+ */
+ public int write(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts,
+ @WriteMode int writeMode) {
if (mState == STATE_UNINITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) {
return ERROR_INVALID_OPERATION;
}
+ if ((writeMode != WRITE_BLOCKING) && (writeMode != WRITE_NON_BLOCKING)) {
+ Log.e(TAG, "AudioTrack.write() called with invalid blocking mode");
+ return ERROR_BAD_VALUE;
+ }
+
if ( (audioData == null) || (offsetInShorts < 0 ) || (sizeInShorts < 0)
|| (offsetInShorts + sizeInShorts < 0) // detect integer overflow
|| (offsetInShorts + sizeInShorts > audioData.length)) {
return ERROR_BAD_VALUE;
}
- int ret = native_write_short(audioData, offsetInShorts, sizeInShorts, mAudioFormat);
+ int ret = native_write_short(audioData, offsetInShorts, sizeInShorts, mAudioFormat,
+ writeMode == WRITE_BLOCKING);
if ((mDataLoadMode == MODE_STATIC)
&& (mState == STATE_NO_STATIC_DATA)
@@ -1627,10 +1703,11 @@
return ret;
}
-
/**
* Writes the audio data to the audio sink for playback (streaming mode),
* or copies audio data for later playback (static buffer mode).
+ * The format specified in the AudioTrack constructor should be
+ * {@link AudioFormat#ENCODING_PCM_FLOAT} to correspond to the data in the array.
* In static buffer mode, copies the data to the buffer starting at offset 0,
* and the write mode is ignored.
* In streaming mode, the blocking behavior will depend on the write mode.
@@ -1654,9 +1731,9 @@
* @param sizeInFloats the number of floats to read in audioData after the offset.
* @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. It has no
* effect in static mode.
- * <BR>With {@link #WRITE_BLOCKING}, the write will block until all data has been written
+ * <br>With {@link #WRITE_BLOCKING}, the write will block until all data has been written
* to the audio sink.
- * <BR>With {@link #WRITE_NON_BLOCKING}, the write will return immediately after
+ * <br>With {@link #WRITE_NON_BLOCKING}, the write will return immediately after
* queuing as much audio data for playback as possible without blocking.
* @return the number of floats that were written, or {@link #ERROR_INVALID_OPERATION}
* if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if
@@ -1664,7 +1741,7 @@
* {@link AudioManager#ERROR_DEAD_OBJECT} if the AudioTrack is not valid anymore and
* needs to be recreated.
*/
- public int write(float[] audioData, int offsetInFloats, int sizeInFloats,
+ public int write(@NonNull float[] audioData, int offsetInFloats, int sizeInFloats,
@WriteMode int writeMode) {
if (mState == STATE_UNINITIALIZED) {
@@ -1727,7 +1804,7 @@
* {@link AudioManager#ERROR_DEAD_OBJECT} if the AudioTrack is not valid anymore and
* needs to be recreated.
*/
- public int write(ByteBuffer audioData, int sizeInBytes,
+ public int write(@NonNull ByteBuffer audioData, int sizeInBytes,
@WriteMode int writeMode) {
if (mState == STATE_UNINITIALIZED) {
@@ -1851,6 +1928,39 @@
return err == 0 ? SUCCESS : ERROR;
}
+ //--------------------------------------------------------------------------
+ // Explicit Routing
+ //--------------------
+ private AudioDeviceInfo mPreferredDevice = null;
+
+ /**
+ * Specifies an audio device (via and {@link AudioDeviceInfo} object) to route
+ * the output from this AudioTrack.
+ * @param deviceSpec The {@link AudioDeviceInfo} specifying the physical audio device.
+ * If deviceSpec is null, default routing is restored.
+ * @return true if succesful, false if the specified {@link AudioDeviceInfo} is non-null and
+ * does not correspond to a valid audio output device.
+ */
+ public boolean setPreferredOutputDevice(AudioDeviceInfo deviceSpec) {
+ // Do some validation....
+ if (deviceSpec != null && !deviceSpec.isSink()) {
+ return false;
+ }
+
+ mPreferredDevice = deviceSpec;
+ int routingDeviceId = mPreferredDevice != null ? deviceSpec.getId() : 0;
+
+ return native_setOutputDevice(routingDeviceId);
+ }
+
+ /**
+ * Returns the selected output specified by {@link #setPreferredOutputDevice}. Note that this
+ * is not guarenteed to correspond to the actual device being used for playback.
+ */
+ public AudioDeviceInfo getPreferredOutputDevice() {
+ return mPreferredDevice;
+ }
+
//---------------------------------------------------------
// Interface definitions
//--------------------
@@ -1984,7 +2094,8 @@
boolean isBlocking);
private native final int native_write_short(short[] audioData,
- int offsetInShorts, int sizeInShorts, int format);
+ int offsetInShorts, int sizeInShorts, int format,
+ boolean isBlocking);
private native final int native_write_float(float[] audioData,
int offsetInFloats, int sizeInFloats, int format,
@@ -2027,6 +2138,8 @@
private native final int native_attachAuxEffect(int effectId);
private native final int native_setAuxEffectSendLevel(float level);
+ private native final boolean native_setOutputDevice(int deviceId);
+
//---------------------------------------------------------
// Utility methods
//------------------
diff --git a/media/java/android/media/DataSource.java b/media/java/android/media/DataSource.java
deleted file mode 100644
index 347bd5f..0000000
--- a/media/java/android/media/DataSource.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package android.media;
-
-import java.io.Closeable;
-
-/**
- * An abstraction for a media data source, e.g. a file or an http stream
- * {@hide}
- */
-public interface DataSource extends Closeable {
- /**
- * Reads data from the data source at the requested position
- *
- * @param offset where in the source to read
- * @param buffer the buffer to read the data into
- * @param size how many bytes to read
- * @return the number of bytes read, or -1 if there was an error
- */
- public int readAt(long offset, byte[] buffer, int size);
-
- /**
- * Gets the size of the data source.
- *
- * @return size of data source, or -1 if the length is unknown
- */
- public long getSize();
-}
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 59fccda..d82afdf 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -669,10 +669,10 @@
* Thrown when an internal codec error occurs.
*/
public final static class CodecException extends IllegalStateException {
- CodecException(int errorCode, int actionCode, String detailMessage) {
+ CodecException(int errorCode, int actionCode, String detailMessage, int reason) {
super(detailMessage);
mErrorCode = errorCode;
- mReason = REASON_HARDWARE;
+ mReason = reason;
mActionCode = actionCode;
// TODO get this from codec
diff --git a/media/java/android/media/MediaDataSource.java b/media/java/android/media/MediaDataSource.java
new file mode 100644
index 0000000..246c0ef
--- /dev/null
+++ b/media/java/android/media/MediaDataSource.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package android.media;
+
+import java.io.Closeable;
+
+/**
+ * For supplying media data to the framework. Implement this if your app has
+ * special requirements for the way media data is obtained.
+ *
+ * <p class="note">Methods of this interface may be called on multiple different
+ * threads. There will be a thread synchronization point between each call to ensure that
+ * modifications to the state of your MediaDataSource are visible to future calls. This means
+ * you don't need to do your own synchronization unless you're modifying the
+ * MediaDataSource from another thread while it's being used by the framework.</p>
+ */
+public interface MediaDataSource extends Closeable {
+ /**
+ * Called to request data from the given position.
+ *
+ * Implementations should should write up to {@code size} bytes into
+ * {@code buffer}, and return the number of bytes written.
+ *
+ * Return {@code 0} to indicate that {@code position} is at, or beyond, the
+ * end of the source.
+ *
+ * Return {@code -1} to indicate that a fatal error occurred. The failed
+ * read will not be retried, so transient errors should be handled
+ * internally.
+ *
+ * Throwing an exception from this method will have the same effect as
+ * returning {@code -1}.
+ *
+ * @param position the position in the data source to read from.
+ * @param buffer the buffer to read the data into.
+ * @param size the number of bytes to read.
+ * @return the number of bytes read, or -1 if there was an error.
+ */
+ public int readAt(long position, byte[] buffer, int size);
+
+ /**
+ * Called to get the size of the data source.
+ *
+ * @return the size of data source in bytes, or -1 if the size is unknown.
+ */
+ public long getSize();
+}
diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java
index b23b540..b4acbc0 100644
--- a/media/java/android/media/MediaExtractor.java
+++ b/media/java/android/media/MediaExtractor.java
@@ -66,10 +66,11 @@
}
/**
- * Sets the DataSource object to be used as the data source for this extractor
- * {@hide}
+ * Sets the data source (MediaDataSource) to use.
+ *
+ * @param dataSource the MediaDataSource for the media you want to extract from
*/
- public native final void setDataSource(DataSource source) throws IOException;
+ public native final void setDataSource(MediaDataSource dataSource) throws IllegalArgumentException, IOException;
/**
* Sets the data source as a content Uri.
diff --git a/media/java/android/media/MediaHTTPConnection.java b/media/java/android/media/MediaHTTPConnection.java
index b2886bb..541d871 100644
--- a/media/java/android/media/MediaHTTPConnection.java
+++ b/media/java/android/media/MediaHTTPConnection.java
@@ -32,6 +32,7 @@
import java.net.MalformedURLException;
import java.net.NoRouteToHostException;
import java.net.ProtocolException;
+import java.net.UnknownServiceException;
import java.util.HashMap;
import java.util.Map;
@@ -337,7 +338,10 @@
} catch (NoRouteToHostException e) {
Log.w(TAG, "readAt " + offset + " / " + size + " => " + e);
return MEDIA_ERROR_UNSUPPORTED;
- } catch (IOException e) {
+ } catch (UnknownServiceException e) {
+ Log.w(TAG, "readAt " + offset + " / " + size + " => " + e);
+ return MEDIA_ERROR_UNSUPPORTED;
+ }catch (IOException e) {
if (VERBOSE) {
Log.d(TAG, "readAt " + offset + " / " + size + " => -1");
}
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index 9aa8003..a3ff080 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -203,7 +203,20 @@
}
/**
- * Call this method after setDataSource(). This method retrieves the
+ * Sets the data source (MediaDataSource) to use.
+ *
+ * @param dataSource the MediaDataSource for the media you want to play
+ */
+ public void setDataSource(MediaDataSource dataSource)
+ throws IllegalArgumentException {
+ _setDataSource(dataSource);
+ }
+
+ private native void _setDataSource(MediaDataSource dataSource)
+ throws IllegalArgumentException;
+
+ /**
+ * Call this method after setDataSource(). This method retrieves the
* meta data value associated with the keyCode.
*
* The keyCode currently supported is listed below as METADATA_XXX
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 83954ae..210d08f 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -181,7 +181,8 @@
* {@link #setDataSource(FileDescriptor)}, or
* {@link #setDataSource(String)}, or
* {@link #setDataSource(Context, Uri)}, or
- * {@link #setDataSource(FileDescriptor, long, long)} transfers a
+ * {@link #setDataSource(FileDescriptor, long, long)}, or
+ * {@link #setDataSource(MediaDataSource)} transfers a
* MediaPlayer object in the <em>Idle</em> state to the
* <em>Initialized</em> state.
* <ul>
@@ -1127,6 +1128,20 @@
throws IOException, IllegalArgumentException, IllegalStateException;
/**
+ * Sets the data source (MediaDataSource) to use.
+ *
+ * @param dataSource the MediaDataSource for the media you want to play
+ * @throws IllegalStateException if it is called in an invalid state
+ */
+ public void setDataSource(MediaDataSource dataSource)
+ throws IllegalArgumentException, IllegalStateException {
+ _setDataSource(dataSource);
+ }
+
+ private native void _setDataSource(MediaDataSource dataSource)
+ throws IllegalArgumentException, IllegalStateException;
+
+ /**
* Prepares the player for playback, synchronously.
*
* After setting the datasource and the display surface, you need to either
@@ -1822,6 +1837,7 @@
public static final int MEDIA_TRACK_TYPE_AUDIO = 2;
public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3;
public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4;
+ public static final int MEDIA_TRACK_TYPE_METADATA = 5;
final int mTrackType;
final MediaFormat mFormat;
@@ -2562,6 +2578,7 @@
private static final int MEDIA_ERROR = 100;
private static final int MEDIA_INFO = 200;
private static final int MEDIA_SUBTITLE_DATA = 201;
+ private static final int MEDIA_META_DATA = 202;
private TimeProvider mTimeProvider;
@@ -2709,6 +2726,18 @@
}
return;
+ case MEDIA_META_DATA:
+ if (mOnTimedMetaDataListener == null) {
+ return;
+ }
+ if (msg.obj instanceof Parcel) {
+ Parcel parcel = (Parcel) msg.obj;
+ TimedMetaData data = TimedMetaData.createTimedMetaDataFromParcel(parcel);
+ parcel.recycle();
+ mOnTimedMetaDataListener.onTimedMetaData(mMediaPlayer, data);
+ }
+ return;
+
case MEDIA_NOP: // interface test message - ignore
break;
@@ -2945,6 +2974,46 @@
private OnSubtitleDataListener mOnSubtitleDataListener;
+ /**
+ * Interface definition of a callback to be invoked when a
+ * track has timed metadata available.
+ *
+ * @see MediaPlayer#setOnTimedMetaDataListener(OnTimedMetaDataListener)
+ */
+ public interface OnTimedMetaDataListener
+ {
+ /**
+ * Called to indicate avaliable timed metadata
+ * <p>
+ * This method will be called as timed metadata is extracted from the media,
+ * in the same order as it occurs in the media. The timing of this event is
+ * not controlled by the associated timestamp.
+ *
+ * @param mp the MediaPlayer associated with this callback
+ * @param data the timed metadata sample associated with this event
+ */
+ public void onTimedMetaData(MediaPlayer mp, TimedMetaData data);
+ }
+
+ /**
+ * Register a callback to be invoked when a selected track has timed metadata available.
+ * <p>
+ * Currently only HTTP live streaming data URI's embedded with timed ID3 tags generates
+ * {@link TimedMetaData}.
+ *
+ * @see MediaPlayer#selectTrack(int)
+ * @see MediaPlayer.OnTimedMetaDataListener
+ * @see TimedMetaData
+ *
+ * @param listener the callback that will be run
+ */
+ public void setOnTimedMetaDataListener(OnTimedMetaDataListener listener)
+ {
+ mOnTimedMetaDataListener = listener;
+ }
+
+ private OnTimedMetaDataListener mOnTimedMetaDataListener;
+
/* Do not change these values without updating their counterparts
* in include/media/mediaplayer.h!
*/
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index c227eb7..a046512 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -18,6 +18,7 @@
import android.Manifest;
import android.annotation.DrawableRes;
+import android.annotation.NonNull;
import android.app.ActivityThread;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -882,8 +883,12 @@
* @param types type flags indicating which types this route should be used for.
* The route must support at least a subset.
* @param route Route to select
+ * @throws IllegalArgumentException if the given route is {@code null}
*/
- public void selectRoute(int types, RouteInfo route) {
+ public void selectRoute(int types, @NonNull RouteInfo route) {
+ if (route == null) {
+ throw new IllegalArgumentException("Route cannot be null.");
+ }
selectRouteStatic(types, route, true);
}
@@ -894,7 +899,8 @@
selectRouteStatic(types, route, explicit);
}
- static void selectRouteStatic(int types, RouteInfo route, boolean explicit) {
+ static void selectRouteStatic(int types, @NonNull RouteInfo route, boolean explicit) {
+ assert(route != null);
final RouteInfo oldRoute = sStatic.mSelectedRoute;
if (oldRoute == route) return;
if (!route.matchesTypes(types)) {
@@ -917,7 +923,7 @@
final WifiDisplay activeDisplay =
sStatic.mDisplayService.getWifiDisplayStatus().getActiveDisplay();
final boolean oldRouteHasAddress = oldRoute != null && oldRoute.mDeviceAddress != null;
- final boolean newRouteHasAddress = route != null && route.mDeviceAddress != null;
+ final boolean newRouteHasAddress = route.mDeviceAddress != null;
if (activeDisplay != null || oldRouteHasAddress || newRouteHasAddress) {
if (newRouteHasAddress && !matchesDeviceAddress(activeDisplay, route)) {
if (sStatic.mCanConfigureWifiDisplays) {
diff --git a/media/java/android/media/MediaSync.java b/media/java/android/media/MediaSync.java
index 7350bd4..9446c0c 100644
--- a/media/java/android/media/MediaSync.java
+++ b/media/java/android/media/MediaSync.java
@@ -43,9 +43,9 @@
* // MediaCodec videoDecoder = ...;
* videoDecoder.configure(format, inputSurface, ...);
* ...
- * sync.configureAudioTrack(audioTrack, nativeSampleRateInHz);
+ * sync.configureAudioTrack(audioTrack);
* sync.setCallback(new MediaSync.Callback() {
- * \@Override
+ * {@literal @Override}
* public void onReturnAudioBuffer(MediaSync sync, ByteBuffer audioBuffer, int bufferIndex) {
* ...
* }
@@ -151,8 +151,6 @@
private Handler mCallbackHandler = null;
private MediaSync.Callback mCallback = null;
- private int mNativeSampleRateInHz = 0;
-
private Thread mAudioThread = null;
// Created on mAudioThread when mAudioThread is started. When used on user thread, they should
// be guarded by checking mAudioThread.
@@ -247,20 +245,17 @@
* Configures the audio track for MediaSync.
*
* @param audioTrack Specify an AudioTrack through which to render the audio data.
- * @throws IllegalArgumentException if the audioTrack has been released, or is invalid,
- * or nativeSampleRateInHz is invalid.
+ * @throws IllegalArgumentException if the audioTrack has been released, or is invalid.
* @throws IllegalStateException if not in the Initialized state, or another audio track
* has already been configured.
*/
- public void configureAudioTrack(AudioTrack audioTrack, int nativeSampleRateInHz) {
- if (audioTrack != null && nativeSampleRateInHz <= 0) {
- final String msg = "Native sample rate " + nativeSampleRateInHz + " is invalid";
- throw new IllegalArgumentException(msg);
- }
+ public void configureAudioTrack(AudioTrack audioTrack) {
+ // AudioTrack has sanity check for configured sample rate.
+ int nativeSampleRateInHz = (audioTrack == null ? 0 : audioTrack.getSampleRate());
+
native_configureAudioTrack(audioTrack, nativeSampleRateInHz);
mAudioTrack = audioTrack;
- mNativeSampleRateInHz = nativeSampleRateInHz;
- if (mAudioThread == null) {
+ if (audioTrack != null && mAudioThread == null) {
createAudioThread();
}
}
@@ -349,8 +344,9 @@
int status = AudioTrack.SUCCESS;
if (mAudioTrack != null) {
- int playbackSampleRate = (int)(rate * mNativeSampleRateInHz + 0.5);
- rate = playbackSampleRate / (float)mNativeSampleRateInHz;
+ int nativeSampleRateInHz = mAudioTrack.getSampleRate();
+ int playbackSampleRate = (int)(rate * nativeSampleRateInHz + 0.5);
+ rate = playbackSampleRate / (float)nativeSampleRateInHz;
try {
if (rate == 0.0) {
diff --git a/media/java/android/media/TimedMetaData.java b/media/java/android/media/TimedMetaData.java
new file mode 100644
index 0000000..dceb050
--- /dev/null
+++ b/media/java/android/media/TimedMetaData.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+package android.media;
+
+import android.os.Parcel;
+
+/**
+ * Class that embodies a piece of timed metadata, including
+ *
+ * <ul>
+ * <li> a time stamp, and </li>
+ * <li> raw uninterpreted byte-array extracted directly from the container. </li>
+ * </ul>
+ *
+ * @see MediaPlayer#setOnTimedMetaDataListener(android.media.MediaPlayer.OnTimedMetaDataListener)
+ */
+
+public class TimedMetaData {
+ private static final String TAG = "TimedMetaData";
+
+ private long mTimeUs;
+ private byte[] mRawData;
+
+ /**
+ * @hide
+ */
+ static TimedMetaData createTimedMetaDataFromParcel(Parcel parcel) {
+ return new TimedMetaData(parcel);
+ }
+
+ private TimedMetaData(Parcel parcel) {
+ if (!parseParcel(parcel)) {
+ throw new IllegalArgumentException("parseParcel() fails");
+ }
+ }
+
+ public long getTimeUs() {
+ return mTimeUs;
+ }
+
+ public byte[] getRawData() {
+ return mRawData;
+ }
+
+ private boolean parseParcel(Parcel parcel) {
+ parcel.setDataPosition(0);
+ if (parcel.dataAvail() == 0) {
+ return false;
+ }
+
+ mTimeUs = parcel.readLong();
+ mRawData = new byte[parcel.readInt()];
+ parcel.readByteArray(mRawData);
+
+ return true;
+ }
+}
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 936762c..8c61129a 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -833,7 +833,13 @@
}
}
- /** Column definitions for the TV programs table. */
+ /**
+ * Column definitions for the TV programs table.
+ * <p>
+ * By default, the query results will be sorted by {@link Programs#COLUMN_START_TIME_UTC_MILLIS}
+ * in ascending order.
+ * </p>
+ */
public static final class Programs implements BaseTvColumns {
/** The content:// style URI for this table. */
@@ -1233,6 +1239,10 @@
/**
* Column definitions for the TV programs that the user watched. Applications do not have access
* to this table.
+ * <p>
+ * By default, the query results will be sorted by
+ * {@link WatchedPrograms#COLUMN_WATCH_START_TIME_UTC_MILLIS} in descending order.
+ * </p>
* @hide
*/
@SystemApi
diff --git a/media/jni/Android.mk b/media/jni/Android.mk
index 66d055a..8cf9874 100644
--- a/media/jni/Android.mk
+++ b/media/jni/Android.mk
@@ -7,6 +7,7 @@
android_media_MediaCrypto.cpp \
android_media_MediaCodec.cpp \
android_media_MediaCodecList.cpp \
+ android_media_MediaDataSource.cpp \
android_media_MediaDrm.cpp \
android_media_MediaExtractor.cpp \
android_media_MediaHTTPConnection.cpp \
@@ -42,7 +43,7 @@
libusbhost \
libjhead \
libexif \
- libstagefright_amrnb_common
+ libstagefright_amrnb_common \
LOCAL_REQUIRED_MODULES := \
libjhead_jni
@@ -54,7 +55,6 @@
external/libexif/ \
external/tremor/Tremor \
frameworks/base/core/jni \
- frameworks/base/libs/hwui \
frameworks/av/media/libmedia \
frameworks/av/media/libstagefright \
frameworks/av/media/libstagefright/codecs/amrnb/enc/src \
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 16758d0..5f586a9 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -70,6 +70,11 @@
jint codecActionRecoverable;
} gCodecActionCodes;
+static struct ExceptionReason {
+ jint reasonHardware;
+ jint reasonReclaimed;
+} gExceptionReason;
+
struct fields_t {
jfieldID context;
jmethodID postEventFromNativeID;
@@ -568,7 +573,7 @@
env, env->FindClass("android/media/MediaCodec$CodecException"));
CHECK(clazz.get() != NULL);
- const jmethodID ctor = env->GetMethodID(clazz.get(), "<init>", "(IILjava/lang/String;)V");
+ const jmethodID ctor = env->GetMethodID(clazz.get(), "<init>", "(IILjava/lang/String;I)V");
CHECK(ctor != NULL);
ScopedLocalRef<jstring> msgObj(
@@ -587,7 +592,9 @@
break;
}
- return (jthrowable)env->NewObject(clazz.get(), ctor, err, actionCode, msgObj.get());
+ // TODO: propagate reason from MediaCodec.
+ int reason = gExceptionReason.reasonHardware;
+ return (jthrowable)env->NewObject(clazz.get(), ctor, err, actionCode, msgObj.get(), reason);
}
void JMediaCodec::handleCallback(const sp<AMessage> &msg) {
@@ -1454,6 +1461,16 @@
CHECK(field != NULL);
gCodecActionCodes.codecActionRecoverable =
env->GetStaticIntField(clazz.get(), field);
+
+ field = env->GetStaticFieldID(clazz.get(), "REASON_HARDWARE", "I");
+ CHECK(field != NULL);
+ gExceptionReason.reasonHardware =
+ env->GetStaticIntField(clazz.get(), field);
+
+ field = env->GetStaticFieldID(clazz.get(), "REASON_RECLAIMED", "I");
+ CHECK(field != NULL);
+ gExceptionReason.reasonReclaimed =
+ env->GetStaticIntField(clazz.get(), field);
}
static void android_media_MediaCodec_native_setup(
diff --git a/media/jni/android_media_MediaDataSource.cpp b/media/jni/android_media_MediaDataSource.cpp
new file mode 100644
index 0000000..1e6d2af
--- /dev/null
+++ b/media/jni/android_media_MediaDataSource.cpp
@@ -0,0 +1,148 @@
+/*
+ * 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "JMediaDataSource-JNI"
+#include <utils/Log.h>
+
+#include "android_media_MediaDataSource.h"
+
+#include "android_runtime/AndroidRuntime.h"
+#include "android_runtime/Log.h"
+#include "jni.h"
+#include "JNIHelp.h"
+
+#include <binder/MemoryDealer.h>
+#include <media/stagefright/foundation/ADebug.h>
+#include <nativehelper/ScopedLocalRef.h>
+
+namespace android {
+
+JMediaDataSource::JMediaDataSource(JNIEnv* env, jobject source)
+ : mJavaObjStatus(OK), mSizeIsCached(false), mCachedSize(0), mMemory(NULL) {
+ mMediaDataSourceObj = env->NewGlobalRef(source);
+ CHECK(mMediaDataSourceObj != NULL);
+
+ ScopedLocalRef<jclass> mediaDataSourceClass(env, env->GetObjectClass(mMediaDataSourceObj));
+ CHECK(mediaDataSourceClass.get() != NULL);
+
+ mReadMethod = env->GetMethodID(mediaDataSourceClass.get(), "readAt", "(J[BI)I");
+ CHECK(mReadMethod != NULL);
+ mGetSizeMethod = env->GetMethodID(mediaDataSourceClass.get(), "getSize", "()J");
+ CHECK(mGetSizeMethod != NULL);
+ mCloseMethod = env->GetMethodID(mediaDataSourceClass.get(), "close", "()V");
+ CHECK(mCloseMethod != NULL);
+
+ ScopedLocalRef<jbyteArray> tmp(env, env->NewByteArray(kBufferSize));
+ mByteArrayObj = (jbyteArray)env->NewGlobalRef(tmp.get());
+ CHECK(mByteArrayObj != NULL);
+
+ sp<MemoryDealer> memoryDealer = new MemoryDealer(kBufferSize, "JMediaDataSource");
+ mMemory = memoryDealer->allocate(kBufferSize);
+ if (mMemory == NULL) {
+ ALOGE("Failed to allocate memory!");
+ }
+}
+
+JMediaDataSource::~JMediaDataSource() {
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ env->DeleteGlobalRef(mMediaDataSourceObj);
+ env->DeleteGlobalRef(mByteArrayObj);
+}
+
+sp<IMemory> JMediaDataSource::getIMemory() {
+ Mutex::Autolock lock(mLock);
+ return mMemory;
+}
+
+ssize_t JMediaDataSource::readAt(off64_t offset, size_t size) {
+ Mutex::Autolock lock(mLock);
+
+ if (mJavaObjStatus != OK || mMemory == NULL) {
+ return -1;
+ }
+ if (size > kBufferSize) {
+ size = kBufferSize;
+ }
+
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ jint numread = env->CallIntMethod(mMediaDataSourceObj, mReadMethod,
+ (jlong)offset, mByteArrayObj, (jint)size);
+ if (env->ExceptionCheck()) {
+ ALOGW("An exception occurred in readAt()");
+ LOGW_EX(env);
+ env->ExceptionClear();
+ mJavaObjStatus = UNKNOWN_ERROR;
+ return -1;
+ }
+ if (numread < 0) {
+ ALOGW("An error occurred in readAt()");
+ mJavaObjStatus = UNKNOWN_ERROR;
+ return -1;
+ }
+ if ((size_t)numread > size) {
+ ALOGE("readAt read too many bytes.");
+ mJavaObjStatus = UNKNOWN_ERROR;
+ return -1;
+ }
+
+ ALOGV("readAt %lld / %zu => %d.", (long long)offset, size, numread);
+ env->GetByteArrayRegion(mByteArrayObj, 0, numread, (jbyte*)mMemory->pointer());
+ return numread;
+}
+
+status_t JMediaDataSource::getSize(off64_t* size) {
+ Mutex::Autolock lock(mLock);
+
+ if (mJavaObjStatus != OK) {
+ return UNKNOWN_ERROR;
+ }
+ if (mSizeIsCached) {
+ return mCachedSize;
+ }
+
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ *size = env->CallLongMethod(mMediaDataSourceObj, mGetSizeMethod);
+ if (env->ExceptionCheck()) {
+ ALOGW("An exception occurred in getSize()");
+ LOGW_EX(env);
+ env->ExceptionClear();
+ // After returning an error, size shouldn't be used by callers.
+ *size = UNKNOWN_ERROR;
+ mJavaObjStatus = UNKNOWN_ERROR;
+ return UNKNOWN_ERROR;
+ }
+
+ // The minimum size should be -1, which indicates unknown size.
+ if (*size < 0) {
+ *size = -1;
+ }
+
+ mCachedSize = *size;
+ mSizeIsCached = true;
+ return OK;
+}
+
+void JMediaDataSource::close() {
+ Mutex::Autolock lock(mLock);
+
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ env->CallVoidMethod(mMediaDataSourceObj, mCloseMethod);
+ // The closed state is effectively the same as an error state.
+ mJavaObjStatus = UNKNOWN_ERROR;
+}
+
+} // namespace android
diff --git a/media/jni/android_media_MediaDataSource.h b/media/jni/android_media_MediaDataSource.h
new file mode 100644
index 0000000..2bc237e
--- /dev/null
+++ b/media/jni/android_media_MediaDataSource.h
@@ -0,0 +1,73 @@
+/*
+ * 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 _ANDROID_MEDIA_MEDIADATASOURCE_H_
+#define _ANDROID_MEDIA_MEDIADATASOURCE_H_
+
+#include "jni.h"
+
+#include <media/IDataSource.h>
+#include <media/stagefright/foundation/ABase.h>
+#include <utils/Errors.h>
+#include <utils/Mutex.h>
+
+namespace android {
+
+// The native counterpart to a Java android.media.MediaDataSource. It inherits from
+// IDataSource so that it can be accessed remotely.
+//
+// If the java DataSource returns an error or throws an exception it
+// will be considered to be in a broken state, and the only further call this
+// will make is to close().
+class JMediaDataSource : public BnDataSource {
+public:
+ enum {
+ kBufferSize = 64 * 1024,
+ };
+
+ JMediaDataSource(JNIEnv *env, jobject source);
+ virtual ~JMediaDataSource();
+
+ virtual sp<IMemory> getIMemory();
+ virtual ssize_t readAt(off64_t offset, size_t size);
+ virtual status_t getSize(off64_t* size);
+ virtual void close();
+
+private:
+ // Protect all member variables with mLock because this object will be
+ // accessed on different binder worker threads.
+ Mutex mLock;
+
+ // The status of the java DataSource. Set to OK unless an error occurred or
+ // close() was called.
+ status_t mJavaObjStatus;
+ // Only call the java getSize() once so the app can't change the size on us.
+ bool mSizeIsCached;
+ off64_t mCachedSize;
+ sp<IMemory> mMemory;
+
+ jobject mMediaDataSourceObj;
+ jmethodID mReadMethod;
+ jmethodID mGetSizeMethod;
+ jmethodID mCloseMethod;
+ jbyteArray mByteArrayObj;
+
+ DISALLOW_EVIL_CONSTRUCTORS(JMediaDataSource);
+};
+
+} // namespace android
+
+#endif // _ANDROID_MEDIA_MEDIADATASOURCE_H_
diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp
index c0795b6..b6b7a80 100644
--- a/media/jni/android_media_MediaExtractor.cpp
+++ b/media/jni/android_media_MediaExtractor.cpp
@@ -25,6 +25,7 @@
#include "android_runtime/Log.h"
#include "jni.h"
#include "JNIHelp.h"
+#include "android_media_MediaDataSource.h"
#include <media/IMediaHTTPService.h>
#include <media/hardware/CryptoAPI.h>
@@ -50,74 +51,6 @@
static fields_t gFields;
-class JavaDataSourceBridge : public DataSource {
- jmethodID mReadMethod;
- jmethodID mGetSizeMethod;
- jmethodID mCloseMethod;
- jobject mDataSource;
- public:
- JavaDataSourceBridge(JNIEnv *env, jobject source) {
- mDataSource = env->NewGlobalRef(source);
-
- jclass datasourceclass = env->GetObjectClass(mDataSource);
- CHECK(datasourceclass != NULL);
-
- mReadMethod = env->GetMethodID(datasourceclass, "readAt", "(J[BI)I");
- CHECK(mReadMethod != NULL);
-
- mGetSizeMethod = env->GetMethodID(datasourceclass, "getSize", "()J");
- CHECK(mGetSizeMethod != NULL);
-
- mCloseMethod = env->GetMethodID(datasourceclass, "close", "()V");
- CHECK(mCloseMethod != NULL);
- }
-
- ~JavaDataSourceBridge() {
- JNIEnv *env = AndroidRuntime::getJNIEnv();
- env->CallVoidMethod(mDataSource, mCloseMethod);
- env->DeleteGlobalRef(mDataSource);
- }
-
- virtual status_t initCheck() const {
- return OK;
- }
-
- virtual ssize_t readAt(off64_t offset, void* buffer, size_t size) {
- JNIEnv *env = AndroidRuntime::getJNIEnv();
-
- // XXX could optimize this by reusing the same array
- jbyteArray byteArrayObj = env->NewByteArray(size);
- env->DeleteLocalRef(env->GetObjectClass(mDataSource));
- env->DeleteLocalRef(env->GetObjectClass(byteArrayObj));
- ssize_t numread = env->CallIntMethod(mDataSource, mReadMethod, offset, byteArrayObj, (jint)size);
- env->GetByteArrayRegion(byteArrayObj, 0, size, (jbyte*) buffer);
- env->DeleteLocalRef(byteArrayObj);
- if (env->ExceptionCheck()) {
- ALOGW("Exception occurred while reading %zu at %lld", size, (long long)offset);
- LOGW_EX(env);
- env->ExceptionClear();
- return -1;
- }
- return numread;
- }
-
- virtual status_t getSize(off64_t *size) {
- JNIEnv *env = AndroidRuntime::getJNIEnv();
-
- CHECK(size != NULL);
-
- int64_t len = env->CallLongMethod(mDataSource, mGetSizeMethod);
- if (len < 0) {
- *size = ERROR_UNSUPPORTED;
- } else {
- *size = len;
- }
- return OK;
- }
-};
-
-////////////////////////////////////////////////////////////////////////////////
-
JMediaExtractor::JMediaExtractor(JNIEnv *env, jobject thiz)
: mClass(NULL),
mObject(NULL) {
@@ -777,7 +710,8 @@
return;
}
- sp<JavaDataSourceBridge> bridge = new JavaDataSourceBridge(env, callbackObj);
+ sp<DataSource> bridge =
+ DataSource::CreateFromIDataSource(new JMediaDataSource(env, callbackObj));
status_t err = extractor->setDataSource(bridge);
if (err != OK) {
@@ -881,7 +815,7 @@
{ "setDataSource", "(Ljava/io/FileDescriptor;JJ)V",
(void *)android_media_MediaExtractor_setDataSourceFd },
- { "setDataSource", "(Landroid/media/DataSource;)V",
+ { "setDataSource", "(Landroid/media/MediaDataSource;)V",
(void *)android_media_MediaExtractor_setDataSourceCallback },
{ "getCachedDuration", "()J",
diff --git a/media/jni/android_media_MediaHTTPConnection.cpp b/media/jni/android_media_MediaHTTPConnection.cpp
index 7226ef5..393003d 100644
--- a/media/jni/android_media_MediaHTTPConnection.cpp
+++ b/media/jni/android_media_MediaHTTPConnection.cpp
@@ -134,7 +134,6 @@
static jint android_media_MediaHTTPConnection_native_readAt(
JNIEnv *env, jobject thiz, jlong offset, jint size) {
sp<JMediaHTTPConnection> conn = getObject(env, thiz);
-
if (size > JMediaHTTPConnection::kBufferSize) {
size = JMediaHTTPConnection::kBufferSize;
}
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index c6fa379..59fb6d6 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -30,6 +30,7 @@
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
+#include "android_media_MediaDataSource.h"
#include "android_media_Utils.h"
#include "android_util_Binder.h"
@@ -171,6 +172,23 @@
process_media_retriever_call(env, retriever->setDataSource(fd, offset, length), "java/lang/RuntimeException", "setDataSource failed");
}
+static void android_media_MediaMetadataRetriever_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource)
+{
+ ALOGV("setDataSourceCallback");
+ MediaMetadataRetriever* retriever = getRetriever(env, thiz);
+ if (retriever == 0) {
+ jniThrowException(env, "java/lang/IllegalStateException", "No retriever available");
+ return;
+ }
+ if (dataSource == NULL) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ return;
+ }
+
+ sp<IDataSource> callbackDataSource = new JMediaDataSource(env, dataSource);
+ process_media_retriever_call(env, retriever->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed");
+}
+
template<typename T>
static void rotate0(T* dst, const T* src, size_t width, size_t height)
{
@@ -457,6 +475,7 @@
},
{"setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaMetadataRetriever_setDataSourceFD},
+ {"_setDataSource", "(Landroid/media/MediaDataSource;)V", (void *)android_media_MediaMetadataRetriever_setDataSourceCallback},
{"_getFrameAtTime", "(JI)Landroid/graphics/Bitmap;", (void *)android_media_MediaMetadataRetriever_getFrameAtTime},
{"extractMetadata", "(I)Ljava/lang/String;", (void *)android_media_MediaMetadataRetriever_extractMetadata},
{"getEmbeddedPicture", "(I)[B", (void *)android_media_MediaMetadataRetriever_getEmbeddedPicture},
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index 3e41716..c247220 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -36,6 +36,7 @@
#include "utils/Errors.h" // for status_t
#include "utils/KeyedVector.h"
#include "utils/String8.h"
+#include "android_media_MediaDataSource.h"
#include "android_media_Utils.h"
#include "android_os_Parcel.h"
@@ -251,6 +252,23 @@
process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." );
}
+static void
+android_media_MediaPlayer_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource)
+{
+ sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
+ if (mp == NULL ) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return;
+ }
+
+ if (dataSource == NULL) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ return;
+ }
+ sp<IDataSource> callbackDataSource = new JMediaDataSource(env, dataSource);
+ process_media_player_call(env, thiz, mp->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed." );
+}
+
static sp<IGraphicBufferProducer>
getVideoSurfaceTexture(JNIEnv* env, jobject thiz) {
IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture);
@@ -871,7 +889,8 @@
(void *)android_media_MediaPlayer_setDataSourceAndHeaders
},
- {"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD},
+ {"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD},
+ {"_setDataSource", "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback },
{"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface},
{"_prepare", "()V", (void *)android_media_MediaPlayer_prepare},
{"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync},
diff --git a/media/jni/android_media_MediaSync.cpp b/media/jni/android_media_MediaSync.cpp
index b96c733..e167f83 100644
--- a/media/jni/android_media_MediaSync.cpp
+++ b/media/jni/android_media_MediaSync.cpp
@@ -71,8 +71,8 @@
return mSync->createInputSurface(bufferProducer);
}
-void JMediaSync::setPlaybackRate(float rate) {
- mSync->setPlaybackRate(rate);
+status_t JMediaSync::setPlaybackRate(float rate) {
+ return mSync->setPlaybackRate(rate);
}
sp<const MediaClock> JMediaSync::getMediaClock() {
@@ -115,15 +115,23 @@
static void throwExceptionAsNecessary(
JNIEnv *env, status_t err, const char *msg = NULL) {
switch (err) {
- case INVALID_OPERATION:
- jniThrowException(env, "java/lang/IllegalStateException", msg);
+ case NO_ERROR:
break;
case BAD_VALUE:
jniThrowException(env, "java/lang/IllegalArgumentException", msg);
break;
+ case NO_INIT:
+ case INVALID_OPERATION:
default:
+ if (err > 0) {
+ break;
+ }
+ AString msgWithErrorCode(msg);
+ msgWithErrorCode.append(" error:");
+ msgWithErrorCode.append(err);
+ jniThrowException(env, "java/lang/IllegalStateException", msgWithErrorCode.c_str());
break;
}
}
@@ -295,7 +303,11 @@
return;
}
- sync->setPlaybackRate(rate);
+ status_t err = sync->setPlaybackRate(rate);
+ if (err != NO_ERROR) {
+ throwExceptionAsNecessary(env, err);
+ return;
+ }
}
static void android_media_MediaSync_native_finalize(JNIEnv *env, jobject thiz) {
diff --git a/media/jni/android_media_MediaSync.h b/media/jni/android_media_MediaSync.h
index 976a456..9e5de7e 100644
--- a/media/jni/android_media_MediaSync.h
+++ b/media/jni/android_media_MediaSync.h
@@ -39,7 +39,7 @@
status_t updateQueuedAudioData(int sizeInBytes, int64_t presentationTimeUs);
- void setPlaybackRate(float rate);
+ status_t setPlaybackRate(float rate);
sp<const MediaClock> getMediaClock();
diff --git a/native/graphics/jni/Android.mk b/native/graphics/jni/Android.mk
index f89a5af..91c9ac6 100644
--- a/native/graphics/jni/Android.mk
+++ b/native/graphics/jni/Android.mk
@@ -24,8 +24,7 @@
LOCAL_C_INCLUDES += \
frameworks/base/native/include \
- frameworks/base/core/jni/android/graphics \
- frameworks/base/libs/hwui
+ frameworks/base/core/jni/android/graphics
LOCAL_MODULE:= libjnigraphics
diff --git a/obex/Android.mk b/obex/Android.mk
index fbfe9be..e7c1fd3 100644
--- a/obex/Android.mk
+++ b/obex/Android.mk
@@ -7,3 +7,14 @@
LOCAL_MODULE:= javax.obex
include $(BUILD_JAVA_LIBRARY)
+
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_MODULE:= javax.obexstatic
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
\ No newline at end of file
diff --git a/obex/javax/obex/ClientOperation.java b/obex/javax/obex/ClientOperation.java
index 75278b5..cc20d39 100644
--- a/obex/javax/obex/ClientOperation.java
+++ b/obex/javax/obex/ClientOperation.java
@@ -1,5 +1,6 @@
/*
- * Copyright (c) 2014 The Android Open Source Project
+ * Copyright (c) 2015 The Android Open Source Project
+ * Copyright (C) 2015 Samsung LSI
* Copyright (c) 2008-2009, Motorola, Inc.
*
* All rights reserved.
@@ -40,6 +41,8 @@
import java.io.DataOutputStream;
import java.io.ByteArrayOutputStream;
+import android.util.Log;
+
/**
* This class implements the <code>Operation</code> interface. It will read and
* write data via puts and gets.
@@ -47,6 +50,10 @@
*/
public final class ClientOperation implements Operation, BaseStream {
+ private static final String TAG = "ClientOperation";
+
+ private static final boolean V = ObexHelper.VDBG;
+
private ClientSession mParent;
private boolean mInputOpen;
@@ -75,6 +82,19 @@
private boolean mEndOfBodySent;
+ private boolean mSendBodyHeader = true;
+ // A latch - when triggered, there is not way back ;-)
+ private boolean mSrmActive = false;
+
+ // Assume SRM disabled - until support is confirmed
+ // by the server
+ private boolean mSrmEnabled = false;
+ // keep waiting until final-bit is received in request
+ // to handle the case where the SRM enable header is in
+ // a different OBEX packet than the SRMP header.
+ private boolean mSrmWaitingForRemote = true;
+
+
/**
* Creates new OperationImpl to read and write data to a server
* @param maxSize the maximum packet size
@@ -164,7 +184,7 @@
* Since we are not sending any headers or returning any headers then
* we just need to write and read the same bytes
*/
- mParent.sendRequest(ObexHelper.OBEX_OPCODE_ABORT, null, mReplyHeader, null);
+ mParent.sendRequest(ObexHelper.OBEX_OPCODE_ABORT, null, mReplyHeader, null, false);
if (mReplyHeader.responseCode != ResponseCodes.OBEX_HTTP_OK) {
throw new IOException("Invalid response code from server");
@@ -215,6 +235,7 @@
try {
return (String)mReplyHeader.getHeader(HeaderSet.TYPE);
} catch (IOException e) {
+ if(V) Log.d(TAG, "Exception occured - returning null",e);
return null;
}
}
@@ -236,6 +257,7 @@
return temp.longValue();
}
} catch (IOException e) {
+ if(V) Log.d(TAG,"Exception occured - returning -1",e);
return -1;
}
}
@@ -408,7 +430,9 @@
}
/**
- * Sends a request to the client of the specified type
+ * Sends a request to the client of the specified type.
+ * This function will enable SRM and set SRM active if the server
+ * response allows this.
* @param opCode the request code to send to the client
* @return <code>true</code> if there is more data to send;
* <code>false</code> if there is no more data to send
@@ -431,13 +455,16 @@
* length, but it is a waste of resources if we can't send much of
* the body.
*/
- if ((ObexHelper.BASE_PACKET_LENGTH + headerArray.length) > mMaxPacketSize) {
+ final int MINIMUM_BODY_LENGTH = 3;
+ if ((ObexHelper.BASE_PACKET_LENGTH + headerArray.length + MINIMUM_BODY_LENGTH)
+ > mMaxPacketSize) {
int end = 0;
int start = 0;
// split & send the headerArray in multiple packets.
while (end != headerArray.length) {
//split the headerArray
+
end = ObexHelper.findHeaderEnd(headerArray, start, mMaxPacketSize
- ObexHelper.BASE_PACKET_LENGTH);
// can not split
@@ -459,7 +486,7 @@
byte[] sendHeader = new byte[end - start];
System.arraycopy(headerArray, start, sendHeader, 0, sendHeader.length);
- if (!mParent.sendRequest(opCode, sendHeader, mReplyHeader, mPrivateInput)) {
+ if (!mParent.sendRequest(opCode, sendHeader, mReplyHeader, mPrivateInput, false)) {
return false;
}
@@ -470,12 +497,20 @@
start = end;
}
+ // Enable SRM if it should be enabled
+ checkForSrm();
+
if (bodyLength > 0) {
return true;
} else {
return false;
}
} else {
+ /* All headers will fit into a single package */
+ if(mSendBodyHeader == false) {
+ /* As we are not to send any body data, set the FINAL_BIT */
+ opCode |= ObexHelper.OBEX_OPCODE_FINAL_BIT_MASK;
+ }
out.write(headerArray);
}
@@ -499,11 +534,11 @@
* (End of Body) otherwise, we need to send 0x48 (Body)
*/
if ((mPrivateOutput.isClosed()) && (!returnValue) && (!mEndOfBodySent)
- && ((opCode & 0x80) != 0)) {
- out.write(0x49);
+ && ((opCode & ObexHelper.OBEX_OPCODE_FINAL_BIT_MASK) != 0)) {
+ out.write(HeaderSet.END_OF_BODY);
mEndOfBodySent = true;
} else {
- out.write(0x48);
+ out.write(HeaderSet.BODY);
}
bodyLength += 3;
@@ -517,12 +552,11 @@
if (mPrivateOutputOpen && bodyLength <= 0 && !mEndOfBodySent) {
// only 0x82 or 0x83 can send 0x49
- if ((opCode & 0x80) == 0) {
- out.write(0x48);
+ if ((opCode & ObexHelper.OBEX_OPCODE_FINAL_BIT_MASK) == 0) {
+ out.write(HeaderSet.BODY);
} else {
- out.write(0x49);
+ out.write(HeaderSet.END_OF_BODY);
mEndOfBodySent = true;
-
}
bodyLength = 3;
@@ -531,15 +565,20 @@
}
if (out.size() == 0) {
- if (!mParent.sendRequest(opCode, null, mReplyHeader, mPrivateInput)) {
+ if (!mParent.sendRequest(opCode, null, mReplyHeader, mPrivateInput, mSrmActive)) {
return false;
}
+ // Enable SRM if it should be enabled
+ checkForSrm();
return returnValue;
}
if ((out.size() > 0)
- && (!mParent.sendRequest(opCode, out.toByteArray(), mReplyHeader, mPrivateInput))) {
+ && (!mParent.sendRequest(opCode, out.toByteArray(),
+ mReplyHeader, mPrivateInput, mSrmActive))) {
return false;
}
+ // Enable SRM if it should be enabled
+ checkForSrm();
// send all of the output data in 0x48,
// send 0x49 with empty body
@@ -549,6 +588,35 @@
return returnValue;
}
+ private void checkForSrm() throws IOException {
+ Byte srmMode = (Byte)mReplyHeader.getHeader(HeaderSet.SINGLE_RESPONSE_MODE);
+ if(mParent.isSrmSupported() == true && srmMode != null
+ && srmMode == ObexHelper.OBEX_SRM_ENABLE) {
+ mSrmEnabled = true;
+ }
+ /**
+ * Call this only when a complete obex packet have been received.
+ * (This is not optimal, but the current design is not really suited to
+ * the way SRM is specified.)
+ * The BT usage of SRM is not really safe - it assumes that the SRMP will fit
+ * into every OBEX packet, hence if another header occupies the entire packet,
+ * the scheme will not work - unlikely though.
+ */
+ if(mSrmEnabled) {
+ mSrmWaitingForRemote = false;
+ Byte srmp = (Byte)mReplyHeader.getHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER);
+ if(srmp != null && srmp == ObexHelper.OBEX_SRMP_WAIT) {
+ mSrmWaitingForRemote = true;
+ // Clear the wait header, as the absence of the header in the next packet
+ // indicates don't wait anymore.
+ mReplyHeader.setHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER, null);
+ }
+ }
+ if((mSrmWaitingForRemote == false) && (mSrmEnabled == true)) {
+ mSrmActive = true;
+ }
+ }
+
/**
* This method starts the processing thread results. It will send the
* initial request. If the response takes more then one packet, a thread
@@ -564,40 +632,35 @@
if (mGetOperation) {
if (!mOperationDone) {
- if (!mGetFinalFlag) {
- mReplyHeader.responseCode = ResponseCodes.OBEX_HTTP_CONTINUE;
- while ((more) && (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE)) {
- more = sendRequest(0x03);
- }
-
- if (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE) {
- mParent.sendRequest(0x83, null, mReplyHeader, mPrivateInput);
- }
- if (mReplyHeader.responseCode != ResponseCodes.OBEX_HTTP_CONTINUE) {
- mOperationDone = true;
- }
- } else {
- more = sendRequest(0x83);
-
- if (more) {
- throw new IOException("FINAL_GET forced but data did not fit into single packet!");
- }
-
+ mReplyHeader.responseCode = ResponseCodes.OBEX_HTTP_CONTINUE;
+ while ((more) && (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE)) {
+ more = sendRequest(ObexHelper.OBEX_OPCODE_GET);
+ }
+ // For GET we need to loop until all headers have been sent,
+ // And then we wait for the first continue package with the
+ // reply.
+ if (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE) {
+ mParent.sendRequest(ObexHelper.OBEX_OPCODE_GET_FINAL,
+ null, mReplyHeader, mPrivateInput, mSrmActive);
+ }
+ if (mReplyHeader.responseCode != ResponseCodes.OBEX_HTTP_CONTINUE) {
mOperationDone = true;
+ } else {
+ checkForSrm();
}
}
} else {
-
+ // PUT operation
if (!mOperationDone) {
mReplyHeader.responseCode = ResponseCodes.OBEX_HTTP_CONTINUE;
while ((more) && (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE)) {
- more = sendRequest(0x02);
-
+ more = sendRequest(ObexHelper.OBEX_OPCODE_PUT);
}
}
if (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE) {
- mParent.sendRequest(0x82, null, mReplyHeader, mPrivateInput);
+ mParent.sendRequest(ObexHelper.OBEX_OPCODE_PUT_FINAL,
+ null, mReplyHeader, mPrivateInput, mSrmActive);
}
if (mReplyHeader.responseCode != ResponseCodes.OBEX_HTTP_CONTINUE) {
@@ -617,15 +680,21 @@
public synchronized boolean continueOperation(boolean sendEmpty, boolean inStream)
throws IOException {
+ // One path to the first put operation - the other one does not need to
+ // handle SRM, as all will fit into one packet.
+
if (mGetOperation) {
if ((inStream) && (!mOperationDone)) {
// to deal with inputstream in get operation
- mParent.sendRequest(0x83, null, mReplyHeader, mPrivateInput);
+ mParent.sendRequest(ObexHelper.OBEX_OPCODE_GET_FINAL,
+ null, mReplyHeader, mPrivateInput, mSrmActive);
/*
* Determine if that was not the last packet in the operation
*/
if (mReplyHeader.responseCode != ResponseCodes.OBEX_HTTP_CONTINUE) {
mOperationDone = true;
+ } else {
+ checkForSrm();
}
return true;
@@ -636,16 +705,7 @@
if (mPrivateInput == null) {
mPrivateInput = new PrivateInputStream(this);
}
-
- if (!mGetFinalFlag) {
- sendRequest(0x03);
- } else {
- sendRequest(0x83);
-
- if (mReplyHeader.responseCode != ResponseCodes.OBEX_HTTP_CONTINUE) {
- mOperationDone = true;
- }
- }
+ sendRequest(ObexHelper.OBEX_OPCODE_GET);
return true;
} else if (mOperationDone) {
@@ -653,12 +713,13 @@
}
} else {
+ // PUT operation
if ((!inStream) && (!mOperationDone)) {
// to deal with outputstream in put operation
if (mReplyHeader.responseCode == -1) {
mReplyHeader.responseCode = ResponseCodes.OBEX_HTTP_CONTINUE;
}
- sendRequest(0x02);
+ sendRequest(ObexHelper.OBEX_OPCODE_PUT);
return true;
} else if ((inStream) && (!mOperationDone)) {
// How to deal with inputstream in put operation ?
@@ -696,7 +757,7 @@
}
while ((more) && (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE)) {
- more = sendRequest(0x02);
+ more = sendRequest(ObexHelper.OBEX_OPCODE_PUT);
}
/*
@@ -706,7 +767,7 @@
*/
while (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE) {
- sendRequest(0x82);
+ sendRequest(ObexHelper.OBEX_OPCODE_PUT_FINAL);
}
mOperationDone = true;
} else if ((inStream) && (mOperationDone)) {
@@ -724,12 +785,14 @@
}
while (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE) {
- if (!sendRequest(0x83)) {
+ if (!sendRequest(ObexHelper.OBEX_OPCODE_GET_FINAL)) {
break;
}
}
while (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE) {
- mParent.sendRequest(0x83, null, mReplyHeader, mPrivateInput);
+ mParent.sendRequest(ObexHelper.OBEX_OPCODE_GET_FINAL, null,
+ mReplyHeader, mPrivateInput, false);
+ // Regardless of the SRM state, wait for the response.
}
mOperationDone = true;
} else if ((!inStream) && (!mOperationDone)) {
@@ -752,9 +815,9 @@
mReplyHeader.responseCode = ResponseCodes.OBEX_HTTP_CONTINUE;
while ((more) && (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE)) {
- more = sendRequest(0x03);
+ more = sendRequest(ObexHelper.OBEX_OPCODE_GET);
}
- sendRequest(0x83);
+ sendRequest(ObexHelper.OBEX_OPCODE_GET_FINAL);
// parent.sendRequest(0x83, null, replyHeaders, privateInput);
if (mReplyHeader.responseCode != ResponseCodes.OBEX_HTTP_CONTINUE) {
mOperationDone = true;
@@ -764,5 +827,6 @@
}
public void noBodyHeader(){
+ mSendBodyHeader = false;
}
}
diff --git a/obex/javax/obex/ClientSession.java b/obex/javax/obex/ClientSession.java
index 27d8976..272a920 100644
--- a/obex/javax/obex/ClientSession.java
+++ b/obex/javax/obex/ClientSession.java
@@ -1,4 +1,6 @@
/*
+ * Copyright (c) 2015 The Android Open Source Project
+ * Copyright (C) 2015 Samsung LSI
* Copyright (c) 2008-2009, Motorola, Inc.
*
* All rights reserved.
@@ -37,12 +39,16 @@
import java.io.InputStream;
import java.io.OutputStream;
+import android.util.Log;
+
/**
* This class in an implementation of the OBEX ClientSession.
* @hide
*/
public final class ClientSession extends ObexSession {
+ private static final String TAG = "ClientSession";
+
private boolean mOpen;
// Determines if an OBEX layer connection has been established
@@ -51,10 +57,10 @@
private byte[] mConnectionId = null;
/*
- * The max Packet size must be at least 256 according to the OBEX
+ * The max Packet size must be at least 255 according to the OBEX
* specification.
*/
- private int maxPacketSize = 256;
+ private int mMaxTxPacketSize = ObexHelper.LOWER_LIMIT_MAX_PACKET_SIZE;
private boolean mRequestActive;
@@ -62,11 +68,33 @@
private final OutputStream mOutput;
+ private final boolean mLocalSrmSupported;
+
+ private final ObexTransport mTransport;
+
public ClientSession(final ObexTransport trans) throws IOException {
mInput = trans.openInputStream();
mOutput = trans.openOutputStream();
mOpen = true;
mRequestActive = false;
+ mLocalSrmSupported = trans.isSrmSupported();
+ mTransport = trans;
+ }
+
+ /**
+ * Create a ClientSession
+ * @param trans The transport to use for OBEX transactions
+ * @param supportsSrm True if Single Response Mode should be used e.g. if the
+ * supplied transport is a TCP or l2cap channel.
+ * @throws IOException if it occurs while opening the transport streams.
+ */
+ public ClientSession(final ObexTransport trans, final boolean supportsSrm) throws IOException {
+ mInput = trans.openInputStream();
+ mOutput = trans.openOutputStream();
+ mOpen = true;
+ mRequestActive = false;
+ mLocalSrmSupported = supportsSrm;
+ mTransport = trans;
}
public HeaderSet connect(final HeaderSet header) throws IOException {
@@ -98,23 +126,25 @@
* Byte 7 to n: headers
*/
byte[] requestPacket = new byte[totalLength];
+ int maxRxPacketSize = ObexHelper.getMaxRxPacketSize(mTransport);
// We just need to start at byte 3 since the sendRequest() method will
// handle the length and 0x80.
requestPacket[0] = (byte)0x10;
requestPacket[1] = (byte)0x00;
- requestPacket[2] = (byte)(ObexHelper.MAX_PACKET_SIZE_INT >> 8);
- requestPacket[3] = (byte)(ObexHelper.MAX_PACKET_SIZE_INT & 0xFF);
+ requestPacket[2] = (byte)(maxRxPacketSize >> 8);
+ requestPacket[3] = (byte)(maxRxPacketSize & 0xFF);
if (head != null) {
System.arraycopy(head, 0, requestPacket, 4, head.length);
}
- // check with local max packet size
+ // Since we are not yet connected, the peer max packet size is unknown,
+ // hence we are only guaranteed the server will use the first 7 bytes.
if ((requestPacket.length + 3) > ObexHelper.MAX_PACKET_SIZE_INT) {
- throw new IOException("Packet size exceeds max packet size");
+ throw new IOException("Packet size exceeds max packet size for connect");
}
HeaderSet returnHeaderSet = new HeaderSet();
- sendRequest(ObexHelper.OBEX_OPCODE_CONNECT, requestPacket, returnHeaderSet, null);
+ sendRequest(ObexHelper.OBEX_OPCODE_CONNECT, requestPacket, returnHeaderSet, null, false);
/*
* Read the response from the OBEX server.
@@ -158,7 +188,18 @@
System.arraycopy(mConnectionId, 0, head.mConnectionID, 0, 4);
}
- return new ClientOperation(maxPacketSize, this, head, true);
+ if(mLocalSrmSupported) {
+ head.setHeader(HeaderSet.SINGLE_RESPONSE_MODE, ObexHelper.OBEX_SRM_ENABLE);
+ /* TODO: Consider creating an interface to get the wait state.
+ * On an android system, I cannot see when this is to be used.
+ * except perhaps if we are to wait for user accept on a push message.
+ if(getLocalWaitState()) {
+ head.setHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER, ObexHelper.OBEX_SRMP_WAIT);
+ }
+ */
+ }
+
+ return new ClientOperation(mMaxTxPacketSize, this, head, true);
}
/**
@@ -202,7 +243,7 @@
}
head = ObexHelper.createHeader(header, false);
- if ((head.length + 3) > maxPacketSize) {
+ if ((head.length + 3) > mMaxTxPacketSize) {
throw new IOException("Packet size exceeds max packet size");
}
} else {
@@ -215,7 +256,7 @@
}
HeaderSet returnHeaderSet = new HeaderSet();
- sendRequest(ObexHelper.OBEX_OPCODE_DISCONNECT, head, returnHeaderSet, null);
+ sendRequest(ObexHelper.OBEX_OPCODE_DISCONNECT, head, returnHeaderSet, null, false);
/*
* An OBEX DISCONNECT reply from the server:
@@ -269,7 +310,16 @@
System.arraycopy(mConnectionId, 0, head.mConnectionID, 0, 4);
}
- return new ClientOperation(maxPacketSize, this, head, false);
+ if(mLocalSrmSupported) {
+ head.setHeader(HeaderSet.SINGLE_RESPONSE_MODE, ObexHelper.OBEX_SRM_ENABLE);
+ /* TODO: Consider creating an interface to get the wait state.
+ * On an android system, I cannot see when this is to be used.
+ if(getLocalWaitState()) {
+ head.setHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER, ObexHelper.OBEX_SRMP_WAIT);
+ }
+ */
+ }
+ return new ClientOperation(mMaxTxPacketSize, this, head, false);
}
public void setAuthenticator(Authenticator auth) throws IOException {
@@ -314,7 +364,7 @@
head = ObexHelper.createHeader(headset, false);
totalLength += head.length;
- if (totalLength > maxPacketSize) {
+ if (totalLength > mMaxTxPacketSize) {
throw new IOException("Packet size exceeds max packet size");
}
@@ -348,7 +398,7 @@
}
HeaderSet returnHeaderSet = new HeaderSet();
- sendRequest(ObexHelper.OBEX_OPCODE_SETPATH, packet, returnHeaderSet, null);
+ sendRequest(ObexHelper.OBEX_OPCODE_SETPATH, packet, returnHeaderSet, null, false);
/*
* An OBEX SETPATH reply from the server:
@@ -400,20 +450,40 @@
* @param head the headers to send to the client
* @param header the header object to update with the response
* @param privateInput the input stream used by the Operation object; null
- * if this is called on a CONNECT, SETPATH or DISCONNECT return
+ * if this is called on a CONNECT, SETPATH or DISCONNECT
+ * @return
* <code>true</code> if the operation completed successfully;
* <code>false</code> if an authentication response failed to pass
* @throws IOException if an IO error occurs
*/
public boolean sendRequest(int opCode, byte[] head, HeaderSet header,
- PrivateInputStream privateInput) throws IOException {
+ PrivateInputStream privateInput, boolean srmActive) throws IOException {
//check header length with local max size
if (head != null) {
if ((head.length + 3) > ObexHelper.MAX_PACKET_SIZE_INT) {
+ // TODO: This is an implementation limit - not a specification requirement.
throw new IOException("header too large ");
}
}
+ boolean skipSend = false;
+ boolean skipReceive = false;
+ if (srmActive == true) {
+ if (opCode == ObexHelper.OBEX_OPCODE_PUT) {
+ // we are in the middle of a SRM PUT operation, don't expect a continue.
+ skipReceive = true;
+ } else if (opCode == ObexHelper.OBEX_OPCODE_GET) {
+ // We are still sending the get request, send, but don't expect continue
+ // until the request is transfered (the final bit is set)
+ skipReceive = true;
+ } else if (opCode == ObexHelper.OBEX_OPCODE_GET_FINAL) {
+ // All done sending the request, expect data from the server, without
+ // sending continue.
+ skipSend = true;
+ }
+
+ }
+
int bytesReceived;
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write((byte)opCode);
@@ -428,86 +498,105 @@
out.write(head);
}
- // Write the request to the output stream and flush the stream
- mOutput.write(out.toByteArray());
- mOutput.flush();
-
- header.responseCode = mInput.read();
-
- int length = ((mInput.read() << 8) | (mInput.read()));
-
- if (length > ObexHelper.MAX_PACKET_SIZE_INT) {
- throw new IOException("Packet received exceeds packet size limit");
+ if (!skipSend) {
+ // Write the request to the output stream and flush the stream
+ mOutput.write(out.toByteArray());
+ // TODO: is this really needed? if this flush is implemented
+ // correctly, we will get a gap between each obex packet.
+ // which is kind of the idea behind SRM to avoid.
+ // Consider offloading to another thread (async action)
+ mOutput.flush();
}
- if (length > ObexHelper.BASE_PACKET_LENGTH) {
- byte[] data = null;
- if (opCode == ObexHelper.OBEX_OPCODE_CONNECT) {
- @SuppressWarnings("unused")
- int version = mInput.read();
- @SuppressWarnings("unused")
- int flags = mInput.read();
- maxPacketSize = (mInput.read() << 8) + mInput.read();
- //check with local max size
- if (maxPacketSize > ObexHelper.MAX_CLIENT_PACKET_SIZE) {
- maxPacketSize = ObexHelper.MAX_CLIENT_PACKET_SIZE;
- }
+ if (!skipReceive) {
+ header.responseCode = mInput.read();
- if (length > 7) {
- data = new byte[length - 7];
+ int length = ((mInput.read() << 8) | (mInput.read()));
- bytesReceived = mInput.read(data);
- while (bytesReceived != (length - 7)) {
- bytesReceived += mInput.read(data, bytesReceived, data.length
- - bytesReceived);
+ if (length > ObexHelper.getMaxRxPacketSize(mTransport)) {
+ throw new IOException("Packet received exceeds packet size limit");
+ }
+ if (length > ObexHelper.BASE_PACKET_LENGTH) {
+ byte[] data = null;
+ if (opCode == ObexHelper.OBEX_OPCODE_CONNECT) {
+ @SuppressWarnings("unused")
+ int version = mInput.read();
+ @SuppressWarnings("unused")
+ int flags = mInput.read();
+ mMaxTxPacketSize = (mInput.read() << 8) + mInput.read();
+
+ //check with local max size
+ if (mMaxTxPacketSize > ObexHelper.MAX_CLIENT_PACKET_SIZE) {
+ mMaxTxPacketSize = ObexHelper.MAX_CLIENT_PACKET_SIZE;
+ }
+
+ // check with transport maximum size
+ if(mMaxTxPacketSize > ObexHelper.getMaxTxPacketSize(mTransport)) {
+ // To increase this size, increase the buffer size in L2CAP layer
+ // in Bluedroid.
+ Log.w(TAG, "An OBEX packet size of " + mMaxTxPacketSize + "was"
+ + " requested. Transport only allows: "
+ + ObexHelper.getMaxTxPacketSize(mTransport)
+ + " Lowering limit to this value.");
+ mMaxTxPacketSize = ObexHelper.getMaxTxPacketSize(mTransport);
+ }
+
+ if (length > 7) {
+ data = new byte[length - 7];
+
+ bytesReceived = mInput.read(data);
+ while (bytesReceived != (length - 7)) {
+ bytesReceived += mInput.read(data, bytesReceived, data.length
+ - bytesReceived);
+ }
+ } else {
+ return true;
}
} else {
- return true;
+ data = new byte[length - 3];
+ bytesReceived = mInput.read(data);
+
+ while (bytesReceived != (length - 3)) {
+ bytesReceived += mInput.read(data, bytesReceived, data.length - bytesReceived);
+ }
+ if (opCode == ObexHelper.OBEX_OPCODE_ABORT) {
+ return true;
+ }
}
- } else {
- data = new byte[length - 3];
- bytesReceived = mInput.read(data);
- while (bytesReceived != (length - 3)) {
- bytesReceived += mInput.read(data, bytesReceived, data.length - bytesReceived);
+ byte[] body = ObexHelper.updateHeaderSet(header, data);
+ if ((privateInput != null) && (body != null)) {
+ privateInput.writeBytes(body, 1);
}
- if (opCode == ObexHelper.OBEX_OPCODE_ABORT) {
- return true;
+
+ if (header.mConnectionID != null) {
+ mConnectionId = new byte[4];
+ System.arraycopy(header.mConnectionID, 0, mConnectionId, 0, 4);
}
- }
- byte[] body = ObexHelper.updateHeaderSet(header, data);
- if ((privateInput != null) && (body != null)) {
- privateInput.writeBytes(body, 1);
- }
-
- if (header.mConnectionID != null) {
- mConnectionId = new byte[4];
- System.arraycopy(header.mConnectionID, 0, mConnectionId, 0, 4);
- }
-
- if (header.mAuthResp != null) {
- if (!handleAuthResp(header.mAuthResp)) {
- setRequestInactive();
- throw new IOException("Authentication Failed");
+ if (header.mAuthResp != null) {
+ if (!handleAuthResp(header.mAuthResp)) {
+ setRequestInactive();
+ throw new IOException("Authentication Failed");
+ }
}
- }
- if ((header.responseCode == ResponseCodes.OBEX_HTTP_UNAUTHORIZED)
- && (header.mAuthChall != null)) {
+ if ((header.responseCode == ResponseCodes.OBEX_HTTP_UNAUTHORIZED)
+ && (header.mAuthChall != null)) {
- if (handleAuthChall(header)) {
- out.write((byte)HeaderSet.AUTH_RESPONSE);
- out.write((byte)((header.mAuthResp.length + 3) >> 8));
- out.write((byte)(header.mAuthResp.length + 3));
- out.write(header.mAuthResp);
- header.mAuthChall = null;
- header.mAuthResp = null;
+ if (handleAuthChall(header)) {
+ out.write((byte)HeaderSet.AUTH_RESPONSE);
+ out.write((byte)((header.mAuthResp.length + 3) >> 8));
+ out.write((byte)(header.mAuthResp.length + 3));
+ out.write(header.mAuthResp);
+ header.mAuthChall = null;
+ header.mAuthResp = null;
- byte[] sendHeaders = new byte[out.size() - 3];
- System.arraycopy(out.toByteArray(), 3, sendHeaders, 0, sendHeaders.length);
+ byte[] sendHeaders = new byte[out.size() - 3];
+ System.arraycopy(out.toByteArray(), 3, sendHeaders, 0, sendHeaders.length);
- return sendRequest(opCode, sendHeaders, header, privateInput);
+ return sendRequest(opCode, sendHeaders, header, privateInput, false);
+ }
}
}
}
@@ -520,4 +609,8 @@
mInput.close();
mOutput.close();
}
+
+ public boolean isSrmSupported() {
+ return mLocalSrmSupported;
+ }
}
diff --git a/obex/javax/obex/HeaderSet.java b/obex/javax/obex/HeaderSet.java
index 51b560a..35fe186 100644
--- a/obex/javax/obex/HeaderSet.java
+++ b/obex/javax/obex/HeaderSet.java
@@ -40,7 +40,7 @@
/**
* This class implements the javax.obex.HeaderSet interface for OBEX over
- * RFCOMM.
+ * RFCOMM or OBEX over l2cap.
* @hide
*/
public final class HeaderSet {
@@ -178,6 +178,22 @@
*/
public static final int OBJECT_CLASS = 0x4F;
+ /**
+ * Represents the OBEX Single Response Mode (SRM). This header is used
+ * for Single response mode, introduced in OBEX 1.5.
+ * <P>
+ * The value of <code>SINGLE_RESPONSE_MODE</code> is 0x97 (151).
+ */
+ public static final int SINGLE_RESPONSE_MODE = 0x97;
+
+ /**
+ * Represents the OBEX Single Response Mode Parameters. This header is used
+ * for Single response mode, introduced in OBEX 1.5.
+ * <P>
+ * The value of <code>SINGLE_RESPONSE_MODE_PARAMETER</code> is 0x98 (152).
+ */
+ public static final int SINGLE_RESPONSE_MODE_PARAMETER = 0x98;
+
private Long mCount; // 4 byte unsigned integer
private String mName; // null terminated Unicode text string
@@ -204,7 +220,7 @@
private byte[] mObjectClass; // byte sequence
- private String[] mUnicodeUserDefined; //null terminated unicode string
+ private String[] mUnicodeUserDefined; // null terminated unicode string
private byte[][] mSequenceUserDefined; // byte sequence user defined
@@ -212,7 +228,12 @@
private Long[] mIntegerUserDefined; // 4 byte unsigned integer
- private final SecureRandom mRandom;
+ private SecureRandom mRandom = null;
+
+ private Byte mSingleResponseMode; // byte to indicate enable/disable/support for SRM
+
+ private Byte mSrmParam; // byte representing the SRM parameters - only "wait"
+ // is supported by Bluetooth
/*package*/ byte[] nonce;
@@ -234,7 +255,6 @@
mByteUserDefined = new Byte[16];
mIntegerUserDefined = new Long[16];
responseCode = -1;
- mRandom = new SecureRandom();
}
/**
@@ -393,6 +413,30 @@
}
}
break;
+ case SINGLE_RESPONSE_MODE:
+ if (headerValue == null) {
+ mSingleResponseMode = null;
+ } else {
+ if (!(headerValue instanceof Byte)) {
+ throw new IllegalArgumentException(
+ "Single Response Mode must be a Byte");
+ } else {
+ mSingleResponseMode = (Byte)headerValue;
+ }
+ }
+ break;
+ case SINGLE_RESPONSE_MODE_PARAMETER:
+ if (headerValue == null) {
+ mSrmParam = null;
+ } else {
+ if (!(headerValue instanceof Byte)) {
+ throw new IllegalArgumentException(
+ "Single Response Mode Parameter must be a Byte");
+ } else {
+ mSrmParam = (Byte)headerValue;
+ }
+ }
+ break;
default:
// Verify that it was not a Unicode String user Defined
if ((headerID >= 0x30) && (headerID <= 0x3F)) {
@@ -493,6 +537,10 @@
return mObjectClass;
case APPLICATION_PARAMETER:
return mAppParam;
+ case SINGLE_RESPONSE_MODE:
+ return mSingleResponseMode;
+ case SINGLE_RESPONSE_MODE_PARAMETER:
+ return mSrmParam;
default:
// Verify that it was not a Unicode String user Defined
if ((headerID >= 0x30) && (headerID <= 0x3F)) {
@@ -564,6 +612,12 @@
if (mObjectClass != null) {
out.write(OBJECT_CLASS);
}
+ if(mSingleResponseMode != null) {
+ out.write(SINGLE_RESPONSE_MODE);
+ }
+ if(mSrmParam != null) {
+ out.write(SINGLE_RESPONSE_MODE_PARAMETER);
+ }
for (int i = 0x30; i < 0x40; i++) {
if (mUnicodeUserDefined[i - 0x30] != null) {
@@ -625,6 +679,9 @@
throws IOException {
nonce = new byte[16];
+ if(mRandom == null) {
+ mRandom = new SecureRandom();
+ }
for (int i = 0; i < 16; i++) {
nonce[i] = (byte)mRandom.nextInt();
}
diff --git a/obex/javax/obex/ObexHelper.java b/obex/javax/obex/ObexHelper.java
index 0a06709..fa50943 100644
--- a/obex/javax/obex/ObexHelper.java
+++ b/obex/javax/obex/ObexHelper.java
@@ -1,5 +1,6 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2015 Samsung LSI
* Copyright (c) 2008-2009, Motorola, Inc.
*
* All rights reserved.
@@ -42,12 +43,16 @@
import java.util.Date;
import java.util.TimeZone;
+import android.util.Log;
+
/**
* This class defines a set of helper methods for the implementation of Obex.
* @hide
*/
public final class ObexHelper {
+ private static final String TAG = "ObexHelper";
+ public static final boolean VDBG = false;
/**
* Defines the basic packet length used by OBEX. Every OBEX packet has the
* same basic format:<BR>
@@ -65,18 +70,24 @@
* should be the Max incoming MTU minus TODO: L2CAP package headers and
* RFCOMM package headers. TODO: Retrieve the max incoming MTU from TODO:
* LocalDevice.getProperty().
+ * NOTE: This value must be larger than or equal to the L2CAP SDU
*/
/*
* android note set as 0xFFFE to match remote MPS
*/
public static final int MAX_PACKET_SIZE_INT = 0xFFFE;
+ // The minimum allowed max packet size is 255 according to the OBEX specification
+ public static final int LOWER_LIMIT_MAX_PACKET_SIZE = 255;
+
/**
* Temporary workaround to be able to push files to Windows 7.
* TODO: Should be removed as soon as Microsoft updates their driver.
*/
public static final int MAX_CLIENT_PACKET_SIZE = 0xFC00;
+ public static final int OBEX_OPCODE_FINAL_BIT_MASK = 0x80;
+
public static final int OBEX_OPCODE_CONNECT = 0x80;
public static final int OBEX_OPCODE_DISCONNECT = 0x81;
@@ -119,6 +130,12 @@
public static final int OBEX_AUTH_REALM_CHARSET_UNICODE = 0xFF;
+ public static final byte OBEX_SRM_ENABLE = 0x01; // For BT we only need enable/disable
+ public static final byte OBEX_SRM_DISABLE = 0x00;
+ public static final byte OBEX_SRM_SUPPORT = 0x02; // Unused for now
+
+ public static final byte OBEX_SRMP_WAIT = 0x01; // Only SRMP value used by BT
+
/**
* Updates the HeaderSet with the headers received in the byte array
* provided. Invalid headers are ignored.
@@ -314,7 +331,7 @@
}
} catch (Exception e) {
// Not a valid header so ignore
- throw new IOException("Header was not formatted properly");
+ throw new IOException("Header was not formatted properly", e);
}
index += 4;
break;
@@ -322,7 +339,7 @@
}
} catch (IOException e) {
- throw new IOException("Header was not formatted properly");
+ throw new IOException("Header was not formatted properly", e);
}
return body;
@@ -672,6 +689,33 @@
}
}
+ // TODO:
+ // If the SRM and SRMP header is in use, they must be send in the same OBEX packet
+ // But the current structure of the obex code cannot handle this, and therefore
+ // it makes sense to put them in the tail of the headers, since we then reduce the
+ // chance of enabling SRM to soon. The down side is that SRM cannot be used while
+ // transferring non-body headers
+
+ // Add the SRM header
+ byteHeader = (Byte)headImpl.getHeader(HeaderSet.SINGLE_RESPONSE_MODE);
+ if (byteHeader != null) {
+ out.write((byte)HeaderSet.SINGLE_RESPONSE_MODE);
+ out.write(byteHeader.byteValue());
+ if (nullOut) {
+ headImpl.setHeader(HeaderSet.SINGLE_RESPONSE_MODE, null);
+ }
+ }
+
+ // Add the SRM parameter header
+ byteHeader = (Byte)headImpl.getHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER);
+ if (byteHeader != null) {
+ out.write((byte)HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER);
+ out.write(byteHeader.byteValue());
+ if (nullOut) {
+ headImpl.setHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER, null);
+ }
+ }
+
} catch (IOException e) {
} finally {
result = out.toByteArray();
@@ -702,6 +746,8 @@
int index = start;
int length = 0;
+ // TODO: Ensure SRM and SRMP headers are not split into two OBEX packets
+
while ((fullLength < maxSize) && (index < headerArray.length)) {
int headerID = (headerArray[index] < 0 ? headerArray[index] + 256 : headerArray[index]);
lastLength = fullLength;
@@ -1008,4 +1054,39 @@
return authChall;
}
+
+ /**
+ * Return the maximum allowed OBEX packet to transmit.
+ * OBEX packets transmitted must be smaller than this value.
+ * @param transport Reference to the ObexTransport in use.
+ * @return the maximum allowed OBEX packet to transmit
+ */
+ public static int getMaxTxPacketSize(ObexTransport transport) {
+ int size = transport.getMaxTransmitPacketSize();
+ return validateMaxPacketSize(size);
+ }
+
+ /**
+ * Return the maximum allowed OBEX packet to receive - used in OBEX connect.
+ * @param transport
+ * @return he maximum allowed OBEX packet to receive
+ */
+ public static int getMaxRxPacketSize(ObexTransport transport) {
+ int size = transport.getMaxReceivePacketSize();
+ return validateMaxPacketSize(size);
+ }
+
+ private static int validateMaxPacketSize(int size) {
+ if(VDBG && (size > MAX_PACKET_SIZE_INT)) Log.w(TAG,
+ "The packet size supported for the connection (" + size + ") is larger"
+ + " than the configured OBEX packet size: " + MAX_PACKET_SIZE_INT);
+ if(size != -1) {
+ if(size < LOWER_LIMIT_MAX_PACKET_SIZE) {
+ throw new IllegalArgumentException(size + " is less that the lower limit: "
+ + LOWER_LIMIT_MAX_PACKET_SIZE);
+ }
+ return size;
+ }
+ return MAX_PACKET_SIZE_INT;
+ }
}
diff --git a/obex/javax/obex/ObexPacket.java b/obex/javax/obex/ObexPacket.java
new file mode 100644
index 0000000..bb6c96e
--- /dev/null
+++ b/obex/javax/obex/ObexPacket.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2015 The Android Open Source Project
+ * Copyright (c) 2015 Samsung LSI
+ *
+ * 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 javax.obex;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ObexPacket {
+ public int mHeaderId;
+ public int mLength;
+ public byte[] mPayload = null;
+
+ private ObexPacket(int headerId, int length) {
+ mHeaderId = headerId;
+ mLength = length;
+ }
+
+ /**
+ * Create a complete OBEX packet by reading data from an InputStream.
+ * @param is the input stream to read from.
+ * @return the OBEX packet read.
+ * @throws IOException if an IO exception occurs during read.
+ */
+ public static ObexPacket read(InputStream is) throws IOException {
+ int headerId = is.read();
+ return read(headerId, is);
+ }
+
+ /**
+ * Read the remainder of an OBEX packet, with a specified headerId.
+ * @param headerId the headerId already read from the stream.
+ * @param is the stream to read from, assuming 1 byte have already been read.
+ * @return the OBEX packet read.
+ * @throws IOException
+ */
+ public static ObexPacket read(int headerId, InputStream is) throws IOException {
+ // Read the 2 byte length field from the stream
+ int length = is.read();
+ length = (length << 8) + is.read();
+
+ ObexPacket newPacket = new ObexPacket(headerId, length);
+
+ int bytesReceived;
+ byte[] temp = null;
+ if (length > 3) {
+ // First three bytes already read, compensating for this
+ temp = new byte[length - 3];
+ bytesReceived = is.read(temp);
+ while (bytesReceived != temp.length) {
+ bytesReceived += is.read(temp, bytesReceived, temp.length - bytesReceived);
+ }
+ }
+ newPacket.mPayload = temp;
+ return newPacket;
+ }
+}
diff --git a/obex/javax/obex/ObexSession.java b/obex/javax/obex/ObexSession.java
index a7daeb5..542b9c8 100644
--- a/obex/javax/obex/ObexSession.java
+++ b/obex/javax/obex/ObexSession.java
@@ -34,6 +34,8 @@
import java.io.IOException;
+import android.util.Log;
+
/**
* The <code>ObexSession</code> interface characterizes the term
* "OBEX Connection" as defined in the IrDA Object Exchange Protocol v1.2, which
@@ -47,6 +49,9 @@
*/
public class ObexSession {
+ private static final String TAG = "ObexSession";
+ private static final boolean V = ObexHelper.VDBG;
+
protected Authenticator mAuthenticator;
protected byte[] mChallengeDigest;
@@ -125,6 +130,7 @@
result = mAuthenticator
.onAuthenticationChallenge(realm, isUserIDRequired, isFullAccess);
} catch (Exception e) {
+ if (V) Log.d(TAG, "Exception occured - returning false", e);
return false;
}
diff --git a/obex/javax/obex/ObexTransport.java b/obex/javax/obex/ObexTransport.java
index 445e267..a5a75f5 100644
--- a/obex/javax/obex/ObexTransport.java
+++ b/obex/javax/obex/ObexTransport.java
@@ -73,4 +73,39 @@
DataOutputStream openDataOutputStream() throws IOException;
+ /**
+ * Must return the maximum allowed OBEX packet that can be sent over
+ * the transport. For L2CAP this will be the Max SDU reported by the
+ * peer device.
+ * The returned value will be used to set the outgoing OBEX packet
+ * size. Therefore this value shall not change.
+ * For RFCOMM or other transport types where the OBEX packets size
+ * is unrelated to the transport packet size, return -1;
+ * @return the maximum allowed OBEX packet that can be send over
+ * the transport. Or -1 in case of don't care.
+ */
+ int getMaxTransmitPacketSize();
+
+ /**
+ * Must return the maximum allowed OBEX packet that can be received over
+ * the transport. For L2CAP this will be the Max SDU configured for the
+ * L2CAP channel.
+ * The returned value will be used to validate the incoming packet size
+ * values.
+ * For RFCOMM or other transport types where the OBEX packets size
+ * is unrelated to the transport packet size, return -1;
+ * @return the maximum allowed OBEX packet that can be send over
+ * the transport. Or -1 in case of don't care.
+ */
+ int getMaxReceivePacketSize();
+
+ /**
+ * Shall return true if the transport in use supports SRM.
+ * @return
+ * <code>true</code> if SRM operation is supported, and is to be enabled.
+ * <code>false</code> if SRM operations are not supported, or should not be used.
+ */
+ boolean isSrmSupported();
+
+
}
diff --git a/obex/javax/obex/ServerOperation.java b/obex/javax/obex/ServerOperation.java
index fc441e0..56a675a 100644
--- a/obex/javax/obex/ServerOperation.java
+++ b/obex/javax/obex/ServerOperation.java
@@ -1,4 +1,5 @@
-/*
+/* Copyright (c) 2015 The Android Open Source Project
+ * Copyright (C) 2015 Samsung LSI
* Copyright (c) 2008-2009, Motorola, Inc.
*
* All rights reserved.
@@ -39,6 +40,8 @@
import java.io.DataOutputStream;
import java.io.ByteArrayOutputStream;
+import android.util.Log;
+
/**
* This class implements the Operation interface for server side connections.
* <P>
@@ -54,6 +57,10 @@
*/
public final class ServerOperation implements Operation, BaseStream {
+ private static final String TAG = "ServerOperation";
+
+ private static final boolean V = ObexHelper.VDBG; // Verbose debugging
+
public boolean isAborted;
public HeaderSet requestHeader;
@@ -78,6 +85,8 @@
private PrivateOutputStream mPrivateOutput;
+ private ObexTransport mTransport;
+
private boolean mPrivateOutputOpen;
private String mExceptionString;
@@ -89,6 +98,19 @@
private boolean mHasBody;
private boolean mSendBodyHeader = true;
+ // Assume SRM disabled - needs to be explicit
+ // enabled by client
+ private boolean mSrmEnabled = false;
+ // A latch - when triggered, there is not way back ;-)
+ private boolean mSrmActive = false;
+ // Set to true when a SRM enable response have been send
+ private boolean mSrmResponseSent = false;
+ // keep waiting until final-bit is received in request
+ // to handle the case where the SRM enable header is in
+ // a different OBEX packet than the SRMP header.
+ private boolean mSrmWaitingForRemote = true;
+ // Why should we wait? - currently not exposed to apps.
+ private boolean mSrmLocalWait = false;
/**
* Creates new ServerOperation
@@ -116,12 +138,14 @@
mRequestFinished = false;
mPrivateOutputOpen = false;
mHasBody = false;
- int bytesReceived;
+ ObexPacket packet;
+ mTransport = p.getTransport();
/*
* Determine if this is a PUT request
*/
- if ((request == 0x02) || (request == 0x82)) {
+ if ((request == ObexHelper.OBEX_OPCODE_PUT) ||
+ (request == ObexHelper.OBEX_OPCODE_PUT_FINAL)) {
/*
* It is a PUT request.
*/
@@ -130,13 +154,14 @@
/*
* Determine if the final bit is set
*/
- if ((request & 0x80) == 0) {
+ if ((request & ObexHelper.OBEX_OPCODE_FINAL_BIT_MASK) == 0) {
finalBitSet = false;
} else {
finalBitSet = true;
mRequestFinished = true;
}
- } else if ((request == 0x03) || (request == 0x83)) {
+ } else if ((request == ObexHelper.OBEX_OPCODE_GET) ||
+ (request == ObexHelper.OBEX_OPCODE_GET_FINAL)) {
/*
* It is a GET request.
*/
@@ -145,71 +170,32 @@
// For Get request, final bit set is decided by server side logic
finalBitSet = false;
- if (request == 0x83) {
+ if (request == ObexHelper.OBEX_OPCODE_GET_FINAL) {
mRequestFinished = true;
}
} else {
throw new IOException("ServerOperation can not handle such request");
}
- int length = in.read();
- length = (length << 8) + in.read();
+ packet = ObexPacket.read(request, mInput);
/*
* Determine if the packet length is larger than this device can receive
*/
- if (length > ObexHelper.MAX_PACKET_SIZE_INT) {
+ if (packet.mLength > ObexHelper.getMaxRxPacketSize(mTransport)) {
mParent.sendResponse(ResponseCodes.OBEX_HTTP_REQ_TOO_LARGE, null);
- throw new IOException("Packet received was too large");
+ throw new IOException("Packet received was too large. Length: "
+ + packet.mLength + " maxLength: " + ObexHelper.getMaxRxPacketSize(mTransport));
}
/*
* Determine if any headers were sent in the initial request
*/
- if (length > 3) {
- byte[] data = new byte[length - 3];
- bytesReceived = in.read(data);
-
- while (bytesReceived != data.length) {
- bytesReceived += in.read(data, bytesReceived, data.length - bytesReceived);
+ if (packet.mLength > 3) {
+ if(!handleObexPacket(packet)) {
+ return;
}
-
- byte[] body = ObexHelper.updateHeaderSet(requestHeader, data);
-
- if (body != null) {
- mHasBody = true;
- }
-
- if (mListener.getConnectionId() != -1 && requestHeader.mConnectionID != null) {
- mListener.setConnectionId(ObexHelper.convertToLong(requestHeader.mConnectionID));
- } else {
- mListener.setConnectionId(1);
- }
-
- if (requestHeader.mAuthResp != null) {
- if (!mParent.handleAuthResp(requestHeader.mAuthResp)) {
- mExceptionString = "Authentication Failed";
- mParent.sendResponse(ResponseCodes.OBEX_HTTP_UNAUTHORIZED, null);
- mClosed = true;
- requestHeader.mAuthResp = null;
- return;
- }
- }
-
- if (requestHeader.mAuthChall != null) {
- mParent.handleAuthChall(requestHeader);
- // send the authResp to the client
- replyHeader.mAuthResp = new byte[requestHeader.mAuthResp.length];
- System.arraycopy(requestHeader.mAuthResp, 0, replyHeader.mAuthResp, 0,
- replyHeader.mAuthResp.length);
- requestHeader.mAuthResp = null;
- requestHeader.mAuthChall = null;
-
- }
-
- if (body != null) {
- mPrivateInput.writeBytes(body, 1);
- } else {
+ if (!mHasBody) {
while ((!mGetOperation) && (!finalBitSet)) {
sendReply(ResponseCodes.OBEX_HTTP_CONTINUE);
if (mPrivateInput.available() > 0) {
@@ -232,6 +218,100 @@
}
}
+ /**
+ * Parse headers and update member variables
+ * @param packet the received obex packet
+ * @return false for failing authentication - and a OBEX_HTTP_UNAUTHORIZED
+ * response have been send. Else true.
+ * @throws IOException
+ */
+ private boolean handleObexPacket(ObexPacket packet) throws IOException {
+ byte[] body = updateRequestHeaders(packet);
+
+ if (body != null) {
+ mHasBody = true;
+ }
+ if (mListener.getConnectionId() != -1 && requestHeader.mConnectionID != null) {
+ mListener.setConnectionId(ObexHelper
+ .convertToLong(requestHeader.mConnectionID));
+ } else {
+ mListener.setConnectionId(1);
+ }
+
+ if (requestHeader.mAuthResp != null) {
+ if (!mParent.handleAuthResp(requestHeader.mAuthResp)) {
+ mExceptionString = "Authentication Failed";
+ mParent.sendResponse(ResponseCodes.OBEX_HTTP_UNAUTHORIZED, null);
+ mClosed = true;
+ requestHeader.mAuthResp = null;
+ return false;
+ }
+ requestHeader.mAuthResp = null;
+ }
+
+ if (requestHeader.mAuthChall != null) {
+ mParent.handleAuthChall(requestHeader);
+ // send the auhtResp to the client
+ replyHeader.mAuthResp = new byte[requestHeader.mAuthResp.length];
+ System.arraycopy(requestHeader.mAuthResp, 0, replyHeader.mAuthResp, 0,
+ replyHeader.mAuthResp.length);
+ requestHeader.mAuthResp = null;
+ requestHeader.mAuthChall = null;
+ }
+
+ if (body != null) {
+ mPrivateInput.writeBytes(body, 1);
+ }
+ return true;
+ }
+
+ /**
+ * Update the request header set, and sniff on SRM headers to update local state.
+ * @param data the OBEX packet data
+ * @return any bytes in a body/end-of-body header returned by {@link ObexHelper.updateHeaderSet}
+ * @throws IOException
+ */
+ private byte[] updateRequestHeaders(ObexPacket packet) throws IOException {
+ byte[] body = null;
+ if (packet.mPayload != null) {
+ body = ObexHelper.updateHeaderSet(requestHeader, packet.mPayload);
+ }
+ Byte srmMode = (Byte)requestHeader.getHeader(HeaderSet.SINGLE_RESPONSE_MODE);
+ if(mTransport.isSrmSupported() && srmMode != null
+ && srmMode == ObexHelper.OBEX_SRM_ENABLE) {
+ mSrmEnabled = true;
+ if(V) Log.d(TAG,"SRM is now ENABLED (but not active) for this operation");
+ }
+ checkForSrmWait(packet.mHeaderId);
+ if((!mSrmWaitingForRemote) && (mSrmEnabled)) {
+ if(V) Log.d(TAG,"SRM is now ACTIVE for this operation");
+ mSrmActive = true;
+ }
+ return body;
+ }
+
+ /**
+ * Call this only when a complete request have been received.
+ * (This is not optimal, but the current design is not really suited to
+ * the way SRM is specified.)
+ */
+ private void checkForSrmWait(int headerId){
+ if (mSrmEnabled && (headerId == ObexHelper.OBEX_OPCODE_GET
+ || headerId == ObexHelper.OBEX_OPCODE_GET_FINAL
+ || headerId == ObexHelper.OBEX_OPCODE_PUT)) {
+ try {
+ mSrmWaitingForRemote = false;
+ Byte srmp = (Byte)requestHeader.getHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER);
+ if(srmp != null && srmp == ObexHelper.OBEX_SRMP_WAIT) {
+ mSrmWaitingForRemote = true;
+ // Clear the wait header, as the absents of the header when the final bit is set
+ // indicates don't wait.
+ requestHeader.setHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER, null);
+ }
+ } catch (IOException e) {if(V){Log.w(TAG,"Exception while extracting header",e);}}
+ }
+ }
+
public boolean isValidBody() {
return mHasBody;
}
@@ -274,17 +354,19 @@
/**
* Sends a reply to the client. If the reply is a OBEX_HTTP_CONTINUE, it
- * will wait for a response from the client before ending.
+ * will wait for a response from the client before ending unless SRM is active.
* @param type the response code to send back to the client
* @return <code>true</code> if the final bit was not set on the reply;
* <code>false</code> if no reply was received because the operation
- * ended, an abort was received, or the final bit was set in the
- * reply
+ * ended, an abort was received, the final bit was set in the
+ * reply or SRM is active.
* @throws IOException if an IO error occurs
*/
public synchronized boolean sendReply(int type) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
- int bytesReceived;
+ boolean skipSend = false;
+ boolean skipReceive = false;
+ boolean srmRespSendPending = false;
long id = mListener.getConnectionId();
if (id == -1) {
@@ -293,7 +375,19 @@
replyHeader.mConnectionID = ObexHelper.convertToByteArray(id);
}
- byte[] headerArray = ObexHelper.createHeader(replyHeader, true);
+ if(mSrmEnabled && !mSrmResponseSent) {
+ // As we are not ensured that the SRM enable is in the first OBEX packet
+ // We must check for each reply.
+ if(V)Log.v(TAG, "mSrmEnabled==true, sending SRM enable response.");
+ replyHeader.setHeader(HeaderSet.SINGLE_RESPONSE_MODE, (byte)ObexHelper.OBEX_SRM_ENABLE);
+ srmRespSendPending = true;
+ }
+
+ if(mSrmEnabled && !mGetOperation && mSrmLocalWait) {
+ replyHeader.setHeader(HeaderSet.SINGLE_RESPONSE_MODE, (byte)ObexHelper.OBEX_SRMP_WAIT);
+ }
+
+ byte[] headerArray = ObexHelper.createHeader(replyHeader, true); // This clears the headers
int bodyLength = -1;
int orginalBodyLength = -1;
@@ -347,6 +441,28 @@
finalBitSet = true;
}
+ if(mSrmActive) {
+ if(!mGetOperation && type == ResponseCodes.OBEX_HTTP_CONTINUE &&
+ mSrmResponseSent == true) {
+ // we are in the middle of a SRM PUT operation, don't send a continue.
+ skipSend = true;
+ } else if(mGetOperation && mRequestFinished == false && mSrmResponseSent == true) {
+ // We are still receiving the get request, receive, but don't send continue.
+ skipSend = true;
+ } else if(mGetOperation && mRequestFinished == true) {
+ // All done receiving the GET request, send data to the client, without
+ // expecting a continue.
+ skipReceive = true;
+ }
+ if(V)Log.v(TAG, "type==" + type + " skipSend==" + skipSend
+ + " skipReceive==" + skipReceive);
+ }
+ if(srmRespSendPending) {
+ if(V)Log.v(TAG,
+ "SRM Enabled (srmRespSendPending == true)- sending SRM Enable response");
+ mSrmResponseSent = true;
+ }
+
if ((finalBitSet) || (headerArray.length < (mMaxPacketLength - 20))) {
if (bodyLength > 0) {
/*
@@ -387,7 +503,7 @@
}
if ((finalBitSet) && (type == ResponseCodes.OBEX_HTTP_OK) && (orginalBodyLength <= 0)) {
- if(mSendBodyHeader == true) {
+ if(mSendBodyHeader) {
out.write(0x49);
orginalBodyLength = 3;
out.write((byte)(orginalBodyLength >> 8));
@@ -395,107 +511,66 @@
}
}
- mResponseSize = 3;
- mParent.sendResponse(type, out.toByteArray());
+ if(skipSend == false) {
+ mResponseSize = 3;
+ mParent.sendResponse(type, out.toByteArray());
+ }
if (type == ResponseCodes.OBEX_HTTP_CONTINUE) {
- int headerID = mInput.read();
- int length = mInput.read();
- length = (length << 8) + mInput.read();
- if ((headerID != ObexHelper.OBEX_OPCODE_PUT)
- && (headerID != ObexHelper.OBEX_OPCODE_PUT_FINAL)
- && (headerID != ObexHelper.OBEX_OPCODE_GET)
- && (headerID != ObexHelper.OBEX_OPCODE_GET_FINAL)) {
- if (length > 3) {
- byte[] temp = new byte[length - 3];
- // First three bytes already read, compensating for this
- bytesReceived = mInput.read(temp);
-
- while (bytesReceived != temp.length) {
- bytesReceived += mInput.read(temp, bytesReceived,
- temp.length - bytesReceived);
- }
- }
-
- /*
- * Determine if an ABORT was sent as the reply
- */
- if (headerID == ObexHelper.OBEX_OPCODE_ABORT) {
- mParent.sendResponse(ResponseCodes.OBEX_HTTP_OK, null);
- mClosed = true;
- isAborted = true;
- mExceptionString = "Abort Received";
- throw new IOException("Abort Received");
- } else {
- mParent.sendResponse(ResponseCodes.OBEX_HTTP_BAD_REQUEST, null);
- mClosed = true;
- mExceptionString = "Bad Request Received";
- throw new IOException("Bad Request Received");
- }
+ if(mGetOperation && skipReceive) {
+ // Here we need to check for and handle abort (throw an exception).
+ // Any other signal received should be discarded silently (only on server side)
+ checkSrmRemoteAbort();
} else {
+ // Receive and handle data (only send reply if !skipSend)
+ // Read a complete OBEX Packet
+ ObexPacket packet = ObexPacket.read(mInput);
- if ((headerID == ObexHelper.OBEX_OPCODE_PUT_FINAL)) {
- finalBitSet = true;
- } else if (headerID == ObexHelper.OBEX_OPCODE_GET_FINAL) {
- mRequestFinished = true;
- }
+ int headerId = packet.mHeaderId;
+ if ((headerId != ObexHelper.OBEX_OPCODE_PUT)
+ && (headerId != ObexHelper.OBEX_OPCODE_PUT_FINAL)
+ && (headerId != ObexHelper.OBEX_OPCODE_GET)
+ && (headerId != ObexHelper.OBEX_OPCODE_GET_FINAL)) {
- /*
- * Determine if the packet length is larger then this device can receive
- */
- if (length > ObexHelper.MAX_PACKET_SIZE_INT) {
- mParent.sendResponse(ResponseCodes.OBEX_HTTP_REQ_TOO_LARGE, null);
- throw new IOException("Packet received was too large");
- }
-
- /*
- * Determine if any headers were sent in the initial request
- */
- if (length > 3) {
- byte[] data = new byte[length - 3];
- bytesReceived = mInput.read(data);
-
- while (bytesReceived != data.length) {
- bytesReceived += mInput.read(data, bytesReceived, data.length
- - bytesReceived);
- }
- byte[] body = ObexHelper.updateHeaderSet(requestHeader, data);
- if (body != null) {
- mHasBody = true;
- }
- if (mListener.getConnectionId() != -1 && requestHeader.mConnectionID != null) {
- mListener.setConnectionId(ObexHelper
- .convertToLong(requestHeader.mConnectionID));
+ /*
+ * Determine if an ABORT was sent as the reply
+ */
+ if (headerId == ObexHelper.OBEX_OPCODE_ABORT) {
+ handleRemoteAbort();
} else {
- mListener.setConnectionId(1);
+ // TODO:shall we send this if it occurs during SRM? Errata on the subject
+ mParent.sendResponse(ResponseCodes.OBEX_HTTP_BAD_REQUEST, null);
+ mClosed = true;
+ mExceptionString = "Bad Request Received";
+ throw new IOException("Bad Request Received");
+ }
+ } else {
+
+ if ((headerId == ObexHelper.OBEX_OPCODE_PUT_FINAL)) {
+ finalBitSet = true;
+ } else if (headerId == ObexHelper.OBEX_OPCODE_GET_FINAL) {
+ mRequestFinished = true;
}
- if (requestHeader.mAuthResp != null) {
- if (!mParent.handleAuthResp(requestHeader.mAuthResp)) {
- mExceptionString = "Authentication Failed";
- mParent.sendResponse(ResponseCodes.OBEX_HTTP_UNAUTHORIZED, null);
- mClosed = true;
- requestHeader.mAuthResp = null;
+ /*
+ * Determine if the packet length is larger than the negotiated packet size
+ */
+ if (packet.mLength > ObexHelper.getMaxRxPacketSize(mTransport)) {
+ mParent.sendResponse(ResponseCodes.OBEX_HTTP_REQ_TOO_LARGE, null);
+ throw new IOException("Packet received was too large");
+ }
+
+ /*
+ * Determine if any headers were sent in the initial request
+ */
+ if (packet.mLength > 3 || (mSrmEnabled && packet.mLength == 3)) {
+ if(handleObexPacket(packet) == false) {
return false;
}
- requestHeader.mAuthResp = null;
- }
-
- if (requestHeader.mAuthChall != null) {
- mParent.handleAuthChall(requestHeader);
- // send the auhtResp to the client
- replyHeader.mAuthResp = new byte[requestHeader.mAuthResp.length];
- System.arraycopy(requestHeader.mAuthResp, 0, replyHeader.mAuthResp, 0,
- replyHeader.mAuthResp.length);
- requestHeader.mAuthResp = null;
- requestHeader.mAuthChall = null;
- }
-
- if (body != null) {
- mPrivateInput.writeBytes(body, 1);
}
}
+
}
return true;
} else {
@@ -504,6 +579,53 @@
}
/**
+ * This method will look for an abort from the peer during a SRM transfer.
+ * The function will not block if no data has been received from the remote device.
+ * If data have been received, the function will block while reading the incoming
+ * OBEX package.
+ * An Abort request will be handled, and cause an IOException("Abort Received").
+ * Other messages will be discarded silently as per GOEP specification.
+ * @throws IOException if an abort request have been received.
+ * TODO: I think this is an error in the specification. If we discard other messages,
+ * the peer device will most likely stall, as it will not receive the expected
+ * response for the message...
+ * I'm not sure how to understand "Receipt of invalid or unexpected SRM or SRMP
+ * header values shall be ignored by the receiving device."
+ * If any signal is received during an active SRM transfer it is unexpected regardless
+ * whether or not it contains SRM/SRMP headers...
+ */
+ private void checkSrmRemoteAbort() throws IOException {
+ if(mInput.available() > 0) {
+ ObexPacket packet = ObexPacket.read(mInput);
+ /*
+ * Determine if an ABORT was sent as the reply
+ */
+ if (packet.mHeaderId == ObexHelper.OBEX_OPCODE_ABORT) {
+ handleRemoteAbort();
+ } else {
+ // TODO: should we throw an exception here anyway? - don't see how to
+ // ignore SRM/SRMP headers without ignoring the complete signal
+ // (in this particular case).
+ Log.w(TAG, "Received unexpected request from client - discarding...\n"
+ + " headerId: " + packet.mHeaderId + " length: " + packet.mLength);
+ }
+ }
+ }
+
+ private void handleRemoteAbort() throws IOException {
+ /* TODO: To increase the speed of the abort operation in SRM, we need
+ * to be able to flush the L2CAP queue for the PSM in use.
+ * This could be implemented by introducing a control
+ * message to be send over the socket, that in the abort case
+ * could carry a flush command. */
+ mParent.sendResponse(ResponseCodes.OBEX_HTTP_OK, null);
+ mClosed = true;
+ isAborted = true;
+ mExceptionString = "Abort Received";
+ throw new IOException("Abort Received");
+ }
+
+ /**
* Sends an ABORT message to the server. By calling this method, the
* corresponding input and output streams will be closed along with this
* object.
diff --git a/obex/javax/obex/ServerRequestHandler.java b/obex/javax/obex/ServerRequestHandler.java
index 0882572..09cbc2c 100644
--- a/obex/javax/obex/ServerRequestHandler.java
+++ b/obex/javax/obex/ServerRequestHandler.java
@@ -275,4 +275,13 @@
*/
public void onClose() {
}
+
+ /**
+ * Override to add Single Response Mode support - e.g. if the supplied
+ * transport is l2cap.
+ * @return True if SRM is supported, else False
+ */
+ public boolean isSrmSupported() {
+ return false;
+ }
}
diff --git a/obex/javax/obex/ServerSession.java b/obex/javax/obex/ServerSession.java
index f1b9a0d..acee5dd 100644
--- a/obex/javax/obex/ServerSession.java
+++ b/obex/javax/obex/ServerSession.java
@@ -1,4 +1,6 @@
/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (c) 2015 Samsung LSI
* Copyright (c) 2008-2009, Motorola, Inc.
*
* All rights reserved.
@@ -45,6 +47,7 @@
public final class ServerSession extends ObexSession implements Runnable {
private static final String TAG = "Obex ServerSession";
+ private static final boolean V = ObexHelper.VDBG;
private ObexTransport mTransport;
@@ -91,7 +94,9 @@
boolean done = false;
while (!done && !mClosed) {
+ if(V) Log.v(TAG, "Waiting for incoming request...");
int requestType = mInput.read();
+ if(V) Log.v(TAG, "Read request: " + requestType);
switch (requestType) {
case ObexHelper.OBEX_OPCODE_CONNECT:
handleConnectRequest();
@@ -140,9 +145,9 @@
}
} catch (NullPointerException e) {
- Log.d(TAG, e.toString());
+ Log.d(TAG, "Exception occured - ignoring", e);
} catch (Exception e) {
- Log.d(TAG, e.toString());
+ Log.d(TAG, "Exception occured - ignoring", e);
}
close();
}
@@ -163,7 +168,7 @@
int length = mInput.read();
length = (length << 8) + mInput.read();
- if (length > ObexHelper.MAX_PACKET_SIZE_INT) {
+ if (length > ObexHelper.getMaxRxPacketSize(mTransport)) {
code = ResponseCodes.OBEX_HTTP_REQ_TOO_LARGE;
} else {
for (int i = 3; i < length; i++) {
@@ -215,6 +220,7 @@
*internal error should not be sent because server has already replied with
*OK response in "sendReply")
*/
+ if(V) Log.d(TAG,"Exception occured - sending OBEX_HTTP_INTERNAL_ERROR reply",e);
if (!op.isAborted) {
sendResponse(ResponseCodes.OBEX_HTTP_INTERNAL_ERROR, null);
}
@@ -243,6 +249,7 @@
op.sendReply(response);
}
} catch (Exception e) {
+ if(V) Log.d(TAG,"Exception occured - sending OBEX_HTTP_INTERNAL_ERROR reply",e);
sendResponse(ResponseCodes.OBEX_HTTP_INTERNAL_ERROR, null);
}
}
@@ -275,7 +282,7 @@
data[2] = (byte)totalLength;
}
op.write(data);
- op.flush();
+ op.flush(); // TODO: Do we need to flush?
}
/**
@@ -304,7 +311,7 @@
flags = mInput.read();
constants = mInput.read();
- if (length > ObexHelper.MAX_PACKET_SIZE_INT) {
+ if (length > ObexHelper.getMaxRxPacketSize(mTransport)) {
code = ResponseCodes.OBEX_HTTP_REQ_TOO_LARGE;
totalLength = 3;
} else {
@@ -358,6 +365,7 @@
try {
code = mListener.onSetPath(request, reply, backup, create);
} catch (Exception e) {
+ if(V) Log.d(TAG,"Exception occured - sending OBEX_HTTP_INTERNAL_ERROR reply",e);
sendResponse(ResponseCodes.OBEX_HTTP_INTERNAL_ERROR, null);
return;
}
@@ -425,7 +433,7 @@
length = mInput.read();
length = (length << 8) + mInput.read();
- if (length > ObexHelper.MAX_PACKET_SIZE_INT) {
+ if (length > ObexHelper.getMaxRxPacketSize(mTransport)) {
code = ResponseCodes.OBEX_HTTP_REQ_TOO_LARGE;
totalLength = 3;
} else {
@@ -466,6 +474,7 @@
try {
mListener.onDisconnect(request, reply);
} catch (Exception e) {
+ if(V) Log.d(TAG,"Exception occured - sending OBEX_HTTP_INTERNAL_ERROR reply",e);
sendResponse(ResponseCodes.OBEX_HTTP_INTERNAL_ERROR, null);
return;
}
@@ -531,23 +540,38 @@
HeaderSet reply = new HeaderSet();
int bytesReceived;
+ if(V) Log.v(TAG,"handleConnectRequest()");
+
/*
* Read in the length of the OBEX packet, OBEX version, flags, and max
* packet length
*/
packetLength = mInput.read();
packetLength = (packetLength << 8) + mInput.read();
+ if(V) Log.v(TAG,"handleConnectRequest() - packetLength: " + packetLength);
+
version = mInput.read();
flags = mInput.read();
mMaxPacketLength = mInput.read();
mMaxPacketLength = (mMaxPacketLength << 8) + mInput.read();
+ if(V) Log.v(TAG,"handleConnectRequest() - version: " + version
+ + " MaxLength: " + mMaxPacketLength + " flags: " + flags);
+
// should we check it?
if (mMaxPacketLength > ObexHelper.MAX_PACKET_SIZE_INT) {
mMaxPacketLength = ObexHelper.MAX_PACKET_SIZE_INT;
}
- if (packetLength > ObexHelper.MAX_PACKET_SIZE_INT) {
+ if(mMaxPacketLength > ObexHelper.getMaxTxPacketSize(mTransport)) {
+ Log.w(TAG, "Requested MaxObexPacketSize " + mMaxPacketLength
+ + " is larger than the max size supported by the transport: "
+ + ObexHelper.getMaxTxPacketSize(mTransport)
+ + " Reducing to this size.");
+ mMaxPacketLength = ObexHelper.getMaxTxPacketSize(mTransport);
+ }
+
+ if (packetLength > ObexHelper.getMaxRxPacketSize(mTransport)) {
code = ResponseCodes.OBEX_HTTP_REQ_TOO_LARGE;
totalLength = 7;
} else {
@@ -614,7 +638,7 @@
code = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
} catch (Exception e) {
- e.printStackTrace();
+ if(V) Log.d(TAG,"Exception occured - sending OBEX_HTTP_INTERNAL_ERROR reply",e);
totalLength = 7;
head = null;
code = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
@@ -633,13 +657,14 @@
* Packet Length (Defined in MAX_PACKET_SIZE) Byte 7 to n: headers
*/
byte[] sendData = new byte[totalLength];
+ int maxRxLength = ObexHelper.getMaxRxPacketSize(mTransport);
sendData[0] = (byte)code;
sendData[1] = length[2];
sendData[2] = length[3];
sendData[3] = (byte)0x10;
sendData[4] = (byte)0x00;
- sendData[5] = (byte)(ObexHelper.MAX_PACKET_SIZE_INT >> 8);
- sendData[6] = (byte)(ObexHelper.MAX_PACKET_SIZE_INT & 0xFF);
+ sendData[5] = (byte)(maxRxLength >> 8);
+ sendData[6] = (byte)(maxRxLength & 0xFF);
if (head != null) {
System.arraycopy(head, 0, sendData, 7, head.length);
@@ -659,11 +684,16 @@
mListener.onClose();
}
try {
- mInput.close();
- mOutput.close();
- mTransport.close();
+ /* Set state to closed before interrupting the thread by closing the streams */
mClosed = true;
+ if(mInput != null)
+ mInput.close();
+ if(mOutput != null)
+ mOutput.close();
+ if(mTransport != null)
+ mTransport.close();
} catch (Exception e) {
+ if(V) Log.d(TAG,"Exception occured during close() - ignore",e);
}
mTransport = null;
mInput = null;
@@ -702,4 +732,7 @@
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
+ public ObexTransport getTransport() {
+ return mTransport;
+ }
}
diff --git a/packages/DocumentsUI/res/layout/dialog_create_dir.xml b/packages/DocumentsUI/res/layout/dialog_create_dir.xml
index 54e26b4..5ed476f 100644
--- a/packages/DocumentsUI/res/layout/dialog_create_dir.xml
+++ b/packages/DocumentsUI/res/layout/dialog_create_dir.xml
@@ -22,6 +22,7 @@
<EditText
android:id="@android:id/text1"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:inputType="text" />
</FrameLayout>
diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml
index 14a9721..b79e1c9 100644
--- a/packages/DocumentsUI/res/values-af/strings.xml
+++ b/packages/DocumentsUI/res/values-af/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Versteek SD-kaart"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Wys lêergrootte"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Versteek lêergrootte"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopieer"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> gekies"</string>
<string name="sort_name" msgid="9183560467917256779">"Volgens naam"</string>
<string name="sort_date" msgid="586080032956151448">"Volgens datum gewysig"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Kopieer tans <xliff:g id="COUNT_0">%1$d</xliff:g> lêer.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Maak tans gereed vir kopieer …"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Kon <xliff:g id="COUNT_1">%1$d</xliff:g> lêers nie kopieer nie.</item>
+ <item quantity="one">Kon <xliff:g id="COUNT_0">%1$d</xliff:g> lêer nie kopieer nie.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Raak om besonderhede te bekyk"</string>
+ <string name="retry" msgid="7564024179122207376">"Herprobeer"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Kon nie lêers kopieer nie"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Die volgende lêers is nie gekopieer nie: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml
index 7e655d0..0db718f 100644
--- a/packages/DocumentsUI/res/values-am/strings.xml
+++ b/packages/DocumentsUI/res/values-am/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD ካርድ ደብቅ"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"የፋይል መጠን አሳይ"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"የፋይል መጠን ደብቅ"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"ቅዳ"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ተመርጠዋል"</string>
<string name="sort_name" msgid="9183560467917256779">"በስም"</string>
<string name="sort_date" msgid="586080032956151448">"በተለወጠበት ቀን"</string>
@@ -66,13 +65,12 @@
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች በመቅዳት ላይ።</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"ቅጂ በማዘጋጀት ላይ…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን መቅዳት ላይ ስህተት።</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን መቅዳት ላይ ስህተት።</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"ዝርዝሮችን ለመመልከት ይንኩ።"</string>
+ <string name="retry" msgid="7564024179122207376">"እንደገና ይሞክሩ"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ፋይሎችን መቅዳት ስህተት"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"የሚከተሉት ፋይሎች አልተቀዱም፦ <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ar/strings.xml b/packages/DocumentsUI/res/values-ar/strings.xml
index 4db588d..debe04c 100644
--- a/packages/DocumentsUI/res/values-ar/strings.xml
+++ b/packages/DocumentsUI/res/values-ar/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"إخفاء بطاقة SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"إظهار حجم الملف"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"إخفاء حجم الملف"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"نسخ"</string>
<string name="mode_selected_count" msgid="459111894725594625">"تم تحديد <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"بحسب الاسم"</string>
<string name="sort_date" msgid="586080032956151448">"بحسب تاريخ التعديل"</string>
@@ -70,13 +69,16 @@
<item quantity="one">جارٍ نسخ ملف واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>).</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"جارٍ التحضير للنسخ ..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="zero">حدث خطأ أثناء نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات.</item>
+ <item quantity="two">حدث خطأ أثناء نسخ ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>).</item>
+ <item quantity="few">حدث خطأ أثناء نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات.</item>
+ <item quantity="many">حدث خطأ أثناء نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا.</item>
+ <item quantity="other">حدث خطأ أثناء نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> من الملفات.</item>
+ <item quantity="one">حدث خطأ أثناء نسخ ملف واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>).</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"المس لعرض التفاصيل"</string>
+ <string name="retry" msgid="7564024179122207376">"إعادة المحاولة"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"حدث خطأ أثناء نسخ الملفات"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"لم يتم نسخ الملفات التالية: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml
index 81ad675..ae30951 100644
--- a/packages/DocumentsUI/res/values-bg/strings.xml
+++ b/packages/DocumentsUI/res/values-bg/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD карта: Скриване"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Размер на файла: Показв."</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Размер на файла: Скрив."</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Копиране"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Избрахте <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"По име"</string>
<string name="sort_date" msgid="586080032956151448">"По дата на промяната"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Копира се <xliff:g id="COUNT_0">%1$d</xliff:g> файл.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Подготвя се за копиране…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">При копирането на <xliff:g id="COUNT_1">%1$d</xliff:g> файла възникна грешка.</item>
+ <item quantity="one">При копирането на <xliff:g id="COUNT_0">%1$d</xliff:g> файл възникна грешка.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Докоснете, за да видите подробностите"</string>
+ <string name="retry" msgid="7564024179122207376">"Нов опит"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"При копирането на файловете възникна грешка"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Следните файлове не са копирани: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-bn-rBD/strings.xml b/packages/DocumentsUI/res/values-bn-rBD/strings.xml
index 71443d1..6c5b0cc 100644
--- a/packages/DocumentsUI/res/values-bn-rBD/strings.xml
+++ b/packages/DocumentsUI/res/values-bn-rBD/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD কার্ড লুকান"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ফাইলের আকার দেখান"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ফাইলের আকার লুকান"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"অনুলিপি করুন"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> নির্বাচন করা হয়েছে"</string>
<string name="sort_name" msgid="9183560467917256779">"নামের দ্বারা"</string>
<string name="sort_date" msgid="586080032956151448">"পরিবর্তনের তারিখ দ্বারা"</string>
@@ -66,13 +65,12 @@
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল অনুলিপি করা হচ্ছে৷</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"অনুলিপি করার জন্য প্রস্তুত করা হচ্ছে..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল অনুলিপি করার সময় ত্রুটি হয়েছে৷</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল অনুলিপি করার সময় ত্রুটি হয়েছে৷</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"বিশদ বিবরণ দেখতে স্পর্শ করুন"</string>
+ <string name="retry" msgid="7564024179122207376">"পুনরায় চেষ্টা করুন"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ফাইলগুলি অনুলিপি করার সময় ত্রুটি হয়েছে"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"নিম্নলিখিত ফাইলগুলি অনুলিপি করা হয়নি: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml
index c3e1ff8..69a65bd 100644
--- a/packages/DocumentsUI/res/values-ca/strings.xml
+++ b/packages/DocumentsUI/res/values-ca/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Amaga la targeta SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Mostra la mida de fitxer"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Amaga la mida del fitxer"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copia"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Seleccionats: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Per nom"</string>
<string name="sort_date" msgid="586080032956151448">"Per data de modificació"</string>
@@ -66,13 +65,12 @@
<item quantity="one">S\'està copiant <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"S\'està preparant una còpia…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">S\'ha produït un error en copiar <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers.</item>
+ <item quantity="one">S\'ha produït un error en copiar <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Toca per veure els detalls"</string>
+ <string name="retry" msgid="7564024179122207376">"Torna-ho a provar"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"S\'ha produït un error en copiar els fitxers"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Els fitxers següents no s\'han copiat: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml
index ae6e625..00bc43b 100644
--- a/packages/DocumentsUI/res/values-cs/strings.xml
+++ b/packages/DocumentsUI/res/values-cs/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skrýt SD kartu"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Zobrazit velikost souboru"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Skrýt velikost souboru"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopírovat"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Vybráno: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Podle názvu"</string>
<string name="sort_date" msgid="586080032956151448">"Podle data úpravy"</string>
@@ -68,13 +67,14 @@
<item quantity="one">Kopírování <xliff:g id="COUNT_0">%1$d</xliff:g> souboru</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Příprava na kopírování…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="few">Při kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souborů došlo k chybě.</item>
+ <item quantity="many">Při kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souboru došlo k chybě.</item>
+ <item quantity="other">Při kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souborů došlo k chybě.</item>
+ <item quantity="one">Při kopírování <xliff:g id="COUNT_0">%1$d</xliff:g> souboru došlo k chybě.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Podrobnosti zobrazíte klepnutím"</string>
+ <string name="retry" msgid="7564024179122207376">"Opakovat"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Při kopírování souborů došlo k chybě"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Následující soubory nebyly zkopírovány: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml
index 8e9ff6b..2394c36 100644
--- a/packages/DocumentsUI/res/values-da/strings.xml
+++ b/packages/DocumentsUI/res/values-da/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skjul SD-kort"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Vis filstørrelse"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Skjul filstørrelse"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopiér"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> er valgt"</string>
<string name="sort_name" msgid="9183560467917256779">"Efter navn"</string>
<string name="sort_date" msgid="586080032956151448">"Efter ændringsdato"</string>
@@ -66,13 +65,12 @@
<item quantity="other">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Forbereder kopiering…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Fejl i forbindelse med kopiering af <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item>
+ <item quantity="other">Fejl i forbindelse med kopiering af <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Tryk for at se yderligere oplysninger."</string>
+ <string name="retry" msgid="7564024179122207376">"Prøv igen"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Fejl i forbindelse med kopiering af filer"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Følgende filer blev ikke kopieret: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml
index f6f2514..fa74ae3 100644
--- a/packages/DocumentsUI/res/values-de/strings.xml
+++ b/packages/DocumentsUI/res/values-de/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD-Karte ausblenden"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Dateigröße anzeigen"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Dateigröße ausblenden"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopieren"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ausgewählt"</string>
<string name="sort_name" msgid="9183560467917256779">"Nach Name"</string>
<string name="sort_date" msgid="586080032956151448">"Nach Änderungsdatum"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei wird kopiert.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Kopieren wird vorbereitet…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Fehler beim Kopieren von <xliff:g id="COUNT_1">%1$d</xliff:g> Dateien</item>
+ <item quantity="one">Fehler beim Kopieren von <xliff:g id="COUNT_0">%1$d</xliff:g> Datei</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Zum Einblenden von Details tippen"</string>
+ <string name="retry" msgid="7564024179122207376">"Erneut versuchen"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Fehler beim Kopieren von Dateien"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Folgende Dateien wurden nicht kopiert: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml
index 40d4aae..0f99cb7 100644
--- a/packages/DocumentsUI/res/values-el/strings.xml
+++ b/packages/DocumentsUI/res/values-el/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Απόκρυψη κάρτας SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Εμφ. μεγέθους αρχείου"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Απόκρ. μεγέθους αρχείου"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Αντιγραφή"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Επιλέχθηκαν <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Κατά όνομα"</string>
<string name="sort_date" msgid="586080032956151448">"Κατά ημερομηνία τροποποίησης"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Αντιγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Προετοιμασία για αντιγραφή…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Σφάλμα κατά την αντιγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων.</item>
+ <item quantity="one">Σφάλμα κατά την αντιγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Αγγίξτε για προβολή λεπτομερειών"</string>
+ <string name="retry" msgid="7564024179122207376">"Επανάληψη"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Σφάλμα κατά την αντιγραφή των αρχείων"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Τα παρακάτω αρχεία δεν αντιγράφηκαν: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-en-rAU/strings.xml b/packages/DocumentsUI/res/values-en-rAU/strings.xml
index 26af414..80f13b4 100644
--- a/packages/DocumentsUI/res/values-en-rAU/strings.xml
+++ b/packages/DocumentsUI/res/values-en-rAU/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Hide SD card"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copy"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selected"</string>
<string name="sort_name" msgid="9183560467917256779">"By name"</string>
<string name="sort_date" msgid="586080032956151448">"By date modified"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Error copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item>
+ <item quantity="one">Error copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Touch to view details"</string>
+ <string name="retry" msgid="7564024179122207376">"Retry"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Error copying files"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Following files are not copied: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-en-rGB/strings.xml b/packages/DocumentsUI/res/values-en-rGB/strings.xml
index 26af414..80f13b4 100644
--- a/packages/DocumentsUI/res/values-en-rGB/strings.xml
+++ b/packages/DocumentsUI/res/values-en-rGB/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Hide SD card"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copy"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selected"</string>
<string name="sort_name" msgid="9183560467917256779">"By name"</string>
<string name="sort_date" msgid="586080032956151448">"By date modified"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Error copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item>
+ <item quantity="one">Error copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Touch to view details"</string>
+ <string name="retry" msgid="7564024179122207376">"Retry"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Error copying files"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Following files are not copied: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-en-rIN/strings.xml b/packages/DocumentsUI/res/values-en-rIN/strings.xml
index 26af414..80f13b4 100644
--- a/packages/DocumentsUI/res/values-en-rIN/strings.xml
+++ b/packages/DocumentsUI/res/values-en-rIN/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Hide SD card"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copy"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selected"</string>
<string name="sort_name" msgid="9183560467917256779">"By name"</string>
<string name="sort_date" msgid="586080032956151448">"By date modified"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Error copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item>
+ <item quantity="one">Error copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Touch to view details"</string>
+ <string name="retry" msgid="7564024179122207376">"Retry"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Error copying files"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Following files are not copied: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml
index 366cee9..c2ef612 100644
--- a/packages/DocumentsUI/res/values-es-rUS/strings.xml
+++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar tarjeta SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño archivos"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño archivos"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copiar"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> seleccionado(s)"</string>
<string name="sort_name" msgid="9183560467917256779">"Por nombre"</string>
<string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Copiando <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Se produjo un error al copiar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item>
+ <item quantity="one">Se produjo un error al copiar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Toca el elemento para ver más información."</string>
+ <string name="retry" msgid="7564024179122207376">"Reintentar"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Se produjo un error al copiar archivos"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"No se copiaron los siguientes archivos: <xliff:g id="LIST">%1$s</xliff:g>."</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml
index a5db821..3aa0779 100644
--- a/packages/DocumentsUI/res/values-es/strings.xml
+++ b/packages/DocumentsUI/res/values-es/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar tarjeta SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño archivo"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño archivo"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copiar"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Seleccionado: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Por nombre"</string>
<string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Copiando <xliff:g id="COUNT_0">%1$d</xliff:g> archivo.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Error al copiar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos.</item>
+ <item quantity="one">Error al copiar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Toca para ver más información"</string>
+ <string name="retry" msgid="7564024179122207376">"Volver a intentar"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Error al copiar archivos"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"No se han copiado los siguientes archivos: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml
index ebf3927..91ebfd1 100644
--- a/packages/DocumentsUI/res/values-et-rEE/strings.xml
+++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Peida SD-kaart"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Kuva faili suurus"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Peida faili suurus"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopeeri"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> on valitud"</string>
<string name="sort_name" msgid="9183560467917256779">"Nime järgi"</string>
<string name="sort_date" msgid="586080032956151448">"Muutmiskuupäeva järgi"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> faili kopeerimine.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Kopeerimise ettevalmistamine …"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Viga <xliff:g id="COUNT_1">%1$d</xliff:g> faili kopeerimisel.</item>
+ <item quantity="one">Viga <xliff:g id="COUNT_0">%1$d</xliff:g> faili kopeerimisel.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Puudutage üksikasjade vaatamiseks"</string>
+ <string name="retry" msgid="7564024179122207376">"Proovi uuesti"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Viga failide kopeerimisel"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Järgmiseid faile ei kopeeritud: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-eu-rES/strings.xml b/packages/DocumentsUI/res/values-eu-rES/strings.xml
index 95dca4a..fdb2585 100644
--- a/packages/DocumentsUI/res/values-eu-rES/strings.xml
+++ b/packages/DocumentsUI/res/values-eu-rES/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ezkutatu SD txartela"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Erakutsi fitxategi-tamaina"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ezkutatu fitxategi-tamaina"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopiatu"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> hautatuta"</string>
<string name="sort_name" msgid="9183560467917256779">"Izenaren arabera"</string>
<string name="sort_date" msgid="586080032956151448">"Aldatze-dataren arabera"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi kopiatzen.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Kopiatzeko prestatzen…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Errore bat gertatu da <xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi kopiatzean.</item>
+ <item quantity="one">Errore bat gertatu da <xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi kopiatzean.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Xehetasunak ikusteko, ukitu hau."</string>
+ <string name="retry" msgid="7564024179122207376">"Saiatu berriro"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Errore bat gertatu da fitxategiak kopiatzean"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Ez dira kopiatu fitxategi hauek: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml
index 77a8ca1..096d53f 100644
--- a/packages/DocumentsUI/res/values-fa/strings.xml
+++ b/packages/DocumentsUI/res/values-fa/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"پنهان کردن کارت SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"نمایش اندازه فایل"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"پنهان کردن اندازه فایل"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"کپی"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> انتخاب شد"</string>
<string name="sort_name" msgid="9183560467917256779">"بر اساس نام"</string>
<string name="sort_date" msgid="586080032956151448">"بر اساس تاریخ اصلاح"</string>
@@ -66,13 +65,12 @@
<item quantity="other">در حال کپی کردن <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"در حال آمادهسازی برای کپی..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">خطا هنگام کپی کردن <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item>
+ <item quantity="other">خطا هنگام کپی کردن <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"برای مشاهده جزئیات لمس کنید"</string>
+ <string name="retry" msgid="7564024179122207376">"امتحان مجدد"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"خطا هنگام کپی کردن فایلها"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"فایلهای زیر کپی نشد: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml
index c1e8449..ea4a572 100644
--- a/packages/DocumentsUI/res/values-fi/strings.xml
+++ b/packages/DocumentsUI/res/values-fi/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Piilota SD-kortti"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Näytä tiedostokoko"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Piilota tiedostokoko"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopioi"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> valittua"</string>
<string name="sort_name" msgid="9183560467917256779">"Nimen mukaan"</string>
<string name="sort_date" msgid="586080032956151448">"Muokkauspäivän mukaan"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Kopioidaan <xliff:g id="COUNT_0">%1$d</xliff:g> tiedosto.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Valmistellaan kopiointia…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Virhe kopioitaessa <xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa.</item>
+ <item quantity="one">Virhe kopioitaessa <xliff:g id="COUNT_0">%1$d</xliff:g> tiedostoa.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Lue lisätietoja koskettamalla"</string>
+ <string name="retry" msgid="7564024179122207376">"Yritä uudelleen"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Virhe kopioitaessa tiedostoja"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Seuraavia tiedostoja ei kopioitu: <xliff:g id="LIST">%1$s</xliff:g>."</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
index 2d6033b..e3d36c0 100644
--- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml
+++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Masquer la carte SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Afficher taille fichier"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Masquer taille fichier"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copier"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> sélectionné(s)"</string>
<string name="sort_name" msgid="9183560467917256779">"Par nom"</string>
<string name="sort_date" msgid="586080032956151448">"Par date de modification"</string>
@@ -66,13 +65,12 @@
<item quantity="other">Copier de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Préparation de la copie en cours"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Erreur lors de la copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier.</item>
+ <item quantity="other">Erreur lors de la copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Touchez ici pour afficher les détails"</string>
+ <string name="retry" msgid="7564024179122207376">"Réessayer"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Erreur lors de la copie des fichiers"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Les fichiers suivants n\'ont pas été copiés : <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml
index 64feecb..987f1f4 100644
--- a/packages/DocumentsUI/res/values-fr/strings.xml
+++ b/packages/DocumentsUI/res/values-fr/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Masquer la carte SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Afficher taille fichier"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Masquer taille fichier"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copier"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> élément(s) sélectionné(s)"</string>
<string name="sort_name" msgid="9183560467917256779">"Par nom"</string>
<string name="sort_date" msgid="586080032956151448">"Par date de modification"</string>
@@ -66,13 +65,12 @@
<item quantity="other">Copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours…</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Préparation de la copie en cours…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Erreur lors de la copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item>
+ <item quantity="other">Erreur lors de la copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Appuyez pour en savoir plus."</string>
+ <string name="retry" msgid="7564024179122207376">"Réessayer"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Erreur lors de la copie des fichiers"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Les fichiers suivants n\'ont pas été copiés : <xliff:g id="LIST">%1$s</xliff:g>."</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-gl-rES/strings.xml b/packages/DocumentsUI/res/values-gl-rES/strings.xml
index 518c62c..dcd9235 100644
--- a/packages/DocumentsUI/res/values-gl-rES/strings.xml
+++ b/packages/DocumentsUI/res/values-gl-rES/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar tarxeta SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño ficheiro"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño ficheiro"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copiar"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> seleccionados"</string>
<string name="sort_name" msgid="9183560467917256779">"Por nome"</string>
<string name="sort_date" msgid="586080032956151448">"Por data de modificación"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Copianto <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Produciuse un erro ao copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item>
+ <item quantity="one">Produciuse un erro ao copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Toca para ver detalles"</string>
+ <string name="retry" msgid="7564024179122207376">"Tentar de novo"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Produciuse un erro ao copiar ficheiros"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Os seguintes ficheiros non se copiaron: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-hi/strings.xml b/packages/DocumentsUI/res/values-hi/strings.xml
index b422333..f9c2ff0 100644
--- a/packages/DocumentsUI/res/values-hi/strings.xml
+++ b/packages/DocumentsUI/res/values-hi/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD कार्ड छिपाएं"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"फ़ाइल आकार दिखाएं"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"फ़ाइल आकार छिपाएं"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"कॉपी करें"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> चयनित"</string>
<string name="sort_name" msgid="9183560467917256779">"नाम के अनुसार"</string>
<string name="sort_date" msgid="586080032956151448">"बदलाव के दिनांक के अनुसार"</string>
@@ -66,13 +65,12 @@
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें कॉपी की जा रही हैं.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"कॉपी करने की तैयारी हो रही है…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें कॉपी करने में त्रुटि हुई.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें कॉपी करने में त्रुटि हुई.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"विवरण देखने के लिए स्पर्श करें"</string>
+ <string name="retry" msgid="7564024179122207376">"पुन: प्रयास करें"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"फ़ाइलें कॉपी करने में त्रुटि हुई"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"निम्न फ़ाइलें कॉपी नहीं की गईं: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml
index 518c62d..0ad4599 100644
--- a/packages/DocumentsUI/res/values-hr/strings.xml
+++ b/packages/DocumentsUI/res/values-hr/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Sakrij SD karticu"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Pokaži veličinu datoteke"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Sakrij veličinu datoteke"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopiraj"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Odabrano: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Po korisniku"</string>
<string name="sort_date" msgid="586080032956151448">"Po datumu izmjene"</string>
@@ -67,13 +66,13 @@
<item quantity="other">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Priprema za kopiranje…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Pogreška prilikom kopiranja <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item>
+ <item quantity="few">Pogreška prilikom kopiranja <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item>
+ <item quantity="other">Pogreška prilikom kopiranja <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Dodirnite da biste vidjeli pojedinosti"</string>
+ <string name="retry" msgid="7564024179122207376">"Pokušaj ponovo"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Pogreška prilikom kopiranja datoteka"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Sljedeće datoteke nisu kopirane: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml
index 172402b..76f732d 100644
--- a/packages/DocumentsUI/res/values-hu/strings.xml
+++ b/packages/DocumentsUI/res/values-hu/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD-kártya elrejtése"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Fájlméret megjelenítése"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Fájlméret elrejtése"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Másolás"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> kiválasztva"</string>
<string name="sort_name" msgid="9183560467917256779">"Név szerint"</string>
<string name="sort_date" msgid="586080032956151448">"Módosítás dátuma szerint"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fájl másolása.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Felkészülés a másolásra…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Hiba <xliff:g id="COUNT_1">%1$d</xliff:g> fájl átmásolása közben.</item>
+ <item quantity="one">Hiba <xliff:g id="COUNT_0">%1$d</xliff:g> fájl átmásolása közben.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Érintse meg a részletek megtekintéséhez"</string>
+ <string name="retry" msgid="7564024179122207376">"Újra"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Hiba a fájlok másolásakor"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"A következő fájlok nem lettek átmásolva: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml
index 89be3b5..3a804b1 100644
--- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml
+++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Թաքցնել SD քարտը"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Ցույց տալ ֆայլի չափը"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Թաքցնել ֆայլի չափը"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Պատճենել"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ընտրված"</string>
<string name="sort_name" msgid="9183560467917256779">"Ըստ անվան"</string>
<string name="sort_date" msgid="586080032956151448">"Ըստ փոփոխման ամսաթվի"</string>
@@ -66,13 +65,12 @@
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի պատճենում:</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Պատճենման նախապատրաստում…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Սխալ առաջացավ <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ պատճենելիս:</item>
+ <item quantity="other">Սխալ առաջացավ <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ պատճենելիս:</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Հպեք՝ մանրամասները դիտելու համար"</string>
+ <string name="retry" msgid="7564024179122207376">"Կրկնել"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Սխալ առաջացավ ֆայլերը պատճենելիս"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Հետևյալ ֆայլերը չեն պատճենվել՝ <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml
index ee15004..18e7896 100644
--- a/packages/DocumentsUI/res/values-in/strings.xml
+++ b/packages/DocumentsUI/res/values-in/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Sembunyikan kartu SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Tampilkan ukuran file"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Sembunyikan ukuran file"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Salin"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> dipilih"</string>
<string name="sort_name" msgid="9183560467917256779">"Menurut nama"</string>
<string name="sort_date" msgid="586080032956151448">"Menurut tanggal diubah"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Menyiapkan salinan..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Ada kesalahan saat menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item>
+ <item quantity="one">Ada kesalahan saat menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Sentuh untuk melihat detail"</string>
+ <string name="retry" msgid="7564024179122207376">"Coba lagi"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Ada kesalahan saat menyalin file"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"File berikut tidak disalin: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-is-rIS/strings.xml b/packages/DocumentsUI/res/values-is-rIS/strings.xml
index eebac4a..9b3799f 100644
--- a/packages/DocumentsUI/res/values-is-rIS/strings.xml
+++ b/packages/DocumentsUI/res/values-is-rIS/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Fela SD-kort"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Sýna skráarstærð"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Fela skráarstærð"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Afrita"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> valin"</string>
<string name="sort_name" msgid="9183560467917256779">"Eftir heiti"</string>
<string name="sort_date" msgid="586080032956151448">"Eftir breytingadags."</string>
@@ -66,13 +65,12 @@
<item quantity="other">Afritar <xliff:g id="COUNT_1">%1$d</xliff:g> skrár.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Undirbúningur fyrir afritun…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Villa við afritun á <xliff:g id="COUNT_1">%1$d</xliff:g> skrá.</item>
+ <item quantity="other">Villa við afritun á <xliff:g id="COUNT_1">%1$d</xliff:g> skrám.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Snertu til að skoða nánari upplýsingar"</string>
+ <string name="retry" msgid="7564024179122207376">"Reyna aftur"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Villa við að afrita skrár"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Eftirfarandi skrár eru ekki afritaðar: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml
index b905e6d..e889da0 100644
--- a/packages/DocumentsUI/res/values-it/strings.xml
+++ b/packages/DocumentsUI/res/values-it/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Nascondi scheda SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Mostra dimensioni file"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Nascondi dimensioni file"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copia"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selezionati"</string>
<string name="sort_name" msgid="9183560467917256779">"Per nome"</string>
<string name="sort_date" msgid="586080032956151448">"Per data di modifica"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Copia di <xliff:g id="COUNT_0">%1$d</xliff:g> file in corso.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Preparazione alla copia…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Errore durante la copia di <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item>
+ <item quantity="one">Errore durante la copia di <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Tocca per visualizzare i dettagli"</string>
+ <string name="retry" msgid="7564024179122207376">"Riprova"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Errore durante la copia dei file"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"I seguenti file non sono stati copiati: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml
index c7fcea8..f04dabd2 100644
--- a/packages/DocumentsUI/res/values-iw/strings.xml
+++ b/packages/DocumentsUI/res/values-iw/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"הסתר כרטיס SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"הצג גודל קובץ"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"הסתר גודל קובץ"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"העתק"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> נבחרו"</string>
<string name="sort_name" msgid="9183560467917256779">"לפי שם"</string>
<string name="sort_date" msgid="586080032956151448">"לפי תאריך שינוי"</string>
@@ -68,13 +67,14 @@
<item quantity="one">מעתיק קובץ <xliff:g id="COUNT_0">%1$d</xliff:g>.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"מתכונן להעתקה..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="two">אירעה שגיאה בהעתקה של <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item>
+ <item quantity="many">אירעה שגיאה בהעתקה של <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item>
+ <item quantity="other">אירעה שגיאה בהעתקה של <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item>
+ <item quantity="one">אירעה שגיאה בהעתקה של קובץ <xliff:g id="COUNT_0">%1$d</xliff:g>.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"גע כדי להציג את הפרטים"</string>
+ <string name="retry" msgid="7564024179122207376">"נסה שוב"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"אירעה שגיאה בהעתקת קבצים"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"הקבצים הבאים לא הועתקו: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml
index 939ebdc..da9fbb5 100644
--- a/packages/DocumentsUI/res/values-ja/strings.xml
+++ b/packages/DocumentsUI/res/values-ja/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SDカードを非表示"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ファイルサイズを表示"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ファイルサイズを非表示"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"コピー"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g>件選択済み"</string>
<string name="sort_name" msgid="9183560467917256779">"名前順"</string>
<string name="sort_date" msgid="586080032956151448">"更新日順"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>個のファイルをコピーしています。</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"コピーの準備をしています…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>個のファイルのコピー中にエラーが発生しました</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>個のファイルのコピー中にエラーが発生しました</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"タップして詳細をご覧ください"</string>
+ <string name="retry" msgid="7564024179122207376">"再試行"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ファイルのコピーエラー"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"次のファイルはコピーされていません。<xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml
index 92da133..2214f5a 100644
--- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml
+++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD ბარათის დამალვა"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ფაილის ზომის ჩვენება"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ფაილის ზომის დამალვა"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"კოპირება"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> მონიშნული"</string>
<string name="sort_name" msgid="9183560467917256779">"სახელით"</string>
<string name="sort_date" msgid="586080032956151448">"ცვლილების თარიღით"</string>
@@ -66,13 +65,12 @@
<item quantity="one">მიმდინარეობს <xliff:g id="COUNT_0">%1$d</xliff:g> ფაილის კოპირება.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"მომზადება კოპირებისთვის…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">შეცდომა მოხდა <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილის კოპირებისა.</item>
+ <item quantity="one">შეცდომა მოხდა <xliff:g id="COUNT_0">%1$d</xliff:g> ფაილის კოპირებისას.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"შეეხეთ მონაცემების სანახავად."</string>
+ <string name="retry" msgid="7564024179122207376">"ხელახლა ცდა"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ფაილების გადაწერისას მოხდა შეცდომა"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"შემდეგი ფაილები არ გადაიწერა: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml
index b16f6ac..e3653e6 100644
--- a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml
+++ b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD картасын жасыру"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Файл өлшемін көрсету"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Файл өлшемін жасыру"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Көшіру"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> таңдалды"</string>
<string name="sort_name" msgid="9183560467917256779">"Атауы бойынша"</string>
<string name="sort_date" msgid="586080032956151448">"Өзгертілген мерзімі бойынша"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды көшіру.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Көшіруге дайындау…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды көшіру қатесі.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды көшіру қатесі.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Толығырақ мәліметті көру үшін түртіңіз"</string>
+ <string name="retry" msgid="7564024179122207376">"Қайталау"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Файлдарды көшіру қатесі"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Келесі файлдар көшірілмейді: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-km-rKH/strings.xml b/packages/DocumentsUI/res/values-km-rKH/strings.xml
index 4fd9a63..b5688a2 100644
--- a/packages/DocumentsUI/res/values-km-rKH/strings.xml
+++ b/packages/DocumentsUI/res/values-km-rKH/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"លាក់កាតអេសឌី"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"បង្ហាញទំហំឯកសារ"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"លាក់ទំហំឯកសារ"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"ចម្លង"</string>
<string name="mode_selected_count" msgid="459111894725594625">"បានជ្រើស <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"តាមឈ្មោះ"</string>
<string name="sort_date" msgid="586080032956151448">"តាមកាលបរិច្ឆេទបានកែប្រែ"</string>
@@ -66,13 +65,12 @@
<item quantity="one">កំពុងថតចម្លងឯកសារចំនួន <xliff:g id="COUNT_0">%1$d</xliff:g> ។</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"កំពុងរៀបចំចម្លង…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">កំហុសក្នុងការចម្លងឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g>។</item>
+ <item quantity="one">កំហុសក្នុងការចម្លងឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g>។</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"ប៉ះ ដើម្បីមើលព័ត៌មានលម្អិត"</string>
+ <string name="retry" msgid="7564024179122207376">"ព្យាយាមម្ដងទៀត"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"កំហុសក្នុងការចម្លងឯកសារ"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"ឯកសារខាងក្រោមមិនត្រូវបានចម្លងទេ៖ <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-kn-rIN/strings.xml b/packages/DocumentsUI/res/values-kn-rIN/strings.xml
index fb0d818..ae5d02b 100644
--- a/packages/DocumentsUI/res/values-kn-rIN/strings.xml
+++ b/packages/DocumentsUI/res/values-kn-rIN/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD ಕಾರ್ಡ್ ಅನ್ನು ಮರೆಮಾಡಿ"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ಫೈಲ್ ಗಾತ್ರವನ್ನು ತೋರಿಸು"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ಫೈಲ್ ಗಾತ್ರವನ್ನು ಮರೆಮಾಡಿ"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"ನಕಲಿಸು"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ"</string>
<string name="sort_name" msgid="9183560467917256779">"ಹೆಸರಿನ ಪ್ರಕಾರ"</string>
<string name="sort_date" msgid="586080032956151448">"ಮಾರ್ಪಡಿಸಿರುವ ದಿನಾಂಕದ ಪ್ರಕಾರ"</string>
@@ -66,13 +65,12 @@
<item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗುತ್ತಿದೆ.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"ನಕಲಿಸಲು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸುವಲ್ಲಿ ದೋಷ.</item>
+ <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸುವಲ್ಲಿ ದೋಷ.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"ವಿವರಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಸ್ಪರ್ಶಿಸಿ"</string>
+ <string name="retry" msgid="7564024179122207376">"ಮರುಪ್ರಯತ್ನಿಸು"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸುವಲ್ಲಿ ದೋಷ"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"ಕೆಳಗಿನ ಫೈಲ್ಗಳನ್ನು ನಕಲು ಮಾಡಲಾಗಿಲ್ಲ: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml
index 073b9c6..d2ff58c 100644
--- a/packages/DocumentsUI/res/values-ko/strings.xml
+++ b/packages/DocumentsUI/res/values-ko/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD 카드 숨기기"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"파일 크기 표시"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"파일 크기 숨기기"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"복사"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g>개 선택됨"</string>
<string name="sort_name" msgid="9183560467917256779">"이름순"</string>
<string name="sort_date" msgid="586080032956151448">"수정된 날짜순"</string>
@@ -66,13 +65,12 @@
<item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 복사합니다.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"사본 준비 중…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개 복사 중 오류가 발생했습니다.</item>
+ <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개 복사 중 오류가 발생했습니다.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"세부정보를 보려면 터치하세요."</string>
+ <string name="retry" msgid="7564024179122207376">"다시 시도"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"파일 복사 중 오류 발생"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"다음 파일이 복사되지 않았습니다. <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ky-rKG/strings.xml b/packages/DocumentsUI/res/values-ky-rKG/strings.xml
index 5aa4c837..b9569c5 100644
--- a/packages/DocumentsUI/res/values-ky-rKG/strings.xml
+++ b/packages/DocumentsUI/res/values-ky-rKG/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD картаны жашыруу"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Файл өлчөмүн көрсөтүү"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Файл өлчөмүн жашыруу"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Көчүрүү"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> тандалды"</string>
<string name="sort_name" msgid="9183560467917256779">"Аты боюнча"</string>
<string name="sort_date" msgid="586080032956151448">"Өзгөртүлгөн күнү боюнча"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл көчүрүлүүдө.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Көчүрүүгө даярдалууда…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды көчүрүүдөгү ката.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды көчүрүүдөгү ката.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Чоо-жайын билүү үчүн тийип коюңуз"</string>
+ <string name="retry" msgid="7564024179122207376">"Дагы аракет кылуу"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Файлдарды көчүрүүдөгү ката"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Төмөнкү файлдар көчүрүлгөн жок: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml
index f9e39e9..03b9f2e 100644
--- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml
+++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"ເຊື່ອງ SD Card"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ສະແດງຂະໜາດໄຟລ໌"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ເຊື່ອງຂະຫນາດໄຟລ໌"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"ສຳເນົາ"</string>
<string name="mode_selected_count" msgid="459111894725594625">"ເລືອກແລ້ວ <xliff:g id="COUNT">%1$d</xliff:g> ລາຍການ"</string>
<string name="sort_name" msgid="9183560467917256779">"ຕາມຊື່"</string>
<string name="sort_date" msgid="586080032956151448">"ຕາມວັນທີທີ່ແກ້ໄຂ"</string>
@@ -66,13 +65,12 @@
<item quantity="one">ກຳລັງອັດສຳເນົາ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"ກຳລັງກຽມອັດສຳເນົາ…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">ມີຄວາມຜິດພາດການອັດສຳເນົາ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌.</item>
+ <item quantity="one">ມີຄວາມຜິດພາດການອັດສຳເນົາ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"ສຳພັດເພື່ອເບິ່ງລາຍລະອຽດ"</string>
+ <string name="retry" msgid="7564024179122207376">"ລອງໃໝ່"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ມີຂໍ້ຜິດພາດການອັດສຳເນົາ"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"ໄຟລ໌ຕໍ່ໄປນີ້ບໍ່ຖືກອັດສຳເນົາ: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml
index cb968ad..d313a9d 100644
--- a/packages/DocumentsUI/res/values-lt/strings.xml
+++ b/packages/DocumentsUI/res/values-lt/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Slėpti SD kortelę"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Rodyti failo dydį"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Slėpti failo dydį"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopijuoti"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Pasirinkta: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Pagal pavadinimą"</string>
<string name="sort_date" msgid="586080032956151448">"Pagal keitimo datą"</string>
@@ -68,13 +67,14 @@
<item quantity="other">Kopijuojama <xliff:g id="COUNT_1">%1$d</xliff:g> failų.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Ruošiamasi kopijuoti…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Klaida kopijuojant <xliff:g id="COUNT_1">%1$d</xliff:g> failą.</item>
+ <item quantity="few">Klaida kopijuojant <xliff:g id="COUNT_1">%1$d</xliff:g> failus.</item>
+ <item quantity="many">Klaida kopijuojant <xliff:g id="COUNT_1">%1$d</xliff:g> failo.</item>
+ <item quantity="other">Klaida kopijuojant <xliff:g id="COUNT_1">%1$d</xliff:g> failų.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Palieskite, kad peržiūr. išsamią informaciją"</string>
+ <string name="retry" msgid="7564024179122207376">"Bandyti dar kartą"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Klaida kopijuojant failus"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Šie failai nenukopijuoti: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml
index 6c911fa..fb92de2 100644
--- a/packages/DocumentsUI/res/values-lv/strings.xml
+++ b/packages/DocumentsUI/res/values-lv/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Paslēpt SD karti"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Rādīt failu lielumu"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Paslēpt failu lielumu"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopēt"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Atlasīts: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Pēc nosaukuma"</string>
<string name="sort_date" msgid="586080032956151448">"Pēc pārveidošanas datuma"</string>
@@ -67,13 +66,13 @@
<item quantity="other">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu kopēšana.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Gatavošanās kopēšanai…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="zero">Kopējot <xliff:g id="COUNT_1">%1$d</xliff:g> failus, radās kļūda.</item>
+ <item quantity="one">Kopējot <xliff:g id="COUNT_1">%1$d</xliff:g> failu, radās kļūda.</item>
+ <item quantity="other">Kopējot <xliff:g id="COUNT_1">%1$d</xliff:g> failus, radās kļūda.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Pieskarieties, lai skatītu informāciju"</string>
+ <string name="retry" msgid="7564024179122207376">"Mēģināt vēlreiz"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Kopējot failus, radās kļūda"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Tālāk norādītie faili netika kopēti: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-mk-rMK/strings.xml b/packages/DocumentsUI/res/values-mk-rMK/strings.xml
index 748ac2e..34b2509 100644
--- a/packages/DocumentsUI/res/values-mk-rMK/strings.xml
+++ b/packages/DocumentsUI/res/values-mk-rMK/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Сoкриј СД-картичка"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Прикажи целосна големина"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Сокриј целосна големина"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Копирај"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Избрани се <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"По име"</string>
<string name="sort_date" msgid="586080032956151448">"Изменети по датум"</string>
@@ -66,13 +65,12 @@
<item quantity="other">Се копираат <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Се подготвува за копирање…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Грешка при копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item>
+ <item quantity="other">Грешка при копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Допрете за да ги погледнете деталите"</string>
+ <string name="retry" msgid="7564024179122207376">"Обидете се повторно"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Грешка при копирање датотеки"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Следните датотеки не се копирани: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ml-rIN/strings.xml b/packages/DocumentsUI/res/values-ml-rIN/strings.xml
index 750c842..c7bdbad 100644
--- a/packages/DocumentsUI/res/values-ml-rIN/strings.xml
+++ b/packages/DocumentsUI/res/values-ml-rIN/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD കാർഡ് മറയ്ക്കുക"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ഫയൽ വലുപ്പം കാണിക്കുക"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ഫയൽ വലുപ്പം മറയ്ക്കുക"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"പകര്ത്തുക"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> തിരഞ്ഞെടുത്തു"</string>
<string name="sort_name" msgid="9183560467917256779">"പേര് പ്രകാരം"</string>
<string name="sort_date" msgid="586080032956151448">"പരിഷ്ക്കരിച്ച തീയതി പ്രകാരം"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ പകർത്തുന്നു.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"പകർപ്പിനായി തയ്യാറെടുക്കുന്നു…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ പകർത്തുന്നതിൽ പിശക്.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ പകർത്തുന്നതിൽ പിശക്.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"വിശദാംശങ്ങൾ കാണാൻ സ്പർശിക്കുക"</string>
+ <string name="retry" msgid="7564024179122207376">"വീണ്ടും ശ്രമിക്കുക"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ഫയലുകൾ പകർത്തുന്നതിൽ പിശക്"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"ഇനിപ്പറയുന്ന ഫയലുകൾ പകർത്തിയില്ല: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml
index 28174ec..850ae55 100644
--- a/packages/DocumentsUI/res/values-mn-rMN/strings.xml
+++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD картыг нуух"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Файлын хэмжээг харуулах"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Файлын хэмжээг нуух"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Хуулах"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> сонгогдсон"</string>
<string name="sort_name" msgid="9183560467917256779">"Нэрээр"</string>
<string name="sort_date" msgid="586080032956151448">"Өөрчлөгдсөн огноогоор"</string>
@@ -66,13 +65,12 @@
<item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файл хуулж байна.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Хуулбарлахад бэлтгэж байна..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файлыг хуулахад алдаа гарлаа.</item>
+ <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> Файлыг хуулбарлахад алдаа гарлаа</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Дэлгэрэнгүй мэдээллийг үзэхийн тулд хүрнэ үү."</string>
+ <string name="retry" msgid="7564024179122207376">"Дахин оролдох"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Файл хуулбарлахад алдаа гарлаа"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Дараах файлуудыг хуулаагүй байна : <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-mr-rIN/strings.xml b/packages/DocumentsUI/res/values-mr-rIN/strings.xml
index 5664515..94e3dfe 100644
--- a/packages/DocumentsUI/res/values-mr-rIN/strings.xml
+++ b/packages/DocumentsUI/res/values-mr-rIN/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD कार्ड लपवा"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"फाईल आकार दर्शवा"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"फाईल आकार लपवा"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"कॉपी करा"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> निवडले"</string>
<string name="sort_name" msgid="9183560467917256779">"नावानुसार"</string>
<string name="sort_date" msgid="586080032956151448">"सुधारित केलेल्या तारखेनुसार"</string>
@@ -66,13 +65,12 @@
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फायली कॉपी करीत आहे.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"कॉपी करण्यासाठी तयार करीत आहे…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फाईल कॉपी करताना त्रुटी.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फायली कॉपी करताना त्रुटी.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"तपशील पाहण्यासाठी स्पर्श करा"</string>
+ <string name="retry" msgid="7564024179122207376">"पुन्हा प्रयत्न करा"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"फायली कॉपी करताना त्रुटी"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"या फायलींची कॉपी केली नाही: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml
index 69bfd34..d338ac7 100644
--- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml
+++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Sembunyikan kad SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Papar saiz fail"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Sembunyikan saiz fail"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Salin"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> dipilih"</string>
<string name="sort_name" msgid="9183560467917256779">"Mengikut nama"</string>
<string name="sort_date" msgid="586080032956151448">"Diubah suai mengikut tarikh"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> fail.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Bersedia untuk salin..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Ralat semasa menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> fail.</item>
+ <item quantity="one">Ralat semasa menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> fail.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Sentuh untuk melihat butiran"</string>
+ <string name="retry" msgid="7564024179122207376">"Cuba semula"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Ralat semasa menyalin fail"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Fail berikut tidak disalin: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-my-rMM/strings.xml b/packages/DocumentsUI/res/values-my-rMM/strings.xml
index e2513e8..60736fb 100644
--- a/packages/DocumentsUI/res/values-my-rMM/strings.xml
+++ b/packages/DocumentsUI/res/values-my-rMM/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD ကဒ် ဖျောက်ပါ"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ဖိုင်အရွယ်အစား ပြပါ"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ဖိုင်အရွယ်အစား ဖျောက်ပါ"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"ကူးယူရန်"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ခရွေးချယ်ပြီး"</string>
<string name="sort_name" msgid="9183560467917256779">"အမည်ဖြင့်"</string>
<string name="sort_date" msgid="586080032956151448">"ပြင်ဆင်မှု ရက်စွဲဖြင့်"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ဖိုင် ကူးယူနေသည်။</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"မိတ္တူကူးရန်ပြင်ဆင်နေ..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>ဖိုင်များအား ကူးယူရာတွင် အမှားဖြစ်ပေါ်၏။</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ဖိုင်အား ကူးယူရာတွင် အမှားဖြစ်ပေါ်၏။</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"အသေးစိတ် ကြည့်ရန် ထိပါ။"</string>
+ <string name="retry" msgid="7564024179122207376">"ထပ်စမ်းရန်"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ဖိုင်များကူးယူရာတွင် အမှားဖြစ်ပေါ်၏"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"ဖော်ပြပါ ဖိုင်များအား ကူးယူထားခြင်းမရှိပါ- <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml
index 4f0c866..8acbc8e 100644
--- a/packages/DocumentsUI/res/values-nb/strings.xml
+++ b/packages/DocumentsUI/res/values-nb/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skjul SD-kortet"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Vis filstørrelsen"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Skjul filstørrelsen"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopiér"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> valgt"</string>
<string name="sort_name" msgid="9183560467917256779">"Etter navn"</string>
<string name="sort_date" msgid="586080032956151448">"«Etter dato» endret"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Kopierer <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Forbereder kopiering …"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Feil ved kopiering av <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item>
+ <item quantity="one">Feil ved kopiering av <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Trykk for å se detaljer"</string>
+ <string name="retry" msgid="7564024179122207376">"Prøv på nytt"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Feil ved kopiering av filer"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Følgende filer er ikke kopiert: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ne-rNP/strings.xml b/packages/DocumentsUI/res/values-ne-rNP/strings.xml
index 7aa51e6..c65f554 100644
--- a/packages/DocumentsUI/res/values-ne-rNP/strings.xml
+++ b/packages/DocumentsUI/res/values-ne-rNP/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD कार्ड लुकाउनुहोस्"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"फाइल आकार देखाउनुहोस्"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"फाइल आकार लुकाउनुहोस्"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"प्रतिलिपि बनाउनुहोस्"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> चयन गरियो"</string>
<string name="sort_name" msgid="9183560467917256779">"नाम अनुसार"</string>
<string name="sort_date" msgid="586080032956151448">"परिमार्जित मिति अनुसार"</string>
@@ -66,13 +65,12 @@
<item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> फाइल प्रतिलिपि गर्दै।</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"प्रतिलिपिको लागि तयारी गर्दै ..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फाइलहरु प्रतिलिपि बनाउदा त्रुटि।</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> फाइल प्रतिलिपि बनाउदा त्रुटि।</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"विवरणहरू हेर्न छुनुहोस्"</string>
+ <string name="retry" msgid="7564024179122207376">"पुनःप्रयास गर्नुहोस्"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"फाइलहरु प्रतिलिपिमा त्रुटि"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"निम्नलिखित फाइलहरूको प्रतिलिपि बनाइएको छैनन्: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml
index b5e4930..29f8e08 100644
--- a/packages/DocumentsUI/res/values-nl/strings.xml
+++ b/packages/DocumentsUI/res/values-nl/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD-kaart verbergen"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Bestandsgrootte weergeven"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Bestandsgrootte verbergen"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopiëren"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> geselecteerd"</string>
<string name="sort_name" msgid="9183560467917256779">"Op naam"</string>
<string name="sort_date" msgid="586080032956151448">"Op aanpassingsdatum"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> bestand kopiëren.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Kopiëren voorbereiden…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Fout bij kopiëren van <xliff:g id="COUNT_1">%1$d</xliff:g> bestanden.</item>
+ <item quantity="one">Fout bij kopiëren van <xliff:g id="COUNT_0">%1$d</xliff:g> bestand.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Tik om details weer te geven"</string>
+ <string name="retry" msgid="7564024179122207376">"Opnieuw proberen"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Fout bij kopiëren van bestanden"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"De volgende bestanden zijn niet gekopieerd: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml
index 4d39387..3945199 100644
--- a/packages/DocumentsUI/res/values-pl/strings.xml
+++ b/packages/DocumentsUI/res/values-pl/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ukryj kartę SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Pokaż rozmiar pliku"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ukryj rozmiar pliku"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopiuj"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Wybrano: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Według nazwy"</string>
<string name="sort_date" msgid="586080032956151448">"Według daty edycji"</string>
@@ -68,13 +67,14 @@
<item quantity="one">Kopiowanie <xliff:g id="COUNT_0">%1$d</xliff:g> pliku.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Przygotowuję do kopiowania…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="few">Podczas kopiowania <xliff:g id="COUNT_1">%1$d</xliff:g> plików wystąpił błąd.</item>
+ <item quantity="many">Podczas kopiowania <xliff:g id="COUNT_1">%1$d</xliff:g> plików wystąpił błąd.</item>
+ <item quantity="other">Podczas kopiowania <xliff:g id="COUNT_1">%1$d</xliff:g> pliku wystąpił błąd.</item>
+ <item quantity="one">Podczas kopiowania <xliff:g id="COUNT_0">%1$d</xliff:g> pliku wystąpił błąd.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Kliknij, by zobaczyć szczegóły"</string>
+ <string name="retry" msgid="7564024179122207376">"Ponów"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Błąd podczas kopiowania plików"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Te pliki nie zostały skopiowane: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml
index c145be9..982b68e 100644
--- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml
+++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar cartão SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tam. de fich."</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tam. de fich."</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copiar"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selecionado(s)"</string>
<string name="sort_name" msgid="9183560467917256779">"Por nome"</string>
<string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string>
@@ -66,13 +65,12 @@
<item quantity="one">A copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"A preparar para copiar…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Erro ao copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item>
+ <item quantity="one">Erro ao copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Toque para ver detalhes"</string>
+ <string name="retry" msgid="7564024179122207376">"Tentar novamente"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Erro ao copiar os ficheiros"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Os ficheiros seguintes não foram copiados: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml
index b47a084..17c8e2b 100644
--- a/packages/DocumentsUI/res/values-pt/strings.xml
+++ b/packages/DocumentsUI/res/values-pt/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar cartão SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tam. do arquivo"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tam. do arquivo"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copiar"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selecionados"</string>
<string name="sort_name" msgid="9183560467917256779">"Por nome"</string>
<string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string>
@@ -66,13 +65,12 @@
<item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Erro ao copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item>
+ <item quantity="other">Erro ao copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Toque para ver detalhes"</string>
+ <string name="retry" msgid="7564024179122207376">"Repetir"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Erro ao copiar arquivos"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Os seguintes arquivos não foram copiados: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml
index 9dd4abc..d6cfaee 100644
--- a/packages/DocumentsUI/res/values-ro/strings.xml
+++ b/packages/DocumentsUI/res/values-ro/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ascundeți cardul SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Afișați mărime fișiere"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ascundeți mărime fișiere"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Copiați"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selectate"</string>
<string name="sort_name" msgid="9183560467917256779">"După nume"</string>
<string name="sort_date" msgid="586080032956151448">"După data modificării"</string>
@@ -67,13 +66,13 @@
<item quantity="one">Se copiază <xliff:g id="COUNT_0">%1$d</xliff:g> fișier.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Se pregătește copierea..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="few">Eroare la copiere pentru <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere.</item>
+ <item quantity="other">Eroare la copiere pentru <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere.</item>
+ <item quantity="one">Eroare la copiere pentru <xliff:g id="COUNT_0">%1$d</xliff:g> fișier.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Atingeți pentru a afișa detaliile"</string>
+ <string name="retry" msgid="7564024179122207376">"Reîncercați"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Eroare la copierea fișierelor"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Următoarele fișiere nu au fost copiate: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml
index 839dd27..77dd9c5 100644
--- a/packages/DocumentsUI/res/values-ru/strings.xml
+++ b/packages/DocumentsUI/res/values-ru/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Скрыть SD-карту"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Показать размер файлов"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Скрыть размер файлов"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Копировать"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Выбрано: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"По названию"</string>
<string name="sort_date" msgid="586080032956151448">"По дате изменения"</string>
@@ -68,13 +67,14 @@
<item quantity="other">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файла...</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Подготовка к копированию…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item>
+ <item quantity="few">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item>
+ <item quantity="many">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файлов</item>
+ <item quantity="other">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Нажмите, чтобы узнать подробности."</string>
+ <string name="retry" msgid="7564024179122207376">"Повторить"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Во время копирования файлов произошла ошибка"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Не удалось скопировать следующие файлы: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml
index d7b6cd9..0dff55f 100644
--- a/packages/DocumentsUI/res/values-si-rLK/strings.xml
+++ b/packages/DocumentsUI/res/values-si-rLK/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD කාඩ් පත සඟවන්න"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ගොනු ප්රමණය පෙන්වන්න"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ගොනු ප්රමණය සඟවන්න"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"පිටපත් කිරීම"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ක් තෝරාගන්නා ලදි"</string>
<string name="sort_name" msgid="9183560467917256779">"නමින්"</string>
<string name="sort_date" msgid="586080032956151448">"වෙනස් කරන ලද දිනයෙන්"</string>
@@ -66,13 +65,12 @@
<item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කරමින්.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"පිටපතක් සඳහා සූදානම් කරමින්..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කිරීමේ දෝෂය</item>
+ <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කිරීමේ දෝෂය</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"විස්තර බැලීමට ස්පර්ශ කරන්න"</string>
+ <string name="retry" msgid="7564024179122207376">"නැවත උත්සාහ කරන්න"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ගොනු පිටපත් කිරීමේ දෝෂය"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"පහත ගොනු පිටපත් නොකෙරේ: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml
index f4e401a..a4c2b58 100644
--- a/packages/DocumentsUI/res/values-sk/strings.xml
+++ b/packages/DocumentsUI/res/values-sk/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skryť kartu SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Zobraziť veľkosť súboru"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Skryť veľkosť súboru"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopírovať"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Vybraté: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Podľa názvu"</string>
<string name="sort_date" msgid="586080032956151448">"Podľa dátumu zmeny"</string>
@@ -68,13 +67,14 @@
<item quantity="one">Kopíruje sa <xliff:g id="COUNT_0">%1$d</xliff:g> súbor.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Pripravuje sa na kopírovanie..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="few">Pri kopírovaní <xliff:g id="COUNT_1">%1$d</xliff:g> súborov sa vyskytla chyba</item>
+ <item quantity="many">Pri kopírovaní <xliff:g id="COUNT_1">%1$d</xliff:g> súboru sa vyskytla chyba</item>
+ <item quantity="other">Pri kopírovaní <xliff:g id="COUNT_1">%1$d</xliff:g> súborov sa vyskytla chyba</item>
+ <item quantity="one">Pri kopírovaní <xliff:g id="COUNT_0">%1$d</xliff:g> súboru sa vyskytla chyba</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Klepnutím zobrazíte podrobné informácie"</string>
+ <string name="retry" msgid="7564024179122207376">"Skúsiť znova"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Pri kopírovaní súborov sa vyskytla chyba"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Nasledujúce súbory neboli skopírované: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml
index 2e57114..d232ba0 100644
--- a/packages/DocumentsUI/res/values-sl/strings.xml
+++ b/packages/DocumentsUI/res/values-sl/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skrij kartico SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Pokaži velikost datoteke"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Skrij velikost datoteke"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopiraj"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Št. izbranih: <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Po imenu"</string>
<string name="sort_date" msgid="586080032956151448">"Po datumu spremembe"</string>
@@ -68,13 +67,14 @@
<item quantity="other">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Pripravljanje na kopiranje …"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Napaka pri kopiranju <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item>
+ <item quantity="two">Napaka pri kopiranju <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item>
+ <item quantity="few">Napaka pri kopiranju <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item>
+ <item quantity="other">Napaka pri kopiranju <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Dotaknite se za ogled podrobnosti"</string>
+ <string name="retry" msgid="7564024179122207376">"Poskusi znova"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Napaka pri kopiranju datotek"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Te datoteke niso kopirane: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml
index 7c3f2c9b..80c59ba 100644
--- a/packages/DocumentsUI/res/values-sr/strings.xml
+++ b/packages/DocumentsUI/res/values-sr/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Сакриј SD картицу"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Прикажи величину датотеке"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Сакриј величину датотеке"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Копирај"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Изабрано је <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Према имену"</string>
<string name="sort_date" msgid="586080032956151448">"Према датуму измене"</string>
@@ -67,13 +66,13 @@
<item quantity="other">Копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Припрема се копирање…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Грешка при копирању <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item>
+ <item quantity="few">Грешка при копирању <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item>
+ <item quantity="other">Грешка при копирању <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Додирните да бисте видели детаље"</string>
+ <string name="retry" msgid="7564024179122207376">"Покушај поново"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Грешка при копирању датотека"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Следеће датотеке нису копиране: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml
index cafba2c..509b084 100644
--- a/packages/DocumentsUI/res/values-sv/strings.xml
+++ b/packages/DocumentsUI/res/values-sv/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Dölj SD-kort"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Visa filstorlek"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Dölj filstorlek"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopiera"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Har valt <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Efter namn"</string>
<string name="sort_date" msgid="586080032956151448">"Efter ändringsdatum"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Kopierar <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Kopieringen förbereds …"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Det gick inte att kopiera <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item>
+ <item quantity="one">Det gick inte att kopiera <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Tryck här om du vill veta mer"</string>
+ <string name="retry" msgid="7564024179122207376">"Försök igen"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Det gick inte att kopiera filer"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Följande filer kopierades inte: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml
index 61f5874..e9711ed0 100644
--- a/packages/DocumentsUI/res/values-sw/strings.xml
+++ b/packages/DocumentsUI/res/values-sw/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ficha kadi ya SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Onyesha ukubwa wa faili"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ficha ukubwa wa faili"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Nakili"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> zimechaguliwa"</string>
<string name="sort_name" msgid="9183560467917256779">"Kwa jina"</string>
<string name="sort_date" msgid="586080032956151448">"Kwa tarehe viliporekebishwa"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Inanakili faili <xliff:g id="COUNT_0">%1$d</xliff:g>.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Inaanda kunakili..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Hitilafu ya kunakili faili <xliff:g id="COUNT_1">%1$d</xliff:g>.</item>
+ <item quantity="one">Hitilafu ya kunakili faili <xliff:g id="COUNT_0">%1$d</xliff:g>.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Gusa ili uone maelezo"</string>
+ <string name="retry" msgid="7564024179122207376">"Jaribu tena"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Hitilafu ya kunakili faili"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Faili zifuatazo hazijanakiliwa: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ta-rIN/strings.xml b/packages/DocumentsUI/res/values-ta-rIN/strings.xml
index 6ce4983..4e74f47 100644
--- a/packages/DocumentsUI/res/values-ta-rIN/strings.xml
+++ b/packages/DocumentsUI/res/values-ta-rIN/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD கார்டை மறை"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"கோப்பு அளவைக் காட்டு"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"கோப்பு அளவை மறை"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"நகலெடு"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டன"</string>
<string name="sort_name" msgid="9183560467917256779">"பெயரின்படி"</string>
<string name="sort_date" msgid="586080032956151448">"தேதியின்படி திருத்தப்பட்டது"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகலெடுக்கிறது.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"நகல் தயாராகிறது…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நகலெடுப்பதில் பிழை.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகலெடுப்பதில் பிழை.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"விவரங்களைப் பார்க்க, தொடவும்"</string>
+ <string name="retry" msgid="7564024179122207376">"மீண்டும் முயற்சிக்கவும்"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"கோப்புகளை நகலெடுப்பதில் பிழை"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"பின்வரும் கோப்புகள் நகலெடுக்கப்படவில்லை: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-te-rIN/strings.xml b/packages/DocumentsUI/res/values-te-rIN/strings.xml
index 8215fcd..7817b05 100644
--- a/packages/DocumentsUI/res/values-te-rIN/strings.xml
+++ b/packages/DocumentsUI/res/values-te-rIN/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD కార్డ్ను దాచు"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"ఫైల్ పరిమాణాన్ని చూపు"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ఫైల్ పరిమాణాన్ని దాచు"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"కాపీ చేయి"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ఎంచుకోబడ్డాయి"</string>
<string name="sort_name" msgid="9183560467917256779">"పేరు ద్వారా"</string>
<string name="sort_date" msgid="586080032956151448">"సవరించిన తేదీ ద్వారా"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను కాపీ చేస్తోంది.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"కాపీ చేయడానికి సిద్ధం చేస్తోంది…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను కాపీ చేయడంలో లోపం.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను కాపీ చేయడంలో లోపం.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"వివరాలను వీక్షించడానికి తాకండి"</string>
+ <string name="retry" msgid="7564024179122207376">"మళ్లీ ప్రయత్నించు"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"ఫైల్లను కాపీ చేయడంలో లోపం"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"క్రింది ఫైల్లు కాపీ చేయబడలేదు: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml
index eb2c2ed..eea8504 100644
--- a/packages/DocumentsUI/res/values-th/strings.xml
+++ b/packages/DocumentsUI/res/values-th/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"ซ่อนการ์ด SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"แสดงขนาดไฟล์"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"ซ่อนขนาดไฟล์"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"คัดลอก"</string>
<string name="mode_selected_count" msgid="459111894725594625">"เลือกไว้ <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"ตามชื่อ"</string>
<string name="sort_date" msgid="586080032956151448">"ตามวันที่ที่ปรับเปลี่ยน"</string>
@@ -66,13 +65,12 @@
<item quantity="one">กำลังคัดลอก <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"กำลังเตรียมการคัดลอก…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">เกิดข้อผิดพลาดในการคัดลอก <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item>
+ <item quantity="one">เกิดข้อผิดพลาดในการคัดลอก <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"แตะเพื่อดูรายละเอียด"</string>
+ <string name="retry" msgid="7564024179122207376">"ลองอีกครั้ง"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"เกิดข้อผิดพลากในการคัดลอกไฟล์"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"ไฟล์ต่อไปนี้ไม่ได้รับการคัดลอก: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml
index 27cfc6c..de0b083 100644
--- a/packages/DocumentsUI/res/values-tl/strings.xml
+++ b/packages/DocumentsUI/res/values-tl/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Itago ang SD card"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Ipakita ang laki ng file"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Itago ang laki ng file"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopyahin"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ang pinili"</string>
<string name="sort_name" msgid="9183560467917256779">"Ayon sa pangalan"</string>
<string name="sort_date" msgid="586080032956151448">"Ayon sa petsa ng pagbago"</string>
@@ -66,13 +65,12 @@
<item quantity="other">Kumokopya ng <xliff:g id="COUNT_1">%1$d</xliff:g> na file.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Naghahanda para sa pagkopya…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Nagkaroon ng error sa pagkopya sa <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item>
+ <item quantity="other">Nagkaroon ng error sa pagkopya sa <xliff:g id="COUNT_1">%1$d</xliff:g> na file.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Pindutin upang tingnan ang mga detalye"</string>
+ <string name="retry" msgid="7564024179122207376">"Subukang muli"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Nagkaroon ng error sa pagkopya sa mga file"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Hindi nakopya ang mga sumusunod na file: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml
index cb18930..fbfdec0 100644
--- a/packages/DocumentsUI/res/values-tr/strings.xml
+++ b/packages/DocumentsUI/res/values-tr/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD kartı gizle"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Dosya boyutunu göster"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Dosya boyutunu gizle"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopyala"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> tane seçildi"</string>
<string name="sort_name" msgid="9183560467917256779">"Ada göre"</string>
<string name="sort_date" msgid="586080032956151448">"Değişiklik tarihine göre"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya kopyalanıyor.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Kopyalanmak için hazırlanıyor…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya kopyalanırken hata oluştu.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya kopyalanırken hata oluştu.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Ayrıntıları görüntülemek için dokunun"</string>
+ <string name="retry" msgid="7564024179122207376">"Yeniden dene"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Dosyalar kopyalanırken hata oluştu"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Şu dosyalar kopyalanmadı: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml
index 9c4f1b0..1108e66 100644
--- a/packages/DocumentsUI/res/values-uk/strings.xml
+++ b/packages/DocumentsUI/res/values-uk/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Сховати карту SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Показати розмір файлу"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Сховати розмір файлу"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Копіювати"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Вибрано <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"За назвою"</string>
<string name="sort_date" msgid="586080032956151448">"За датою змінення"</string>
@@ -68,13 +67,14 @@
<item quantity="other">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлу.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Підготовка до копіювання…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Не вдалося скопіювати <xliff:g id="COUNT_1">%1$d</xliff:g> файл.</item>
+ <item quantity="few">Не вдалося скопіювати <xliff:g id="COUNT_1">%1$d</xliff:g> файли.</item>
+ <item quantity="many">Не вдалося скопіювати <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item>
+ <item quantity="other">Не вдалося скопіювати <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Торкніться, щоб дізнатися більше"</string>
+ <string name="retry" msgid="7564024179122207376">"Повторити"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Не вдалося скопіювати файли"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Не вдалося скопіювати ці файли: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml
index 33710c5..c54cb03 100644
--- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml
+++ b/packages/DocumentsUI/res/values-ur-rPK/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD کارڈ چھپائیں"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"فائل سائز دکھائیں"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"فائل سائز چھپائیں"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"کاپی کریں"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> کو منتخب کیا گیا"</string>
<string name="sort_name" msgid="9183560467917256779">"نام کے لحاظ سے"</string>
<string name="sort_date" msgid="586080032956151448">"ترمیم کی تاریخ کے لحاظ سے"</string>
@@ -66,13 +65,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل کاپی کی جا رہی ہے۔</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"کاپی کیلئے تیار ہو رہا ہے…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلز کاپی کرنے میں خرابی پیش آ گئی۔</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل کاپی کرنے میں خرابی پیش آ گئی۔</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"تفصیلات دیکھنے کیلئے ٹچ کریں"</string>
+ <string name="retry" msgid="7564024179122207376">"دوبارہ کوشش کریں"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"فائلز کاپی کرنے میں خرابی پیش آ گئی"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"مندرجہ ذیل فائلز کاپی نہیں کی گئیں: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml
index 1b73b34..bf9d24b 100644
--- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml
+++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD kartani berkitish"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Fayl hajmini ko‘rsatish"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Fayl hajmini berkitish"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Nusxalash"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> belgilandi"</string>
<string name="sort_name" msgid="9183560467917256779">"Nomi bo‘yicha"</string>
<string name="sort_date" msgid="586080032956151448">"Tahrir sanasi bo‘yicha"</string>
@@ -66,13 +65,12 @@
<item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> ta fayl nusxalanmoqda</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Nuxsa olishga tayyorgarlik..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta faylni nusxalashda xatolik yuz berdi.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta faylni nusxalashda xatolik yuz berdi.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Batafsil ma’lumot olish uchun bosing"</string>
+ <string name="retry" msgid="7564024179122207376">"Qayta urinish"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Fayllarni nusxalashda xatolik yuz berdi"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Quyidagi fayllarni nusxalab bo‘lmadi: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml
index 70a7af3..8c0b996 100644
--- a/packages/DocumentsUI/res/values-vi/strings.xml
+++ b/packages/DocumentsUI/res/values-vi/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ẩn thẻ SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Hiển thị kích thước tệp"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Ẩn kích thước tệp"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Sao chép"</string>
<string name="mode_selected_count" msgid="459111894725594625">"Đã chọn <xliff:g id="COUNT">%1$d</xliff:g>"</string>
<string name="sort_name" msgid="9183560467917256779">"Theo tên"</string>
<string name="sort_date" msgid="586080032956151448">"Theo ngày sửa đổi"</string>
@@ -66,13 +65,12 @@
<item quantity="one">Đang sao chép <xliff:g id="COUNT_0">%1$d</xliff:g> tệp.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Đang chuẩn bị sao chép…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">Lỗi khi sao chép <xliff:g id="COUNT_1">%1$d</xliff:g> tệp.</item>
+ <item quantity="one">Lỗi khi sao chép <xliff:g id="COUNT_0">%1$d</xliff:g> tệp.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Chạm để xem chi tiết"</string>
+ <string name="retry" msgid="7564024179122207376">"Thử lại"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Lỗi khi sao chép tệp"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Các tệp sau không được sao chép: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml
index 0097017..c0a0a40 100644
--- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"隐藏SD卡"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"显示文件大小"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"隐藏文件大小"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"复制"</string>
<string name="mode_selected_count" msgid="459111894725594625">"已选择<xliff:g id="COUNT">%1$d</xliff:g>项"</string>
<string name="sort_name" msgid="9183560467917256779">"按名称"</string>
<string name="sort_date" msgid="586080032956151448">"按修改日期"</string>
@@ -66,13 +65,12 @@
<item quantity="one">正在复制 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件。</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"正在准备复制…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">复制 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件时出错。</item>
+ <item quantity="one">复制 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件时出错。</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"触摸可查看详情"</string>
+ <string name="retry" msgid="7564024179122207376">"重试"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"复制文件时出错"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"以下文件未复制成功:<xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
index 34dcfa5..fe6e35b 100644
--- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"隱藏 SD 卡"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"顯示檔案大小"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"隱藏檔案大小"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"複製"</string>
<string name="mode_selected_count" msgid="459111894725594625">"已選取 <xliff:g id="COUNT">%1$d</xliff:g> 個"</string>
<string name="sort_name" msgid="9183560467917256779">"按名稱"</string>
<string name="sort_date" msgid="586080032956151448">"按修改日期"</string>
@@ -66,13 +65,12 @@
<item quantity="one">正在複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"正在準備複製…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">複製<xliff:g id="COUNT_1">%1$d</xliff:g>個檔案時出現錯誤。</item>
+ <item quantity="one">複製<xliff:g id="COUNT_0">%1$d</xliff:g>個檔案時出現錯誤。</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"輕觸即可查看詳情"</string>
+ <string name="retry" msgid="7564024179122207376">"重試"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"複製檔案時出現錯誤"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"未有複製以下檔案:<xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml
index 62a6488..6abe011 100644
--- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"隱藏 SD 卡"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"顯示檔案大小"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"隱藏檔案大小"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"複製"</string>
<string name="mode_selected_count" msgid="459111894725594625">"已選取 <xliff:g id="COUNT">%1$d</xliff:g> 個項目"</string>
<string name="sort_name" msgid="9183560467917256779">"依名稱"</string>
<string name="sort_date" msgid="586080032956151448">"依修改日期"</string>
@@ -66,13 +65,12 @@
<item quantity="one">正在複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"正在準備複製…"</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="other">複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案時發生錯誤。</item>
+ <item quantity="one">複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案時發生錯誤。</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"輕觸即可查看詳細資料"</string>
+ <string name="retry" msgid="7564024179122207376">"重試"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"複製檔案時發生錯誤"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"無法複製以下檔案:<xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml
index c97e0bf..cdca5af 100644
--- a/packages/DocumentsUI/res/values-zu/strings.xml
+++ b/packages/DocumentsUI/res/values-zu/strings.xml
@@ -38,8 +38,7 @@
<string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Fihla ikhadi le-SD"</string>
<string name="menu_file_size_show" msgid="3240323619260823076">"Bonisa usayizi wefayela"</string>
<string name="menu_file_size_hide" msgid="8881975928502581042">"Fihla usayizi wefayela"</string>
- <!-- no translation found for button_copy (8706475544635021302) -->
- <skip />
+ <string name="button_copy" msgid="8706475544635021302">"Kopisha"</string>
<string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> okukhethiwe"</string>
<string name="sort_name" msgid="9183560467917256779">"Ngegama"</string>
<string name="sort_date" msgid="586080032956151448">"Ngedethi yokuguqula"</string>
@@ -66,13 +65,12 @@
<item quantity="other">Ikopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item>
</plurals>
<string name="copy_preparing" msgid="3896202461003039386">"Ilungiselela ukukopisha..."</string>
- <!-- no translation found for copy_error_notification_title (4911333304372840735) -->
- <!-- no translation found for notification_touch_for_details (4483108577842961665) -->
- <skip />
- <!-- no translation found for retry (7564024179122207376) -->
- <skip />
- <!-- no translation found for copy_failure_alert_title (616726451967793549) -->
- <skip />
- <!-- no translation found for copy_failure_alert_content (2655232627616241542) -->
- <skip />
+ <plurals name="copy_error_notification_title" formatted="false" msgid="4911333304372840735">
+ <item quantity="one">Iphutha lokukopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item>
+ <item quantity="other">Iphutha lokukopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item>
+ </plurals>
+ <string name="notification_touch_for_details" msgid="4483108577842961665">"Thinta ukuze ubuke imininingwane"</string>
+ <string name="retry" msgid="7564024179122207376">"Zama futhi"</string>
+ <string name="copy_failure_alert_title" msgid="616726451967793549">"Iphutha lokukopisha amafayela"</string>
+ <string name="copy_failure_alert_content" msgid="2655232627616241542">"Amafayela alandelayo awakopishiwe: <xliff:g id="LIST">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java
index d2ef3d7..a9f03b6 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java
@@ -191,7 +191,8 @@
cancelIntent.putExtra(EXTRA_CANCEL, mJobId);
mProgressBuilder.addAction(R.drawable.ic_cab_cancel,
getString(android.R.string.cancel), PendingIntent.getService(this, 0,
- cancelIntent, PendingIntent.FLAG_ONE_SHOT));
+ cancelIntent,
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT));
// Send an initial progress notification.
mProgressBuilder.setProgress(0, 0, true); // Indeterminate progress while setting up.
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index e2e9807..a617bd3 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -53,7 +53,6 @@
import android.os.CancellationSignal;
import android.os.OperationCanceledException;
import android.os.Parcelable;
-import android.os.SystemProperties;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.text.format.DateUtils;
@@ -506,10 +505,7 @@
open.setVisible(!manageOrBrowse);
share.setVisible(manageOrBrowse);
delete.setVisible(manageOrBrowse);
-
- // TODO: unhide copying when ready
- copy.setVisible(manageOrBrowse &&
- SystemProperties.getBoolean("debug.documentsui.enable_copy", false));
+ copy.setVisible(manageOrBrowse);
return true;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java b/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java
index 5e565bf..7ea51b9 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java
@@ -97,7 +97,6 @@
CharSequence displayName) {
if (mContainer != null) {
if (pickTarget != null) {
- mContainer.setVisibility(View.VISIBLE);
final Locale locale = getResources().getConfiguration().locale;
switch (action) {
case BaseActivity.State.ACTION_OPEN_TREE:
@@ -112,7 +111,9 @@
default:
throw new IllegalArgumentException("Illegal action for PickFragment.");
}
-
+ }
+ if (pickTarget != null && pickTarget.isCreateSupported()) {
+ mContainer.setVisibility(View.VISIBLE);
} else {
mContainer.setVisibility(View.GONE);
}
diff --git a/packages/ExternalStorageProvider/AndroidManifest.xml b/packages/ExternalStorageProvider/AndroidManifest.xml
index edd6255..3185917 100644
--- a/packages/ExternalStorageProvider/AndroidManifest.xml
+++ b/packages/ExternalStorageProvider/AndroidManifest.xml
@@ -19,9 +19,7 @@
<receiver android:name=".MountReceiver">
<intent-filter>
- <action android:name="android.intent.action.MEDIA_MOUNTED" />
- <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
- <data android:scheme="file" />
+ <action android:name="android.os.storage.action.VOLUME_STATE_CHANGED" />
</intent-filter>
</receiver>
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 8f73118..aff57bf 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -26,34 +26,35 @@
import android.graphics.Point;
import android.net.Uri;
import android.os.CancellationSignal;
-import android.os.Environment;
import android.os.FileObserver;
import android.os.FileUtils;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor.OnCloseListener;
+import android.os.UserHandle;
import android.os.storage.StorageManager;
-import android.os.storage.StorageVolume;
+import android.os.storage.VolumeInfo;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Root;
import android.provider.DocumentsProvider;
import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.DebugUtils;
import android.util.Log;
import android.webkit.MimeTypeMap;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.google.android.collect.Lists;
-import com.google.android.collect.Maps;
+import com.android.internal.util.IndentingPrintWriter;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.io.PrintWriter;
import java.util.LinkedList;
-import java.util.Map;
+import java.util.List;
import java.util.Objects;
public class ExternalStorageProvider extends DocumentsProvider {
@@ -80,6 +81,8 @@
public int flags;
public String title;
public String docId;
+ public File visiblePath;
+ public File path;
}
private static final String ROOT_ID_PRIMARY_EMULATED = "primary";
@@ -90,26 +93,17 @@
private final Object mRootsLock = new Object();
@GuardedBy("mRootsLock")
- private ArrayList<RootInfo> mRoots;
- @GuardedBy("mRootsLock")
- private HashMap<String, RootInfo> mIdToRoot;
- @GuardedBy("mRootsLock")
- private HashMap<String, File> mIdToPath;
+ private ArrayMap<String, RootInfo> mRoots = new ArrayMap<>();
@GuardedBy("mObservers")
- private Map<File, DirectoryObserver> mObservers = Maps.newHashMap();
+ private ArrayMap<File, DirectoryObserver> mObservers = new ArrayMap<>();
@Override
public boolean onCreate() {
mStorageManager = (StorageManager) getContext().getSystemService(Context.STORAGE_SERVICE);
mHandler = new Handler();
- mRoots = Lists.newArrayList();
- mIdToRoot = Maps.newHashMap();
- mIdToPath = Maps.newHashMap();
-
updateVolumes();
-
return true;
}
@@ -121,52 +115,53 @@
private void updateVolumesLocked() {
mRoots.clear();
- mIdToPath.clear();
- mIdToRoot.clear();
- final StorageVolume[] volumes = mStorageManager.getVolumeList();
- for (StorageVolume volume : volumes) {
- final boolean mounted = Environment.MEDIA_MOUNTED.equals(volume.getState())
- || Environment.MEDIA_MOUNTED_READ_ONLY.equals(volume.getState());
- if (!mounted) continue;
+ final int userId = UserHandle.myUserId();
+ final List<VolumeInfo> volumes = mStorageManager.getVolumes();
+ for (VolumeInfo volume : volumes) {
+ if (!volume.isMountedReadable()) continue;
final String rootId;
- if (volume.isPrimary() && volume.isEmulated()) {
+ if (VolumeInfo.ID_EMULATED_INTERNAL.equals(volume.getId())) {
rootId = ROOT_ID_PRIMARY_EMULATED;
- } else if (volume.getUuid() != null) {
- rootId = volume.getUuid();
+ } else if (volume.getType() == VolumeInfo.TYPE_EMULATED) {
+ final VolumeInfo privateVol = mStorageManager.findPrivateForEmulated(volume);
+ rootId = privateVol.getFsUuid();
+ } else if (volume.getType() == VolumeInfo.TYPE_PUBLIC) {
+ rootId = volume.getFsUuid();
} else {
- Log.d(TAG, "Missing UUID for " + volume.getPath() + "; skipping");
+ // Unsupported volume; ignore
continue;
}
- if (mIdToPath.containsKey(rootId)) {
- Log.w(TAG, "Duplicate UUID " + rootId + "; skipping");
+ if (TextUtils.isEmpty(rootId)) {
+ Log.d(TAG, "Missing UUID for " + volume.getId() + "; skipping");
+ continue;
+ }
+ if (mRoots.containsKey(rootId)) {
+ Log.w(TAG, "Duplicate UUID " + rootId + " for " + volume.getId() + "; skipping");
continue;
}
try {
- final File path = volume.getPathFile();
- mIdToPath.put(rootId, path);
-
final RootInfo root = new RootInfo();
+ mRoots.put(rootId, root);
+
root.rootId = rootId;
root.flags = Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY | Root.FLAG_ADVANCED
| Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD;
if (ROOT_ID_PRIMARY_EMULATED.equals(rootId)) {
root.title = getContext().getString(R.string.root_internal_storage);
} else {
- final String userLabel = volume.getUserLabel();
- if (!TextUtils.isEmpty(userLabel)) {
- root.title = userLabel;
- } else {
- root.title = volume.getDescription(getContext());
- }
+ root.title = mStorageManager.getBestVolumeDescription(volume);
+ }
+ if (volume.getType() == VolumeInfo.TYPE_PUBLIC) {
root.flags |= Root.FLAG_HAS_SETTINGS;
}
- root.docId = getDocIdForFile(path);
- mRoots.add(root);
- mIdToRoot.put(rootId, root);
+ root.visiblePath = volume.getPathForUser(userId);
+ root.path = volume.getInternalPathForUser(userId);
+ root.docId = getDocIdForFile(root.path);
+
} catch (FileNotFoundException e) {
throw new IllegalStateException(e);
}
@@ -190,23 +185,26 @@
String path = file.getAbsolutePath();
// Find the most-specific root path
- Map.Entry<String, File> mostSpecific = null;
+ String mostSpecificId = null;
+ String mostSpecificPath = null;
synchronized (mRootsLock) {
- for (Map.Entry<String, File> root : mIdToPath.entrySet()) {
- final String rootPath = root.getValue().getPath();
- if (path.startsWith(rootPath) && (mostSpecific == null
- || rootPath.length() > mostSpecific.getValue().getPath().length())) {
- mostSpecific = root;
+ for (int i = 0; i < mRoots.size(); i++) {
+ final String rootId = mRoots.keyAt(i);
+ final String rootPath = mRoots.valueAt(i).path.getAbsolutePath();
+ if (path.startsWith(rootPath) && (mostSpecificPath == null
+ || rootPath.length() > mostSpecificPath.length())) {
+ mostSpecificId = rootId;
+ mostSpecificPath = rootPath;
}
}
}
- if (mostSpecific == null) {
+ if (mostSpecificPath == null) {
throw new FileNotFoundException("Failed to find root that contains " + path);
}
// Start at first char of path under root
- final String rootPath = mostSpecific.getValue().getPath();
+ final String rootPath = mostSpecificPath;
if (rootPath.equals(path)) {
path = "";
} else if (rootPath.endsWith("/")) {
@@ -215,21 +213,30 @@
path = path.substring(rootPath.length() + 1);
}
- return mostSpecific.getKey() + ':' + path;
+ return mostSpecificId + ':' + path;
}
private File getFileForDocId(String docId) throws FileNotFoundException {
+ return getFileForDocId(docId, false);
+ }
+
+ private File getFileForDocId(String docId, boolean visible) throws FileNotFoundException {
final int splitIndex = docId.indexOf(':', 1);
final String tag = docId.substring(0, splitIndex);
final String path = docId.substring(splitIndex + 1);
- File target;
+ RootInfo root;
synchronized (mRootsLock) {
- target = mIdToPath.get(tag);
+ root = mRoots.get(tag);
}
- if (target == null) {
+ if (root == null) {
throw new FileNotFoundException("No root for " + tag);
}
+
+ File target = visible ? root.visiblePath : root.path;
+ if (target == null) {
+ return null;
+ }
if (!target.exists()) {
target.mkdirs();
}
@@ -286,16 +293,13 @@
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection));
synchronized (mRootsLock) {
- for (String rootId : mIdToPath.keySet()) {
- final RootInfo root = mIdToRoot.get(rootId);
- final File path = mIdToPath.get(rootId);
-
+ for (RootInfo root : mRoots.values()) {
final RowBuilder row = result.newRow();
row.add(Root.COLUMN_ROOT_ID, root.rootId);
row.add(Root.COLUMN_FLAGS, root.flags);
row.add(Root.COLUMN_TITLE, root.title);
row.add(Root.COLUMN_DOCUMENT_ID, root.docId);
- row.add(Root.COLUMN_AVAILABLE_BYTES, path.getFreeSpace());
+ row.add(Root.COLUMN_AVAILABLE_BYTES, root.path.getFreeSpace());
}
}
return result;
@@ -464,7 +468,7 @@
final File parent;
synchronized (mRootsLock) {
- parent = mIdToPath.get(rootId);
+ parent = mRoots.get(rootId).path;
}
final LinkedList<File> pending = new LinkedList<File>();
@@ -494,8 +498,10 @@
String documentId, String mode, CancellationSignal signal)
throws FileNotFoundException {
final File file = getFileForDocId(documentId);
+ final File visibleFile = getFileForDocId(documentId, true);
+
final int pfdMode = ParcelFileDescriptor.parseMode(mode);
- if (pfdMode == ParcelFileDescriptor.MODE_READ_ONLY) {
+ if (pfdMode == ParcelFileDescriptor.MODE_READ_ONLY || visibleFile == null) {
return ParcelFileDescriptor.open(file, pfdMode);
} else {
try {
@@ -505,7 +511,7 @@
public void onClose(IOException e) {
final Intent intent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
- intent.setData(Uri.fromFile(file));
+ intent.setData(Uri.fromFile(visibleFile));
getContext().sendBroadcast(intent);
}
});
@@ -523,6 +529,27 @@
return DocumentsContract.openImageThumbnail(file);
}
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ", 160);
+ synchronized (mRootsLock) {
+ for (int i = 0; i < mRoots.size(); i++) {
+ final RootInfo root = mRoots.valueAt(i);
+ pw.println("Root{" + root.rootId + "}:");
+ pw.increaseIndent();
+ pw.printPair("flags", DebugUtils.flagsToString(Root.class, "FLAG_", root.flags));
+ pw.println();
+ pw.printPair("title", root.title);
+ pw.printPair("docId", root.docId);
+ pw.println();
+ pw.printPair("path", root.path);
+ pw.printPair("visiblePath", root.visiblePath);
+ pw.decreaseIndent();
+ pw.println();
+ }
+ }
+ }
+
private static String getTypeForFile(File file) {
if (file.isDirectory()) {
return Document.MIME_TYPE_DIR;
diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml
index 9573395..673d5c9 100644
--- a/packages/Keyguard/res/values-sl/strings.xml
+++ b/packages/Keyguard/res/values-sl/strings.xml
@@ -113,5 +113,5 @@
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ni storitve."</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Gumb za preklop načina vnosa."</string>
<string name="airplane_mode" msgid="3122107900897202805">"Način za letalo"</string>
- <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Neprepoznano"</string>
+ <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ni prepoznano"</string>
</resources>
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
index a88497c..be71b034 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
@@ -23,6 +23,7 @@
import android.graphics.Canvas;
import android.media.AudioManager;
import android.os.SystemClock;
+import android.service.trust.TrustAgentService;
import android.telephony.TelephonyManager;
import android.util.AttributeSet;
import android.util.Log;
@@ -69,14 +70,27 @@
}
@Override
- public void onTrustInitiatedByUser(int userId) {
+ public void onTrustGrantedWithFlags(int flags, int userId) {
if (userId != mLockPatternUtils.getCurrentUser()) return;
if (!isAttachedToWindow()) return;
+ boolean bouncerVisible = isVisibleToUser();
+ boolean initiatedByUser =
+ (flags & TrustAgentService.FLAG_GRANT_TRUST_INITIATED_BY_USER) != 0;
+ boolean dismissKeyguard =
+ (flags & TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD) != 0;
- if (isVisibleToUser()) {
- dismiss(false /* authenticated */);
- } else {
- mViewMediatorCallback.playTrustedSound();
+ if (initiatedByUser || dismissKeyguard) {
+ if (mViewMediatorCallback.isScreenOn() && (bouncerVisible || dismissKeyguard)) {
+ if (!bouncerVisible) {
+ // The trust agent dismissed the keyguard without the user proving
+ // that they are present (by swiping up to show the bouncer). That's fine if
+ // the user proved presence via some other way to the trust agent.
+ Log.i(TAG, "TrustAgent dismissed Keyguard.");
+ }
+ dismiss(false /* authenticated */);
+ } else {
+ mViewMediatorCallback.playTrustedSound();
+ }
}
}
};
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index a02fb4a..1eec5325 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -58,12 +58,12 @@
import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
import android.hardware.fingerprint.FingerprintUtils;
import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
+import android.service.trust.TrustAgentService;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.util.Log;
-import android.util.Slog;
import android.util.SparseBooleanArray;
import com.google.android.collect.Lists;
@@ -245,15 +245,14 @@
private SparseBooleanArray mUserFaceUnlockRunning = new SparseBooleanArray();
@Override
- public void onTrustChanged(boolean enabled, int userId, boolean initiatedByUser) {
+ public void onTrustChanged(boolean enabled, int userId, int flags) {
mUserHasTrust.put(userId, enabled);
-
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onTrustChanged(userId);
- if (enabled && initiatedByUser) {
- cb.onTrustInitiatedByUser(userId);
+ if (enabled && flags != 0) {
+ cb.onTrustGrantedWithFlags(flags, userId);
}
}
}
@@ -783,21 +782,14 @@
private void startListeningForFingerprint() {
if (DEBUG) Log.v(TAG, "startListeningForFingerprint()");
- final int userId;
- try {
- userId = ActivityManagerNative.getDefault().getCurrentUser().id;
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to get current user id: ", e);
- return;
- }
+ int userId = ActivityManager.getCurrentUser();
if (mFpm != null && mFpm.isHardwareDetected() && !isFingerprintDisabled(userId)
- && mFpm.getEnrolledFingerprints().size() > 0) {
+ && mFpm.getEnrolledFingerprints(userId).size() > 0) {
if (mFingerprintCancelSignal != null) {
mFingerprintCancelSignal.cancel();
}
mFingerprintCancelSignal = new CancellationSignal();
- mFpm.authenticate(null, mFingerprintCancelSignal, mAuthenticationCallback, 0,
- ActivityManager.getCurrentUser());
+ mFpm.authenticate(null, mFingerprintCancelSignal, mAuthenticationCallback, 0, userId);
setFingerprintRunningDetectionRunning(true);
}
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
index 756a7a4..26e6973 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
@@ -171,9 +171,9 @@
public void onTrustManagedChanged(int userId) { }
/**
- * Called when the user has proved to a trust agent that they want to use the device.
+ * Called after trust was granted with non-zero flags.
*/
- public void onTrustInitiatedByUser(int userId) { }
+ public void onTrustGrantedWithFlags(int flags, int userId) { }
/**
* Called when a fingerprint is recognized.
diff --git a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
index 5bbcc8c..f5c809a 100644
--- a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
+++ b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
@@ -76,4 +76,9 @@
* (legacy API)
*/
boolean isInputRestricted();
+
+ /**
+ * @return true if the screen is on
+ */
+ boolean isScreenOn();
}
diff --git a/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java
index e6a0dd7..b8f16e7 100644
--- a/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java
+++ b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java
@@ -38,7 +38,7 @@
* <pre>
* $ adb shell am broadcast -a action.sample_trust_agent.grant_trust\
* -e extra.message SampleTrust\
- * --el extra.duration 1000 --ez extra.init_by_user false
+ * --el extra.duration 1000 --ez extra.init_by_user false --ez extra.dismiss_keyguard false
* </pre>
*/
private static final boolean ALLOW_EXTERNAL_BROADCASTS = false;
@@ -51,6 +51,7 @@
private static final String EXTRA_MESSAGE = "extra.message";
private static final String EXTRA_DURATION = "extra.duration";
private static final String EXTRA_INITIATED_BY_USER = "extra.init_by_user";
+ private static final String EXTRA_DISMISS_KEYGUARD = "extra.dismiss_keyguard";
private static final String PREFERENCE_REPORT_UNLOCK_ATTEMPTS
= "preference.report_unlock_attempts";
@@ -141,10 +142,17 @@
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_GRANT_TRUST.equals(action)) {
+ int flags = 0;
+ if (intent.getBooleanExtra(EXTRA_INITIATED_BY_USER, false)) {
+ flags |= TrustAgentService.FLAG_GRANT_TRUST_INITIATED_BY_USER;
+ }
+ if (intent.getBooleanExtra(EXTRA_DISMISS_KEYGUARD, false)) {
+ flags |= TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD;
+ }
+
try {
grantTrust(intent.getStringExtra(EXTRA_MESSAGE),
- intent.getLongExtra(EXTRA_DURATION, 0),
- intent.getBooleanExtra(EXTRA_INITIATED_BY_USER, false));
+ intent.getLongExtra(EXTRA_DURATION, 0), flags);
} catch (IllegalStateException e) {
logAndShowToast("IllegalStateException: " + e.getMessage());
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java b/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java
new file mode 100644
index 0000000..60b5ba5
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java
@@ -0,0 +1,188 @@
+/*
+ * 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.settingslib.applications;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.ShapeDrawable;
+import android.os.AsyncTask;
+import android.os.Build;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class PermissionsInfo {
+
+ private static final String TAG = "PermissionsInfo";
+
+ private final PackageManager mPm;
+ private final ArrayList<PermissionGroup> mGroups = new ArrayList<>();
+ private final Map<String, PermissionGroup> mGroupLookup = new ArrayMap<>();
+ private final Callback mCallback;
+ private final Context mContext;
+ // Count of apps that request runtime permissions.
+ private int mRuntimePermAppsCt;
+ // Count of apps that are granted runtime permissions.
+ private int mRuntimePermAppsGrantedCt;
+
+ public PermissionsInfo(Context context, Callback callback) {
+ mContext = context;
+ mPm = context.getPackageManager();
+ mCallback = callback;
+ new PermissionsLoader().execute();
+ }
+
+ public List<PermissionGroup> getGroups() {
+ synchronized (mGroups) {
+ return new ArrayList<>(mGroups);
+ }
+ }
+
+ public int getRuntimePermAppsCount() {
+ return mRuntimePermAppsCt;
+ }
+
+ public int getRuntimePermAppsGrantedCount() {
+ return mRuntimePermAppsGrantedCt;
+ }
+
+ private PermissionGroup getOrCreateGroup(String permission) {
+ PermissionGroup group = mGroupLookup.get(permission);
+ if (group == null) {
+ // Some permissions don't have a group, in that case treat them like a group
+ // and create their own PermissionGroup (only if they are runtime).
+ try {
+ PermissionInfo info = mPm.getPermissionInfo(permission, 0);
+ if (info.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS) {
+ group = new PermissionGroup();
+ // TODO: Add default permission icon.
+ group.icon = info.icon != 0 ? info.loadIcon(mPm) : new ShapeDrawable();
+ group.name = info.name;
+ group.label = info.loadLabel(mPm).toString();
+ mGroups.add(group);
+ mGroupLookup.put(permission, group);
+ }
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Unknown permission " + permission, e);
+ }
+ }
+ return group;
+ }
+
+ private class PermissionsLoader extends AsyncTask<Void, Void, Void> {
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ List<PermissionGroupInfo> groups =
+ mPm.getAllPermissionGroups(PackageManager.GET_META_DATA);
+ // Get the groups.
+ for (PermissionGroupInfo groupInfo : groups) {
+ PermissionGroup group = new PermissionGroup();
+ // TODO: Add default permission icon.
+ group.icon = groupInfo.icon != 0 ? groupInfo.loadIcon(mPm) : new ShapeDrawable();
+ group.name = groupInfo.name;
+ group.label = groupInfo.loadLabel(mPm).toString();
+ synchronized (mGroups) {
+ mGroups.add(group);
+ }
+ }
+ // Load permissions and which are runtime.
+ for (PermissionGroup group : mGroups) {
+ try {
+ List<PermissionInfo> permissions =
+ mPm.queryPermissionsByGroup(group.name, 0);
+ for (PermissionInfo info : permissions) {
+ if (info.protectionLevel != PermissionInfo.PROTECTION_DANGEROUS) continue;
+ mGroupLookup.put(info.name, group);
+ }
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Problem getting permissions", e);
+ }
+ }
+ // Load granted info.
+ for (UserHandle user : UserManager.get(mContext).getUserProfiles()) {
+ List<PackageInfo> allApps = mPm.getInstalledPackages(
+ PackageManager.GET_PERMISSIONS, user.getIdentifier());
+ for (PackageInfo info : allApps) {
+ if (info.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1
+ || info.requestedPermissions == null) {
+ continue;
+ }
+ final int N = info.requestedPermissionsFlags.length;
+ boolean appHasRuntimePerms = false;
+ boolean appGrantedRuntimePerms = false;
+ for (int i = 0; i < N; i++) {
+ boolean granted = (info.requestedPermissionsFlags[i]
+ & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0;
+ PermissionGroup group = getOrCreateGroup(info.requestedPermissions[i]);
+ String key = Integer.toString(info.applicationInfo.uid);
+ if (group != null && !group.possibleApps.contains(key)) {
+ appHasRuntimePerms = true;
+ group.possibleApps.add(key);
+ if (granted) {
+ appGrantedRuntimePerms = true;
+ group.grantedApps.add(key);
+ }
+ }
+ }
+ if (appHasRuntimePerms) {
+ mRuntimePermAppsCt++;
+ if (appGrantedRuntimePerms) {
+ mRuntimePermAppsGrantedCt++;
+ }
+ }
+ }
+ }
+ Collections.sort(mGroups);
+
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ mCallback.onPermissionLoadComplete();
+ }
+ }
+
+ public static class PermissionGroup implements Comparable<PermissionGroup> {
+ public final List<String> possibleApps = new ArrayList<>();
+ public final List<String> grantedApps = new ArrayList<>();
+ public String name;
+ public String label;
+ public Drawable icon;
+
+ @Override
+ public int compareTo(PermissionGroup another) {
+ return label.compareTo(another.label);
+ }
+ }
+
+ public interface Callback {
+ void onPermissionLoadComplete();
+ }
+
+}
diff --git a/packages/SystemUI/res/anim/ic_qs_signal_blink_1.xml b/packages/SystemUI/res/anim/ic_qs_signal_blink_1.xml
new file mode 100644
index 0000000..57b61da
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_qs_signal_blink_1.xml
@@ -0,0 +1,38 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="#FFFFFFFF"/>
+ <keyframe
+ android:fraction="0.32"
+ android:value="#FFFFFFFF"/>
+ <keyframe
+ android:fraction="0.33"
+ android:value="#4DFFFFFF"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="#4DFFFFFF"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/anim/ic_qs_signal_blink_2.xml b/packages/SystemUI/res/anim/ic_qs_signal_blink_2.xml
new file mode 100644
index 0000000..09694c3
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_qs_signal_blink_2.xml
@@ -0,0 +1,44 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="#4DFFFFFF"/>
+ <keyframe
+ android:fraction="0.32"
+ android:value="#4DFFFFFF"/>
+ <keyframe
+ android:fraction="0.33"
+ android:value="#FFFFFFFF"/>
+ <keyframe
+ android:fraction="0.66"
+ android:value="#FFFFFFFF"/>
+ <keyframe
+ android:fraction="0.67"
+ android:value="#4DFFFFFF"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="#4DFFFFFF"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/anim/ic_qs_signal_blink_3.xml b/packages/SystemUI/res/anim/ic_qs_signal_blink_3.xml
new file mode 100644
index 0000000..2270e3f
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_qs_signal_blink_3.xml
@@ -0,0 +1,38 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="#4DFFFFFF"/>
+ <keyframe
+ android:fraction="0.66"
+ android:value="#4DFFFFFF"/>
+ <keyframe
+ android:fraction="0.67"
+ android:value="#FFFFFFFF"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="#FFFFFFFF"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/anim/ic_signal_blink_1.xml b/packages/SystemUI/res/anim/ic_signal_blink_1.xml
new file mode 100644
index 0000000..ab1905a
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_signal_blink_1.xml
@@ -0,0 +1,38 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="@color/light_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="0.32"
+ android:value="@color/light_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="0.33"
+ android:value="@color/light_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="@color/light_mode_icon_color_dual_tone_background"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/anim/ic_signal_blink_2.xml b/packages/SystemUI/res/anim/ic_signal_blink_2.xml
new file mode 100644
index 0000000..1b7ace2
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_signal_blink_2.xml
@@ -0,0 +1,44 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="@color/light_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="0.32"
+ android:value="@color/light_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="0.33"
+ android:value="@color/light_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="0.66"
+ android:value="@color/light_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="0.67"
+ android:value="@color/light_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="@color/light_mode_icon_color_dual_tone_background"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/anim/ic_signal_blink_3.xml b/packages/SystemUI/res/anim/ic_signal_blink_3.xml
new file mode 100644
index 0000000..cee831c
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_signal_blink_3.xml
@@ -0,0 +1,38 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="@color/light_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="0.66"
+ android:value="@color/light_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="0.67"
+ android:value="@color/light_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="@color/light_mode_icon_color_dual_tone_fill"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/anim/ic_signal_dark_blink_1.xml b/packages/SystemUI/res/anim/ic_signal_dark_blink_1.xml
new file mode 100644
index 0000000..9d398fa
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_signal_dark_blink_1.xml
@@ -0,0 +1,38 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="@color/dark_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="0.32"
+ android:value="@color/dark_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="0.33"
+ android:value="@color/dark_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="@color/dark_mode_icon_color_dual_tone_background"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/anim/ic_signal_dark_blink_2.xml b/packages/SystemUI/res/anim/ic_signal_dark_blink_2.xml
new file mode 100644
index 0000000..c6e213d
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_signal_dark_blink_2.xml
@@ -0,0 +1,44 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="@color/dark_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="0.32"
+ android:value="@color/dark_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="0.33"
+ android:value="@color/dark_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="0.66"
+ android:value="@color/dark_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="0.67"
+ android:value="@color/dark_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="@color/dark_mode_icon_color_dual_tone_background"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/anim/ic_signal_dark_blink_3.xml b/packages/SystemUI/res/anim/ic_signal_dark_blink_3.xml
new file mode 100644
index 0000000..dce148c
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_signal_dark_blink_3.xml
@@ -0,0 +1,38 @@
+<!--
+ 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.
+-->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/linear_interpolator"
+ android:duration="@integer/carrier_network_change_anim_time"
+ android:repeatCount="-1">
+
+ <propertyValuesHolder
+ android:propertyName="fillColor"
+ android:valueType="colorType">
+ <keyframe
+ android:fraction="0.0"
+ android:value="@color/dark_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="0.66"
+ android:value="@color/dark_mode_icon_color_dual_tone_background"/>
+ <keyframe
+ android:fraction="0.67"
+ android:value="@color/dark_mode_icon_color_dual_tone_fill"/>
+ <keyframe
+ android:fraction="1.0"
+ android:value="@color/dark_mode_icon_color_dual_tone_fill"/>
+ </propertyValuesHolder>
+
+</objectAnimator>
diff --git a/packages/SystemUI/res/drawable/ic_audio_alarm.xml b/packages/SystemUI/res/drawable/ic_audio_alarm.xml
deleted file mode 100644
index 91010a3..0000000
--- a/packages/SystemUI/res/drawable/ic_audio_alarm.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28.0dp"
- android:height="28.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#ffffffff"
- android:pathData="M44.0,11.44l-9.19,-7.71 -2.57,3.06 9.19,7.71 2.57,-3.06zm-28.24,-4.66l-2.57,-3.06 -9.19,7.71 2.57,3.06 9.19,-7.71zm9.24,9.22l-3.0,0.0l0.0,12.0l9.49,5.71 1.51,-2.47 -8.0,-4.74l0.0,-10.5zm-1.01,-8.0c-9.95,0.0 -17.99,8.06 -17.99,18.0s8.04,18.0 17.99,18.0 18.01,-8.06 18.01,-18.0 -8.06,-18.0 -18.01,-18.0zm0.01,32.0c-7.73,0.0 -14.0,-6.27 -14.0,-14.0s6.27,-14.0 14.0,-14.0 14.0,6.27 14.0,14.0 -6.26,14.0 -14.0,14.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml b/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml
deleted file mode 100644
index dd124d7..0000000
--- a/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28.0dp"
- android:height="28.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#ffffffff"
- android:pathData="M24.0,12.0c7.73,0.0 14.0,6.27 14.0,14.0 0.0,1.69 -0.31,3.3 -0.86,4.8l3.04,3.04c1.16,-2.37 1.82,-5.03 1.82,-7.84 0.0,-9.94 -8.06,-18.0 -18.01,-18.0 -2.81,0.0 -5.46,0.66 -7.84,1.81l3.05,3.05c1.5,-0.55 3.11,-0.86 4.8,-0.86zm20.0,-0.56l-9.19,-7.71 -2.57,3.06 9.19,7.71 2.57,-3.06zm-38.16,-6.85l-2.55,2.54 2.66,2.66 -2.22,1.86 2.84,2.84 2.22,-1.86 1.6,1.6c-2.73,3.16 -4.39,7.27 -4.39,11.77 0.0,9.94 8.04,18.0 17.99,18.0 4.51,0.0 8.62,-1.67 11.77,-4.4l4.4,4.4 2.54,-2.55 -34.91,-34.91 -1.95,-1.95zm27.1,32.19c-2.43,2.01 -5.54,3.22 -8.94,3.22 -7.73,0.0 -14.0,-6.27 -14.0,-14.0 0.0,-3.4 1.21,-6.51 3.22,-8.94l19.72,19.72zm-16.91,-30.23l-2.84,-2.84 -1.7,1.43 2.84,2.84 1.7,-1.43z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_audio_bt.xml b/packages/SystemUI/res/drawable/ic_audio_bt.xml
deleted file mode 100644
index c0da519..0000000
--- a/packages/SystemUI/res/drawable/ic_audio_bt.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28dp"
- android:height="28dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
-
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M35.4,15.4L24.0,4.0l-2.0,0.0l0.0,15.2L12.8,10.0L10.0,12.8L21.2,24.0L10.0,35.2l2.8,2.8l9.2,-9.2L22.0,44.0l2.0,0.0l11.4,-11.4L26.8,24.0L35.4,15.4zM26.0,11.7l3.8,3.8L26.0,19.2L26.0,11.7zM29.8,32.6L26.0,36.3l0.0,-7.5L29.8,32.6z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml b/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml
deleted file mode 100644
index 718eee5..0000000
--- a/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28dp"
- android:height="28dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
-
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M26.0,11.8l3.8,3.8l-3.2,3.2l2.8,2.8l6.0,-6.0L24.0,4.2l-2.0,0.0l0.0,10.1l4.0,4.0L26.0,11.8zM10.8,8.2L8.0,11.0l13.2,13.2L10.0,35.3l2.8,2.8L22.0,29.0l0.0,15.2l2.0,0.0l8.6,-8.6l4.6,4.6l2.8,-2.8L10.8,8.2zM26.0,36.5L26.0,29.0l3.8,3.8L26.0,36.5z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_audio_remote.xml b/packages/SystemUI/res/drawable/ic_audio_remote.xml
deleted file mode 100644
index 762878b..0000000
--- a/packages/SystemUI/res/drawable/ic_audio_remote.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28dp"
- android:height="28dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
-
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M2.0,36.0l0.0,6.0l6.0,0.0C8.0,38.7 5.3,36.0 2.0,36.0zM2.0,28.0l0.0,4.0c5.5,0.0 10.0,4.5 10.0,10.0l4.0,0.0C16.0,34.3 9.7,28.0 2.0,28.0zM38.0,14.0L10.0,14.0l0.0,3.3c7.9,2.6 14.2,8.8 16.7,16.7L38.0,34.0L38.0,14.0zM2.0,20.0l0.0,4.0c9.9,0.0 18.0,8.1 18.0,18.0l4.0,0.0C24.0,29.8 14.1,20.0 2.0,20.0zM42.0,6.0L6.0,6.0c-2.2,0.0 -4.0,1.8 -4.0,4.0l0.0,6.0l4.0,0.0l0.0,-6.0l36.0,0.0l0.0,28.0L28.0,38.0l0.0,4.0l14.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L46.0,10.0C46.0,7.8 44.2,6.0 42.0,6.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_audio_vol.xml b/packages/SystemUI/res/drawable/ic_audio_vol.xml
deleted file mode 100644
index 587ea89..0000000
--- a/packages/SystemUI/res/drawable/ic_audio_vol.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28.0dp"
- android:height="28.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#ffffffff"
- android:pathData="M6.0,18.0l0.0,12.0l8.0,0.0l10.0,10.0L24.0,8.0L14.0,18.0L6.0,18.0zm27.0,6.0c0.0,-3.53 -2.04,-6.58 -5.0,-8.05l0.0,16.11c2.96,-1.48 5.0,-4.53 5.0,-8.06zM28.0,6.46l0.0,4.13c5.78,1.72 10.0,7.07 10.0,13.41s-4.22,11.69 -10.0,13.41l0.0,4.13c8.01,-1.82 14.0,-8.97 14.0,-17.54S36.01,8.28 28.0,6.46z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml b/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml
deleted file mode 100644
index 8a7c7ec..0000000
--- a/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28.0dp"
- android:height="28.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#ffffffff"
- android:pathData="M33.0,24.0c0.0,-3.53 -2.04,-6.58 -5.0,-8.05l0.0,4.42l4.91,4.91c0.06,-0.42 0.09,-0.85 0.09,-1.28zm5.0,0.0c0.0,1.88 -0.41,3.65 -1.08,5.28l3.03,3.03C41.25,29.82 42.0,27.0 42.0,24.0c0.0,-8.56 -5.99,-15.72 -14.0,-17.54l0.0,4.13c5.78,1.72 10.0,7.07 10.0,13.41zM8.55,6.0L6.0,8.55 15.45,18.0L6.0,18.0l0.0,12.0l8.0,0.0l10.0,10.0L24.0,26.55l8.51,8.51c-1.34,1.03 -2.85,1.86 -4.51,2.36l0.0,4.13c2.75,-0.63 5.26,-1.89 7.37,-3.62L39.45,42.0 42.0,39.45l-18.0,-18.0L8.55,6.0zM24.0,8.0l-4.18,4.18L24.0,16.36L24.0,8.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change.xml b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change.xml
new file mode 100644
index 0000000..96e2fd4
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change.xml
@@ -0,0 +1,36 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:name="dot1"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M9.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/>
+ <path
+ android:name="dot2"
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M14.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/>
+ <path
+ android:name="dot3"
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/>
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.0,22.0l6.0,0.0 0.0,-4.0 14.0,0.0 0.0,-16.0z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml
new file mode 100644
index 0000000..2186aa8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml
@@ -0,0 +1,27 @@
+<!--
+ 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/ic_qs_signal_carrier_network_change" >
+ <target
+ android:name="dot1"
+ android:animation="@anim/ic_qs_signal_blink_1"/>
+ <target
+ android:name="dot2"
+ android:animation="@anim/ic_qs_signal_blink_2"/>
+ <target
+ android:name="dot3"
+ android:animation="@anim/ic_qs_signal_blink_3"/>
+</animated-vector>
diff --git a/packages/SystemUI/res/drawable/ic_ringer_audible.xml b/packages/SystemUI/res/drawable/ic_ringer_audible.xml
deleted file mode 100644
index fd50617..0000000
--- a/packages/SystemUI/res/drawable/ic_ringer_audible.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28dp"
- android:height="28dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
-
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M11.5,22.0c1.1,0.0 2.0,-0.9 2.0,-2.0l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0zM18.0,16.0l0.0,-5.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7c-2.9,0.7 -5.0,3.2 -5.0,6.3L5.0,16.0l-2.0,2.0l0.0,1.0l17.0,0.0l0.0,-1.0L18.0,16.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_ringer_mute.xml b/packages/SystemUI/res/drawable/ic_ringer_mute.xml
deleted file mode 100644
index b29a139..0000000
--- a/packages/SystemUI/res/drawable/ic_ringer_mute.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28dp"
- android:height="28dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M23.000000,44.000000c2.200000,0.000000 4.000000,-1.800000 4.000000,-4.000000l-8.000000,0.000000C19.000000,42.200001 20.799999,44.000000 23.000000,44.000000zM36.000000,21.000000c0.000000,-6.100000 -4.300000,-11.300000 -10.000000,-12.600000L26.000000,7.000000c0.000000,-1.700000 -1.300000,-3.000000 -3.000000,-3.000000c-1.700000,0.000000 -3.000000,1.300000 -3.000000,3.000000l0.000000,1.400000c-1.000000,0.200000 -2.000000,0.600000 -2.900000,1.100000L36.000000,28.400000L36.000000,21.000000zM35.500000,38.000000l4.000000,4.000000l2.500000,-2.500000L8.500000,6.000000L6.000000,8.500000l5.800000,5.800000C10.700000,16.299999 10.000000,18.600000 10.000000,21.000000l0.000000,11.000000l-4.000000,4.000000l0.000000,2.000000L35.500000,38.000000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml b/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml
deleted file mode 100644
index 4bff96d..0000000
--- a/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28dp"
- android:height="28dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
-
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M0.0,15.0l2.0,0.0L2.0,9.0L0.0,9.0L0.0,15.0zM3.0,17.0l2.0,0.0L5.0,7.0L3.0,7.0L3.0,17.0zM22.0,9.0l0.0,6.0l2.0,0.0L24.0,9.0L22.0,9.0zM19.0,17.0l2.0,0.0L21.0,7.0l-2.0,0.0L19.0,17.0zM16.5,3.0l-9.0,0.0C6.7,3.0 6.0,3.7 6.0,4.5l0.0,15.0C6.0,20.3 6.7,21.0 7.5,21.0l9.0,0.0c0.8,0.0 1.5,-0.7 1.5,-1.5l0.0,-15.0C18.0,3.7 17.3,3.0 16.5,3.0zM16.0,19.0L8.0,19.0L8.0,5.0l8.0,0.0L16.0,19.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml
new file mode 100644
index 0000000..f69ffe4
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml
@@ -0,0 +1,36 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="17dp"
+ android:height="17dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:name="dot1"
+ android:fillColor="?attr/fillColor"
+ android:pathData="M9.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/>
+ <path
+ android:name="dot2"
+ android:fillColor="?attr/backgroundColor"
+ android:pathData="M14.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/>
+ <path
+ android:name="dot3"
+ android:fillColor="?attr/backgroundColor"
+ android:pathData="M19.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/>
+ <path
+ android:fillColor="?attr/backgroundColor"
+ android:pathData="M2.0,22.0l6.0,0.0 0.0,-4.0 14.0,0.0 0.0,-16.0z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml
new file mode 100644
index 0000000..275f037
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml
@@ -0,0 +1,27 @@
+<!--
+ 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/stat_sys_signal_carrier_network_change" >
+ <target
+ android:name="dot1"
+ android:animation="@anim/ic_signal_blink_1"/>
+ <target
+ android:name="dot2"
+ android:animation="@anim/ic_signal_blink_2"/>
+ <target
+ android:name="dot3"
+ android:animation="@anim/ic_signal_blink_3"/>
+</animated-vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_dark_carrier_network_change_animation.xml b/packages/SystemUI/res/drawable/stat_sys_signal_dark_carrier_network_change_animation.xml
new file mode 100644
index 0000000..ff49d4c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_dark_carrier_network_change_animation.xml
@@ -0,0 +1,27 @@
+<!--
+ 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/stat_sys_signal_carrier_network_change" >
+ <target
+ android:name="dot1"
+ android:animation="@anim/ic_signal_dark_blink_1"/>
+ <target
+ android:name="dot2"
+ android:animation="@anim/ic_signal_dark_blink_2"/>
+ <target
+ android:name="dot3"
+ android:animation="@anim/ic_signal_dark_blink_3"/>
+</animated-vector>
diff --git a/packages/SystemUI/res/layout/volume_panel.xml b/packages/SystemUI/res/layout/volume_panel.xml
deleted file mode 100644
index 4d8aaa7..0000000
--- a/packages/SystemUI/res/layout/volume_panel.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/visible_panel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <FrameLayout
- android:id="@+id/slider_panel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@color/system_secondary_color"
- android:paddingTop="8dp"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:clipChildren="false" />
-
- <include
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- layout="@layout/zen_mode_panel" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/volume_panel_dialog.xml b/packages/SystemUI/res/layout/volume_panel_dialog.xml
deleted file mode 100644
index 700102f..0000000
--- a/packages/SystemUI/res/layout/volume_panel_dialog.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
- 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.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/volume_panel_z"
- android:layout_marginLeft="@dimen/notification_side_padding"
- android:layout_marginRight="@dimen/notification_side_padding"
- android:background="@drawable/qs_background_primary"
- android:translationZ="@dimen/volume_panel_z" >
-
- <include layout="@layout/volume_panel" />
-
-</FrameLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/volume_panel_item.xml b/packages/SystemUI/res/layout/volume_panel_item.xml
deleted file mode 100644
index dad68c3..0000000
--- a/packages/SystemUI/res/layout/volume_panel_item.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:clipChildren="false"
- android:gravity="start|center_vertical"
- android:orientation="horizontal" >
-
- <ImageView
- android:id="@+id/stream_icon"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:scaleType="center"
- android:background="@drawable/btn_borderless_rect"
- android:contentDescription="@null" />
-
- <FrameLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1" >
-
- <TextView
- android:id="@+id/suppressor"
- android:visibility="gone"
- android:textAppearance="@style/TextAppearance.QS.VolumeSuppressor"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
- android:singleLine="true"
- android:ellipsize="end"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
-
- <SeekBar
- android:id="@+id/seekbar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingBottom="0dp"
- android:paddingEnd="16dp"
- android:paddingStart="8dp"
- android:paddingTop="0dp" />
-
- </FrameLayout>
-
- <View
- android:id="@+id/divider"
- android:layout_width="1dp"
- android:layout_height="32dp"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp"
- android:background="@color/volume_panel_divider" />
-
- <ImageView
- android:id="@+id/secondary_icon"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:scaleType="center"
- android:background="@drawable/btn_borderless_rect"
- android:contentDescription="@null" />
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml
index d829f0e..b676bce 100644
--- a/packages/SystemUI/res/layout/zen_mode_panel.xml
+++ b/packages/SystemUI/res/layout/zen_mode_panel.xml
@@ -126,7 +126,7 @@
android:lineSpacingMultiplier="1.20029"
android:layout_toStartOf="@id/zen_introduction_confirm"
android:text="@string/zen_priority_introduction"
- android:textAppearance="@style/TextAppearance.QS.VolumeSuppressor" />
+ android:textAppearance="@style/TextAppearance.QS.Introduction" />
<TextView
android:id="@+id/zen_introduction_customize"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index bba8a6d..09faebc 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Geen SIM nie."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-verbinding."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Vliegtuigmodus."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> persent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Stelselinstellings"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Kennisgewings"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Sluitskerm."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Instellings"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oorsig."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bevestig"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Gebruiker <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi afgeskakel."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Gly op vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Gly links vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Geen onderbrekings nie. Nie eens wekkers nie."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Jy sal nie deur klanke en vibrasies gesteur word nie, afgesien van wekkers, onthounotas, gebeurtenisse en bellers wat jy spesifiseer."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Pasmaak"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Geen onderbrekings nie"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Net prioriteitonderbrekings"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Net wekkers"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Wiil jy jou sessie voortsit?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Begin van voor af"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, gaan voort"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gasgebruiker"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Verwyder gas om programme en data uit te vee"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"VERWYDER GAS"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Voeg nuwe gebruiker by?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel.\n\nEnige gebruiker kan programme vir al die ander gebruikers opdateer."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batteryspaarder is aan"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Weier"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is die volumedialoog"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Raak om die oorspronklike terug te stel."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen-kenmerk"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Jy is in die Work-profiel"</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 06e9fb2..083ee76 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"ምንም SIM የለም።"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ብሉቱዝ ማያያዝ።"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"የአውሮፕላን ሁነታ።"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"የባትሪ <xliff:g id="NUMBER">%d</xliff:g> መቶኛ።"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"የስርዓት ቅንብሮች"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"ማሳወቂያዎች"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ማያ ገጽ ቆልፍ።"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ቅንብሮች"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"አጠቃላይ እይታ።"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"አረጋግጥ"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ተጠቃሚ <xliff:g id="USER">%s</xliff:g>።"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>።"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi ጠፍቷል።"</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ላይ አንሸራትት።"</string>
<string name="description_direction_left" msgid="7207478719805562165">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ግራ አንሸራትት።"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ምንም ማቋረጦች የሉም። ማንቂያዎችም እንኳ።"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"እርስዎ ከገለጿቸው ማንቂያዎች፣ አስታዋሾች፣ ክስተቶች እና ደዋዮች በስተቀር በድምጾች እና ንዝረቶች አይረበሹም።"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"አብጅ"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"ምንም ማቋረጦች የሉም"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"ቅድሚያ የሚሰጣቸው ማቋረጦች ብቻ"</string>
<string name="zen_alarms" msgid="5055668280767657759">"ማንቂያዎች ብቻ"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"ክፍለ-ጊዜዎን መቀጠል ይፈልጋሉ?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"እንደገና ጀምር"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"አዎ፣ ቀጥል"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"የእንግዳ ተጠቃሚ"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"መተግበሪያዎችን እና ውሂብን ለመሰረዝ እንግዳን ያስወግዱ"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"እንግዳን አስወግድ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"አዲስ ተጠቃሚ ይታከል?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"እርስዎ አንድ አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሱ ቦታ ማዘጋጀት አለበት።\n\nማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ሊያዘምን ይችላል።"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"የባትሪ ኃይል ቆጣቢ በርቷል"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"ከልክል"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> የድምጽ መጠን መገናኛው ነው"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"የመጀመሪያውን ወደነበረበት ለመመለስ ይንኩ።"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"እርስዎ በስራ መገለጫ ውስጥ ነዎት"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index ac86dbd..612e2f9 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -150,6 +150,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"ليست هناك شريحة SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ربط البلوتوث."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"وضع الطائرة."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"مستوى البطارية <xliff:g id="NUMBER">%d</xliff:g> في المائة."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"إعدادات النظام."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"الإشعارات."</string>
@@ -171,8 +173,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"شاشة التأمين."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"الإعدادات"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"النظرة عامة."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"تأكيد"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"المستخدم <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"تم إيقاف Wifi."</string>
@@ -307,10 +308,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"تمرير لأعلى لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"تمرير لليسار لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"عدم المقاطعة، ولا بالتنبيهات كذلك."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"لن يتم إزعاجك بأصوات الاهتزاز، عدا من التنبيهات والتذكيرات والأحداث والمتصلين الذين تحددهم."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"تخصيص"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"بدون مقاطعات"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"المقاطعات ذات الأولوية فقط"</string>
<string name="zen_alarms" msgid="5055668280767657759">"التنبيهات فقط"</string>
@@ -346,12 +345,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"هل تريد متابعة جلستك؟"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"البدء من جديد"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"نعم، متابعة."</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"مستخدم ضيف"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"إزالة الضيف لحذف التطبيقات والبيانات"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"إزالة الضيف"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"هل تريد إضافة مستخدم جديد؟"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"عند إضافة مستخدم جديد، يلزمه إعداد مساحته.\n\nعلمًا بأنه يُمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"وضع توفير الطاقة قيد التشغيل"</string>
@@ -403,7 +399,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"رفض"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> هو مربع حوار مستوى الصوت"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"المس لاستعادة الإعداد الأصلي."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"أنت في الملف الشخصي للعمل"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 64e5afa..e569a8f 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Няма SIM карта."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Тетъринг през Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Самолетен режим."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> процента батерия."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Системни настройки."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Известия."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заключване на екрана."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Настройки"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Общ преглед."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Потвърждаване"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Потребител: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Функцията за Wi-Fi се изключи."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Плъзнете нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Плъзнете наляво за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Без прекъсвания. Дори без будилници."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Няма да бъдете обезпокоявани от звуци и вибрирания, различни от будилници, напомняния, събития и обаждания от посочени от вас контакти."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Персонализиране"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Без прекъсвания"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Само приоритетни прекъсвания"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Само будилници"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Искате ли да продължите сесията си?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Започване отначало"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Да, продължавам"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Гост"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Премахване на госта с цел изтриване на приложения и данни"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ПРЕМАХВАНЕ НА ГОСТА"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Да се добави ли нов потреб.?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Когато добавите нов потребител, той трябва да настрои работното си пространство.\n\nВсеки потребител може да актуализира приложенията за всички останали потребители."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Режимът за запазване на батерията е включен"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Отказване"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> изпълнява ролята на диалоговия прозорец за силата на звука"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Докоснете, за да възстановите оригинала."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Влезли сте в потребителски профил в Work"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index dd83d59..eeaa47a 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"কোনো সিম নেই৷"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth টিথারিং৷"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"বিমান মোড৷"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ ব্যাটারি রয়েছে৷"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"সিস্টেম সেটিংস৷"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"বিজ্ঞপ্তিগুলি৷"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"লক স্ক্রীন।"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"সেটিংস"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"এক নজরে৷"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"নিশ্চিত করুন"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ব্যবহারকারী <xliff:g id="USER">%s</xliff:g>৷"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi বন্ধ হয়েছে।"</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য উপরের দিকে স্লাইড করুন৷"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য বাম দিকে স্লাইড করুন৷"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"কোনো ব্যাঘাত ছাড়াই। এমনকি অ্যালার্মও নয়।"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"আপনার নির্দিষ্ট অ্যালার্ম, অনুস্মারক, ইভেন্ট, এবং কলারগুলি ব্যতীত আপনাকে শব্দ এবং কম্পনগুলির দ্বারা বিরক্ত করা হবে না৷"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"কাস্টমাইজ করুন"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"কোনো বাধা নয়"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"শুধুমাত্র প্রাধান্য বাধাগুলি"</string>
<string name="zen_alarms" msgid="5055668280767657759">"শুধুমাত্র অ্যালার্মগুলি"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"আপনি কি আপনার সেশনটি অবিরত রাখতে চান?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"আবার শুরু করুন"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"হ্যাঁ, অবিরত থাকুন"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"অতিথি ব্যবহারকারী"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"অ্যাপ্লিকেশানগুলি এবং ডেটা মুছে ফেলতে অতিথি সরান"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"অতিথি সরান"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"নতুন ব্যবহারকারীকে যোগ করবেন?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ব্যাটারি সেভার চালু রয়েছে"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"প্রত্যাখ্যান করুন"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> হল ভলিউম ডায়লগ"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"আসলটি পুনঃস্থাপন করতে স্পর্শ করুন৷"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"আপনি কাজের প্রোফাইলে রয়েছেন"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index eda024d..d567eb2 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"No hi ha cap targeta SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Ancoratge de Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode d\'avió."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueig"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuració"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visió general"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirma"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuari <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"La xarxa Wi-Fi està desactivada."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Fes lliscar el dit cap amunt per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Fes lliscar el dit cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sense interrupcions (ni tan sols alarmes)"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"No t\'interromprà cap so ni vibració, tret dels que produeixin les alarmes, els recordatoris, els esdeveniments i les trucades de les persones que especifiquis."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalitza"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Cap interrupció"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Només interrupcions amb prioritat"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Només alarmes"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Vols continuar amb la sessió?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Torna a començar"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sí, continua"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Usuari convidat"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Suprimeix el convidat per suprimir les aplicacions i les dades"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"SUPRIMEIX EL CONVIDAT"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vols afegir un usuari nou?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar-se l\'espai.\n\nQualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Estalvi de bateria activada"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Denega"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> és el diàleg de volum"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Toca per restaurar l\'original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Estàs utilitzant el perfil professional"</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 7abcc11..3982e06 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -148,6 +148,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Žádná SIM karta."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Sdílené připojení přes Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Režim Letadlo."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -171,8 +173,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Obrazovka uzamčení"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavení"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Přehled"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potvrdit"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Uživatel <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Připojení Wi-Fi je vypnuto."</string>
@@ -307,10 +308,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Přejeďte prstem nahoru: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Přejeďte prstem doleva: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Žádná vyrušení, dokonce ani budíky."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Nebudou vás rušit zvuky ani vibrace s výjimkou budíků, upozornění, událostí a volajících, které zadáte."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Přizpůsobit"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Žádná vyrušení"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Pouze prioritní vyrušení"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Pouze budíky"</string>
@@ -346,12 +345,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Chcete v relaci pokračovat?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Začít znovu"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ano, pokračovat"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Host"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Chcete-li smazat aplikace a data, odstraňte hosta"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ODSTRANIT HOSTA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Přidat nového uživatele?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Když přidáte nového uživatele, musí si nastavit vlastní prostor.\n\nJakýkoli uživatel může aktualizovat aplikace všech ostatních uživatelů."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Režim Úspora baterie je zapnutý."</string>
@@ -403,7 +399,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmítnout"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je dialog hlasitosti"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Klepnutím obnovíte originál."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Nacházíte se v pracovním profilu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 3d0a0b0..e574f12 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Intet SIM-kort."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-netdeling."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flytilstand."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Batteri <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Systemindstillinger."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Underretninger."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låseskærm."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Indstillinger"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oversigt."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bekræft"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Bruger <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi er slået fra."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Glid op for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Glid til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Ingen afbrydelser. Ikke engang alarmer."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Du bliver ikke forstyrret af lyde og vibrationer undtagen fra de alarmer, påmindelser, begivenheder og opkaldere, som du angiver."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tilpas"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Ingen afbrydelser"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Kun prioriterede afbrydelser"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Kun Alarmer"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Vil du fortsætte din session?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start forfra"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, fortsæt"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gæstebruger"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Fjern gæsten for at slette apps og data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"FJERN GÆST"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vil du tilføje den nye bruger?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Når du tilføjer en ny bruger, skal personen konfigurere sit område.\n\nEnhver bruger kan opdatere apps for alle andre brugere."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparefunktion er slået til"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Afvis"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er dialogboksen for lydstyrke"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Tryk for at gendanne originalen."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Du er i arbejdsprofilen"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index f77da12..b064055 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Keine SIM-Karte"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-Tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flugmodus"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Sperrbildschirm"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Einstellungen"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Übersicht"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bestätigen"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Nutzer: <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WLAN ist deaktiviert."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach oben schieben"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links schieben"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Keine Unterbrechungen. Auch keine Weckrufe."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Klingeltöne und die Vibration werden deaktiviert, außer für den Wecker, Erinnerungen, Termine sowie Anrufe von zuvor von Ihnen festgelegten Personen."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Anpassen"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Keine Unterbrechungen"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Nur wichtige Unterbrechungen"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Nur Wecker"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Möchten Sie Ihre Sitzung fortsetzen?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Von vorn"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, weiter"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gastnutzer"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Entfernen Sie den Gast, um Apps und Daten zu löschen."</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"Gast entfernen"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Neuen Nutzer hinzufügen?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Wenn Sie einen neuen Nutzer hinzufügen, muss dieser seinen Bereich einrichten.\n\nJeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Energiesparmodus ist aktiviert"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ablehnen"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> regelt die Lautstärke."</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Zum Wiederherstellen des Originals hier tippen"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Sie befinden sich im Arbeitsprofil."</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index e1e8ba3..bdbd26f 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Δεν υπάρχει SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Πρόσδεση Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Λειτουργία πτήσης."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Κλείδωμα οθόνης."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Ρυθμίσεις"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Επισκόπηση."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Επιβεβαίωση"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Χρήστης <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Το Wi-fi απενεργοποιήθηκε."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Κύλιση προς τα επάνω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Κύλιση προς τα αριστερά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Χωρίς διακοπές. Ούτε ειδοποιήσεις,"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Δεν θα διακόπτεστε από ήχους και δονήσεις, με εξαίρεση τα ξυπνητήρια, τις υπενθυμίσεις, τα συμβάντα και τους καλούντες που έχετε ορίσει."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Προσαρμογή"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Χωρίς διακοπές"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Μόνο διακοπές προτεραιότητας"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Μόνο ειδοποιήσεις"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Θέλετε να συνεχίσετε την περίοδο σύνδεσής σας;"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Έναρξη από την αρχή"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ναι, συνέχεια"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Χρήστης-επισκέπτης"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Κατάργηση επισκέπτη για διαγραφή εφαρμογών και δεδομένων"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ΚΑΤΑΡΓΗΣΗ ΕΠΙΣΚΕΠΤΗ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Προσθήκη νέου χρήστη;"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Η Εξοικονόμηση μπαταρίας είναι ενεργή"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Απόρριψη"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> αποτελεί το παράθυρο διαλόγου ελέγχου έντασης"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Αγγίξτε για επαναφορά αρχικού."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Χρησιμοποιείτε προφίλ εργασίας"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 9e76616..fe52d59 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -146,6 +146,7 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"No SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Aeroplane mode"</string>
+ <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Carrier network changing."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"System settings"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string>
@@ -167,8 +168,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi turned off."</string>
@@ -303,10 +303,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"No interruptions. Not even alarms."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"No interruptions"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Priority interruptions only"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Alarms only"</string>
@@ -342,12 +340,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Do you want to continue your session?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start again"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Yes, continue"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Remove guest to delete apps and data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string>
@@ -399,7 +394,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 9e76616..fe52d59 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -146,6 +146,7 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"No SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Aeroplane mode"</string>
+ <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Carrier network changing."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"System settings"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string>
@@ -167,8 +168,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi turned off."</string>
@@ -303,10 +303,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"No interruptions. Not even alarms."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"No interruptions"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Priority interruptions only"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Alarms only"</string>
@@ -342,12 +340,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Do you want to continue your session?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start again"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Yes, continue"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Remove guest to delete apps and data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string>
@@ -399,7 +394,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 9e76616..fe52d59 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -146,6 +146,7 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"No SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Aeroplane mode"</string>
+ <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Carrier network changing."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Battery <xliff:g id="NUMBER">%d</xliff:g> per cent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"System settings"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifications."</string>
@@ -167,8 +168,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi turned off."</string>
@@ -303,10 +303,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"No interruptions. Not even alarms."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"No interruptions"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Priority interruptions only"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Alarms only"</string>
@@ -342,12 +340,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Do you want to continue your session?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start again"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Yes, continue"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Remove guest to delete apps and data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string>
@@ -399,7 +394,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 40400f3..8ed73b7 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Sin tarjeta SIM"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Conexión mediante Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla bloqueada"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Recientes"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desactivado"</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sin interrupciones (ni siquiera alarmas)"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"No te molestarán los sonidos ni las vibraciones, excepto que se trate de alarmas, recordatorios, eventos y emisores que especifiques."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Sin interrupciones"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Solo interrupciones de prioridad"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Solo alarmas"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"¿Quieres retomar la sesión?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Volver a empezar"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sí, continuar"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Usuario invitado"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Para borrar las aplicaciones y los datos, quita el invitado."</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"QUITAR INVITADO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"¿Agregar usuario nuevo?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Cuando agregas un nuevo usuario, esa persona debe configurar su espacio.\n\nCualquier usuario puede actualizar aplicaciones para todos los usuarios."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rechazar"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen."</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar el original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Estás usando el perfil de Work."</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index cb061a5..4527eee 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Sin tarjeta SIM"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Anclaje por Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> por ciento de batería"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Ajustes del sistema"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificaciones"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Ajustes"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión general."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desactivado."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sin interrupciones, ni siquiera alarmas."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"No te interrumpirán sonidos ni vibraciones, salvo los de las alarmas, los recordatorios, los eventos y las llamadas que especifiques."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Sin interrupciones"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Solo interrupciones de prioridad"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Solo alarmas"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"¿Quieres continuar con la sesión?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Volver a empezar"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sí, continuar"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Usuario invitado"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Eliminar invitado para borrar aplicaciones y datos"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ELIMINAR INVITADO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"¿Añadir nuevo usuario?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Al añadir un usuario nuevo, este debe configurar su espacio.\n\nCualquier usuario puede actualizar las aplicaciones del resto de usuarios."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rechazar"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar la versión original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Estás en el perfil de trabajo"</string>
</resources>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index 7fffec7..c247d19 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM-kaarti pole."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetoothi jagamine."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Lennurežiim."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Aku: <xliff:g id="NUMBER">%d</xliff:g> protsenti."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Süsteemiseaded"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Teatised"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kuva lukustamine."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Seaded"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ülevaade."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Kinnitamine"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kasutaja <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi on välja lülitatud."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Lohistage üles: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Lohistage vasakule: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Katkestusi pole. Pole isegi hoiatusi."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Teid segatakse helide ja vibratsioonidega vaid teie määratud alarmide, meeldetuletuste, sündmuste ning helistajate puhul."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Kohanda"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Mitte ühtegi katkestust"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Ainult prioriteetsed katkestused"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Ainult alarmid"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Kas soovite seansiga jätkata?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Alusta uuesti"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Jah, jätka"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Külaliskasutaja"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Rakenduste ja andmete kustutamiseks eemaldage külaline"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"EEMALDA KÜLALINE"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Kas lisada uus kasutaja?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi.\n\nIga kasutaja saab värskendada rakendusi kõigi kasutajate jaoks."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akusäästja on sisse lülitatud"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Keela"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> on helitugevuse dialoog"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Originaali taastamiseks puudutage."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Olete tööprofiilil"</string>
</resources>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index 94dd6b1..e5efbcc 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Ez dago SIM txartelik."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Konexioa partekatzea (Bluetooth)"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Hegaldi-modua"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Bateriaren karga: <xliff:g id="NUMBER">%d</xliff:g>."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Sistemaren ezarpenak."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Jakinarazpenak."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantaila blokeatzeko aukera."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Ezarpenak"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikuspegi orokorra."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Berretsi"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"<xliff:g id="USER">%s</xliff:g> erabiltzailea."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi konexioa desaktibatu egin da."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Lerratu gora hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Lerratu ezkerrera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Etenaldirik ez, ezta alarmaren bat bada ere."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Soinuek eta dardarek ez zaituzte eragotziko, zehazten dituzun abisuek, gertaerek eta deitzaileek izan ezik."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Pertsonalizatu"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Etenaldirik gabe"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Lehentasun-etenaldiak soilik"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Alarmak soilik"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Saioarekin jarraitu nahi duzu?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Hasi berriro"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Bai, jarraitu"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Erabiltzaile gonbidatua"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Kendu gonbidatua, aplikazioak eta datuak ezabatzeko"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"KENDU GONBIDATUA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Beste erabiltzaile bat gehitu?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Erabiltzaile bat gehitzen duzunean, horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Bateria aurrezlea aktibatuta dago"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ukatu"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> da bolumenaren leihoa"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Ukitu jatorrizkora leheneratzeko"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Work profil bat erabiltzen ari zara"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 0260d3a..955c5a8 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"بدون سیم کارت."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"اتصال اینترنت با بلوتوث تلفن همراه."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"حالت هواپیما."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"باتری <xliff:g id="NUMBER">%d</xliff:g> درصد."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"تنظیمات سیستم."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"اعلانها."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"صفحه در حالت قفل."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"تنظیمات"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"نمای کلی."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"تأیید"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"کاربر <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi خاموش شد."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"لغزاندن به بالا برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"لغزاندن به چپ برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"بدون قطعی. حتی هشدارها قطع نمیشوند."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"صداها و لرزشهایی به جز هشدارها، یادآوریها، رویدادها و تماسگیرندههایی که مشخص میکنید، مزاحم شما نمیشوند."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"سفارشی کردن"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"بدون وقفه"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"فقط وقفههای اولویتدار"</string>
<string name="zen_alarms" msgid="5055668280767657759">"فقط هشدارها"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"آیا میخواهید جلسهتان را ادامه دهید؟"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"شروع مجدد"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"بله، ادامه داده شود"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"کاربر مهمان"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"برای حذف برنامهها و اطلاعات، مهمان را حذف کنید"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"حذف مهمان"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"کاربر جدیدی اضافه میکنید؟"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"وقتی کاربر جدیدی را اضافه میکنید آن فرد باید فضای خودش را تنظیم کند.\n\nهر کاربری میتواند برنامهها را برای همه کاربران دیگر بهروزرسانی کند."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ذخیره کننده باتری روشن است."</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"رد کردن"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> کنترلکننده صدا است"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"برای بازیابی کنترلکننده اصلی، لمس کنید."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"در نمایه کاری هستید"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 156bbb7..16e0539 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Ei SIM-korttia."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Internetyhteyden jakaminen Bluetoothin kautta."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Lentokonetila."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Akun virta <xliff:g id="NUMBER">%d</xliff:g> prosenttia."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Järjestelmän asetukset"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Ilmoitukset"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lukitse näyttö."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Asetukset"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Viimeisimmät."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Vahvista"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Käyttäjä: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi poistettiin käytöstä."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Liu\'uta ylös ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Liu\'uta vasemmalle ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Ei keskeytyksiä, ei edes herätyksiä."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Äänet ja värinät eivät häiritse sinua, paitsi jos ne ovat hälytyksiä, muistutuksia, tapahtumia tai määrittämiäsi soittajia."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Muokkaa"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Ei häiriöitä"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Vain tärkeät häiriöt"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Vain herätykset"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Haluatko jatkaa istuntoa?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Aloita alusta"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Kyllä, haluan jatkaa"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Vierailijakäyttäjä"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Poista vierailija, jos haluat poistaa sovelluksia ja tietoja."</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"POISTA VIERAILIJA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Lisätäänkö uusi käyttäjä?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Virransäästö on käytössä"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Estä"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> on äänenvoimakkuusvalinta."</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Palauta alkuperäinen koskettamalla."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Olet Work-profiilissa"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index de5b7aa..3c238af 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Aucune carte SIM"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Partage de connexion Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode Avion"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmer"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur : <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi désactivé"</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Faire glisser le doigt vers le haut : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Aucune interruption. Même pas pour les alarmes."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Vous ne serez pas dérangé par les sonneries ni les vibrations, sauf pour les alarmes, les rappels, les événements et les appels des personnes que vous spécifiez."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Aucune interruption"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Interruptions prioritaires seulement"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Alarmes uniquement"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Voulez-vous poursuivre la session?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Recommencer"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Oui, continuer"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Utilisateur invité"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Retirez l\'invité pour supprimer des applications et données"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"RETIRER L\'INVITÉ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ajouter un utilisateur?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace.\n\nN\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"La fonction Économie d\'énergie est activée"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuser"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> correspond à la boîte de dialogue du volume"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Touchez pour restaurer l\'original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Vous avec activé le profil professionnel"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index ed17e4af..760ea15 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Aucune carte SIM"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Partage de connexion Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode Avion"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmer"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi désactivé."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Faites glisser vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Faites glisser vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Aucune sonnerie, pas même pour les alarmes"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Vous ne serez pas dérangé par les sonneries ni les vibrations, sauf pour les alarmes, les rappels, les événements et les appels des personnes que vous spécifiez."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Aucune sonnerie"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Sonneries prioritaires uniquement"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Alarmes uniquement"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Voulez-vous poursuivre la dernière session ?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Non, nouvelle session"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Oui, continuer"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Invité"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Retirez l\'invité pour supprimer des applications et données."</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"RETIRER L\'INVITÉ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ajouter un utilisateur ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace.\n\nN\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"L\'économiseur de batterie est activé"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuser"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> correspond à la boîte de dialogue du volume"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Appuyez pour restaurer l\'interface d\'origine."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Vous consultez le profil professionnel."</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index 89d5fc3..888a7ab 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Sen SIM"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Ancoraxe de Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión xeral."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi desactivada."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Pasa o dedo cara arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Non hai interrupcións nin alarmas."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos de emisores de chamada especificados."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Sen interrupcións"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Só interrupcións prioritarias"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Só alarmas"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Queres continuar coa túa sesión?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Comezar de novo"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Si, continuar"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Usuario convidado"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Quita o convidado para eliminar aplicacións e datos"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"QUITAR CONVIDADO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Engadir un usuario novo?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Cando engadas un usuario novo, este deberá configurar o seu espazo\n\nCalquera usuario pode actualizar as aplicacións para todos os demais usuarios."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"O aforro de batería está activado"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Denegar"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é o cadro de diálogo de volume"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar o orixinal."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Está no perfil de traballo"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 08fbe69..49de264 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"कोई सिम नहीं."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब्लूटूथ टेदरिंग."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"हवाई जहाज मोड."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> प्रतिशत बैटरी."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"सिस्टम सेटिंग."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचनाएं."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"लॉक स्क्रीन."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिंग"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"अवलोकन."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"पुष्टि करें"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"उपयोगकर्ता <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"वाई-फ़ाई को बंद किया गया."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए ऊपर स्लाइड करें."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए बाएं स्लाइड करें."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ऐसा सेट करें की कोई कि अलार्म भी ना हो."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"आपको आपके द्वारा निर्दिष्ट किए गए अलार्म, रिमाइंडर्स, ईवेंट और कॉलर को छोड़कर अन्य ध्वनियों और कंपनों के द्वारा परेशान नहीं किया जाएगा."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"कस्टमाइज़ करें"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"कोई अवरोध नहीं"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"केवल प्राथमिकता वाले कल और मैसेज को रोकें"</string>
<string name="zen_alarms" msgid="5055668280767657759">"केवल अलार्म"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"क्या आप अपना सत्र जारी रखना चाहते हैं?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"पुन: प्रारंभ करें"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"हां, जारी रखें"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"अतिथि उपयोगकर्ता"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"ऐप्स और डेटा हटाने के लिए अतिथि को निकालें"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"अतिथि को निकालें"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"नया उपयोगकर्ता जोड़ें?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उस व्यक्ति को अपना स्थान सेट करना होता है.\n\nकोई भी उपयोगकर्ता अन्य सभी उपयोगकर्ताओं के लिए ऐप्स अपडेट कर सकता है."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"बैटरी सेवर चालू है"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"अस्वीकार करें"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> वॉल्यूम संवाद है"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"मूल वॉल्यूम को फिर से लाने के लिए स्पर्श करें."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"आप कार्य प्रोफ़ाइल में हैं"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 85bb634..3f2de7a 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -147,6 +147,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Nema SIM kartice."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Posredno povezivanje Bluetootha."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Način rada u zrakoplovu"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Baterija <xliff:g id="NUMBER">%d</xliff:g> posto."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Postavke sustava."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Obavijesti."</string>
@@ -168,8 +170,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Zaključavanje zaslona."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Postavke"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pregled."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potvrdi"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Korisnik <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi isključen."</string>
@@ -304,10 +305,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Kliznite prema gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Kliznite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Bez prekida, čak ni za alarme."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Neće vas prekidati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivatelja koje navedete."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Bez prekida"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Samo prioritetni prekidi"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Samo alarmi"</string>
@@ -343,12 +342,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Želite li nastaviti sesiju?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Počni ispočetka"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Da, nastavi"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gostujući korisnik"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Uklonite gosta da biste izbrisali aplikacije i podatke"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"UKLONI GOSTA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Dodati novog korisnika?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor.\n\nBilo koji korisnik može ažurirati aplikacije za sve ostale korisnike."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Štednja baterije je uključena"</string>
@@ -400,7 +396,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odbij"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> predstavlja dijaloški okvir za upravljanje glasnoćom"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Dodirnite da biste vratili izvorno."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Nalazite se na profilu Worka"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 0773849..42cafcd 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Nincs SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth megosztása."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Repülőgép üzemmód."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Akkumulátor <xliff:g id="NUMBER">%d</xliff:g> százalék."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Rendszerbeállítások"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Értesítések"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lezárási képernyő."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Beállítások"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Áttekintés."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Megerősítés"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Felhasználó: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi kikapcsolva."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa felfelé."</string>
<string name="description_direction_left" msgid="7207478719805562165">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa balra."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Semmi sem zavarja meg, még a riasztások sem."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Nem fogják zavarni hanghatások és rezgés, kivéve az ébresztéseket, emlékeztetőket, eseményeket és az Ön által megjelölt hívókat."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Személyre szabás"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Ne zavarjon"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Csak prioritást élvező zavaró üzenetek"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Csak riasztások"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Folytatja a munkamenetet?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Újrakezdés"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Igen, folytatom"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Vendég felhasználó"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Vendég eltávolítása az alkalmazások és adatok törléséhez"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"VENDÉG ELTÁVOLÍTÁSA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Új felhasználó hozzáadása?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját tárterületét.\n\nBármely felhasználó frissítheti az alkalmazásokat valamennyi felhasználó számára."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akkumulátorkímélő mód bekapcsolva"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Elutasítás"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás kezeli a hangerőt"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Érintse meg az eredeti érték visszaállításához."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"A munkaprofilt használja"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index 3ffc030..7f20360 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM չկա:"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ը կապվում է:"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Ինքնաթիռային ռեժիմ"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Մարտկոցը <xliff:g id="NUMBER">%d</xliff:g> տոկոս է:"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Համակարգի կարգավորումներ:"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Ծանուցումներ:"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Էկրանի կողպում:"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Կարգավորումներ"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Համատեսք"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Հաստատել"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Օգտվող <xliff:g id="USER">%s</xliff:g>:"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>:"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi-ն անջատվեց:"</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Սահեցրեք վերև <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Սահեցրեք ձախ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Առանց ընդհատումների՝ ներառյալ զարթուցիչները:"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Բացի ձեր հատկորոշած զարթուցիչներից, հիշեցումներից, իրադարձություններից և զանգողների ցանկից՝ ոչ մի ձայն և թրթռում չի անհանգստացնի ձեզ:"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Հարմարեցնել"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Առանց ընդհատումների"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Միայն կարևոր ընդհատումներ"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Միայն զարթուցիչ"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Դուք ցանկանու՞մ եք շարունակել ձեր գործողությունը:"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Սկսել"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Այո, շարունակել"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Հյուր"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Հեռացնել հյուրին՝ հավելվածներն ու տվյալները ջնջելու համար"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ՀԵՌԱՑՆԵԼ ՀՅՈՒՐԻՆ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ավելացնե՞լ նոր պրոֆիլ:"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Երբ նոր օգտվող եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտվող կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Մարտկոցի տնտեսումը միացված է"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Մերժել"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ը ձայնի ուժգնության երկխոսության հավելված է"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Դիպչեք՝ սկզբնօրինակը վերականգնելու համար:"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Դուք աշխատանքային պրոֆիլում եք"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index edee7c6..8e1e11b 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Tidak ada SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Penambatan bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode pesawat."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Baterai <xliff:g id="NUMBER">%d</xliff:g> persen."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Setelan sistem."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Notifikasi."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Layar kunci."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Setelan"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ringkasan."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Konfirmasi"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi dinonaktifkan."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Geser ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Geser ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Tanpa gangguan, termasuk alarm."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Anda tidak akan diganggu oleh suara dan getaran, kecuali dari alarm, pengingat, acara, dan penelepon yang ditentukan."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Sesuaikan"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Tidak ada interupsi"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Hanya interupsi prioritas"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Hanya alarm"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Lanjutkan sesi Anda?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Mulai"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ya, lanjutkan"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Pengguna tamu"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Hapus tamu untuk menghilangkan aplikasi dan data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"HAPUS TAMU"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Tambahkan pengguna baru?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri.\n\n1Pengguna mana pun dapat memperbarui aplikasi untuk semua pengguna lain."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Penghemat baterai aktif"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tolak"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> adalah dialog volume"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Sentuh untuk memulihkan aslinya."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Anda berada di Profil kerja"</string>
</resources>
diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml
index 660834e..02f525b 100644
--- a/packages/SystemUI/res/values-is-rIS/strings.xml
+++ b/packages/SystemUI/res/values-is-rIS/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Ekkert SIM-kort."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tjóðrun með Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flugstilling"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> prósent á rafhlöðu."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Kerfisstillingar."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Tilkynningar."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lásskjár."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Stillingar"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Yfirlit."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Staðfesta"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Notandi: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Slökkt á Wi-Fi."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Strjúktu upp til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Strjúktu til vinstri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Engar truflanir. Ekki einu sinni vekjarar."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Þú verður ekki fyrir truflunum af hljóðmerkjum og titringi, fyrir utan vekjara, áminningar, viðburði og símtöl sem þú leyfir fyrir fram."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Sérsníða"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Engin truflun"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Aðeins forgangstruflanir"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Aðeins vekjarar"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Viltu halda áfram með lotuna?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Byrja upp á nýtt"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Já, halda áfram"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gestanotandi"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Fjarlægðu gestinn til að eyða forritum og gögnum"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"FJARLÆGJA GEST"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Bæta nýjum notanda við?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Þegar þú bætir nýjum notanda við þarf sá notandi að setja upp svæðið sitt.\n\nHvaða notandi sem er getur uppfært forrit fyrir alla aðra notendur."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Kveikt er á rafhlöðusparnaði"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Hafna"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er hljóðstyrksvalmyndin"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Snertu til að færa í upprunalegt horf."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Þú ert í vinnusniðinu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index a7ac816..0914b0a 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -55,7 +55,7 @@
<string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Consentire all\'applicazione <xliff:g id="APPLICATION">%1$s</xliff:g> di accedere all\'accessorio USB?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Aprire <xliff:g id="ACTIVITY">%1$s</xliff:g> quando questo dispositivo USB è collegato?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Aprire <xliff:g id="ACTIVITY">%1$s</xliff:g> quando questo accessorio USB è collegato?"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Nessuna applicazione installata funziona con questo accessorio USB. Info su <xliff:g id="URL">%1$s</xliff:g>."</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Nessuna app installata funziona con questo accessorio USB. Altre info su <xliff:g id="URL">%1$s</xliff:g>."</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"Accessorio USB"</string>
<string name="label_view" msgid="6304565553218192990">"Visualizza"</string>
<string name="always_use_device" msgid="1450287437017315906">"Usa per impostazione predef. per dispositivo USB"</string>
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Nessuna SIM presente."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modalità aereo."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Schermata di blocco."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Impostazioni"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Panoramica."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Conferma"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utente <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi disattivato."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Su per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"A sinistra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Senza interruzioni. Neanche sveglie."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Non verrai disturbato da suoni e vibrazioni, ad eccezione di sveglie, promemoria, eventi e chiamanti da te specificati."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizza"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Nessuna interruzione"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Solo interruzioni con priorità"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Solo sveglie"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Vuoi continuare la sessione?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Ricomincia"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sì, continua"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Utente ospite"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Rimuovi l\'ospite per eliminare app e dati"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"RIMUOVI OSPITE"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Aggiungere un nuovo utente?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Il nuovo utente, una volta aggiunto, deve impostare il proprio spazio.\n\nQualsiasi utente può aggiornare le app per tutti gli altri."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Risparmio batteria attivo"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Nega"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> rappresenta la finestra di dialogo relativa al volume"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Tocca per ripristinare l\'originale."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Hai attivato il profilo di lavoro"</string>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 837bba7..5f02829 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -148,6 +148,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"אין כרטיס SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"שיתוף אינטרנט דרך Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"מצב טיסה"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> אחוזים של סוללה."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"הגדרות מערכת"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"התראות"</string>
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"מסך נעילה."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"הגדרות"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"סקירה."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"אשר"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"משתמש <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi כבוי."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"הסט למעלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"הסט שמאלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ללא הפרעות. גם לא התראות."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"צלילים ורטט לא יפריעו לך, פרט להתראות, תזכורות, אירועים ומתקשרים שתציין."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"התאם אישית"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"ללא הפרעות"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"רק הפרעות בעדיפות גבוהה"</string>
<string name="zen_alarms" msgid="5055668280767657759">"התראות בלבד"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"האם ברצונך להמשיך בפעילות באתר?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"התחל מחדש"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"כן, המשך"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"משתמש אורח"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"הסר אורח כדי למחוק אפליקציות ונתונים"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"הסר אורח"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"האם להוסיף משתמש חדש?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את השטח שלו.\n\nכל משתמש יכול לעדכן אפליקציות עבור כל המשתמשים האחרים."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"תכונת \'חיסכון בסוללה\' פועלת"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"דחה"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> הוא תיבת הדו-שיח של עוצמת הקול"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"גע כדי לשחזר את עוצמת הקול המקורית."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"אתה נמצא בפרופיל העבודה"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index e01fe53..5a73635 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIMがありません。"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetoothテザリング。"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"機内モード。"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ロック画面"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"最近"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"確認"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ユーザー: <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-FiをOFFにしました。"</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"上にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
<string name="description_direction_left" msgid="7207478719805562165">"左にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"サイレント(アラームも鳴りません)"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"アラーム、リマインダー、予定、指定した人からの着信以外で音やバイブレーションに煩わされることはありません。"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"カスタマイズ"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"サイレント"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"重要な通知のみ"</string>
<string name="zen_alarms" msgid="5055668280767657759">"アラームのみ"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"セッションを続行しますか?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"最初から開始"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"続行"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"ゲストユーザー"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"アプリとデータを削除するにはゲストを削除します"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ゲストを削除"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"新しいユーザーを追加しますか?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。\n\nすべてのユーザーは他のユーザーに代わってアプリを更新できます。"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"バッテリーセーバーがON"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"許可しない"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>を音量ダイアログとして使用"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"タップすると元の音量ダイアログが復元されます。"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"仕事用プロファイルを使用しています"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
index a41c9f5..3561311 100644
--- a/packages/SystemUI/res/values-ka-rGE/strings.xml
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -146,6 +146,7 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM არ არის."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ის ჩართვა"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"თვითმფრინავის რეჟიმი"</string>
+ <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"ოპერატორის ქსელის შეცვლა"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"ბატარეა: <xliff:g id="NUMBER">%d</xliff:g> პროცენტი."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"სისტემის პარამეტრები."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"შეტყობინებები"</string>
@@ -167,8 +168,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ეკრანის დაბლოკვა."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"პარამეტრები"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"მიმოხილვა"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"დადასტურება"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"მომხმარებელი: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi გამორთულია."</string>
@@ -303,10 +303,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"გაასრიალეთ ზემოთ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
<string name="description_direction_left" msgid="7207478719805562165">"გაასრიალეთ მარცხნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"წყვეტების გარეშე. მაღვიძარების შემთხვევაშიც კი."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"თქვენ მიერ მითითებული მაღვიძარების, შეხსენებების, ღონისძიებებისა და ზარების გარდა, არავითარი ხმა და ვიბრაცია არ შეგაწუხებთ."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"მორგება"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"შეწყვეტების გარეშე"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"მხოლოდ პრიორიტეტული შეწყვეტები"</string>
<string name="zen_alarms" msgid="5055668280767657759">"მხოლოდ გაფრთხილებები"</string>
@@ -342,12 +340,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"გსურთ, თქვენი სესიის გაგრძელება?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ხელახლა დაწყება"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"დიახ, გავაგრძელოთ"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"სტუმარი მომხმარებელი"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"აპებისა და მონაცემების წასაშლელად, ამოშალეთ სტუმარი"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"სტუმრის ამოშლა"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"დაემატოს ახალი მომხმარებელი?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს.\n\nნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ბატარეის დამზოგი ჩართულია"</string>
@@ -399,7 +394,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"უარყოფა"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ხმოვან დიალოგშია"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"ორიგინალის აღდგენისათვის, შეეხეთ."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"თქვენ სამუშაო პროფილში ხართ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index 0beea99..dd63d1a 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM жоқ."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth тетеринг."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Ұшақ режимі."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Батарея <xliff:g id="NUMBER">%d</xliff:g> пайыз."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Жүйе параметрлері."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Хабарлар."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Бекіту экраны."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Параметрлер"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Шолу."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Растау"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Пайдаланушы <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi өшірілді."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін жоғары сырғыту."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін солға сырғыту."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Үзілулер болмайды. Тіпті дабылдар да."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Дабылдар, еске салғыштар, оқиғалар мен өзіңіз көрсеткен контактілердің қоңырауларынан басқа дыбыстар мен дірілдер мазаламайтын болады."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Реттеу"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Үзулерсіз"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Тек басым үзулер"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Тек дабылдар"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Сеансты жалғастыру керек пе?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Қайта бастау"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Иә, жалғастыру"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Қонақ пайдаланушы"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Қолданбалар мен деректерді жою үшін қонақты кетіру"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ҚОНАҚТЫ КЕТІРУ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Жаңа пайд-ны қосу керек пе?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Жаңа пайдаланушыны қосқанда сол адам өз кеңістігін реттеуі керек.\n\nКез келген пайдаланушы барлық басқа пайдаланушылар үшін қолданбаларды жаңарта алады."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батарея үнемдегіш қосулы"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Өшіру"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> — көлем диалогтық терезесі"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Түпнұсқаны қалпына келтіру үшін түртіңіз."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Жұмыс профиліндесіз"</string>
</resources>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index ba84a54..f80b164 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"គ្មានស៊ីមកាត។"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ការភ្ជាប់ប៊្លូធូស។"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"របៀបពេលជិះយន្តហោះ"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"ថ្ម <xliff:g id="NUMBER">%d</xliff:g> ភាគរយ។"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"ការកំណត់ប្រព័ន្ធ។"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"ការជូនដំណឹង។"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ចាក់សោអេក្រង់។"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ការកំណត់"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ទិដ្ឋភាព។"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"បញ្ជាក់"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"អ្នកប្រើ <xliff:g id="USER">%s</xliff:g> ។"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"បានបិទវ៉ាយហ្វាយ។"</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
<string name="description_direction_left" msgid="7207478719805562165">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"គ្មានការផ្អាក។ គ្មានការជូនដំណឹងពីព្រឹត្តិការណ៍។"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"អ្នកនឹងមិនរំខានដោយសម្លេង និងរំញ័រឡើយ លើកលែងតែសម្លេងរោទិ៍ ការរំលឹក ព្រឹត្តិការណ៍ និងអ្នកហៅដែលអ្នកបញ្ជាក់។"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"ប្ដូរតាមបំណង"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"គ្មានការផ្អាក"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"តែការផ្អាកអាទិភាពប៉ុណ្ណោះ"</string>
<string name="zen_alarms" msgid="5055668280767657759">"សំឡេងរោទ៍ប៉ុណ្ណោះ"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"តើអ្នកចង់បន្តសម័យរបស់អ្នក?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ចាប់ផ្ដើម"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"បាទ/ចាស បន្ត"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"អ្នកប្រើភ្ញៀវ"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"យកភ្ញៀវចេញដើម្បីលុបកម្មវិធី និងទិន្នន័យ"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"យកភ្ញៀវចេញ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"បន្ថែមអ្នកប្រើថ្មី?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ពេលអ្នកបន្ថែមអ្នកប្រើថ្មី អ្នកប្រើនោះត្រូវកំណត់ទំហំផ្ទាល់របស់គេ។\n\nអ្នកប្រើណាមួយក៏អាចធ្វើបច្ចុប្បន្នភាពកម្មវិធីសម្រាប់អ្នកប្រើផ្សេងបានដែរ។"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"កម្មវិធីសន្សំថ្មគឺបើក"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"បដិសេធ"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> គឺជាប្រអប់សម្លេង"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"ប៉ះដើម្បីស្តារច្បាប់ដើម។"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"អ្នកកំពុងនៅក្នុងប្រវត្តិរូបការងារ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index 76b5707..49741e8 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"ಯಾವುದೇ ಸಿಮ್ ಇಲ್ಲ."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ಬ್ಲೂಟೂತ್ ಟೆಥರಿಂಗ್."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ಏರೋಪ್ಲೇನ್ ಮೋಡ್"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"ಬ್ಯಾಟರಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರತಿಶತ."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್ಗಳು."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"ಅಧಿಸೂಚನೆಗಳು."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ಲಾಕ್ ಪರದೆ."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ಸಮಗ್ರ ನೋಟ."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"ದೃಢೀಕರಿಸು"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ಬಳಕೆದಾರ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ವೈಫೈ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಮೇಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ಅಲಾರಂಗಳನ್ನು ಸೇರಿದಂತೆ ಯಾವುದೇ ಅಡಚಣೆಗಳಿಲ್ಲ."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"ಅಲಾರಮ್ಗಳು, ಜ್ಞಾಪನೆಗಳು, ಈವೆಂಟ್ಗಳು ಮತ್ತು ನೀವು ಸೂಚಿಸುವ ಕರೆದಾರರನ್ನು ಹೊರತುಪಡಿಸಿ, ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳಿಂದ ನಿಮಗೆ ತೊಂದರೆ ಆಗುವುದಿಲ್ಲ."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"ಕಸ್ಟಮೈಸ್ ಮಾಡು"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"ಯಾವುದೇ ಅಡಚಣೆಗಳಿಲ್ಲ"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"ಆದ್ಯತೆಯ ಅಡಚಣೆಗಳು ಮಾತ್ರ"</string>
<string name="zen_alarms" msgid="5055668280767657759">"ಅಲಾರಮ್ಗಳು ಮಾತ್ರ"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"ನಿಮ್ಮ ಸೆಷನ್ ಮುಂದುವರಿಸಲು ಇಚ್ಚಿಸುವಿರಾ?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ಹೌದು, ಮುಂದುವರಿ"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"ಅತಿಥಿ ಬಳಕೆದಾರ"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲು ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನವೀಕರಿಸಬಹುದು."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ಬ್ಯಾಟರಿ ರಕ್ಷಕ ಆನ್ ಆಗಿದೆ"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"ನಿರಾಕರಿಸು"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ವಾಲ್ಯೂಮ್ ಸಂವಾದವಾಗಿದೆ"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"ಮೂಲ ಮರುಸ್ಥಾಪಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"ನೀವು ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನಲ್ಲಿರುವಿರಿ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 32f751f..37d563b 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM이 없습니다."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"블루투스 테더링입니다."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"비행기 모드입니다."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"배터리 <xliff:g id="NUMBER">%d</xliff:g>퍼센트"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"시스템 설정"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"알림"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"화면을 잠급니다."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"설정"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"최근 사용"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"확인"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"사용자 <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi가 사용 중지되었습니다."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 위로 슬라이드"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 왼쪽으로 슬라이드"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"어떤 방해도 받지 않습니다. 알람도 울리지 않습니다."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"지정한 알람, 알림, 이벤트, 발신자를 제외하고 소리와 진동을 끕니다."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"맞춤설정"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"모든 알림 차단"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"최우선 알림만 수신"</string>
<string name="zen_alarms" msgid="5055668280767657759">"알람만 수신"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"세션을 계속 진행하시겠습니까?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"다시 시작"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"예, 계속합니다."</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"게스트 사용자"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"게스트를 삭제하여 앱 및 데이터 삭제"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"게스트 삭제"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"새 사용자를 추가할까요?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"배터리 세이버 사용 중"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"거부"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>은(는) 볼륨 대화입니다."</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"원본을 복원하려면 터치하세요."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"현재 직장 프로필에 있음"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index 8e2defd..ea8547d 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -171,6 +171,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM карта жок."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth аркылуу интернет бөлүшүү."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Учак тартиби."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Батарея <xliff:g id="NUMBER">%d</xliff:g> пайыз."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Система тууралоолору."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Эскертмелер."</string>
@@ -192,8 +194,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Кулпуланган экран."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Жөндөөлөр"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Көз жүгүртүү."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Ырастоо"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Колдонуучу <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi өчүрүлдү."</string>
@@ -328,10 +329,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн жогору жылмыштырыңыз."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн солго жылмыштырыңыз."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Үзгүлтүктөр жок. Ойготкучтар дагы жок."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Ойготкучтар, эстеткичтер, окуялар жана сиз көрсөткөн чалуучулардан башка үндөр менен титирөөлөр тынчыңызды албайт."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Ыңгайлаштыруу"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Үзгүлтүксүз"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Артыкчылыктуу үзгүлтүктөр гана"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Ойготкучтар гана"</string>
@@ -367,12 +366,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Сеансыңызды улантасызбы?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Кайра баштоо"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ооба, уланта берели"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Конок колдонуучу"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Колдонмолор жана дайындарды жок кылуу үчүн конокту алып сал"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"КОНОКТУ АЛЫП САЛУУ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Жаңы колдонуучу кошосузбу?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Жаңы колдонуучу кошулганда, ал өз мейкиндигин түзүп алышы керек.\n\nКолдонмолорду бир колдонуучу жаңыртканда, ал калган бардык колдонуучулар үчүн да жаңырат."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батареяны үнөмдөгүч күйгүзүлдү"</string>
@@ -424,7 +420,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Жок"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> үндү катуулатуу диалогу"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Түпнусканы калыбына келтирүү үчүн тийип коюңуз."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Сиз Жумуш профилиндесиз"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index d7bb83b..f018e08 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -146,6 +146,7 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"ບໍ່ມີຊິມ."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ການປ່ອຍສັນຍານ Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ໂໝດໃນຍົນ."</string>
+ <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"ການປ່ຽນແປງເຄືອຂ່າຍບໍລິສັດເຄືອຂ່າຍມືຖື."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"ແບັດເຕີຣີ <xliff:g id="NUMBER">%d</xliff:g> ເປີເຊັນ."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"ການຕັ້ງຄ່າລະບົບ."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"ການແຈ້ງເຕືອນ."</string>
@@ -167,8 +168,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ລັອກໜ້າຈໍ."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ການຕັ້ງຄ່າ"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ພາບຮວມ."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"ຢືນຢັນ"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ຜູ່ໃຊ້ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ປິດ Wi-Fi ແລ້ວ."</string>
@@ -303,10 +303,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"ເລື່ອນໄປທາງຊ້າຍເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ບໍ່ມີການລົບກວນ. ບໍ່ວ່າຈະເປັນໂມງປຸກກໍຕາມ."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"ທ່ານຈະບໍ່ຖືກລົບກວນຈາກສຽງ ແລະການສັ່ນ, ຍົກເວັ້ນຈາກໂມງປຸກ, ການເຕືອນ, ເຫດການ, ແລະຜູ້ໂທທີ່ທ່ານລະບຸ."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"ປັບແຕ່ງ"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"ບໍ່ມີການລົບກວນ"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"ສະເພາະເລື່ອງສຳຄັນເທົ່ານັນ"</string>
<string name="zen_alarms" msgid="5055668280767657759">"ໂມງປຸກເທົ່ານັ້ນ"</string>
@@ -342,12 +340,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"ທ່ານຕ້ອງການສືບຕໍ່ເຊດຊັນຂອງທ່ານບໍ່?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ເລີ່ມຕົ້ນໃຫມ່"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ຕົກລົງ, ດຳເນີນການຕໍ່"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"ຜູ້ໃຊ້ແຂກ"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"ເອົາແຂກອອກ ເພື່ອລຶບແອັບ ແລະຂໍ້ມູນ"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ເອົາແຂກອອກ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ເພີ່ມຜູ່ໃຊ້ໃໝ່ບໍ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ເມື່ອທ່ານເພີ່ມຜູ່ໃຊ້ໃໝ່, ຜູ່ໃຊ້ນັ້ນຈະຕ້ອງຕັ້ງຄ່າພື້ນທີ່ບ່ອນຈັດເກັບຂໍ້ມູນຂອງລາວ.\n\nຜູ່ໃຊ້ທຸກຄົນສາມາດອັບເດດແອັບຯຂອງຜູ່ໃຊ້ຄົນອື່ນທັງໝົດໄດ້."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ເປີດໃຊ້ໂຕປະຢັດແບັດເຕີຣີແລ້ວ"</string>
@@ -399,7 +394,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"ປະຕິເສດ"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ແມ່ນໜ້າຕ່າງລະດັບສຽງ"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"ສໍາຜັດເພື່ອກູ້ຄືນຕົ້ນສະບັບ."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"ທ່ານຢູ່ໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 2ac4636..234e178 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -148,6 +148,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Nėra SIM kortelės."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"„Bluetooth“ įrenginio kaip modemo naudojimas."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Lėktuvo režimas."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Akumuliatorius: <xliff:g id="NUMBER">%d</xliff:g> proc."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Sistemos nustatymai"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Pranešimai."</string>
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Užrakinimo ekranas."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Nustatymai"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Apžvalga."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Patvirtinti"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Naudotojas <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"„Wi-Fi“ ryšys išjungtas."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Slyskite aukštyn link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Slyskite į kairę link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Nėra trikdžių. Nėra net įspėjimų."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Jūsų netrikdys garsai ir vibravimas, išskyrus nurodytų signalų, priminimų, įvykių ir skambintojų garsus."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tinkinti"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Jokių pertraukčių"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Tik prioritetinės pertrauktys"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Tik signalai"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Ar norite tęsti sesiją?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Pradėti iš naujo"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Taip, tęsti"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Naudotojas svečias"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Pašalinkite svečią, kad ištrintumėte programas ir duomenis"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"PAŠALINTI SVEČIĄ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Pridėti naują naudotoją?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo erdvę.\n\nBet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akumuliatoriaus tausojimo priemonė įjungta"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Atmesti"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ yra garsumo valdymo dialogo langas"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Palieskite, kad atkurtumėte originalą."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Naudojate „Work“ profilį"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index a184664..498b3e4 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -147,6 +147,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Nav SIM kartes."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth piesaiste."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Lidmašīnas režīms."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Akumulators: <xliff:g id="NUMBER">%d</xliff:g> procenti"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Sistēmas iestatījumi"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Paziņojumi"</string>
@@ -168,8 +170,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Bloķēšanas ekrāns."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Iestatījumi"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pārskats."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Apstiprināt"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Lietotājs: <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi ir izslēgts."</string>
@@ -304,10 +305,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Velciet uz augšu, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Velciet pa kreisi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Bez traucējumiem. Pat bez brīdinājumiem"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Jūs netraucēs skaņas un vibrosignāli, ja vien tie nebūs modinātāji, atgādinājumi, pasākumi vai konkrēti zvanītāji, kurus būsiet norādījis."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Pielāgot"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Nepārtraukt"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Tikai prioritārie pārtraukumi"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Tikai signāli"</string>
@@ -343,12 +342,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Vai vēlaties turpināt savu sesiju?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Sākt no sākuma"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Jā, turpināt"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Vieslietotājs"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Lai dzēstu lietotnes un datus, noņemiet viesi."</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"NOŅEMT VIESI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vai pievienot jaunu lietotāju?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kad pievienosiet jaunu lietotāju, viņam būs jāizveido savs profils.\n\nIkviens lietotājs var atjaunināt lietotnes citu lietotāju vietā."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ieslēgts akumulatora enerģijas taupīšanas režīms"</string>
@@ -400,7 +396,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Neatļaut"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ir skaļuma dialoglodziņš"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Pieskarieties, lai atjaunotu sākotnējo."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Jūs esat pierakstījies darba profilā."</string>
</resources>
diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml
index e288451..9dafeab 100644
--- a/packages/SystemUI/res/values-mk-rMK/strings.xml
+++ b/packages/SystemUI/res/values-mk-rMK/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Нема СИМ картичка."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Се поврзува со Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Режим на работа во авион."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заклучи екран."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Поставки"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Краток преглед."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Потврди"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Корисник <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi е исклученo."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Лизгај нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Лизгај налево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Без прекини. Дури и без аларми."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Нема да ви пречат звуци и вибрации, освен од аларми, потсетници, настани и повикувачи што ќе ги наведете."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Приспособи"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Без прекини"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Само приоритетни прекини"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Само аларми"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Дали сакате да продолжите со сесијата?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Почни одново"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Да, продолжи"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Корисник-гостин"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Отстрани гостин за да се избришат апликации и податоци"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ОТСТРАНИ ГОСТИН"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Да се додаде нов корисник?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Кога додавате нов корисник, тоа лице треба да го постави својот простор.\n\nСекој корисник може да ажурира апликации за сите други корисници."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Штедачот на батерија е вклучен"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Одбиј"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> е дијалог за јачина на звук"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Допрете за да го вратите оригиналот."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Вие сте во работен профил"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index 3bc27a1..87f0e12 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"സിം ഇല്ല."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ബ്ലൂടൂത്ത് ടെതറിംഗ്."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ഫ്ലൈറ്റ് മോഡ്."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"ബാറ്ററി <xliff:g id="NUMBER">%d</xliff:g> ശതമാനം."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"സിസ്റ്റം ക്രമീകരണങ്ങൾ."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"അറിയിപ്പുകൾ."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ലോക്ക് സ്ക്രീൻ."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ക്രമീകരണങ്ങൾ"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"കാഴ്ച."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"സ്ഥിരീകരിക്കുക"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ഉപയോക്താവ് <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"വൈഫൈ ഓഫാക്കി."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി മുകളിലേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി ഇടത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"തടസ്സങ്ങളൊന്നുമില്ല. അലാറങ്ങൾ പോലുമില്ല."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"നിങ്ങൾ വ്യക്തമാക്കിയിട്ടുള്ള അലാറങ്ങൾ, ഓർമ്മപ്പെടുത്തലുകൾ, ഇവന്റുകൾ, കോളർമാർ എന്നിവ ഒഴികെയുള്ള ശബ്ദങ്ങളോ വൈബ്രേഷനുകളോ കാരണം നിങ്ങൾക്ക് ശല്യമുണ്ടാകില്ല."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"ഇഷ്ടാനുസൃതമാക്കുക"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"തടസ്സങ്ങളൊന്നുമില്ല"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"മുൻഗണനാ തടസ്സങ്ങൾ മാത്രം"</string>
<string name="zen_alarms" msgid="5055668280767657759">"അലാറങ്ങൾ മാത്രം"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"നിങ്ങളുടെ സെഷൻ തുടരണോ?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"പുനരാംരംഭിക്കുക"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"അതെ, തുടരുക"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"അതിഥി ഉപയോക്താവ്"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"അപ്ലിക്കേഷനുകളും വിവരവും ഇല്ലാതാക്കാൻ അതിഥിയെ നീക്കംചെയ്യുക"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"അതിഥിയെ നീക്കംചെയ്യുക"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"നിങ്ങൾ ഒരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിയ്ക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും അപ്ലിക്കേഷനുകൾ അപ്ഡേറ്റുചെയ്യാനാവും."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ബാറ്ററി സേവർ ഓണാണ്"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"നിരസിക്കുക"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>, വോളിയം ഡയലോഗാണ്"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"ആദ്യത്തേത് പുനഃസ്ഥാപിക്കാൻ സ്പർശിക്കുക."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"നിങ്ങൾ ഔദ്യോഗിക പ്രൊഫൈലിൽ ആണ്"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml
index 367de5d..8f3bcf6 100644
--- a/packages/SystemUI/res/values-mn-rMN/strings.xml
+++ b/packages/SystemUI/res/values-mn-rMN/strings.xml
@@ -144,6 +144,7 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM байхгүй."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Блютүүт модем болж байна."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Нислэгийн горим"</string>
+ <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Дамжуулагч сүлжээг өөрчилж байна."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Батерей <xliff:g id="NUMBER">%d</xliff:g> хувьтай."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Системийн тохиргоо."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Мэдэгдэл."</string>
@@ -165,8 +166,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Дэлгэц түгжих."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Тохиргоо"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Тойм"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Баталгаажуулах"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Хэрэглэгч <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi унтраасан."</string>
@@ -301,10 +301,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г гулсуулах."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулсуулах."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Тасалдал байхгүй. Сэрүүлэг ч байхгүй."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Танд сэрүүлгэ, сануулга, үйл явдлын сануулга, таны сануулсан дуудлага зэргээс бусад дуу чимээ, чичиргээ танд садаа болохгүй."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Тохируулах"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Ямар ч тасалдалгүй"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Зөвхөн нэн тэргүүний тасалдалд"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Зөвхөн сэрүүлэг"</string>
@@ -340,12 +338,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Та үргэлжлүүлэхийг хүсэж байна уу?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Дахин эхлүүлэх"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Тийм, үргэлжлүүлэх"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Зочин хэрэглэгч"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Апп ба өгөгдлийг устгахын тулд зочныг гаргах"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ЗОЧНЫГ ГАРГАХ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Шинэ хэрэглэгч нэмэх үү?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Та шинэ хэрэглэгч нэмбэл, тухайн хүн өөрийн профайлыг тохируулах шаардлагатай.\n\nАль ч хэрэглэгч бүх хэрэглэгчийн апп-уудыг шинэчлэх боломжтой."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батерей хэмнэгч асаалттай"</string>
@@ -397,7 +392,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Татгалзах"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь дууны диалог юм."</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Анхны хувилбарыг эргүүлэн хадгалахыг хүсвэл хүрнэ үү."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Та Work профайлд байна"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index eb8c6ad..2f4c28f 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"सिम नाही."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब टिथरिंग."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"विमान मोड."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"बॅटरी <xliff:g id="NUMBER">%d</xliff:g> टक्के."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"सिस्टम सेटिंग्ज."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचना."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"लॉक स्क्रीन."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिंग्ज"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"विहंगावलोकन."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"पुष्टीकरण करा"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"वापरकर्ता <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi बंद झाले."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी वर स्लाइड करा."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी डावीकडे स्लाइड करा."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"कोणतेही व्यत्यय नाहीत. अगदी अलार्मचे देखील नाहीत."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"आपण निर्दिष्ट करता ते अलार्म, स्मरणपत्रे, इव्हेंट आणि कॉलर व्यतिरिक्त आपल्याला आवाज आणि कंपनांमुळे व्यत्यय येणार नाही."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"सानुकूलित करा"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"कोणतेही व्यत्यय नाही"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"केवळ प्राधान्य दिलेले व्यत्यय"</string>
<string name="zen_alarms" msgid="5055668280767657759">"केवळ अलार्म"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"आपण आपले सत्र सुरु ठेवू इच्छिता?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"येथून प्रारंभ करा"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"होय, सुरु ठेवा"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"अतिथी वापरकर्ता"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"अॅप्स आणि डेटा हटविण्यासाठी अतिथी काढा"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"अतिथी काढा"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"नवीन वापरकर्ता जोडायचा?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"आपण एक नवीन वापरकर्ता जोडता तेव्हा, त्या व्यक्तीने त्यांचे स्थान सेट करणे आवश्यक असते.\n\nकोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अॅप्स अद्यतनित करू शकतो."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"बॅटरी बचतकर्ता चालू आहे"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"नकार द्या"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> हा व्हॉल्यूम संवाद आहे"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"मूळ पुनर्संचयित करण्यासाठी स्पर्श करा."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"आपण कार्य प्रोफाईल मध्ये आहात"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index 1b1fded..8d7437c 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Tiada SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Penambatan Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mod pesawat"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Bateri <xliff:g id="NUMBER">%d</xliff:g> peratus."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Tetapan sistem."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Pemberitahuan."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kunci skrin."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Tetapan"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikhtisar."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Sahkan"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi dimatikan."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Luncurkan ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Luncurkan ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Tiada gangguan, walau penggera sekalipun."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Anda tidak akan diganggu oleh bunyi dan getaran kecuali daripada penggera, peringatan, acara dan pemanggil yang anda tentukan."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Peribadikan"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Tiada gangguan"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Gangguan keutamaan sahaja"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Penggera sahaja"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Adakah anda ingin meneruskan sesi anda?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Mulakan semula"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ya, teruskan"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Pengguna tetamu"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Alih keluar tetamu untuk memadamkan apl dan data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ALIH KELUAR TETAMU"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Tambah pengguna baharu?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Apabila anda menambah pengguna baharu, orang itu perlu menyediakan ruang mereka.\n\nMana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Penjimat bateri dihidupkan"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tolak"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ialah dialog kelantangan"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Sentuh untuk memulihkan yang asal."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:rentetan/nama_ciri_mod_zen"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Anda berada dalam profil Kerja"</string>
</resources>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index 52c4298..b45a8a3 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"ဆင်းကဒ်မရှိပါ။"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်။"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"ဘတ္တရီ <xliff:g id="NUMBER">%d</xliff:g> ရာခိုင်နှုန်း။"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"စနစ်အပြင်အဆင်များ"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"အကြောင်းကြားချက်များ။"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"မျက်နှာပြင် သော့ပိတ်ရန်"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ဆက်တင်များ"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ခြုံကြည့်မှု။"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"အတည်ပြုရန်"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"သုံးစွဲသူ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>။"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ကြိုးမဲ့ ပိတ်ထား။"</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အပေါ်ကို ပွတ်ဆွဲပါ"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဖယ်ဘက်ကို ပွတ်ဆွဲပါ"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ကြားဖြတ်ဝင်မှုများ မရှိခဲ့။ နှိုးစက်ပင် မရှိခဲ့။"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"နှိုးစက်များ၊ အသိပေးချက်များ၊ ဖြစ်ရပ်များ၊ နှင့်သင်သတ်မှတ်ထားသည့် ခေါ်ဆိုသူများမှ လွဲ၍ အသံများနှင့် တုန်ခါမှုများသင့်ကို နှောက်ယှက်တော့မည် မဟုတ်ပါ။"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"စိတ်ကြိုက် ပြုလုပ်ရန်"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"ကြားဖြတ်ဝင်မှု ခွင့်မပြုရန်"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"ဦးစားပေး ကြားဖြတ်ဝင်မှုများ သာလျှင်"</string>
<string name="zen_alarms" msgid="5055668280767657759">"နှိုးစက်များသာ"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"သင်သည် သင်၏ ချိတ်ဆက်မှုကို ဆက်ပြုလုပ် လိုပါသလား?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"အစမှ ပြန်စပါ"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ဟုတ်ကဲ့၊ ဆက်လုပ်ပါ"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"ဧည့်သည် အသုံးပြုသူ"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"အပ်များနှင့် ဒေတာများဖျက်ရန် ဧည့်သည်များကို ဖယ်ရှားမည်"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ဧည့်သည်ကို ဖယ်ထုတ်မည်"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"အသုံးပြုသူ အသစ်ကို ထည့်ရမလား?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"သင်က အသုံးပြုသူ အသစ် တစ်ဦးကို ထည့်ပေးလိုက်လျှင်၊ ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရန် လိုအပ်မည်။\n\n အသုံးပြုသူ မည်သူမဆို ကျန်အသုံးပြုသူ အားလုံးတို့အတွက် appများကို မွမ်းမံပေးနိုင်သည်။"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"ငြင်းပယ်သည်"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် အသံဒိုင်ယာလော့ခ်ဖြစ်သည်"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"မူရင်းအားပြန်လည်သိမ်းဆည်းရန် ထိပါ။"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"သင်သည် အလုပ်ပရိုဖိုင်တွင် ဖြစ်သည်"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 2168f14..9dea7e1 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Uten SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-deling."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flymodus."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Batteri – <xliff:g id="NUMBER">%d</xliff:g> prosent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Systeminnstillinger."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Varsler."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låseskjerm."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Innstillinger"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oversikt."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bekreft"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Bruker: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi er slått av."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Dra opp for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Dra til venstre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Ingen forstyrrelser, ikke engang alarmer."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Du blir ikke forstyrret av lyder og vibrasjoner, bortsett fra alarmer, påminnelser, aktiviteter og oppringere du angir."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tilpass"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Ingen forstyrrelser"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Bare prioriterte forstyrrelser"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Bare alarmer"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Vil du fortsette økten?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start på nytt"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, fortsett"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gjestebruker"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Fjern gjesten for å slette appene og dataene"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"FJERN GJEST"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vil du legge til en ny bruker?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område.\n\nAlle brukere kan oppdatere apper for alle andre brukere."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparing er på"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ikke tillat"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er volumdialogen"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Trykk for å gå tilbake til den opprinnelige volumdialogen."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Du er i Work-profilen"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index 11e19e7..7bae414 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM छैन।"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब्लुटुथ टेदर गर्दै।"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"हवाइजहाज मोड।"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"ब्याट्रि <xliff:g id="NUMBER">%d</xliff:g> प्रतिशत"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"प्रणाली सेटिङहरू"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचनाहरू।"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"स्क्रीन बन्द गर्नुहोस्।"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिङहरू"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"सारांश।"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"निश्चित गर्नुहोस्"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"प्रयोगकर्ता <xliff:g id="USER">%s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"वाइफाइ बन्द गरियो।"</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसार्नुहोस्"</string>
<string name="description_direction_left" msgid="7207478719805562165">"स्लाइड <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाँ।"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"कुनै रुकावट छैन। चेतावनी समेत छैन।"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"अलार्म, अनुस्मारक, घटनाहरु, र तपाईँले निर्दिष्ट कल देखि बाहेक, आवाज र कंपनले तपाईँ व्याकुल हुनुहुने छैन।"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"अनुकूलन गर्नुहोस्"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"कुनै रुकावटहरू छैन"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"प्राथमिकता रुकावटहरूमा मात्र"</string>
<string name="zen_alarms" msgid="5055668280767657759">"अलार्महरू मात्र"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"तपाईँ आफ्नो सत्र जारी गर्न चाहनुहुन्छ?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"सुरु गर्नुहोस्"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"हो, जारी राख्नुहोस्"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"अतिथि प्रयोगकर्ता"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"अनुप्रयोगहरू र डेटा मेटाउन अतिथिलाई निकाल्नु"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"नयाँ प्रयोगकर्ता थप्नुहुन्छ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ब्याट्रि सेभर चालु छ"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"अस्वीकार गर्नुहोस्"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> भोल्यूम संवाद हो"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"मूल पुनर्स्थापना गर्न छुनुहोस्।"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*Android: स्ट्रिङ/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"तपाईँ कार्य प्रोफाइलमा हुनुहुन्छ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 06ed986..d1e067f 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Geen simkaart."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-tethering."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Vliegtuigmodus."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Accu: <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Systeeminstellingen."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Meldingen."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Vergrendelingsscherm."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Instellingen"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overzicht."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bevestigen"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Gebruiker: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi uitgeschakeld."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Veeg omhoog voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Veeg naar links voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Geen onderbrekingen. Zelfs geen alarm."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"U wordt niet gestoord door geluiden en trillingen, behalve voor alarmen, herinneringen, afspraken en bellers die u specificeert."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Aanpassen"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Geen onderbrekingen"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Alleen prioriteitsonderbrekingen"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Alleen alarmen"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Wilt u doorgaan met uw sessie?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Opnieuw starten"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, doorgaan"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gastgebruiker"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Verwijder de gast om apps en gegevens te wissen"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"GAST VERWIJDEREN"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Nieuwe gebruiker toevoegen?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Wanneer u een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen.\n\n1Elke gebruiker kan apps updaten voor alle andere gebruikers."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Accubesparing is ingeschakeld"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Afwijzen"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is het volumedialoogvenster"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Tik hierop om het origineel te herstellen."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"U bevindt zich in het werkprofiel"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index ffeff1e..da38dc4 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -148,6 +148,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Brak karty SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Powiązanie Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Tryb samolotowy."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Bateria: <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Ustawienia systemu."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Powiadomienia."</string>
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ekran blokady."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Ustawienia"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Przegląd."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potwierdź"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Użytkownik: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi wyłączone."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Przesuń w górę: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Przesuń w lewo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Żadnych powiadomień. Nawet alarmów."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Urządzenie nie będzie odtwarzać dźwięków ani włączać wibracji, z wyjątkiem wybranych przez Ciebie alarmów, przypomnień, wydarzeń i kontaktów."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Dostosuj"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Bez przerw"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Tylko dźwięki priorytetowe"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Tylko alarmy"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Chcesz kontynuować sesję?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Rozpocznij nową"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Tak, kontynuuj"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gość"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Usuń gościa, by usunąć aplikacje i dane"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"USUŃ GOŚCIA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Dodać nowego użytkownika?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil.\n\nKażdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Oszczędzanie baterii jest włączone"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmów"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> steruje głośnością"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Dotknij, by przywrócić pierwotną."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Korzystasz z profilu do pracy"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 23413be..f5c444d 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Sem SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Ligação Bluetooth via telemóvel."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo de avião"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Bateria a <xliff:g id="NUMBER">%d</xliff:g> por cento."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Definições do sistema"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificações."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ecrã de bloqueio."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Definições"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visão geral."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilizador <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desligado."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Deslize para cima para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Deslize para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sem interrupções. Nem mesmo alarmes."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Não é incomodado por sons e vibrações, exceto de alarmes, lembretes, eventos e autores de chamadas que especificar."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Sem interrupções"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Apenas interrupções com prioridade"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Apenas alarmes"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Pretende continuar a sessão?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Recomeçar"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sim, continuar"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Utilizador convidado"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Remover convidado para eliminar aplicações e dados"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVER CONVIDADO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Adicionar um novo utilizador?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço.\n\nQualquer utilizador pode atualizar aplicações para todos os outros utilizadores."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"A poupança de bateria está ligada"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Recusar"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo do volume"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Está no Perfil de trabalho"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index caf85cc..536c608 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Sem SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avião."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Tela de bloqueio."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Configurações"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visão geral."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuário <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"O Wi-Fi foi desativado."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sem interrupções. Nem mesmo alarmes."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Você não será perturbado por sons e vibrações, com exceção de alarmes, lembretes, eventos e autores de chamadas que você especificar."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Sem interrupções"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Apenas interrupções prioritárias"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Somente alarmes"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Deseja continuar a sessão?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Recomeçar"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sim, continuar"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Usuário convidado"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Remover convidado para excluir apps e dados"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVER CONVIDADO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Adicionar novo usuário?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Quando você adiciona um novo usuário, essa pessoa precisa configurar o próprio espaço.\n\nQualquer usuário pode atualizar apps para os demais usuários."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"A Economia de bateria está ativada"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Negar"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo referente ao volume"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Você está no Perfil de trabalho"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 509ae92..62bfd5a 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -147,6 +147,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Niciun card SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Conectarea ca modem prin Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mod Avion."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Baterie: <xliff:g id="NUMBER">%d</xliff:g> procente."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Setări de sistem."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificări."</string>
@@ -168,8 +170,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ecranul de blocare."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Setări"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Vizualizare generală"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmați"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilizatorul <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Conexiunea prin Wi-Fi este dezactivată."</string>
@@ -304,10 +305,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Glisaţi în sus pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Glisaţi spre stânga pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Fără întreruperi. Nici măcar alarme."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Nu veți fi deranjat(ă) de sunete și vibrații, exceptând alarmele, mementourile, evenimentele și apelanții pe care îi menționați."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizați"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Fără întreruperi"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Numai întreruperi cu prioritate"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Numai alarme"</string>
@@ -343,12 +342,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Vreți să continuați sesiunea?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Începeți din nou"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Da, continuați"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Utilizator oaspete"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Eliminați oaspetele pentru a șterge aplicațiile și datele"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ELIMINAȚI OASPETELE"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Adăugați utilizator nou?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul.\n\nOrice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Economisirea bateriei este activată"</string>
@@ -400,7 +396,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuzați"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> afișează caseta de dialog pentru volum"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Atingeți pentru a reveni la setarea inițială."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Vă aflați în profilul de serviciu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 1c584fe..b26db33 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -148,6 +148,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM-карта отсутствует."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-модем"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Режим полета."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -171,8 +173,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заблокированный экран."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Настройки"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Обзор."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Подтвердить"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Пользователь <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Модуль Wi-Fi отключен."</string>
@@ -307,10 +308,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Проведите вверх, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Проведите влево, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Никаких оповещений, даже от будильника."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Вибрация и звуки будут отключены. Вас могут побеспокоить только сигналы будильника, напоминания, уведомления о мероприятиях и звонки от выбранных абонентов."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Настроить"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Не беспокоить"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Только важные оповещения"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Только будильник"</string>
@@ -346,12 +345,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Продолжить сеанс?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Начать заново"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Да, продолжить"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Пользователь \"Гость\""</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Удалите аккаунт гостя, чтобы стереть все приложения и данные."</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"УДАЛИТЬ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Добавить пользователя?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"После создания профиля его необходимо настроить.\n\nОбновлять приложения для всех аккаунтов может любой пользователь устройства."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Включен режим энергосбережения"</string>
@@ -403,7 +399,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Нет"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> назначено регулятором громкости"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Нажмите, чтобы восстановить приложение по умолчанию."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Вы вошли в профиль Android for Work"</string>
</resources>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index 9643102..410fcda 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM නැත."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"බ්ලූටූත් ටෙදරින්."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"අහස්යානා ආකාරය."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"බැටරි ප්රතිශතය <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"පද්ධති සැකසීම්."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"දැනුම්දීම්."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"අගුළු තිරය."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"සැකසීම්"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"දළ විශ්ලේෂණය."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"තහවුරු කරන්න"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"පරිශීලකයා <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi අක්රියයි."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා උඩට සර්පණය කරන්න."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා වමට සර්පණය කරන්න."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"අතුරු බිඳීම් නැත. අඩුම තරමේ අනතුරු ඇඟවීමක්වත් නැත."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"සීනු, සිහි කැඳවීම්, සිදුවීම් සහ ඔබ සඳහන් කරන අමතන්නන් හැර වෙනත් ශබ්ද සහ කම්පන වලින් ඔබව බාධා නොකරයි."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"අභිරුචිකරණය"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"අතුරු බිදුම් නැත"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"ප්රමුඛ අතුරු බිඳීම් පමණයි"</string>
<string name="zen_alarms" msgid="5055668280767657759">"ඇඟවීම් පමණි"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"ඔබගේ සැසිය දිගටම කරගෙන යෑමට ඔබට අවශ්යද?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"යළි මුල සිට අරඹන්න"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ඔව්, දිගටම කරගෙන යන්න"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"ආගන්තුක පරිශිලකයා"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"යෙදුම් සහ දත්ත ඉවත් කිරීමට ආගන්තුකයා ඉවත් කරන්න"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ආගන්තුකයා ඉවත් කරන්නද?"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"අලුත් පරිශීලකයෙක් එකතු කරන්නද?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ඔබ අලුත් පරිශීලකයෙක් එකතු කරන විට, එම පුද්ගලයා ඔහුගේ වැඩ කරන ඉඩ සකසා ගත යුතුය.\n\nසියළුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යාවත්කාලීන කළ හැක."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"බැටරිය සුරකින්නා සක්රීයයි"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"ප්රතික්ෂේප කරන්න"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ධාරිතා සංවාදයයි"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"මුල් තත්ත්වය නැවත ප්රතිසාධනය කිරීමට ස්පර්ශ කරන්න."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"ඔබ කාර්යාල පැතිකඩේ සිටියි"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index d826901..93ef222 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -148,6 +148,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Žiadna karta SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Pripojenie cez Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Režim v lietadle."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -171,8 +173,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Uzamknutá obrazovka"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavenia"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Prehľad"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potvrdiť"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Používateľ: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Pripojenie Wi-Fi je vypnuté."</string>
@@ -307,10 +308,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Prejdite prstom nahor: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Prejdite prstom doľava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Žiadne vyrušenia, ani budíky"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Nebudú vás rušiť zvuky ani vibrácie s výnimkou budíkov, upozornení, udalostí a volajúcich, ktoré zadáte."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Prispôsobiť"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Žiadne vyrušenia"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Iba prioritné vyrušenia"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Iba budíky"</string>
@@ -346,12 +345,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Chcete v relácii pokračovať?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Začať odznova"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Áno, pokračovať"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Hosť"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Ak chcete vymazať aplikácie a údaje, odstráňte hosťa."</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ODSTRÁNIŤ HOSŤA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Pridať nového používateľa?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor.\n\nAkýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Šetrič batérie je zapnutý"</string>
@@ -403,7 +399,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmietnuť"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je dialóg hlasitosti"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Klepnutím obnovíte originál."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Nachádzate sa v pracovnom profile"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index a7eca4d..18d3098 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -148,6 +148,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Ni kartice SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Internet prek Bluetootha."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Način za letalo."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Baterija <xliff:g id="NUMBER">%d</xliff:g> odstotkov."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Sistemske nastavitve."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Obvestila."</string>
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Zaklenjen zaslon"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavitve"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pregled."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potrdi"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Uporabnik: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi je izklopljen."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Povlecite navzgor za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Povlecite v levo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Brez motenj. Celo brez alarmov."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Ne bodo vas motili zvoki ali tresenje, razen od alarmov, opomnikov, dogodkov in klicateljev, ki jih določite."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Brez prekinitev"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Samo prednostne prekinitve"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Samo alarmi"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Želite nadaljevati sejo?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Začni znova"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Da, nadaljuj"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gost"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Odstranite gosta, če želite izbrisati aplikacije in podatke"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ODSTRANI GOSTA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Dodajanje novega uporabnika?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Varčevanje z energijo akumulatorja je vklopljeno"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Zavrni"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je pogovorno okno glede prostornine"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Dotaknite se, če želite obnoviti izvirnik."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Ste v profilu za Android Work"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index edb1166..9348895 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -147,6 +147,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Нема SIM картице."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth привезивање."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Режим рада у авиону."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Батерија је на <xliff:g id="NUMBER">%d</xliff:g> посто."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Системска подешавања."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Обавештења."</string>
@@ -168,8 +170,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Закључани екран."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Подешавања"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Преглед."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Потврди"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Корисник: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi је искључен."</string>
@@ -304,10 +305,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Превуците нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Превуците улево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Нема прекида. Чак ни аларма."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Неће вас узнемиравати звукови и вибрације осим за аларме, подсетнике, догађаје и позиваоце које изаберете."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Прилагоди"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Без прекида"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Само приоритетни прекиди"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Само аларми"</string>
@@ -343,12 +342,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Желите ли да наставите сесију?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Почни из почетка"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Да, настави"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Гост"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Уклоните госта да бисте избрисали апликације и податке"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"УКЛОНИ ГОСТА"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Додајете новог корисника?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Када додате новог корисника, та особа треба да подеси сопствени простор.\n\nСваки корисник може да ажурира апликације за све остале кориснике."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Штедња батерије је укључена"</string>
@@ -400,7 +396,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Одбиј"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> је дијалог за јачину звука"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Додирните да бисте вратили оригинал."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Налазите се на профилу за Work"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index ee03be4..5d3fbb0 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Inget SIM-kort."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Internetdelning via Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flygplansläge"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Batteri <xliff:g id="NUMBER">%d</xliff:g> procent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Systeminställningar."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Meddelanden."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låsskärm."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Inställningar"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Översikt."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bekräfta"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Användare <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi har inaktiverats."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Dra uppåt för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Dra åt vänster för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Inga avbrott. Inte ens alarm."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Du blir inte störd av ljud och vibrationer, förutom från alarm, påminnelser, event och specifika samtal."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Anpassa"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Inga avbrott"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Bara prioriterade samtal och aviseringar"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Endast alarm"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Vill du fortsätta sessionen?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Börja om"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, fortsätt"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Gästanvändare"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Ta bort gästen om du vill radera appar och data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"TA BORT GÄSTEN"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Lägga till ny användare?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme.\n\nAlla användare kan uppdatera appar för samtliga användares räkning."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparläget har aktiverats"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Neka"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> används som volymkontroll"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Tryck här om du vill återställa den ursprungliga appen."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Du använder Work-profilen"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 2ac3926..522fa1b 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Hakuna SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Shiriki intaneti kwa Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Hali ya ndege."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Asilimia <xliff:g id="NUMBER">%d</xliff:g> ya betri"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Mipangilio ya mfumo."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Arifa."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Skrini iliyofungwa."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Mipangilio"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Muhtasari."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Thibitisha"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Mtumiaji <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi imezimwa."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Sogeza juu kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Sogeza kushoto kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Hakuna kukatizwa. Hata kama ni kengele."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele, vikumbusho, matukio na wapigaji simu utakaobainisha."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Badilisha kukufaa"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Hakuna kukatizwa"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Mambo yenye kipaumbele pekee yakatize"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Kengele pekee"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Je, unataka kuendelea na kipindi chako?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Anza tena"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ndiyo, endelea"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Mtumiaji mgeni"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Ondoa mgeni ili ufute programu na data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ONDOA MGENI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ungependa kuongeza mtumiaji?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Unapomwongeza mtumiaji mpya, mtu huyo anahitaji kusanidi nafasi yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa ajili ya watumiaji wengine wote."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Kiokoa betri kimewashwa"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Kataa"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ni mazungumzo ya sauti"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Gusa ili urejeshe ya awali."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Uko katika wasifu wa Kazi"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index a8177de..dc730fb 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"சிம் இல்லை."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"புளூடூத் டெதெரிங்."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"விமானப் பயன்முறை."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"பேட்டரி சக்தி <xliff:g id="NUMBER">%d</xliff:g> சதவிகிதம் உள்ளது."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"கணினி அமைப்பு."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"அறிவிப்புகள்."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"பூட்டுத் திரை."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"அமைப்பு"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"மேலோட்டப் பார்வை."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"உறுதிசெய்க"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"பயனர் <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"வைஃபை முடக்கப்பட்டது."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு மேலாக இழுக்கவும்."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு இடதுபக்கமாக இழுக்கவும்."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"அறிவிப்பும் இல்லை. அலாரங்களும் இல்லை."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"அலாரங்கள், நினைவூட்டல்கள், நிகழ்வுகள், குறிப்பிட்ட அழைப்புகள் தவிர, ஒலிகளினாலும் அதிர்வினாலும் தொந்தரவு இருக்காது."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"தனிப்பயனாக்கு"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"தெரிவிக்காதே"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"முக்கிய அறிவிப்புகள் மட்டும்"</string>
<string name="zen_alarms" msgid="5055668280767657759">"அலாரங்கள் மட்டும்"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"உங்கள் அமர்வைத் தொடர விருப்பமா?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"மீண்டும் தொடங்கு"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"தொடரவும்"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"அழைக்கப்பட்டவர்"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"பயன்பாடுகளையும் தரவையும் நீக்க, அழைக்கப்பட்டவரை அகற்றவும்."</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"அழைக்கப்பட்டவரை அகற்றவா?"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"புதியவரைச் சேர்க்கவா?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்.\n\nஎந்தவொரு பயனரும், மற்ற எல்லா பயனர்களுக்காகவும் பயன்பாடுகளைப் புதுப்பிக்கலாம்."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"பேட்டரி சேமிப்பான் இயக்கத்தில் உள்ளது"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"நிராகரி"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"ஒலியளவு செய்தி: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"அசலை மீட்டமைக்கத் தொடவும்."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"பணி சுயவிவரத்தில் இருக்கிறீர்கள்"</string>
</resources>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 009eddb..6a0e136 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"సిమ్ లేదు."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"బ్లూటూత్ టెథెరింగ్."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ఎయిర్ప్లేన్ మోడ్."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"బ్యాటరీ <xliff:g id="NUMBER">%d</xliff:g> శాతం."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"సిస్టమ్ సెట్టింగ్లు."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"నోటిఫికేషన్లు."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"లాక్ స్క్రీన్."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"సెట్టింగ్లు"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"అవలోకనం."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"నిర్ధారిస్తుంది"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"వినియోగదారు <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"వైఫై ఆఫ్ చేయబడింది."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం పైకి స్లైడ్ చేయండి."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం ఎడమవైపుకు స్లైడ్ చేయండి."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"అంతరాయాలు లేవు. అలారాలు కూడా లేవు."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"మీరు పేర్కొనే అలారాలు, రిమైండర్లు, ఈవెంట్లు మరియు కాలర్ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"అనుకూలీకరించు"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"అంతరాయాలు లేకుండా"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"ప్రాధాన్య అంతరాయాలు మాత్రమే"</string>
<string name="zen_alarms" msgid="5055668280767657759">"అలారాలు మాత్రమే"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"మీరు మీ సెషన్ని కొనసాగించాలనుకుంటున్నారా?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"మొదటి నుండి ప్రారంభించు"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"అవును, కొనసాగించు"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"అతిథి వినియోగదారు"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"అనువర్తనాలు మరియు డేటాను తొలగించడానికి అతిథిని తీసివేయండి"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"అతిథిని తీసివేయి"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"కొత్త వినియోగదారుని జోడించాలా?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"మీరు కొత్త వినియోగదారుని జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం అనువర్తనాలను నవీకరించగలరు."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"బ్యాటర్ సేవర్ ఆన్ చేయబడింది"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"తిరస్కరించు"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> అనేది వాల్యూమ్ డైలాగ్"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"అసలుదాన్ని పునరుద్ధరించడానికి తాకండి."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"మీరు కార్యాలయ ప్రొఫైల్లో ఉన్నారు"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index bd0f58e..621876b 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"ไม่มีซิมการ์ด"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"การปล่อยสัญญาณบลูทูธ"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"โหมดใช้งานบนเครื่องบิน"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"แบตเตอรี่ <xliff:g id="NUMBER">%d</xliff:g> เปอร์เซ็นต์"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"การตั้งค่าระบบ"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"การแจ้งเตือน"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ล็อกหน้าจอ"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"การตั้งค่า"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ภาพรวม"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"ยืนยัน"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ผู้ใช้ <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ปิด Wi-Fi แล้ว"</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"เลื่อนขึ้นเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="description_direction_left" msgid="7207478719805562165">"เลื่อนไปทางซ้ายเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ไม่มีการรบกวน แม้แต่นาฬิกาปลุก"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"คุณจะไม่ถูกรบกวนจากเสียงและการสั่น ยกเว้นจากการปลุก ช่วยเตือน กิจกรรมและผู้โทรที่คุณระบุ"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"กำหนดค่า"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"ไม่มีการรบกวน"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"เฉพาะเรื่องสำคัญเท่านั้น"</string>
<string name="zen_alarms" msgid="5055668280767657759">"เฉพาะปลุกเท่านั้น"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"คุณต้องการอยู่ในเซสชันต่อไปไหม"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"เริ่มต้นใหม่"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ใช่ ดำเนินการต่อ"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"ผู้ใช้ที่เป็นผู้เข้าร่วม"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"นำผู้เข้าร่วมออกเพื่อลบแอปและข้อมูล"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"นำผู้เข้าร่วมออก"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ต้องการเพิ่มผู้ใช้ใหม่ใช่ไหม"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง\n\nผู้ใช้ทุกคนสามารถอัปเดตแอปสำหรับผู้ใช้รายอื่นทุกคนได้"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"เปิดโหมดประหยัดแบตเตอรี่อยู่"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"ปฏิเสธ"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> เป็นช่องโต้ตอบระดับเสียง"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"แตะเพื่อคืนค่าดั้งเดิม"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"คุณกำลังอยู่ในโปรไฟล์งาน"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index b8858af..8fe591c 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Walang SIM."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Pag-tether ng Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode na eroplano."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Baterya <xliff:g id="NUMBER">%d</xliff:g> (na) porsyento."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Mga setting ng system."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Mga Notification."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Mga Setting"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Kumpirmahin"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User na si <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Na-off ang wifi."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Mag-slide pataas para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Mag-slide pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Walang mga pagkaantala. Kahit mga alarma."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Hindi ka maaabala ng mga tunog at vibration, maliban sa mga alarm, paalala, kaganapan at tumatawag na iyong tinukoy."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"I-customize"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Walang mga paggambala"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Mga may priyoridad na paggambala lang"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Mga alarm lang"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Gusto mo bang ipagpatuloy ang iyong session?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Magsimulang muli"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Oo, magpatuloy"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Bisitang user"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Alisin ang bisita upang mag-delete ng mga app at data"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ALISIN ANG BISITA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Magdagdag ng bagong user?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo.\n\nAng sinumang user ay maaaring mag-update ng mga app para sa lahat ng iba pang user."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Naka-on ang tagatipid ng baterya"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tanggihan"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"Ang <xliff:g id="APP_NAME">%1$s</xliff:g> ang volume dialog"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Pindutin upang ibalik ang orihinal."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Nandito ka sa profile sa Trabaho"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 1b0d11f..fcb07fbf 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM kart yok."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Uçak modu."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Pil yüzdesi: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Sistem ayarları."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Bildirimler."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kilit ekranı"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Ayarlar"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Genel Bakış."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Onayla"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kullanıcı: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Kablosuz kapatıldı."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için yukarı kaydırın."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sola kaydırın."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Kesinti yok. Uyarı bile yok."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Belirttiğiniz alarmlar, hatırlatıcılar, etkinlikler ve arayanlar hariç olmak üzere, sesler ve titreşimlerle rahatsız edilmezsiniz."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Özelleştir"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Kesinti yok"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Sadece öncelikli kesintiler"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Yalnızca alarmlar"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Oturumunuza devam etmek istiyor musunuz?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Baştan başla"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Evet, devam et"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Misafir kullanıcı"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Uygulamaları ve verileri silmek için misafiri kaldır"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"MİSAFİR KALDIRILSIN MI?"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Yeni kullanıcı eklensin mi?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Yeni bir kullanıcı eklediğinizde, bu kişinin kendi alanını ayarlaması gerekir.\n\nHerhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Pil tasarrufu açık"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Reddet"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ses denetimi iletişim kutusu olarak ayarlandı"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Orijinali geri yüklemek için dokunun."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"İş profilindesiniz"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index c5ebd3a..66106c7 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -148,6 +148,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Немає SIM-карти."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Прив’язка Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Режим польоту."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Заряд акумулятора: <xliff:g id="NUMBER">%d</xliff:g>."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Налаштування системи."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Сповіщення."</string>
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заблокований екран."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Налаштування"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Огляд."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Підтвердити"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Користувач <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi вимкнено."</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Проведіть пальцем угору, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Проведіть пальцем ліворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Без сповіщень і сигналів будильника."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Ви отримуватимете звукові й вібросигнали лише для сповіщень, нагадувань, повідомлень про події та викликів абонентів, яких ви вибрали."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Налаштувати"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Без сповіщень"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Лише пріоритетні сповіщення"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Лише сигнали"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Продовжити сеанс?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Почати знову"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Так, продовжити"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Режим гостя"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Вийдіть із режиму гостя, щоб видалити додатки й дані"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ВИЙТИ З РЕЖИМУ ГОСТЯ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Додати нового користувача?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Користувач має налаштувати свій профіль після створення.\n\nБудь-який користувач пристрою може оновлювати додатки для решти користувачів."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Режим заощадження заряду акумулятора ввімкнено"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Відхилити"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> призначено регулятором гучності"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Торкніться, щоб відновити оригінал."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Ви в робочому профілі"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml
index c01a197..e5d752e 100644
--- a/packages/SystemUI/res/values-ur-rPK/strings.xml
+++ b/packages/SystemUI/res/values-ur-rPK/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"کوئی SIM نہیں ہے۔"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"بلوٹوتھ ربط بنانا۔"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ہوائی جہاز وضع۔"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"بیٹری <xliff:g id="NUMBER">%d</xliff:g> فیصد۔"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"سسٹم کی ترتیبات۔"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"اطلاعات۔"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"مقفل اسکرین۔"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ترتیبات"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"مجموعی جائزہ۔"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"توثیق کریں"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"صارف <xliff:g id="USER">%s</xliff:g>۔"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>۔"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi کو آف کر دیا گیا۔"</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے اوپر سلائیڈ کریں۔"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے بائیں سلائیڈ کریں۔"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"کوئی مداخلتیں نہیں ہیں۔ یہاں تک کہ الارمز بھی نہیں ہیں۔"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"الارمز، یاد دہانیوں، ایونٹس اور آپ کے متعین کردہ کالرز کے علاوہ، آپ آوازوں اور وائبریشنز سے ڈسٹرب نہیں ہونگے۔"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"حسب ضرورت بنائیں"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"کوئی مداخلتیں نہیں ہیں"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"صرف ترجیحی مداخلتیں"</string>
<string name="zen_alarms" msgid="5055668280767657759">"صرف الارمز"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"کیا آپ اپنا سیشن جاری رکھنا چاہتے ہیں؟"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"دوبارہ شروع کریں"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ہاں، جاری رکھیں"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"مہمان صارف"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"ایپس اور ڈیٹا حذف کرنے کیلئے مہمان کو ہٹائیں"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"مہمان کو ہٹائیں"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"نیا صارف شامل کریں؟"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔\n\nکوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"بیٹری سیور آن ہے"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"مسترد کریں"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> والیوم ڈائلاگ ہے"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"اصل کو بحال کرنے کیلئے ٹچ کریں۔"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"آپ دفتری پروفائل میں ہیں"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index 37e9542..f7b373e 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM karta yo‘q."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth bog‘landi."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Parvoz rejimi"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Batareya <xliff:g id="NUMBER">%d</xliff:g> foiz."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Tizim sozlamalari."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Eslatmalar."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Qulflash ekrani."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Sozlamalar"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Umumiy nazar."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Tasdiqlash"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Foydalanuvchi <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi o‘chirildi."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun yuqoriga suring."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun chapga suring."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Hech narsa bezovta qilmaydi, hatto uyg‘otkichlar ham."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Siz ovoz va vibratsiyalar bilan bezovda qilinmaysiz, lekin uyg‘otkich, eslatkich, tadbirlar va siz ko‘rsatgan qo‘ng‘iroq qiluvchilar bundan mustasno."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Moslash"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Tanaffuslarsiz"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Faqat ustuvor tanaffuslar"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Faqat signallar"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Seansni davom ettirmoqchimisiz?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Boshidan boshlansin"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ha, davom ettirilsin"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Mehmon foydalanuvchi"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Ilova va ma’lumotlarni o‘chirish uchun mehmonni o‘chiring"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"MEHMON HISOBI O‘CHIRILSINMI?"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Yangi foyd-chi qo‘shilsinmi?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Yangi foydalanuvchi qo‘shilgach, o‘sha shaxs o‘z hududini sozlashi lozim bo‘ladi.\n\nHar qanday foydalanuvchi ilovalarni barcha foydalanuvchilar uchun yangilashi mumkin."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Quvvat tejash yoqilgan"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rad etish"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ovoz balandligini boshqaradi"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Aslini tiklash uchun bosing."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Siz ish profilidasiz"</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 3c2d0ef..e9e2d6a 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Không có SIM nào."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Dùng làm điểm truy cập Internet qua Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Chế độ trên máy bay."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> phần trăm pin."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Cài đặt hệ thống"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Thông báo."</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Màn hình khóa."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Cài đặt"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Tổng quan."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Xác nhận"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Người dùng <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Đã tắt Wifi."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Trượt lên để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Trượt sang trái để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Không có gián đoạn. Thậm chí không có cảnh báo."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Bạn sẽ không bị làm phiền bởi âm thanh và rung, ngoại trừ báo thức, nhắc nhở, sự kiện và người gọi mà bạn chỉ định."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tùy chỉnh"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Không có gián đoạn nào"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Chỉ các gián đoạn ưu tiên"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Chỉ báo thức"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Bạn có muốn tiếp tục phiên của mình không?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Bắt đầu lại"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Có, tiếp tục"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Người dùng khách"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Xóa khách để xóa ứng dụng và dữ liệu"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"XÓA KHÁCH"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Thêm người dùng mới?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Khi bạn thêm người dùng mới, người dùng đó cần thiết lập dung lượng lưu trữ của mình.\n\nMọi người dùng đều có thể cập nhật ứng dụng cho tất cả người dùng khác."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Trình tiết kiệm pin đang bật"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Từ chối"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> là hộp thoại khối lượng"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Chạm để khôi phục bản gốc."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Bạn đang trên hồ sơ công việc"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 32e7735..9e0f437 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"无 SIM 卡。"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"蓝牙网络共享。"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飞行模式。"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"锁定屏幕。"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"设置"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"概览。"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"确认"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"用户:<xliff:g id="USER">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WLAN已关闭。"</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"向上滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="description_direction_left" msgid="7207478719805562165">"向左滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"零打扰(甚至不发出闹钟提醒)。"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"您将不会受声音和振动的打扰,但闹钟、提醒、活动和您指定的来电者除外。"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"自定义"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"禁止打扰"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"仅限优先打扰内容"</string>
<string name="zen_alarms" msgid="5055668280767657759">"仅限闹钟"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"要继续您的会话吗?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"重新开始"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"是,继续"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"访客用户"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"移除访客以便删除应用和数据"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"移除访客"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"要添加新用户吗?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"当您添加新用户时,该用户必须设置自己的空间。\n\n任何用户均可为其他所有用户更新应用。"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"节电助手已开启"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒绝"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”已用作音量控制对话框"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"触摸即可恢复原始设置。"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"您正在使用工作资料"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index bf8dfb2..6d95678 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"無 SIM 卡。"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"藍牙網絡共享。"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飛航模式。"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"上鎖畫面。"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"概覽"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"確認"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"使用者:<xliff:g id="USER">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi 已關閉。"</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"不干擾 (即使鬧鐘也不例外)。"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"除了指定的鬧鐘、提醒、活動及來電者,您將不會受到其他聲音和震動干擾。"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"自訂"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"不允許干擾"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"只限重要干擾"</string>
<string name="zen_alarms" msgid="5055668280767657759">"僅限鬧鐘"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"您要繼續您的工作階段嗎?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"重新開始"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"是的,請繼續"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"訪客使用者"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"移除訪客以刪除應用程式和數據"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"移除訪客"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者均可為所有其他使用者更新應用程式。"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"省電模式已開啟"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒絕"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」為音量對話框"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"輕觸即可復原。"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"您正在「工作設定檔」頁面"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index f9b33ca..d52179f 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"沒有 SIM 卡。"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"藍牙網路共用"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飛行模式。"</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
@@ -169,8 +171,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"螢幕鎖定。"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"總覽。"</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"確認"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"使用者:<xliff:g id="USER">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi 已關閉。"</string>
@@ -305,10 +306,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"不干擾 (即使鬧鐘也不例外)。"</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"您不會受到聲音和振動干擾 (鬧鐘、提醒、活動和指定來電者例外)。"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"自訂"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"不允許干擾"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"僅限優先干擾"</string>
<string name="zen_alarms" msgid="5055668280767657759">"僅允許鬧鐘"</string>
@@ -344,12 +343,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"您要繼續這個工作階段嗎?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"重新開始"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"是,請繼續"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"訪客使用者"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"移除訪客以刪除應用程式和資料"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"移除訪客"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者皆可為其他所有使用者更新應用程式。"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"節約耗電量模式已啟用"</string>
@@ -401,7 +397,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒絕"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」現在是預設的音量控制對話方塊。"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"輕觸這裡即可恢復原始設定。"</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"您目前在 Work 設定檔"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 9a32c4b..a566a54 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -146,6 +146,8 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Ayikho i-SIM"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Imodemu nge-Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Imodi yendiza."</string>
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
<string name="accessibility_battery_level" msgid="7451474187113371965">"Iphesenti <xliff:g id="NUMBER">%d</xliff:g> lebhetri"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Izilungiselelo zesistimu"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Izaziso"</string>
@@ -167,8 +169,7 @@
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Khiya isikrini."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Izilungiselelo"</string>
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Buka konke."</string>
- <!-- no translation found for accessibility_desc_confirm (3446792278337969766) -->
- <skip />
+ <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Qinisekisa"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Umsebenzisi <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"I-Wifi ivaliwe."</string>
@@ -303,10 +304,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Shelelisela ngenhla ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Shelelisela ngakwesokunxele ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Akukho ukuphazamiseka. Nama-alamu imbala."</string>
- <!-- no translation found for zen_priority_introduction (7253045784560169993) -->
- <skip />
- <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
- <skip />
+ <string name="zen_priority_introduction" msgid="7253045784560169993">"Ngeke uze uphazanyiswe yimisindo nokudlidliza, ngaphandle kokuvela kuma-alamu, izikhumbuzi, imicimbi, nabashayi obacacisayo."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Enza ngendlela oyifisayo"</string>
<string name="zen_no_interruptions" msgid="7970973750143632592">"Azikho iziphazamiso"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"Iziphazamiso ezibalulekile kuphela"</string>
<string name="zen_alarms" msgid="5055668280767657759">"Ama-alamu kuphela"</string>
@@ -342,12 +341,9 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Ingabe ufuna ukuqhubeka ngesikhathi sakho?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Qala phansi"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Yebo, qhubeka"</string>
- <!-- no translation found for guest_notification_title (1585278533840603063) -->
- <skip />
- <!-- no translation found for guest_notification_text (7513706222848825467) -->
- <skip />
- <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
- <skip />
+ <string name="guest_notification_title" msgid="1585278533840603063">"Umsebenzisi oyisihambeli"</string>
+ <string name="guest_notification_text" msgid="7513706222848825467">"Susa isihambeli ukuze ususe izinhlelo zokusebenza nedatha"</string>
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"SUSA ISIHAMBELI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Engeza umsebenzisi omusha?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha isikhala sakhe.\n\nNoma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza kubo bonke abasebenzisi."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Isilondolozi sebhethri sivuliwe"</string>
@@ -399,7 +395,5 @@
<string name="volumeui_prompt_deny" msgid="5720663643411696731">"Phika"</string>
<string name="volumeui_notification_title" msgid="4906770126345910955">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> yingxoxo yevolumu"</string>
<string name="volumeui_notification_text" msgid="1826889705095768656">"Thinta ukuze ubuyisele kokwangempela."</string>
- <string name="volume_zen_switch_text" msgid="8149183012610587643">"@*android:string/zen_mode_feature_name"</string>
- <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) -->
- <skip />
+ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Ukuphrofayela yomsebenzi"</string>
</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 88d1769..1f1455a 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -129,7 +129,6 @@
<color name="segmented_button_selected">#FFFFFFFF</color>
<color name="segmented_button_unselected">#B3B0BEC5</color><!-- 70% blue grey 200 -->
- <color name="volume_panel_divider">#1FFFFFFF</color><!-- 12% white -->
<color name="dark_mode_icon_color_single_tone">#99000000</color>
<color name="dark_mode_icon_color_dual_tone_background">#3d000000</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 051d233..2e44547 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -276,9 +276,6 @@
<!-- Doze: alpha to apply to small icons when dozing -->
<integer name="doze_small_icon_alpha">222</integer><!-- 87% of 0xff -->
- <!-- Volume: time to delay dismissing the volume panel after a click is performed -->
- <integer name="volume_panel_dismiss_delay">200</integer>
-
<!-- Hotspot tile: number of days to show after feature is used. -->
<integer name="days_to_show_hotspot_tile">30</integer>
@@ -293,5 +290,8 @@
<!-- Enable the default volume dialog -->
<bool name="enable_volume_ui">true</bool>
+
+ <!-- Duration of the full carrier network change icon animation. -->
+ <integer name="carrier_network_change_anim_time">3000</integer>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 9e084a0..7e50454 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -344,15 +344,6 @@
<!-- The chevron padding to the circle when hinting -->
<dimen name="hint_chevron_circle_padding">16dp</dimen>
- <!-- Volume panel dialog y offset -->
- <dimen name="volume_panel_top">0dp</dimen>
-
- <!-- Volume panel dialog width -->
- <dimen name="volume_panel_width">344dp</dimen>
-
- <!-- Volume panel z depth -->
- <dimen name="volume_panel_z">3dp</dimen>
-
<!-- Distance between notifications and header when they are considered to be colliding. -->
<dimen name="header_notifications_collide_distance">48dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index ae134c6..67a0bc6 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -359,6 +359,9 @@
<!-- Content description of the airplane mode icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_airplane_mode">Airplane mode.</string>
+ <!-- Content description of the carrier network changing icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
+ <string name="accessibility_carrier_network_change_mode">Carrier network changing.</string>
+
<!-- Content description of the battery level icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_battery_level">Battery <xliff:g id="number">%d</xliff:g> percent.</string>
@@ -998,7 +1001,7 @@
<string name="volumeui_notification_text">Touch to restore the original.</string>
<!-- Volume dialog zen toggle switch title -->
- <string name="volume_zen_switch_text">@*android:string/zen_mode_feature_name</string>
+ <string name="volume_zen_switch_text" translatable="false">@*android:string/zen_mode_feature_name</string>
<!-- Toast shown when user unlocks screen and managed profile activity is in the foreground -->
<string name="managed_profile_foreground_toast">You are in the Work profile</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 87f9ca2..ef2e6f3 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -138,9 +138,8 @@
<item name="android:textColor">@color/system_accent_color</item>
</style>
- <style name="TextAppearance.QS.VolumeSuppressor">
+ <style name="TextAppearance.QS.Introduction">
<item name="android:textSize">14sp</item>
- <item name="android:textColor">@color/qs_tile_text</item>
</style>
<style name="TextAppearance.QS.DetailButton">
@@ -228,12 +227,6 @@
<item name="android:gravity">center</item>
</style>
- <!-- Window animations used for volume panel. -->
- <style name="VolumePanelAnimation">
- <item name="android:windowEnterAnimation">@*android:anim/popup_enter_material</item>
- <item name="android:windowExitAnimation">@*android:anim/popup_exit_material</item>
- </style>
-
<style name="TextAppearance.Material.Notification.Parenthetical"
parent="@*android:style/TextAppearance.Material.Notification">
<item name="android:textStyle">italic</item>
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 065d62eb..b828e78 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -171,6 +171,11 @@
*/
private static final String KEYGUARD_ANALYTICS_SETTING = "keyguard_analytics";
+ /**
+ * How much faster we collapse the lockscreen when authenticating with fingerprint.
+ */
+ private static final float FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR = 1.3f;
+
/** The stream type that the lock sounds are tied to. */
private int mUiSoundsStreamType;
@@ -441,7 +446,8 @@
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
mViewMediatorCallback.keyguardDone(true);
} else {
- mStatusBarKeyguardViewManager.animateCollapsePanels();
+ mStatusBarKeyguardViewManager.animateCollapsePanels(
+ FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);
}
};
@@ -505,6 +511,11 @@
public boolean isInputRestricted() {
return KeyguardViewMediator.this.isInputRestricted();
}
+
+ @Override
+ public boolean isScreenOn() {
+ return mScreenOn;
+ }
};
public void userActivity() {
@@ -867,6 +878,12 @@
*/
private void handleSetOccluded(boolean isOccluded) {
synchronized (KeyguardViewMediator.this) {
+ if (mHiding && isOccluded) {
+ // We're in the process of going away but WindowManager wants to show a
+ // SHOW_WHEN_LOCKED activity instead.
+ startKeyguardExitAnimation(0, 0);
+ }
+
if (mOccluded != isOccluded) {
mOccluded = isOccluded;
mStatusBarKeyguardViewManager.setOccluded(isOccluded);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
index 1790a4e..5a84db5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.Intent;
+import android.graphics.drawable.Animatable;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
@@ -325,7 +326,7 @@
public static class ResourceIcon extends Icon {
private static final SparseArray<Icon> ICONS = new SparseArray<Icon>();
- private final int mResId;
+ protected final int mResId;
private ResourceIcon(int resId) {
mResId = resId;
@@ -342,7 +343,11 @@
@Override
public Drawable getDrawable(Context context) {
- return context.getDrawable(mResId);
+ Drawable d = context.getDrawable(mResId);
+ if (d instanceof Animatable) {
+ ((Animatable) d).start();
+ }
+ return d;
}
@Override
@@ -370,7 +375,7 @@
@Override
public Drawable getDrawable(Context context) {
// workaround: get a clean state for every new AVD
- final AnimatedVectorDrawable d = (AnimatedVectorDrawable) super.getDrawable(context)
+ final AnimatedVectorDrawable d = (AnimatedVectorDrawable) context.getDrawable(mResId)
.getConstantState().newDrawable();
d.start();
if (mAllowAnimation) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
index ec83ca7..af9d3a5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
@@ -38,6 +38,7 @@
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
+import com.android.systemui.qs.QSTile.AnimationIcon;
import com.android.systemui.qs.QSTile.State;
import java.util.Objects;
@@ -315,8 +316,9 @@
iv.setImageDrawable(d);
iv.setTag(R.id.qs_icon_tag, state.icon);
if (d instanceof Animatable) {
- if (!iv.isShown()) {
- ((Animatable) d).stop(); // skip directly to end state
+ Animatable a = (Animatable) d;
+ if (state.icon instanceof AnimationIcon && !iv.isShown()) {
+ a.stop(); // skip directly to end state
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index a82afcf..b2bb021 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -20,6 +20,8 @@
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuff;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
import android.telephony.SubscriptionInfo;
import android.util.AttributeSet;
import android.util.Log;
@@ -165,12 +167,13 @@
}
@Override
- public void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon,
- String contentDescription, String typeContentDescription, boolean isTypeIconWide,
- int subId) {
+ public void setMobileDataIndicators(boolean visible, int strengthIcon, int darkStrengthIcon,
+ int typeIcon, String contentDescription, String typeContentDescription,
+ boolean isTypeIconWide, int subId) {
PhoneState state = getOrInflateState(subId);
state.mMobileVisible = visible;
state.mMobileStrengthId = strengthIcon;
+ state.mMobileDarkStrengthId = darkStrengthIcon;
state.mMobileTypeId = typeIcon;
state.mMobileDescription = contentDescription;
state.mMobileTypeDescription = typeContentDescription;
@@ -360,7 +363,7 @@
private class PhoneState {
private final int mSubId;
private boolean mMobileVisible = false;
- private int mMobileStrengthId = 0, mMobileTypeId = 0;
+ private int mMobileStrengthId = 0, mMobileDarkStrengthId = 0, mMobileTypeId = 0;
private boolean mIsMobileTypeIconWide;
private String mMobileDescription, mMobileTypeDescription;
@@ -384,7 +387,23 @@
public boolean apply(boolean isSecondaryIcon) {
if (mMobileVisible && !mIsAirplaneMode) {
mMobile.setImageResource(mMobileStrengthId);
+ Drawable mobileDrawable = mMobile.getDrawable();
+ if (mobileDrawable instanceof Animatable) {
+ Animatable ad = (Animatable) mobileDrawable;
+ if (!ad.isRunning()) {
+ ad.start();
+ }
+ }
+
mMobileDark.setImageResource(mMobileStrengthId);
+ Drawable mobileDarkDrawable = mMobileDark.getDrawable();
+ if (mobileDarkDrawable instanceof Animatable) {
+ Animatable ad = (Animatable) mobileDarkDrawable;
+ if (!ad.isRunning()) {
+ ad.start();
+ }
+ }
+
mMobileType.setImageResource(mMobileTypeId);
mMobileGroup.setContentDescription(mMobileTypeDescription
+ " " + mMobileDescription);
@@ -401,8 +420,9 @@
mMobileDark.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0,
0, 0, 0);
- if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d typ=%d",
- (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId));
+ if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d dark=%d typ=%d",
+ (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId,
+ mMobileDarkStrengthId, mMobileTypeId));
mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE);
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 c266467..96e95439 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -511,9 +511,10 @@
}
@Override
- protected void flingToHeight(float vel, boolean expand, float target) {
+ protected void flingToHeight(float vel, boolean expand, float target,
+ float collapseSpeedUpFactor) {
mHeadsUpTouchHelper.notifyFling(!expand);
- super.flingToHeight(vel, expand, target);
+ super.flingToHeight(vel, expand, target, collapseSpeedUpFactor);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
index 240438a7..f3d4c7f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
@@ -140,7 +140,7 @@
mPanelHolder.setSelectedPanel(mTouchingPanel);
for (PanelView pv : mPanels) {
if (pv != panel) {
- pv.collapse(false /* delayed */);
+ pv.collapse(false /* delayed */, 1.0f /* speedUpFactor */);
}
}
}
@@ -186,11 +186,11 @@
(fullyOpenedPanel!=null)?" fullyOpened":"", fullyClosed?" fullyClosed":"");
}
- public void collapseAllPanels(boolean animate, boolean delayed) {
+ public void collapseAllPanels(boolean animate, boolean delayed, float speedUpFactor) {
boolean waiting = false;
for (PanelView pv : mPanels) {
if (animate && !pv.isFullyCollapsed()) {
- pv.collapse(delayed);
+ pv.collapse(delayed, speedUpFactor);
waiting = true;
} else {
pv.resetViews();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index ddce9d5..3a30429 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -101,6 +101,12 @@
private boolean mPeekPending;
private boolean mCollapseAfterPeek;
+
+ /**
+ * Speed-up factor to be used when {@link #mFlingCollapseRunnable} runs the next time.
+ */
+ private float mNextCollapseSpeedUpFactor = 1.0f;
+
private boolean mExpanding;
private boolean mGestureWaitForTouchSlop;
private Runnable mPeekRunnable = new Runnable() {
@@ -164,7 +170,7 @@
postOnAnimation(new Runnable() {
@Override
public void run() {
- collapse(false /* delayed */);
+ collapse(false /* delayed */, 1.0f /* speedUpFactor */);
}
});
}
@@ -563,12 +569,17 @@
}
protected void fling(float vel, boolean expand) {
- cancelPeek();
- float target = expand ? getMaxPanelHeight() : 0.0f;
- flingToHeight(vel, expand, target);
+ fling(vel, expand, 1.0f /* collapseSpeedUpFactor */);
}
- protected void flingToHeight(float vel, boolean expand, float target) {
+ protected void fling(float vel, boolean expand, float collapseSpeedUpFactor) {
+ cancelPeek();
+ float target = expand ? getMaxPanelHeight() : 0.0f;
+ flingToHeight(vel, expand, target, collapseSpeedUpFactor);
+ }
+
+ protected void flingToHeight(float vel, boolean expand, float target,
+ float collapseSpeedUpFactor) {
// Hack to make the expand transition look nice when clear all button is visible - we make
// the animation only to the last notification, and then jump to the maximum panel height so
// clear all just fades in and the decelerating motion is towards the last notification.
@@ -600,7 +611,8 @@
// Make it shorter if we run a canned animation
if (vel == 0) {
animator.setDuration((long)
- (animator.getDuration() * getCannedFlingDurationFactor()));
+ (animator.getDuration() * getCannedFlingDurationFactor()
+ / collapseSpeedUpFactor));
}
}
animator.addListener(new AnimatorListenerAdapter() {
@@ -745,7 +757,7 @@
mBar = panelBar;
}
- public void collapse(boolean delayed) {
+ public void collapse(boolean delayed, float speedUpFactor) {
if (DEBUG) logf("collapse: " + this);
if (mPeekPending || mPeekAnimator != null) {
mCollapseAfterPeek = true;
@@ -761,9 +773,10 @@
mClosing = true;
notifyExpandingStarted();
if (delayed) {
+ mNextCollapseSpeedUpFactor = speedUpFactor;
postDelayed(mFlingCollapseRunnable, 120);
} else {
- fling(0, false /* expand */);
+ fling(0, false /* expand */, speedUpFactor);
}
}
}
@@ -771,7 +784,7 @@
private final Runnable mFlingCollapseRunnable = new Runnable() {
@Override
public void run() {
- fling(0, false /* expand */);
+ fling(0, false /* expand */, mNextCollapseSpeedUpFactor);
}
};
@@ -975,7 +988,7 @@
protected final Runnable mPostCollapseRunnable = new Runnable() {
@Override
public void run() {
- collapse(false /* delayed */);
+ collapse(false /* delayed */, 1.0f /* speedUpFactor */);
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 7f65f73..b6dbfce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1981,14 +1981,20 @@
}
public void animateCollapsePanels(int flags) {
- animateCollapsePanels(flags, false /* force */, false /* delayed */);
+ animateCollapsePanels(flags, false /* force */, false /* delayed */,
+ 1.0f /* speedUpFactor */);
}
public void animateCollapsePanels(int flags, boolean force) {
- animateCollapsePanels(flags, force, false /* delayed*/);
+ animateCollapsePanels(flags, force, false /* delayed */, 1.0f /* speedUpFactor */);
}
public void animateCollapsePanels(int flags, boolean force, boolean delayed) {
+ animateCollapsePanels(flags, force, delayed, 1.0f /* speedUpFactor */);
+ }
+
+ public void animateCollapsePanels(int flags, boolean force, boolean delayed,
+ float speedUpFactor) {
if (!force &&
(mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED)) {
runPostCollapseRunnables();
@@ -2012,7 +2018,7 @@
mStatusBarWindowManager.setStatusBarFocusable(false);
mStatusBarWindow.cancelExpandHelper();
- mStatusBarView.collapseAllPanels(true /* animate */, delayed);
+ mStatusBarView.collapseAllPanels(true /* animate */, delayed, speedUpFactor);
}
}
@@ -2055,7 +2061,7 @@
public void animateCollapseQuickSettings() {
if (mState == StatusBarState.SHADE) {
- mStatusBarView.collapseAllPanels(true, false /* delayed */);
+ mStatusBarView.collapseAllPanels(true, false /* delayed */, 1.0f /* speedUpFactor */);
}
}
@@ -2068,7 +2074,8 @@
}
// Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868)
- mStatusBarView.collapseAllPanels(/*animate=*/ false, false /* delayed*/);
+ mStatusBarView.collapseAllPanels(/*animate=*/ false, false /* delayed*/,
+ 1.0f /* speedUpFactor */);
mNotificationPanel.closeQs();
@@ -2158,7 +2165,8 @@
mStatusBarWindowState = state;
if (DEBUG_WINDOW_STATE) Log.d(TAG, "Status bar " + windowStateToString(state));
if (!showing && mState == StatusBarState.SHADE) {
- mStatusBarView.collapseAllPanels(false /* animate */, false /* delayed */);
+ mStatusBarView.collapseAllPanels(false /* animate */, false /* delayed */,
+ 1.0f /* speedUpFactor */);
}
}
if (mNavigationBarView != null
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 6369d5e..194a19a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -441,7 +441,8 @@
mPhoneStatusBar.keyguardGoingAway();
}
- public void animateCollapsePanels() {
- mPhoneStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
+ public void animateCollapsePanels(float speedUpFactor) {
+ mPhoneStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
+ false /* delayed */, speedUpFactor);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
index ba938cc..c3c6b12 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -114,6 +114,11 @@
setInetCondition(inetCondition);
}
+ public void setCarrierNetworkChangeMode(boolean carrierNetworkChangeMode) {
+ mCurrentState.carrierNetworkChangeMode = carrierNetworkChangeMode;
+ notifyListenersIfNecessary();
+ }
+
/**
* Start listening for phone state changes.
*/
@@ -123,7 +128,8 @@
| PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
| PhoneStateListener.LISTEN_CALL_STATE
| PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
- | PhoneStateListener.LISTEN_DATA_ACTIVITY);
+ | PhoneStateListener.LISTEN_DATA_ACTIVITY
+ | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE);
}
/**
@@ -201,8 +207,12 @@
&& !mCurrentState.isEmergency,
getQsCurrentIconId(), contentDescription,
qsTypeIcon,
- mCurrentState.dataConnected && mCurrentState.activityIn,
- mCurrentState.dataConnected && mCurrentState.activityOut,
+ mCurrentState.dataConnected
+ && !mCurrentState.carrierNetworkChangeMode
+ && mCurrentState.activityIn,
+ mCurrentState.dataConnected
+ && !mCurrentState.carrierNetworkChangeMode
+ && mCurrentState.activityOut,
dataContentDescription,
mCurrentState.isEmergency ? null : mCurrentState.networkName,
// Only wide if actually showing something.
@@ -215,6 +225,7 @@
mSignalClusters.get(i).setMobileDataIndicators(
mCurrentState.enabled && !mCurrentState.airplaneMode,
getCurrentIconId(),
+ getCurrentDarkIconId(),
typeIcon,
contentDescription,
dataContentDescription,
@@ -224,6 +235,10 @@
}
}
+ private int getCurrentDarkIconId() {
+ return getCurrentIconId(false /* light */);
+ }
+
@Override
protected MobileState cleanState() {
return new MobileState();
@@ -270,6 +285,10 @@
}
}
+ private boolean isCarrierNetworkChangeActive() {
+ return !hasService() && mCurrentState.carrierNetworkChangeMode;
+ }
+
public void handleBroadcast(Intent intent) {
String action = intent.getAction();
if (action.equals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION)) {
@@ -351,7 +370,9 @@
mCurrentState.dataConnected = mCurrentState.connected
&& mDataState == TelephonyManager.DATA_CONNECTED;
- if (isRoaming()) {
+ if (isCarrierNetworkChangeActive()) {
+ mCurrentState.iconGroup = TelephonyIcons.CARRIER_NETWORK_CHANGE;
+ } else if (isRoaming()) {
mCurrentState.iconGroup = TelephonyIcons.ROAMING;
}
if (isEmergencyOnly() != mCurrentState.isEmergency) {
@@ -363,6 +384,7 @@
&& mServiceState.getOperatorAlphaShort() != null) {
mCurrentState.networkName = mServiceState.getOperatorAlphaShort();
}
+
notifyListenersIfNecessary();
}
@@ -428,6 +450,16 @@
}
setActivity(direction);
}
+
+ @Override
+ public void onCarrierNetworkChange(boolean active) {
+ if (DEBUG) {
+ Log.d(mTag, "onCarrierNetworkChange: active=" + active);
+ }
+ mCurrentState.carrierNetworkChangeMode = active;
+
+ updateTelephony();
+ }
};
static class MobileIconGroup extends SignalController.IconGroup {
@@ -440,8 +472,17 @@
int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
int discContentDesc, int dataContentDesc, int dataType, boolean isWide,
int[] qsDataType) {
- super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState,
- qsDiscState, discContentDesc);
+ this(name, sbIcons, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState,
+ sbDiscState, sbDiscState, qsDiscState, discContentDesc, dataContentDesc,
+ dataType, isWide, qsDataType);
+ }
+
+ public MobileIconGroup(String name, int[][] sbIcons, int[][] sbDarkIcons, int[][] qsIcons,
+ int[] contentDesc, int sbNullState, int qsNullState, int sbDiscState,
+ int sbDarkDiscState, int qsDiscState, int discContentDesc, int dataContentDesc,
+ int dataType, boolean isWide, int[] qsDataType) {
+ super(name, sbIcons, sbDarkIcons, qsIcons, contentDesc, sbNullState, qsNullState,
+ sbDiscState, sbDarkDiscState, qsDiscState, discContentDesc);
mDataContentDescription = dataContentDesc;
mDataType = dataType;
mIsWide = isWide;
@@ -455,6 +496,7 @@
boolean dataConnected;
boolean isEmergency;
boolean airplaneMode;
+ boolean carrierNetworkChangeMode;
int inetForNetwork;
@Override
@@ -467,6 +509,7 @@
inetForNetwork = state.inetForNetwork;
isEmergency = state.isEmergency;
airplaneMode = state.airplaneMode;
+ carrierNetworkChangeMode = state.carrierNetworkChangeMode;
}
@Override
@@ -478,7 +521,8 @@
builder.append("dataConnected=").append(dataConnected).append(',');
builder.append("inetForNetwork=").append(inetForNetwork).append(',');
builder.append("isEmergency=").append(isEmergency).append(',');
- builder.append("airplaneMode=").append(airplaneMode);
+ builder.append("airplaneMode=").append(airplaneMode).append(',');
+ builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode);
}
@Override
@@ -489,6 +533,7 @@
&& ((MobileState) o).dataConnected == dataConnected
&& ((MobileState) o).isEmergency == isEmergency
&& ((MobileState) o).airplaneMode == airplaneMode
+ && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode
&& ((MobileState) o).inetForNetwork == inetForNetwork;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index bb3eb7ad..5cf6a6e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -704,6 +704,13 @@
controller.getState().enabled = show;
controller.notifyListeners();
}
+ String carrierNetworkChange = args.getString("carriernetworkchange");
+ if (carrierNetworkChange != null) {
+ boolean show = carrierNetworkChange.equals("show");
+ for (MobileSignalController controller : mMobileSignalControllers.values()) {
+ controller.setCarrierNetworkChangeMode(show);
+ }
+ }
}
}
@@ -718,9 +725,9 @@
public interface SignalCluster {
void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription);
- void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon,
- String contentDescription, String typeContentDescription, boolean isTypeIconWide,
- int subId);
+ void setMobileDataIndicators(boolean visible, int strengthIcon, int darkStrengthIcon,
+ int typeIcon, String contentDescription, String typeContentDescription,
+ boolean isTypeIconWide, int subId);
void setSubs(List<SubscriptionInfo> subs);
void setNoSims(boolean show);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java
index 1d96c6b..c204814 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java
@@ -142,8 +142,16 @@
* Gets the signal icon for SB based on current state of connected, enabled, and level.
*/
public int getCurrentIconId() {
+ return getCurrentIconId(true /* light */);
+ }
+
+ protected int getCurrentIconId(boolean light) {
if (mCurrentState.connected) {
- return getIcons().mSbIcons[mCurrentState.inetCondition][mCurrentState.level];
+ if (light) {
+ return getIcons().mSbIcons[mCurrentState.inetCondition][mCurrentState.level];
+ } else {
+ return getIcons().mSbDarkIcons[mCurrentState.inetCondition][mCurrentState.level];
+ }
} else if (mCurrentState.enabled) {
return getIcons().mSbDiscState;
} else {
@@ -226,11 +234,13 @@
*/
static class IconGroup {
final int[][] mSbIcons;
+ final int[][] mSbDarkIcons;
final int[][] mQsIcons;
final int[] mContentDesc;
final int mSbNullState;
final int mQsNullState;
final int mSbDiscState;
+ final int mSbDarkDiscState;
final int mQsDiscState;
final int mDiscContentDesc;
// For logging.
@@ -239,13 +249,22 @@
public IconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
int discContentDesc) {
+ this(name, sbIcons, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState,
+ sbDiscState, sbDiscState, qsDiscState, discContentDesc);
+ }
+
+ public IconGroup(String name, int[][] sbIcons, int[][] sbDarkIcons, int[][] qsIcons,
+ int[] contentDesc, int sbNullState, int qsNullState, int sbDiscState,
+ int sbDarkDiscState, int qsDiscState, int discContentDesc) {
mName = name;
mSbIcons = sbIcons;
+ mSbDarkIcons = sbDarkIcons;
mQsIcons = qsIcons;
mContentDesc = contentDesc;
mSbNullState = sbNullState;
mQsNullState = qsNullState;
mSbDiscState = sbDiscState;
+ mSbDarkDiscState = sbDarkDiscState;
mQsDiscState = qsDiscState;
mDiscContentDesc = discContentDesc;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index d266ed8..053feb12 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -68,6 +68,42 @@
R.drawable.stat_sys_signal_4_fully }
};
+ //CarrierNetworkChange
+ static final int[][] TELEPHONY_CARRIER_NETWORK_CHANGE = {
+ { R.drawable.stat_sys_signal_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_carrier_network_change_animation },
+ { R.drawable.stat_sys_signal_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_carrier_network_change_animation }
+ };
+
+ static final int[][] TELEPHONY_CARRIER_NETWORK_CHANGE_DARK = {
+ { R.drawable.stat_sys_signal_dark_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_dark_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_dark_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_dark_carrier_network_change_animation },
+ { R.drawable.stat_sys_signal_dark_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_dark_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_dark_carrier_network_change_animation,
+ R.drawable.stat_sys_signal_dark_carrier_network_change_animation }
+ };
+
+ static final int[][] QS_TELEPHONY_CARRIER_NETWORK_CHANGE = {
+ { R.drawable.ic_qs_signal_carrier_network_change_animation,
+ R.drawable.ic_qs_signal_carrier_network_change_animation,
+ R.drawable.ic_qs_signal_carrier_network_change_animation,
+ R.drawable.ic_qs_signal_carrier_network_change_animation,
+ R.drawable.ic_qs_signal_carrier_network_change_animation },
+ { R.drawable.ic_qs_signal_carrier_network_change_animation,
+ R.drawable.ic_qs_signal_carrier_network_change_animation,
+ R.drawable.ic_qs_signal_carrier_network_change_animation,
+ R.drawable.ic_qs_signal_carrier_network_change_animation,
+ R.drawable.ic_qs_signal_carrier_network_change_animation }
+ };
+
static final int[] QS_DATA_R = {
R.drawable.ic_qs_signal_r,
R.drawable.ic_qs_signal_r
@@ -202,11 +238,34 @@
static final int ICON_3G = R.drawable.stat_sys_data_fully_connected_3g;
static final int ICON_4G = R.drawable.stat_sys_data_fully_connected_4g;
static final int ICON_1X = R.drawable.stat_sys_data_fully_connected_1x;
+ static final int ICON_CARRIER_NETWORK_CHANGE =
+ R.drawable.stat_sys_signal_carrier_network_change_animation;
+ static final int ICON_CARRIER_NETWORK_CHANGE_DARK =
+ R.drawable.stat_sys_signal_dark_carrier_network_change_animation;
static final int QS_ICON_LTE = R.drawable.ic_qs_signal_lte;
static final int QS_ICON_3G = R.drawable.ic_qs_signal_3g;
static final int QS_ICON_4G = R.drawable.ic_qs_signal_4g;
static final int QS_ICON_1X = R.drawable.ic_qs_signal_1x;
+ static final int QS_ICON_CARRIER_NETWORK_CHANGE =
+ R.drawable.ic_qs_signal_carrier_network_change_animation;
+
+ static final MobileIconGroup CARRIER_NETWORK_CHANGE = new MobileIconGroup(
+ "CARRIER_NETWORK_CHANGE",
+ TelephonyIcons.TELEPHONY_CARRIER_NETWORK_CHANGE,
+ TelephonyIcons.TELEPHONY_CARRIER_NETWORK_CHANGE_DARK,
+ TelephonyIcons.QS_TELEPHONY_CARRIER_NETWORK_CHANGE,
+ AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
+ 0, 0,
+ TelephonyIcons.ICON_CARRIER_NETWORK_CHANGE,
+ TelephonyIcons.ICON_CARRIER_NETWORK_CHANGE_DARK,
+ TelephonyIcons.QS_ICON_CARRIER_NETWORK_CHANGE,
+ AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
+ R.string.accessibility_carrier_network_change_mode,
+ 0,
+ false,
+ null
+ );
static final MobileIconGroup THREE_G = new MobileIconGroup(
"3G",
diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
index 818f5ee..240c210 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
@@ -60,7 +60,7 @@
// Avoid kicking notifications when getting early metadata before
// mounted. If already mounted, we're being kicked because of a
// nickname or init'ed change.
- if (vol.getState() == VolumeInfo.STATE_MOUNTED) {
+ if (vol.isMountedReadable()) {
onVolumeStateChangedInternal(vol, vol.getState(), vol.getState());
}
}
@@ -100,68 +100,75 @@
Log.d(TAG, vol.toString());
- // New state means we tear down any old notifications
- mNotificationManager.cancelAsUser(vol.getId(), NOTIF_ID, UserHandle.ALL);
-
+ final Notification notif;
switch (newState) {
case VolumeInfo.STATE_UNMOUNTED:
- onVolumeUnmounted(vol);
+ notif = onVolumeUnmounted(vol);
break;
- case VolumeInfo.STATE_MOUNTING:
- onVolumeMounting(vol);
+ case VolumeInfo.STATE_CHECKING:
+ notif = onVolumeChecking(vol);
break;
case VolumeInfo.STATE_MOUNTED:
- onVolumeMounted(vol);
+ case VolumeInfo.STATE_MOUNTED_READ_ONLY:
+ notif = onVolumeMounted(vol);
break;
case VolumeInfo.STATE_FORMATTING:
- onVolumeFormatting(vol);
+ notif = onVolumeFormatting(vol);
break;
- case VolumeInfo.STATE_UNMOUNTING:
- onVolumeUnmounting(vol);
+ case VolumeInfo.STATE_EJECTING:
+ notif = onVolumeEjecting(vol);
break;
case VolumeInfo.STATE_UNMOUNTABLE:
- onVolumeUnmountable(vol);
+ notif = onVolumeUnmountable(vol);
break;
case VolumeInfo.STATE_REMOVED:
- onVolumeRemoved(vol);
+ notif = onVolumeRemoved(vol);
break;
+ case VolumeInfo.STATE_BAD_REMOVAL:
+ notif = onVolumeBadRemoval(vol);
+ break;
+ default:
+ notif = null;
+ break;
+ }
+
+ if (notif != null) {
+ mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL);
+ } else {
+ mNotificationManager.cancelAsUser(vol.getId(), NOTIF_ID, UserHandle.ALL);
}
}
- private void onVolumeUnmounted(VolumeInfo vol) {
+ private Notification onVolumeUnmounted(VolumeInfo vol) {
// Ignored
+ return null;
}
- private void onVolumeMounting(VolumeInfo vol) {
- final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId());
+ private Notification onVolumeChecking(VolumeInfo vol) {
+ final DiskInfo disk = vol.getDisk();
final CharSequence title = mContext.getString(
R.string.ext_media_checking_notification_title, disk.getDescription());
final CharSequence text = mContext.getString(
R.string.ext_media_checking_notification_message, disk.getDescription());
- final Notification notif = buildNotificationBuilder(title, text)
- .setSmallIcon(R.drawable.stat_notify_sdcard_prepare)
+ return buildNotificationBuilder(vol, title, text)
.setCategory(Notification.CATEGORY_PROGRESS)
.setPriority(Notification.PRIORITY_LOW)
.setOngoing(true)
.build();
-
- mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL);
}
- private void onVolumeMounted(VolumeInfo vol) {
+ private Notification onVolumeMounted(VolumeInfo vol) {
// Don't annoy when user dismissed in past
- if (vol.isSnoozed()) return;
+ if (vol.isSnoozed()) return null;
- final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId());
- final Notification notif;
+ final DiskInfo disk = vol.getDisk();
if (disk.isAdoptable() && !vol.isInited()) {
final CharSequence title = disk.getDescription();
final CharSequence text = mContext.getString(
R.string.ext_media_new_notification_message, disk.getDescription());
- notif = buildNotificationBuilder(title, text)
- .setSmallIcon(R.drawable.stat_notify_sdcard)
+ return buildNotificationBuilder(vol, title, text)
.addAction(new Action(0, mContext.getString(R.string.ext_media_init_action),
buildInitPendingIntent(vol)))
.addAction(new Action(0, mContext.getString(R.string.ext_media_unmount_action),
@@ -175,8 +182,7 @@
final CharSequence text = mContext.getString(
R.string.ext_media_ready_notification_message, disk.getDescription());
- notif = buildNotificationBuilder(title, text)
- .setSmallIcon(R.drawable.stat_notify_sdcard)
+ return buildNotificationBuilder(vol, title, text)
.addAction(new Action(0, mContext.getString(R.string.ext_media_browse_action),
buildBrowsePendingIntent(vol)))
.addAction(new Action(0, mContext.getString(R.string.ext_media_unmount_action),
@@ -186,69 +192,94 @@
.setPriority(Notification.PRIORITY_LOW)
.build();
}
-
- mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL);
}
- private void onVolumeFormatting(VolumeInfo vol) {
+ private Notification onVolumeFormatting(VolumeInfo vol) {
// Ignored
+ return null;
}
- private void onVolumeUnmounting(VolumeInfo vol) {
- final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId());
+ private Notification onVolumeEjecting(VolumeInfo vol) {
+ final DiskInfo disk = vol.getDisk();
final CharSequence title = mContext.getString(
R.string.ext_media_unmounting_notification_title, disk.getDescription());
final CharSequence text = mContext.getString(
R.string.ext_media_unmounting_notification_message, disk.getDescription());
- final Notification notif = buildNotificationBuilder(title, text)
- .setSmallIcon(R.drawable.stat_notify_sdcard_prepare)
+ return buildNotificationBuilder(vol, title, text)
.setCategory(Notification.CATEGORY_PROGRESS)
.setPriority(Notification.PRIORITY_LOW)
.setOngoing(true)
.build();
-
- mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL);
}
- private void onVolumeUnmountable(VolumeInfo vol) {
- final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId());
+ private Notification onVolumeUnmountable(VolumeInfo vol) {
+ final DiskInfo disk = vol.getDisk();
final CharSequence title = mContext.getString(
R.string.ext_media_unmountable_notification_title, disk.getDescription());
final CharSequence text = mContext.getString(
R.string.ext_media_unmountable_notification_message, disk.getDescription());
- final Notification notif = buildNotificationBuilder(title, text)
- .setSmallIcon(R.drawable.stat_notify_sdcard)
+ return buildNotificationBuilder(vol, title, text)
.setContentIntent(buildDetailsPendingIntent(vol))
.setCategory(Notification.CATEGORY_ERROR)
.build();
-
- mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL);
}
- private void onVolumeRemoved(VolumeInfo vol) {
+ private Notification onVolumeRemoved(VolumeInfo vol) {
if (!vol.isPrimary()) {
// Ignore non-primary media
- return;
+ return null;
}
- final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId());
+ final DiskInfo disk = vol.getDisk();
final CharSequence title = mContext.getString(
R.string.ext_media_nomedia_notification_title, disk.getDescription());
final CharSequence text = mContext.getString(
R.string.ext_media_nomedia_notification_message, disk.getDescription());
- final Notification notif = buildNotificationBuilder(title, text)
- .setSmallIcon(R.drawable.stat_notify_sdcard)
+ return buildNotificationBuilder(vol, title, text)
.setCategory(Notification.CATEGORY_ERROR)
.build();
-
- mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL);
}
- private Notification.Builder buildNotificationBuilder(CharSequence title, CharSequence text) {
+ private Notification onVolumeBadRemoval(VolumeInfo vol) {
+ if (!vol.isPrimary()) {
+ // Ignore non-primary media
+ return null;
+ }
+
+ final DiskInfo disk = vol.getDisk();
+ final CharSequence title = mContext.getString(
+ R.string.ext_media_badremoval_notification_title, disk.getDescription());
+ final CharSequence text = mContext.getString(
+ R.string.ext_media_badremoval_notification_message, disk.getDescription());
+
+ return buildNotificationBuilder(vol, title, text)
+ .setCategory(Notification.CATEGORY_ERROR)
+ .build();
+ }
+
+ private int getSmallIcon(VolumeInfo vol) {
+ if (vol.disk.isSd()) {
+ switch (vol.getState()) {
+ case VolumeInfo.STATE_CHECKING:
+ case VolumeInfo.STATE_EJECTING:
+ return R.drawable.stat_notify_sdcard_prepare;
+ default:
+ return R.drawable.stat_notify_sdcard;
+ }
+ } else if (vol.disk.isUsb()) {
+ return R.drawable.stat_sys_data_usb;
+ } else {
+ return R.drawable.stat_notify_sdcard;
+ }
+ }
+
+ private Notification.Builder buildNotificationBuilder(VolumeInfo vol, CharSequence title,
+ CharSequence text) {
return new Notification.Builder(mContext)
+ .setSmallIcon(getSmallIcon(vol))
.setColor(mContext.getColor(R.color.system_notification_accent_color))
.setContentTitle(title)
.setContentText(text)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
deleted file mode 100644
index 45cb4a1..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
+++ /dev/null
@@ -1,1538 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.volume;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.pm.ServiceInfo;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.ColorDrawable;
-import android.media.AudioAttributes;
-import android.media.AudioManager;
-import android.media.AudioSystem;
-import android.media.RingtoneManager;
-import android.media.ToneGenerator;
-import android.media.VolumeProvider;
-import android.media.session.MediaController;
-import android.media.session.MediaController.PlaybackInfo;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Debug;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Vibrator;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.AnimationUtils;
-import android.view.animation.Interpolator;
-import android.widget.ImageView;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-
-import com.android.internal.R;
-import com.android.systemui.DemoMode;
-import com.android.systemui.statusbar.policy.ZenModeController;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-/**
- * Handles the user interface for the volume keys.
- *
- * @hide
- */
-public class VolumePanel extends Handler implements DemoMode {
- private static final String TAG = "VolumePanel";
- private static boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
-
- private static final int PLAY_SOUND_DELAY = AudioSystem.PLAY_SOUND_DELAY;
-
- /**
- * The delay before vibrating. This small period exists so if the user is
- * moving to silent mode, it will not emit a short vibrate (it normally
- * would since vibrate is between normal mode and silent mode using hardware
- * keys).
- */
- public static final int VIBRATE_DELAY = 300;
-
- private static final int VIBRATE_DURATION = 300;
- private static final int BEEP_DURATION = 150;
- private static final int MAX_VOLUME = 100;
- private static final int FREE_DELAY = 10000;
- private static final int TIMEOUT_DELAY = 3000;
- private static final int TIMEOUT_DELAY_SHORT = 1500;
- private static final int TIMEOUT_DELAY_COLLAPSED = 4500;
- private static final int TIMEOUT_DELAY_SAFETY_WARNING = 5000;
- private static final int TIMEOUT_DELAY_EXPANDED = 10000;
-
- private static final int MSG_VOLUME_CHANGED = 0;
- private static final int MSG_FREE_RESOURCES = 1;
- private static final int MSG_PLAY_SOUND = 2;
- private static final int MSG_STOP_SOUNDS = 3;
- private static final int MSG_VIBRATE = 4;
- private static final int MSG_TIMEOUT = 5;
- private static final int MSG_RINGER_MODE_CHANGED = 6;
- private static final int MSG_MUTE_CHANGED = 7;
- private static final int MSG_REMOTE_VOLUME_CHANGED = 8;
- private static final int MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN = 9;
- private static final int MSG_SLIDER_VISIBILITY_CHANGED = 10;
- private static final int MSG_DISPLAY_SAFE_VOLUME_WARNING = 11;
- private static final int MSG_LAYOUT_DIRECTION = 12;
- private static final int MSG_ZEN_MODE_AVAILABLE_CHANGED = 13;
- private static final int MSG_USER_ACTIVITY = 14;
- private static final int MSG_NOTIFICATION_EFFECTS_SUPPRESSOR_CHANGED = 15;
- private static final int MSG_INTERNAL_RINGER_MODE_CHANGED = 16;
-
- // Pseudo stream type for remote volume
- private static final int STREAM_REMOTE_MUSIC = -200;
-
- private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
- .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
- .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
- .build();
-
- private static final int IC_AUDIO_VOL = com.android.systemui.R.drawable.ic_audio_vol;
- private static final int IC_AUDIO_VOL_MUTE = com.android.systemui.R.drawable.ic_audio_vol_mute;
- private static final int IC_AUDIO_BT = com.android.systemui.R.drawable.ic_audio_bt;
- private static final int IC_AUDIO_BT_MUTE = com.android.systemui.R.drawable.ic_audio_bt_mute;
-
- private final String mTag;
- protected final Context mContext;
- private final AudioManager mAudioManager;
- private final ZenModeController mZenController;
- private boolean mRingIsSilent;
- private boolean mVoiceCapable;
- private boolean mZenModeAvailable;
- private boolean mZenPanelExpanded;
- private int mTimeoutDelay = TIMEOUT_DELAY;
- private float mDisabledAlpha;
- private int mLastRingerMode = AudioManager.RINGER_MODE_NORMAL;
- private int mLastRingerProgress = 0;
- private int mDemoIcon;
-
- /** Volume panel content view */
- private final View mView;
- /** Dialog hosting the panel */
- private final Dialog mDialog;
-
- /** The visible portion of the volume overlay */
- private final ViewGroup mPanel;
- /** Contains the slider and its touchable icons */
- private final ViewGroup mSliderPanel;
- /** The zen mode configuration panel view */
- private ZenModePanel mZenPanel;
- /** The component currently suppressing notification stream effects */
- private ComponentName mNotificationEffectsSuppressor;
-
- private Callback mCallback;
-
- /** Currently active stream that shows up at the top of the list of sliders */
- private int mActiveStreamType = -1;
- /** All the slider controls mapped by stream type */
- private SparseArray<StreamControl> mStreamControls;
- private final AccessibilityManager mAccessibilityManager;
- private final SecondaryIconTransition mSecondaryIconTransition;
- private final IconPulser mIconPulser;
-
- private enum StreamResources {
- BluetoothSCOStream(AudioManager.STREAM_BLUETOOTH_SCO,
- R.string.volume_icon_description_bluetooth,
- IC_AUDIO_BT,
- IC_AUDIO_BT_MUTE,
- false),
- RingerStream(AudioManager.STREAM_RING,
- R.string.volume_icon_description_ringer,
- com.android.systemui.R.drawable.ic_ringer_audible,
- com.android.systemui.R.drawable.ic_ringer_mute,
- false),
- VoiceStream(AudioManager.STREAM_VOICE_CALL,
- R.string.volume_icon_description_incall,
- com.android.systemui.R.drawable.ic_audio_phone,
- com.android.systemui.R.drawable.ic_audio_phone,
- false),
- AlarmStream(AudioManager.STREAM_ALARM,
- R.string.volume_alarm,
- com.android.systemui.R.drawable.ic_audio_alarm,
- com.android.systemui.R.drawable.ic_audio_alarm_mute,
- false),
- MediaStream(AudioManager.STREAM_MUSIC,
- R.string.volume_icon_description_media,
- IC_AUDIO_VOL,
- IC_AUDIO_VOL_MUTE,
- true),
- NotificationStream(AudioManager.STREAM_NOTIFICATION,
- R.string.volume_icon_description_notification,
- com.android.systemui.R.drawable.ic_ringer_audible,
- com.android.systemui.R.drawable.ic_ringer_mute,
- true),
- RemoteStream(STREAM_REMOTE_MUSIC,
- R.string.volume_icon_description_media, //FIXME should have its own description
- com.android.systemui.R.drawable.ic_audio_remote,
- com.android.systemui.R.drawable.ic_audio_remote,
- false);// will be dynamically updated
-
- int streamType;
- int descRes;
- int iconRes;
- int iconMuteRes;
- // RING, VOICE_CALL & BLUETOOTH_SCO are hidden unless explicitly requested
- boolean show;
-
- StreamResources(int streamType, int descRes, int iconRes, int iconMuteRes, boolean show) {
- this.streamType = streamType;
- this.descRes = descRes;
- this.iconRes = iconRes;
- this.iconMuteRes = iconMuteRes;
- this.show = show;
- }
- }
-
- // List of stream types and their order
- private static final StreamResources[] STREAMS = {
- StreamResources.BluetoothSCOStream,
- StreamResources.RingerStream,
- StreamResources.VoiceStream,
- StreamResources.MediaStream,
- StreamResources.NotificationStream,
- StreamResources.AlarmStream,
- StreamResources.RemoteStream
- };
-
- /** Object that contains data for each slider */
- private class StreamControl {
- int streamType;
- MediaController controller;
- ViewGroup group;
- ImageView icon;
- SeekBar seekbarView;
- TextView suppressorView;
- View divider;
- ImageView secondaryIcon;
- int iconRes;
- int iconMuteRes;
- int iconSuppressedRes;
- int minVolume;
- }
-
- // Synchronize when accessing this
- private ToneGenerator mToneGenerators[];
- private Vibrator mVibrator;
- private boolean mHasVibrator;
-
- private static AlertDialog sSafetyWarning;
- private static Object sSafetyWarningLock = new Object();
-
- protected LayoutParams getDialogLayoutParams(Window window, Resources res) {
- final LayoutParams lp = window.getAttributes();
- lp.token = null;
- lp.y = res.getDimensionPixelOffset(com.android.systemui.R.dimen.volume_panel_top);
- lp.type = LayoutParams.TYPE_STATUS_BAR_PANEL;
- lp.format = PixelFormat.TRANSLUCENT;
- lp.windowAnimations = com.android.systemui.R.style.VolumePanelAnimation;
- lp.setTitle(TAG);
- return lp;
- }
-
- public VolumePanel(Context context, ZenModeController zenController) {
- mTag = String.format("%s.%08x", TAG, hashCode());
- mContext = context;
- mZenController = zenController;
- mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
- mAccessibilityManager = (AccessibilityManager) context.getSystemService(
- Context.ACCESSIBILITY_SERVICE);
- mSecondaryIconTransition = new SecondaryIconTransition();
- mIconPulser = new IconPulser(context);
-
- if (LOGD) Log.d(mTag, "new VolumePanel");
-
- mDisabledAlpha = 0.5f;
- if (mContext.getTheme() != null) {
- final TypedArray arr = mContext.getTheme().obtainStyledAttributes(
- new int[] { android.R.attr.disabledAlpha });
- mDisabledAlpha = arr.getFloat(0, mDisabledAlpha);
- arr.recycle();
- }
-
- mDialog = new Dialog(context) {
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (isShowing() && event.getAction() == MotionEvent.ACTION_OUTSIDE &&
- sSafetyWarning == null) {
- forceTimeout(0);
- return true;
- }
- return false;
- }
- };
-
- final Window window = mDialog.getWindow();
- window.requestFeature(Window.FEATURE_NO_TITLE);
- mDialog.setCanceledOnTouchOutside(true);
- mDialog.setContentView(com.android.systemui.R.layout.volume_panel_dialog);
- mDialog.setOnDismissListener(new OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- mActiveStreamType = -1;
- mAudioManager.forceVolumeControlStream(mActiveStreamType);
- setZenPanelVisible(false);
- mDemoIcon = 0;
- mSecondaryIconTransition.cancel();
- }
- });
-
- mDialog.create();
-
- final Resources res = context.getResources();
- window.setAttributes(getDialogLayoutParams(window, res));
-
- updateWidth();
-
- window.setBackgroundDrawable(new ColorDrawable(0x00000000));
- window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
- window.addFlags(LayoutParams.FLAG_NOT_FOCUSABLE
- | LayoutParams.FLAG_NOT_TOUCH_MODAL
- | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- | LayoutParams.FLAG_HARDWARE_ACCELERATED);
- mView = window.findViewById(R.id.content);
- Interaction.register(mView, new Interaction.Callback() {
- @Override
- public void onInteraction() {
- resetTimeout();
- }
- });
-
- mPanel = (ViewGroup) mView.findViewById(com.android.systemui.R.id.visible_panel);
- mSliderPanel = (ViewGroup) mView.findViewById(com.android.systemui.R.id.slider_panel);
- mZenPanel = (ZenModePanel) mView.findViewById(com.android.systemui.R.id.zen_mode_panel);
- initZenModePanel();
-
- mToneGenerators = new ToneGenerator[AudioSystem.getNumStreamTypes()];
- mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
- mHasVibrator = mVibrator != null && mVibrator.hasVibrator();
- mVoiceCapable = context.getResources().getBoolean(R.bool.config_voice_capable);
-
- if (mZenController != null) {
- mZenModeAvailable = mZenController.isZenAvailable();
- mNotificationEffectsSuppressor = mZenController.getEffectsSuppressor();
- mZenController.addCallback(mZenCallback);
- }
-
- registerReceiver();
- }
-
- public void onConfigurationChanged(Configuration newConfig) {
- updateWidth();
- if (mZenPanel != null) {
- mZenPanel.updateLocale();
- }
- }
-
- private void updateWidth() {
- final Resources res = mContext.getResources();
- final LayoutParams lp = mDialog.getWindow().getAttributes();
- lp.width = res.getDimensionPixelSize(com.android.systemui.R.dimen.notification_panel_width);
- lp.gravity =
- res.getInteger(com.android.systemui.R.integer.notification_panel_layout_gravity);
- mDialog.getWindow().setAttributes(lp);
- }
-
- public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- pw.println("VolumePanel state:");
- pw.print(" mTag="); pw.println(mTag);
- pw.print(" mRingIsSilent="); pw.println(mRingIsSilent);
- pw.print(" mVoiceCapable="); pw.println(mVoiceCapable);
- pw.print(" mHasVibrator="); pw.println(mHasVibrator);
- pw.print(" mZenModeAvailable="); pw.println(mZenModeAvailable);
- pw.print(" mZenPanelExpanded="); pw.println(mZenPanelExpanded);
- pw.print(" mNotificationEffectsSuppressor="); pw.println(mNotificationEffectsSuppressor);
- pw.print(" mTimeoutDelay="); pw.println(mTimeoutDelay);
- pw.print(" mDisabledAlpha="); pw.println(mDisabledAlpha);
- pw.print(" mLastRingerMode="); pw.println(mLastRingerMode);
- pw.print(" mLastRingerProgress="); pw.println(mLastRingerProgress);
- pw.print(" isShowing()="); pw.println(isShowing());
- pw.print(" mCallback="); pw.println(mCallback);
- pw.print(" sConfirmSafeVolumeDialog=");
- pw.println(sSafetyWarning != null ? "<not null>" : null);
- pw.print(" mActiveStreamType="); pw.println(mActiveStreamType);
- pw.print(" mStreamControls=");
- if (mStreamControls == null) {
- pw.println("null");
- } else {
- final int N = mStreamControls.size();
- pw.print("<size "); pw.print(N); pw.println('>');
- for (int i = 0; i < N; i++) {
- final StreamControl sc = mStreamControls.valueAt(i);
- pw.print(" stream "); pw.print(sc.streamType); pw.print(":");
- if (sc.seekbarView != null) {
- pw.print(" progress="); pw.print(sc.seekbarView.getProgress());
- pw.print(" of "); pw.print(sc.seekbarView.getMax());
- if (!sc.seekbarView.isEnabled()) pw.print(" (disabled)");
- }
- if (sc.icon != null && sc.icon.isClickable()) pw.print(" (clickable)");
- pw.println();
- }
- }
- if (mZenPanel != null) {
- mZenPanel.dump(fd, pw, args);
- }
- }
-
- private void initZenModePanel() {
- mZenPanel.init(mZenController);
- mZenPanel.setCallback(new ZenModePanel.Callback() {
- @Override
- public void onMoreSettings() {
- if (mCallback != null) {
- mCallback.onZenSettings();
- }
- }
-
- @Override
- public void onPrioritySettings() {
- if (mCallback != null) {
- mCallback.onZenPrioritySettings();
- }
- }
-
- @Override
- public void onInteraction() {
- resetTimeout();
- }
-
- @Override
- public void onExpanded(boolean expanded) {
- if (mZenPanelExpanded == expanded) return;
- mZenPanelExpanded = expanded;
- updateTimeoutDelay();
- resetTimeout();
- }
- });
- }
-
- private void setLayoutDirection(int layoutDirection) {
- mPanel.setLayoutDirection(layoutDirection);
- updateStates();
- }
-
- private void registerReceiver() {
- final IntentFilter filter = new IntentFilter();
- filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
- filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
- filter.addAction(Intent.ACTION_SCREEN_OFF);
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
-
- if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) {
- removeMessages(MSG_RINGER_MODE_CHANGED);
- sendEmptyMessage(MSG_RINGER_MODE_CHANGED);
- }
-
- if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
- removeMessages(MSG_INTERNAL_RINGER_MODE_CHANGED);
- sendEmptyMessage(MSG_INTERNAL_RINGER_MODE_CHANGED);
- }
-
- if (Intent.ACTION_SCREEN_OFF.equals(action)) {
- postDismiss(0);
- }
- }
- }, filter);
- }
-
- private boolean isMuted(int streamType) {
- if (streamType == STREAM_REMOTE_MUSIC) {
- // TODO do we need to support a distinct mute property for remote?
- return false;
- } else {
- return mAudioManager.isStreamMute(streamType);
- }
- }
-
- private int getStreamMinVolume(int streamType) {
- if (streamType == STREAM_REMOTE_MUSIC) {
- return 0;
- } else {
- return mAudioManager.getStreamMinVolume(streamType);
- }
- }
-
- private int getStreamMaxVolume(int streamType) {
- if (streamType == STREAM_REMOTE_MUSIC) {
- if (mStreamControls != null) {
- StreamControl sc = mStreamControls.get(streamType);
- if (sc != null && sc.controller != null) {
- PlaybackInfo ai = sc.controller.getPlaybackInfo();
- return ai.getMaxVolume();
- }
- }
- return -1;
- } else {
- return mAudioManager.getStreamMaxVolume(streamType);
- }
- }
-
- private int getStreamVolume(int streamType) {
- if (streamType == STREAM_REMOTE_MUSIC) {
- if (mStreamControls != null) {
- StreamControl sc = mStreamControls.get(streamType);
- if (sc != null && sc.controller != null) {
- PlaybackInfo ai = sc.controller.getPlaybackInfo();
- return ai.getCurrentVolume();
- }
- }
- return -1;
- } else {
- return mAudioManager.getLastAudibleStreamVolume(streamType);
- }
- }
-
- private void setStreamVolume(StreamControl sc, int index, int flags) {
- if (sc.streamType == STREAM_REMOTE_MUSIC) {
- if (sc.controller != null) {
- sc.controller.setVolumeTo(index, flags);
- } else {
- Log.w(mTag, "Adjusting remote volume without a controller!");
- }
- } else if (getStreamVolume(sc.streamType) != index) {
- mAudioManager.setStreamVolume(sc.streamType, index, flags);
- }
- }
-
- private void createSliders() {
- final Resources res = mContext.getResources();
- final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
-
- mStreamControls = new SparseArray<StreamControl>(STREAMS.length);
-
- final StreamResources notificationStream = StreamResources.NotificationStream;
- for (int i = 0; i < STREAMS.length; i++) {
- StreamResources streamRes = STREAMS[i];
-
- final int streamType = streamRes.streamType;
- final boolean isNotification = isNotificationOrRing(streamType);
-
- final StreamControl sc = new StreamControl();
- sc.streamType = streamType;
- sc.group = (ViewGroup) inflater.inflate(
- com.android.systemui.R.layout.volume_panel_item, null);
- sc.group.setTag(sc);
- sc.icon = (ImageView) sc.group.findViewById(com.android.systemui.R.id.stream_icon);
- sc.icon.setTag(sc);
- sc.icon.setContentDescription(res.getString(streamRes.descRes));
- sc.iconRes = streamRes.iconRes;
- sc.iconMuteRes = streamRes.iconMuteRes;
- sc.icon.setImageResource(sc.iconRes);
- sc.icon.setClickable(isNotification && mHasVibrator);
- if (isNotification) {
- if (mHasVibrator) {
- sc.icon.setSoundEffectsEnabled(false);
- sc.iconMuteRes = com.android.systemui.R.drawable.ic_ringer_vibrate;
- sc.icon.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- resetTimeout();
- toggleRinger(sc);
- }
- });
- }
- sc.iconSuppressedRes = com.android.systemui.R.drawable.ic_ringer_mute;
- }
- sc.seekbarView = (SeekBar) sc.group.findViewById(com.android.systemui.R.id.seekbar);
- sc.suppressorView =
- (TextView) sc.group.findViewById(com.android.systemui.R.id.suppressor);
- sc.suppressorView.setVisibility(View.GONE);
- final boolean showSecondary = !isNotification && notificationStream.show;
- sc.divider = sc.group.findViewById(com.android.systemui.R.id.divider);
- sc.secondaryIcon = (ImageView) sc.group
- .findViewById(com.android.systemui.R.id.secondary_icon);
- sc.secondaryIcon.setImageResource(com.android.systemui.R.drawable.ic_ringer_audible);
- sc.secondaryIcon.setContentDescription(res.getString(notificationStream.descRes));
- sc.secondaryIcon.setClickable(showSecondary);
- sc.divider.setVisibility(showSecondary ? View.VISIBLE : View.GONE);
- sc.secondaryIcon.setVisibility(showSecondary ? View.VISIBLE : View.GONE);
- if (showSecondary) {
- sc.secondaryIcon.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- mSecondaryIconTransition.start(sc);
- }
- });
- }
- sc.minVolume = getStreamMinVolume(streamType);
- sc.seekbarView.setMax(getStreamMaxVolume(streamType) - sc.minVolume);
- sc.seekbarView.setOnSeekBarChangeListener(mSeekListener);
- sc.seekbarView.setTag(sc);
- mStreamControls.put(streamType, sc);
- }
- }
-
- private void toggleRinger(StreamControl sc) {
- if (!mHasVibrator) return;
- if (mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_NORMAL) {
- mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_VIBRATE);
- postVolumeChanged(sc.streamType, AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE);
- } else {
- mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL);
- postVolumeChanged(sc.streamType, AudioManager.FLAG_PLAY_SOUND);
- }
- }
-
- private void reorderSliders(int activeStreamType) {
- mSliderPanel.removeAllViews();
-
- final StreamControl active = mStreamControls.get(activeStreamType);
- if (active == null) {
- Log.e(TAG, "Missing stream type! - " + activeStreamType);
- mActiveStreamType = -1;
- } else {
- mSliderPanel.addView(active.group);
- mActiveStreamType = activeStreamType;
- active.group.setVisibility(View.VISIBLE);
- updateSlider(active, true /*forceReloadIcon*/);
- updateTimeoutDelay();
- updateZenPanelVisible();
- }
- }
-
- private void updateSliderProgress(StreamControl sc, int progress) {
- final boolean isRinger = isNotificationOrRing(sc.streamType);
- if (isRinger && mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) {
- progress = mLastRingerProgress;
- }
- if (progress < 0) {
- progress = getStreamVolume(sc.streamType);
- }
- sc.seekbarView.setProgress(progress - sc.minVolume);
- if (isRinger) {
- mLastRingerProgress = progress;
- }
- }
-
- private void updateSliderIcon(StreamControl sc, boolean muted) {
- ComponentName suppressor = null;
- if (isNotificationOrRing(sc.streamType)) {
- suppressor = mNotificationEffectsSuppressor;
- int ringerMode = mAudioManager.getRingerModeInternal();
- if (ringerMode == AudioManager.RINGER_MODE_SILENT) {
- ringerMode = mLastRingerMode;
- } else {
- mLastRingerMode = ringerMode;
- }
- if (mHasVibrator) {
- muted = ringerMode == AudioManager.RINGER_MODE_VIBRATE;
- } else {
- muted = false;
- }
- }
- sc.icon.setImageResource(mDemoIcon != 0 ? mDemoIcon
- : suppressor != null ? sc.iconSuppressedRes
- : muted ? sc.iconMuteRes
- : sc.iconRes);
- }
-
- private void updateSliderSuppressor(StreamControl sc) {
- final ComponentName suppressor = isNotificationOrRing(sc.streamType)
- ? mNotificationEffectsSuppressor : null;
- if (suppressor == null) {
- sc.seekbarView.setVisibility(View.VISIBLE);
- sc.suppressorView.setVisibility(View.GONE);
- } else {
- sc.seekbarView.setVisibility(View.GONE);
- sc.suppressorView.setVisibility(View.VISIBLE);
- sc.suppressorView.setText(mContext.getString(R.string.muted_by,
- getSuppressorCaption(suppressor)));
- }
- }
-
- private String getSuppressorCaption(ComponentName suppressor) {
- final PackageManager pm = mContext.getPackageManager();
- try {
- final ServiceInfo info = pm.getServiceInfo(suppressor, 0);
- if (info != null) {
- final CharSequence seq = info.loadLabel(pm);
- if (seq != null) {
- final String str = seq.toString().trim();
- if (str.length() > 0) {
- return str;
- }
- }
- }
- } catch (Throwable e) {
- Log.w(TAG, "Error loading suppressor caption", e);
- }
- return suppressor.getPackageName();
- }
-
- /** Update the mute and progress state of a slider */
- private void updateSlider(StreamControl sc, boolean forceReloadIcon) {
- updateSliderProgress(sc, -1);
- final boolean muted = isMuted(sc.streamType);
- if (forceReloadIcon) {
- sc.icon.setImageDrawable(null);
- }
- updateSliderIcon(sc, muted);
- updateSliderEnabled(sc, muted, false);
- updateSliderSuppressor(sc);
- }
-
- private void updateSliderEnabled(final StreamControl sc, boolean muted, boolean fixedVolume) {
- final boolean wasEnabled = sc.seekbarView.isEnabled();
- final boolean isRinger = isNotificationOrRing(sc.streamType);
- if (sc.streamType == STREAM_REMOTE_MUSIC) {
- // never disable touch interactions for remote playback, the muting is not tied to
- // the state of the phone.
- sc.seekbarView.setEnabled(!fixedVolume);
- } else if (isRinger && mNotificationEffectsSuppressor != null) {
- sc.icon.setEnabled(true);
- sc.icon.setAlpha(1f);
- sc.icon.setClickable(false);
- } else if (isRinger
- && mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) {
- sc.seekbarView.setEnabled(false);
- sc.icon.setEnabled(false);
- sc.icon.setAlpha(mDisabledAlpha);
- sc.icon.setClickable(false);
- } else if (fixedVolume ||
- (sc.streamType != mAudioManager.getUiSoundsStreamType() && !isRinger && muted) ||
- (sSafetyWarning != null)) {
- sc.seekbarView.setEnabled(false);
- } else {
- sc.seekbarView.setEnabled(true);
- sc.icon.setEnabled(true);
- sc.icon.setAlpha(1f);
- }
- // show the silent hint when the disabled slider is touched in silent mode
- if (isRinger && wasEnabled != sc.seekbarView.isEnabled()) {
- if (sc.seekbarView.isEnabled()) {
- sc.group.setOnTouchListener(null);
- sc.icon.setClickable(mHasVibrator);
- } else {
- final View.OnTouchListener showHintOnTouch = new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- resetTimeout();
- showSilentHint();
- return false;
- }
- };
- sc.group.setOnTouchListener(showHintOnTouch);
- }
- }
- }
-
- private void showSilentHint() {
- if (mZenPanel != null) {
- mZenPanel.showSilentHint();
- }
- }
-
- private void showVibrateHint() {
- final StreamControl active = mStreamControls.get(mActiveStreamType);
- if (active != null) {
- mIconPulser.start(active.icon);
- if (!hasMessages(MSG_VIBRATE)) {
- sendEmptyMessageDelayed(MSG_VIBRATE, VIBRATE_DELAY);
- }
- }
- }
-
- private static boolean isNotificationOrRing(int streamType) {
- return streamType == AudioManager.STREAM_RING
- || streamType == AudioManager.STREAM_NOTIFICATION;
- }
-
- public void setCallback(Callback callback) {
- mCallback = callback;
- }
-
- private void updateTimeoutDelay() {
- mTimeoutDelay = mDemoIcon != 0 ? TIMEOUT_DELAY_EXPANDED
- : sSafetyWarning != null ? TIMEOUT_DELAY_SAFETY_WARNING
- : mActiveStreamType == AudioManager.STREAM_MUSIC ? TIMEOUT_DELAY_SHORT
- : mZenPanelExpanded ? TIMEOUT_DELAY_EXPANDED
- : isZenPanelVisible() ? TIMEOUT_DELAY_COLLAPSED
- : TIMEOUT_DELAY;
- }
-
- private boolean isZenPanelVisible() {
- return mZenPanel != null && mZenPanel.getVisibility() == View.VISIBLE;
- }
-
- private void setZenPanelVisible(boolean visible) {
- if (LOGD) Log.d(mTag, "setZenPanelVisible " + visible + " mZenPanel=" + mZenPanel);
- final boolean changing = visible != isZenPanelVisible();
- if (visible) {
- mZenPanel.setHidden(false);
- resetTimeout();
- } else {
- mZenPanel.setHidden(true);
- }
- if (changing) {
- updateTimeoutDelay();
- resetTimeout();
- }
- }
-
- private void updateStates() {
- final int count = mSliderPanel.getChildCount();
- for (int i = 0; i < count; i++) {
- StreamControl sc = (StreamControl) mSliderPanel.getChildAt(i).getTag();
- updateSlider(sc, true /*forceReloadIcon*/);
- }
- }
-
- private void updateActiveSlider() {
- final StreamControl active = mStreamControls.get(mActiveStreamType);
- if (active != null) {
- updateSlider(active, false /*forceReloadIcon*/);
- }
- }
-
- private void updateZenPanelVisible() {
- setZenPanelVisible(mZenModeAvailable && isNotificationOrRing(mActiveStreamType));
- }
-
- public void postVolumeChanged(int streamType, int flags) {
- if (hasMessages(MSG_VOLUME_CHANGED)) return;
- synchronized (this) {
- if (mStreamControls == null) {
- createSliders();
- }
- }
- removeMessages(MSG_FREE_RESOURCES);
- obtainMessage(MSG_VOLUME_CHANGED, streamType, flags).sendToTarget();
- }
-
- public void postRemoteVolumeChanged(MediaController controller, int flags) {
- if (hasMessages(MSG_REMOTE_VOLUME_CHANGED)) return;
- synchronized (this) {
- if (mStreamControls == null) {
- createSliders();
- }
- }
- removeMessages(MSG_FREE_RESOURCES);
- obtainMessage(MSG_REMOTE_VOLUME_CHANGED, flags, 0, controller).sendToTarget();
- }
-
- public void postRemoteSliderVisibility(boolean visible) {
- obtainMessage(MSG_SLIDER_VISIBILITY_CHANGED,
- STREAM_REMOTE_MUSIC, visible ? 1 : 0).sendToTarget();
- }
-
- /**
- * Called by AudioService when it has received new remote playback information that
- * would affect the VolumePanel display (mainly volumes). The difference with
- * {@link #postRemoteVolumeChanged(int, int)} is that the handling of the posted message
- * (MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN) will only update the volume slider if it is being
- * displayed.
- * This special code path is due to the fact that remote volume updates arrive to AudioService
- * asynchronously. So after AudioService has sent the volume update (which should be treated
- * as a request to update the volume), the application will likely set a new volume. If the UI
- * is still up, we need to refresh the display to show this new value.
- */
- public void postHasNewRemotePlaybackInfo() {
- if (hasMessages(MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN)) return;
- // don't create or prevent resources to be freed, if they disappear, this update came too
- // late and shouldn't warrant the panel to be displayed longer
- obtainMessage(MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN).sendToTarget();
- }
-
- public void postMuteChanged(int streamType, int flags) {
- if (hasMessages(MSG_VOLUME_CHANGED)) return;
- synchronized (this) {
- if (mStreamControls == null) {
- createSliders();
- }
- }
- removeMessages(MSG_FREE_RESOURCES);
- obtainMessage(MSG_MUTE_CHANGED, streamType, flags).sendToTarget();
- }
-
- public void postDisplaySafeVolumeWarning(int flags) {
- if (hasMessages(MSG_DISPLAY_SAFE_VOLUME_WARNING)) return;
- obtainMessage(MSG_DISPLAY_SAFE_VOLUME_WARNING, flags, 0).sendToTarget();
- }
-
- public void postDismiss(long delay) {
- forceTimeout(delay);
- }
-
- public void postLayoutDirection(int layoutDirection) {
- removeMessages(MSG_LAYOUT_DIRECTION);
- obtainMessage(MSG_LAYOUT_DIRECTION, layoutDirection, 0).sendToTarget();
- }
-
- private static String flagsToString(int flags) {
- return flags == 0 ? "0" : (flags + "=" + AudioManager.flagsToString(flags));
- }
-
- private static String streamToString(int stream) {
- return AudioSystem.streamToString(stream);
- }
-
- /**
- * Override this if you have other work to do when the volume changes (for
- * example, vibrating, playing a sound, etc.). Make sure to call through to
- * the superclass implementation.
- */
- protected void onVolumeChanged(int streamType, int flags) {
-
- if (LOGD) Log.d(mTag, "onVolumeChanged(streamType: " + streamToString(streamType)
- + ", flags: " + flagsToString(flags) + ")");
-
- if ((flags & AudioManager.FLAG_SHOW_UI) != 0) {
- synchronized (this) {
- if (mActiveStreamType != streamType) {
- reorderSliders(streamType);
- }
- onShowVolumeChanged(streamType, flags, null);
- }
- }
-
- if ((flags & AudioManager.FLAG_PLAY_SOUND) != 0 && ! mRingIsSilent) {
- removeMessages(MSG_PLAY_SOUND);
- sendMessageDelayed(obtainMessage(MSG_PLAY_SOUND, streamType, flags), PLAY_SOUND_DELAY);
- }
-
- if ((flags & AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE) != 0) {
- removeMessages(MSG_PLAY_SOUND);
- removeMessages(MSG_VIBRATE);
- onStopSounds();
- }
-
- removeMessages(MSG_FREE_RESOURCES);
- sendMessageDelayed(obtainMessage(MSG_FREE_RESOURCES), FREE_DELAY);
- resetTimeout();
- }
-
- protected void onMuteChanged(int streamType, int flags) {
-
- if (LOGD) Log.d(mTag, "onMuteChanged(streamType: " + streamToString(streamType)
- + ", flags: " + flagsToString(flags) + ")");
-
- StreamControl sc = mStreamControls.get(streamType);
- if (sc != null) {
- updateSliderIcon(sc, isMuted(sc.streamType));
- }
-
- onVolumeChanged(streamType, flags);
- }
-
- protected void onShowVolumeChanged(int streamType, int flags, MediaController controller) {
- int index = getStreamVolume(streamType);
-
- mRingIsSilent = false;
-
- if (LOGD) {
- Log.d(mTag, "onShowVolumeChanged(streamType: " + streamToString(streamType)
- + ", flags: " + flagsToString(flags) + "), index: " + index);
- }
-
- // get max volume for progress bar
-
- int max = getStreamMaxVolume(streamType) - getStreamMinVolume(streamType);
- StreamControl sc = mStreamControls.get(streamType);
-
- switch (streamType) {
-
- case AudioManager.STREAM_RING: {
- Uri ringuri = RingtoneManager.getActualDefaultRingtoneUri(
- mContext, RingtoneManager.TYPE_RINGTONE);
- if (ringuri == null) {
- mRingIsSilent = true;
- }
- break;
- }
-
- case AudioManager.STREAM_MUSIC: {
- // Special case for when Bluetooth is active for music
- if ((mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC) &
- (AudioManager.DEVICE_OUT_BLUETOOTH_A2DP |
- AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
- AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)) != 0) {
- setMusicIcon(IC_AUDIO_BT, IC_AUDIO_BT_MUTE);
- } else {
- setMusicIcon(IC_AUDIO_VOL, IC_AUDIO_VOL_MUTE);
- }
- break;
- }
-
- case AudioManager.STREAM_ALARM: {
- break;
- }
-
- case AudioManager.STREAM_NOTIFICATION: {
- Uri ringuri = RingtoneManager.getActualDefaultRingtoneUri(
- mContext, RingtoneManager.TYPE_NOTIFICATION);
- if (ringuri == null) {
- mRingIsSilent = true;
- }
- break;
- }
-
- case STREAM_REMOTE_MUSIC: {
- if (controller == null && sc != null) {
- // If we weren't passed one try using the last one set.
- controller = sc.controller;
- }
- if (controller == null) {
- // We still don't have one, ignore the command.
- Log.w(mTag, "sent remote volume change without a controller!");
- } else {
- PlaybackInfo vi = controller.getPlaybackInfo();
- index = vi.getCurrentVolume();
- max = vi.getMaxVolume();
- if ((vi.getVolumeControl() & VolumeProvider.VOLUME_CONTROL_FIXED) != 0) {
- // if the remote volume is fixed add the flag for the UI
- flags |= AudioManager.FLAG_FIXED_VOLUME;
- }
- }
- if (LOGD) { Log.d(mTag, "showing remote volume "+index+" over "+ max); }
- break;
- }
- }
-
- if (sc != null) {
- if (streamType == STREAM_REMOTE_MUSIC && controller != sc.controller) {
- if (sc.controller != null) {
- sc.controller.unregisterCallback(mMediaControllerCb);
- }
- sc.controller = controller;
- if (controller != null) {
- sc.controller.registerCallback(mMediaControllerCb);
- }
- }
- if (sc.seekbarView.getMax() != max) {
- sc.seekbarView.setMax(max);
- }
- updateSliderProgress(sc, index);
- final boolean muted = isMuted(streamType);
- updateSliderEnabled(sc, muted, (flags & AudioManager.FLAG_FIXED_VOLUME) != 0);
- if (isNotificationOrRing(streamType)) {
- // check for secondary-icon transition completion
- if (mSecondaryIconTransition.isRunning()) {
- mSecondaryIconTransition.cancel(); // safe to reset
- sc.seekbarView.setAlpha(0); sc.seekbarView.animate().alpha(1);
- mZenPanel.setAlpha(0); mZenPanel.animate().alpha(1);
- }
- updateSliderIcon(sc, muted);
- }
- }
-
- if (!isShowing()) {
- int stream = (streamType == STREAM_REMOTE_MUSIC) ? -1 : streamType;
- // when the stream is for remote playback, use -1 to reset the stream type evaluation
- mAudioManager.forceVolumeControlStream(stream);
- mDialog.show();
- if (mCallback != null) {
- mCallback.onVisible(true);
- }
- announceDialogShown();
- }
-
- // Do a little vibrate if applicable (only when going into vibrate mode)
- if ((streamType != STREAM_REMOTE_MUSIC) &&
- ((flags & AudioManager.FLAG_VIBRATE) != 0) &&
- isNotificationOrRing(streamType) &&
- mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) {
- sendMessageDelayed(obtainMessage(MSG_VIBRATE), VIBRATE_DELAY);
- }
-
- // Pulse the zen icon if an adjustment was suppressed due to silent mode.
- if ((flags & AudioManager.FLAG_SHOW_SILENT_HINT) != 0) {
- showSilentHint();
- }
-
- // Pulse the slider icon & vibrate if an adjustment down was suppressed due to vibrate mode.
- if ((flags & AudioManager.FLAG_SHOW_VIBRATE_HINT) != 0) {
- showVibrateHint();
- }
- }
-
- private void announceDialogShown() {
- mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
- }
-
- private boolean isShowing() {
- return mDialog.isShowing();
- }
-
- protected void onPlaySound(int streamType, int flags) {
-
- if (hasMessages(MSG_STOP_SOUNDS)) {
- removeMessages(MSG_STOP_SOUNDS);
- // Force stop right now
- onStopSounds();
- }
-
- synchronized (this) {
- ToneGenerator toneGen = getOrCreateToneGenerator(streamType);
- if (toneGen != null) {
- toneGen.startTone(ToneGenerator.TONE_PROP_BEEP);
- sendMessageDelayed(obtainMessage(MSG_STOP_SOUNDS), BEEP_DURATION);
- }
- }
- }
-
- protected void onStopSounds() {
-
- synchronized (this) {
- int numStreamTypes = AudioSystem.getNumStreamTypes();
- for (int i = numStreamTypes - 1; i >= 0; i--) {
- ToneGenerator toneGen = mToneGenerators[i];
- if (toneGen != null) {
- toneGen.stopTone();
- }
- }
- }
- }
-
- protected void onVibrate() {
-
- // Make sure we ended up in vibrate ringer mode
- if (mAudioManager.getRingerModeInternal() != AudioManager.RINGER_MODE_VIBRATE) {
- return;
- }
- if (mVibrator != null) {
- mVibrator.vibrate(VIBRATE_DURATION, VIBRATION_ATTRIBUTES);
- }
- }
-
- protected void onRemoteVolumeChanged(MediaController controller, int flags) {
- if (LOGD) Log.d(mTag, "onRemoteVolumeChanged(controller:" + controller + ", flags: "
- + flagsToString(flags) + ")");
-
- if (((flags & AudioManager.FLAG_SHOW_UI) != 0) || isShowing()) {
- synchronized (this) {
- if (mActiveStreamType != STREAM_REMOTE_MUSIC) {
- reorderSliders(STREAM_REMOTE_MUSIC);
- }
- onShowVolumeChanged(STREAM_REMOTE_MUSIC, flags, controller);
- }
- } else {
- if (LOGD) Log.d(mTag, "not calling onShowVolumeChanged(), no FLAG_SHOW_UI or no UI");
- }
-
- removeMessages(MSG_FREE_RESOURCES);
- sendMessageDelayed(obtainMessage(MSG_FREE_RESOURCES), FREE_DELAY);
- resetTimeout();
- }
-
- protected void onRemoteVolumeUpdateIfShown() {
- if (LOGD) Log.d(mTag, "onRemoteVolumeUpdateIfShown()");
- if (isShowing()
- && (mActiveStreamType == STREAM_REMOTE_MUSIC)
- && (mStreamControls != null)) {
- onShowVolumeChanged(STREAM_REMOTE_MUSIC, 0, null);
- }
- }
-
- /**
- * Clear the current remote stream controller.
- */
- private void clearRemoteStreamController() {
- if (mStreamControls != null) {
- StreamControl sc = mStreamControls.get(STREAM_REMOTE_MUSIC);
- if (sc != null) {
- if (sc.controller != null) {
- sc.controller.unregisterCallback(mMediaControllerCb);
- sc.controller = null;
- }
- }
- }
- }
-
- /**
- * Handler for MSG_SLIDER_VISIBILITY_CHANGED Hide or show a slider
- *
- * @param streamType can be a valid stream type value, or
- * VolumePanel.STREAM_MASTER, or VolumePanel.STREAM_REMOTE_MUSIC
- * @param visible
- */
- synchronized protected void onSliderVisibilityChanged(int streamType, int visible) {
- if (LOGD) Log.d(mTag, "onSliderVisibilityChanged(stream="+streamType+", visi="+visible+")");
- boolean isVisible = (visible == 1);
- for (int i = STREAMS.length - 1 ; i >= 0 ; i--) {
- StreamResources streamRes = STREAMS[i];
- if (streamRes.streamType == streamType) {
- streamRes.show = isVisible;
- if (!isVisible && (mActiveStreamType == streamType)) {
- mActiveStreamType = -1;
- }
- break;
- }
- }
- }
-
- protected void onDisplaySafeVolumeWarning(int flags) {
- if ((flags & (AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_SHOW_UI_WARNINGS)) != 0
- || isShowing()) {
- synchronized (sSafetyWarningLock) {
- if (sSafetyWarning != null) {
- return;
- }
- sSafetyWarning = new SafetyWarningDialog(mContext, mAudioManager) {
- @Override
- protected void cleanUp() {
- synchronized (sSafetyWarningLock) {
- sSafetyWarning = null;
- }
- forceTimeout(0);
- updateStates();
- }
- };
- sSafetyWarning.show();
- }
- updateStates();
- }
- if (mAccessibilityManager.isTouchExplorationEnabled()) {
- removeMessages(MSG_TIMEOUT);
- } else {
- updateTimeoutDelay();
- resetTimeout();
- }
- }
-
- /**
- * Lock on this VolumePanel instance as long as you use the returned ToneGenerator.
- */
- private ToneGenerator getOrCreateToneGenerator(int streamType) {
- synchronized (this) {
- if (mToneGenerators[streamType] == null) {
- try {
- mToneGenerators[streamType] = new ToneGenerator(streamType, MAX_VOLUME);
- } catch (RuntimeException e) {
- if (LOGD) {
- Log.d(mTag, "ToneGenerator constructor failed with "
- + "RuntimeException: " + e);
- }
- }
- }
- return mToneGenerators[streamType];
- }
- }
-
-
- /**
- * Switch between icons because Bluetooth music is same as music volume, but with
- * different icons.
- */
- private void setMusicIcon(int resId, int resMuteId) {
- StreamControl sc = mStreamControls.get(AudioManager.STREAM_MUSIC);
- if (sc != null) {
- sc.iconRes = resId;
- sc.iconMuteRes = resMuteId;
- updateSliderIcon(sc, isMuted(sc.streamType));
- }
- }
-
- protected void onFreeResources() {
- synchronized (this) {
- for (int i = mToneGenerators.length - 1; i >= 0; i--) {
- if (mToneGenerators[i] != null) {
- mToneGenerators[i].release();
- }
- mToneGenerators[i] = null;
- }
- }
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
-
- case MSG_VOLUME_CHANGED: {
- onVolumeChanged(msg.arg1, msg.arg2);
- break;
- }
-
- case MSG_MUTE_CHANGED: {
- onMuteChanged(msg.arg1, msg.arg2);
- break;
- }
-
- case MSG_FREE_RESOURCES: {
- onFreeResources();
- break;
- }
-
- case MSG_STOP_SOUNDS: {
- onStopSounds();
- break;
- }
-
- case MSG_PLAY_SOUND: {
- onPlaySound(msg.arg1, msg.arg2);
- break;
- }
-
- case MSG_VIBRATE: {
- onVibrate();
- break;
- }
-
- case MSG_TIMEOUT: {
- if (isShowing()) {
- mDialog.dismiss();
- clearRemoteStreamController();
- mActiveStreamType = -1;
- if (mCallback != null) {
- mCallback.onVisible(false);
- }
- }
- synchronized (sSafetyWarningLock) {
- if (sSafetyWarning != null) {
- if (LOGD) Log.d(mTag, "SafetyWarning timeout");
- sSafetyWarning.dismiss();
- }
- }
- break;
- }
-
- case MSG_RINGER_MODE_CHANGED:
- case MSG_INTERNAL_RINGER_MODE_CHANGED:
- case MSG_NOTIFICATION_EFFECTS_SUPPRESSOR_CHANGED: {
- if (isShowing()) {
- updateActiveSlider();
- }
- break;
- }
-
- case MSG_REMOTE_VOLUME_CHANGED: {
- onRemoteVolumeChanged((MediaController) msg.obj, msg.arg1);
- break;
- }
-
- case MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN:
- onRemoteVolumeUpdateIfShown();
- break;
-
- case MSG_SLIDER_VISIBILITY_CHANGED:
- onSliderVisibilityChanged(msg.arg1, msg.arg2);
- break;
-
- case MSG_DISPLAY_SAFE_VOLUME_WARNING:
- onDisplaySafeVolumeWarning(msg.arg1);
- break;
-
- case MSG_LAYOUT_DIRECTION:
- setLayoutDirection(msg.arg1);
- break;
-
- case MSG_ZEN_MODE_AVAILABLE_CHANGED:
- mZenModeAvailable = msg.arg1 != 0;
- updateZenPanelVisible();
- break;
-
- case MSG_USER_ACTIVITY:
- if (mCallback != null) {
- mCallback.onInteraction();
- }
- break;
- }
- }
-
- private void resetTimeout() {
- final boolean touchExploration = mAccessibilityManager.isTouchExplorationEnabled();
- if (LOGD) Log.d(mTag, "resetTimeout at " + System.currentTimeMillis()
- + " delay=" + mTimeoutDelay + " touchExploration=" + touchExploration);
- if (sSafetyWarning == null || !touchExploration) {
- removeMessages(MSG_TIMEOUT);
- sendEmptyMessageDelayed(MSG_TIMEOUT, mTimeoutDelay);
- removeMessages(MSG_USER_ACTIVITY);
- sendEmptyMessage(MSG_USER_ACTIVITY);
- }
- }
-
- private void forceTimeout(long delay) {
- if (LOGD) Log.d(mTag, "forceTimeout delay=" + delay + " callers=" + Debug.getCallers(3));
- removeMessages(MSG_TIMEOUT);
- sendEmptyMessageDelayed(MSG_TIMEOUT, delay);
- }
-
- public ZenModeController getZenController() {
- return mZenController;
- }
-
- @Override
- public void dispatchDemoCommand(String command, Bundle args) {
- if (!COMMAND_VOLUME.equals(command)) return;
- String icon = args.getString("icon");
- final String iconMute = args.getString("iconmute");
- final boolean mute = iconMute != null;
- icon = mute ? iconMute : icon;
- icon = icon.endsWith("Stream") ? icon : (icon + "Stream");
- final StreamResources sr = StreamResources.valueOf(icon);
- mDemoIcon = mute ? sr.iconMuteRes : sr.iconRes;
- final int forcedStreamType = StreamResources.MediaStream.streamType;
- mAudioManager.forceVolumeControlStream(forcedStreamType);
- mAudioManager.adjustStreamVolume(forcedStreamType, AudioManager.ADJUST_SAME,
- AudioManager.FLAG_SHOW_UI);
- }
-
- private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- final Object tag = seekBar.getTag();
- if (fromUser && tag instanceof StreamControl) {
- StreamControl sc = (StreamControl) tag;
- setStreamVolume(sc, progress + sc.minVolume,
- AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE);
- }
- resetTimeout();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- }
- };
-
- private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() {
- @Override
- public void onZenAvailableChanged(boolean available) {
- obtainMessage(MSG_ZEN_MODE_AVAILABLE_CHANGED, available ? 1 : 0, 0).sendToTarget();
- }
-
- @Override
- public void onEffectsSupressorChanged() {
- mNotificationEffectsSuppressor = mZenController.getEffectsSuppressor();
- sendEmptyMessage(MSG_NOTIFICATION_EFFECTS_SUPPRESSOR_CHANGED);
- }
- };
-
- private final MediaController.Callback mMediaControllerCb = new MediaController.Callback() {
- public void onAudioInfoChanged(PlaybackInfo info) {
- onRemoteVolumeUpdateIfShown();
- }
- };
-
- private final class SecondaryIconTransition extends AnimatorListenerAdapter
- implements Runnable {
- private static final int ANIMATION_TIME = 400;
- private static final int WAIT_FOR_SWITCH_TIME = 1000;
-
- private final int mAnimationTime = (int)(ANIMATION_TIME * ValueAnimator.getDurationScale());
- private final int mFadeOutTime = mAnimationTime / 2;
- private final int mDelayTime = mAnimationTime / 3;
-
- private final Interpolator mIconInterpolator =
- AnimationUtils.loadInterpolator(mContext, android.R.interpolator.fast_out_slow_in);
-
- private StreamControl mTarget;
-
- public void start(StreamControl sc) {
- if (sc == null) throw new IllegalArgumentException();
- if (LOGD) Log.d(mTag, "Secondary icon animation start");
- if (mTarget != null) {
- cancel();
- }
- mTarget = sc;
- mTimeoutDelay = mAnimationTime + WAIT_FOR_SWITCH_TIME;
- resetTimeout();
- mTarget.secondaryIcon.setClickable(false);
- final int N = mTarget.group.getChildCount();
- for (int i = 0; i < N; i++) {
- final View child = mTarget.group.getChildAt(i);
- if (child != mTarget.secondaryIcon) {
- child.animate().alpha(0).setDuration(mFadeOutTime).start();
- }
- }
- mTarget.secondaryIcon.animate()
- .translationXBy(mTarget.icon.getX() - mTarget.secondaryIcon.getX())
- .setInterpolator(mIconInterpolator)
- .setStartDelay(mDelayTime)
- .setDuration(mAnimationTime - mDelayTime)
- .setListener(this)
- .start();
- }
-
- public boolean isRunning() {
- return mTarget != null;
- }
-
- public void cancel() {
- if (mTarget == null) return;
- mTarget.secondaryIcon.setClickable(true);
- final int N = mTarget.group.getChildCount();
- for (int i = 0; i < N; i++) {
- final View child = mTarget.group.getChildAt(i);
- if (child != mTarget.secondaryIcon) {
- child.animate().cancel();
- child.setAlpha(1);
- }
- }
- mTarget.secondaryIcon.animate().cancel();
- mTarget.secondaryIcon.setTranslationX(0);
- mTarget = null;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (mTarget == null) return;
- AsyncTask.execute(this);
- }
-
- @Override
- public void run() {
- if (mTarget == null) return;
- if (LOGD) Log.d(mTag, "Secondary icon animation complete, show notification slider");
- mAudioManager.forceVolumeControlStream(StreamResources.NotificationStream.streamType);
- mAudioManager.adjustStreamVolume(StreamResources.NotificationStream.streamType,
- AudioManager.ADJUST_SAME, AudioManager.FLAG_SHOW_UI);
- }
- }
-
- public interface Callback {
- void onZenSettings();
- void onZenPrioritySettings();
- void onInteraction();
- void onVisible(boolean visible);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanelComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanelComponent.java
deleted file mode 100644
index b072cab..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanelComponent.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * 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.systemui.volume;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.media.AudioManager;
-import android.media.IRemoteVolumeController;
-import android.media.IVolumeController;
-import android.media.VolumePolicy;
-import android.media.session.ISessionController;
-import android.media.session.MediaController;
-import android.media.session.MediaSessionManager;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.RemoteException;
-
-import com.android.systemui.R;
-import com.android.systemui.SystemUI;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.qs.tiles.DndTile;
-import com.android.systemui.statusbar.phone.PhoneStatusBar;
-import com.android.systemui.statusbar.policy.ZenModeController;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-/**
- * Implementation of VolumeComponent backed by the old volume panel.
- */
-public class VolumePanelComponent implements VolumeComponent {
-
- private final SystemUI mSysui;
- private final Context mContext;
- private final Handler mHandler;
- private final VolumeController mVolumeController;
- private final RemoteVolumeController mRemoteVolumeController;
- private final AudioManager mAudioManager;
- private final MediaSessionManager mMediaSessionManager;
-
- private VolumePanel mPanel;
- private int mDismissDelay;
-
- public VolumePanelComponent(SystemUI sysui, Context context, Handler handler,
- ZenModeController controller) {
- mSysui = sysui;
- mContext = context;
- mHandler = handler;
- mAudioManager = context.getSystemService(AudioManager.class);
- mMediaSessionManager = context.getSystemService(MediaSessionManager.class);
- mVolumeController = new VolumeController();
- mRemoteVolumeController = new RemoteVolumeController();
- mDismissDelay = mContext.getResources().getInteger(R.integer.volume_panel_dismiss_delay);
- mPanel = new VolumePanel(mContext, controller);
- mPanel.setCallback(new VolumePanel.Callback() {
- @Override
- public void onZenSettings() {
- mHandler.removeCallbacks(mStartZenSettings);
- mHandler.post(mStartZenSettings);
- }
-
- @Override
- public void onZenPrioritySettings() {
- mHandler.removeCallbacks(mStartZenPrioritySettings);
- mHandler.post(mStartZenPrioritySettings);
- }
-
- @Override
- public void onInteraction() {
- final KeyguardViewMediator kvm = mSysui.getComponent(KeyguardViewMediator.class);
- if (kvm != null) {
- kvm.userActivity();
- }
- }
-
- @Override
- public void onVisible(boolean visible) {
- if (mAudioManager != null && mVolumeController != null) {
- mAudioManager.notifyVolumeControllerVisible(mVolumeController, visible);
- }
- }
- });
- }
-
- @Override
- public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (mPanel != null) {
- mPanel.dump(fd, pw, args);
- }
- }
-
- public void register() {
- mAudioManager.setVolumeController(mVolumeController);
- mAudioManager.setVolumePolicy(VolumePolicy.DEFAULT);
- mMediaSessionManager.setRemoteVolumeController(mRemoteVolumeController);
- DndTile.setVisible(mContext, false);
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- if (mPanel != null) {
- mPanel.onConfigurationChanged(newConfig);
- }
- }
-
- @Override
- public ZenModeController getZenController() {
- return mPanel.getZenController();
- }
-
- @Override
- public void dispatchDemoCommand(String command, Bundle args) {
- mPanel.dispatchDemoCommand(command, args);
- }
-
- @Override
- public void dismissNow() {
- mPanel.postDismiss(0);
- }
-
- private void startSettings(Intent intent) {
- mSysui.getComponent(PhoneStatusBar.class).startActivityDismissingKeyguard(intent,
- true /* onlyProvisioned */, true /* dismissShade */);
- mPanel.postDismiss(mDismissDelay);
- }
-
- private final Runnable mStartZenSettings = new Runnable() {
- @Override
- public void run() {
- startSettings(ZenModePanel.ZEN_SETTINGS);
- }
- };
-
- private final Runnable mStartZenPrioritySettings = new Runnable() {
- @Override
- public void run() {
- startSettings(ZenModePanel.ZEN_PRIORITY_SETTINGS);
- }
- };
-
- private final class RemoteVolumeController extends IRemoteVolumeController.Stub {
- @Override
- public void remoteVolumeChanged(ISessionController binder, int flags)
- throws RemoteException {
- MediaController controller = new MediaController(mContext, binder);
- mPanel.postRemoteVolumeChanged(controller, flags);
- }
-
- @Override
- public void updateRemoteController(ISessionController session) throws RemoteException {
- mPanel.postRemoteSliderVisibility(session != null);
- // TODO stash default session in case the slider can be opened other
- // than by remoteVolumeChanged.
- }
- }
-
- /** For now, simply host an unmodified base volume panel in this process. */
- private final class VolumeController extends IVolumeController.Stub {
-
- @Override
- public void displaySafeVolumeWarning(int flags) throws RemoteException {
- mPanel.postDisplaySafeVolumeWarning(flags);
- }
-
- @Override
- public void volumeChanged(int streamType, int flags)
- throws RemoteException {
- mPanel.postVolumeChanged(streamType, flags);
- }
-
- @Override
- public void masterMuteChanged(int flags) throws RemoteException {
- // no-op
- }
-
- @Override
- public void setLayoutDirection(int layoutDirection)
- throws RemoteException {
- mPanel.postLayoutDirection(layoutDirection);
- }
-
- @Override
- public void dismiss() throws RemoteException {
- dismissNow();
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
index e979786..5f04aaf 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
@@ -31,7 +31,6 @@
import android.media.AudioManager;
import android.media.session.MediaSessionManager;
import android.os.Handler;
-import android.os.SystemProperties;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -52,8 +51,6 @@
private static final String TAG = "VolumeUI";
private static boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
- private static final boolean USE_OLD_VOLUME = SystemProperties.getBoolean("volume.old", false);
-
private final Handler mHandler = new Handler();
private final Receiver mReceiver = new Receiver();
private final RestorationNotification mRestorationNotification = new RestorationNotification();
@@ -64,8 +61,7 @@
private MediaSessionManager mMediaSessionManager;
private ServiceMonitor mVolumeControllerService;
- private VolumePanelComponent mOldVolume;
- private VolumeDialogComponent mNewVolume;
+ private VolumeDialogComponent mVolumeComponent;
@Override
public void start() {
@@ -77,8 +73,7 @@
mMediaSessionManager = (MediaSessionManager) mContext
.getSystemService(Context.MEDIA_SESSION_SERVICE);
final ZenModeController zenController = new ZenModeControllerImpl(mContext, mHandler);
- mOldVolume = new VolumePanelComponent(this, mContext, mHandler, zenController);
- mNewVolume = new VolumeDialogComponent(this, mContext, null, zenController);
+ mVolumeComponent = new VolumeDialogComponent(this, mContext, null, zenController);
putComponent(VolumeComponent.class, getVolumeComponent());
mReceiver.start();
mVolumeControllerService = new ServiceMonitor(TAG, LOGD,
@@ -88,7 +83,7 @@
}
private VolumeComponent getVolumeComponent() {
- return USE_OLD_VOLUME ? mOldVolume : mNewVolume;
+ return mVolumeComponent;
}
@Override
@@ -235,7 +230,7 @@
.putExtra(Receiver.EXTRA_COMPONENT, component);
mNotificationManager.notify(R.id.notification_volumeui,
new Notification.Builder(mContext)
- .setSmallIcon(R.drawable.ic_ringer_audible)
+ .setSmallIcon(R.drawable.ic_volume_media)
.setWhen(0)
.setShowWhen(false)
.setOngoing(true)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 5d88407..5d40eed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -279,7 +279,7 @@
// TODO: Verify all fields.
Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setMobileDataIndicators(
- visibleArg.capture(), iconArg.capture(), typeIconArg.capture(),
+ visibleArg.capture(), iconArg.capture(), iconArg.capture(), typeIconArg.capture(),
ArgumentCaptor.forClass(String.class).capture(),
ArgumentCaptor.forClass(String.class).capture(),
ArgumentCaptor.forClass(Boolean.class).capture(),
diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java
index 2203850..3b61f9d 100644
--- a/rs/java/android/renderscript/Allocation.java
+++ b/rs/java/android/renderscript/Allocation.java
@@ -276,7 +276,7 @@
* Enable/Disable AutoPadding for Vec3 elements.
* By default: Diabled.
*
- * @param useAutoPadding True: enable AutoPadding; flase: disable AutoPadding
+ * @param useAutoPadding True: enable AutoPadding; False: disable AutoPadding
*
*/
public void setAutoPadding(boolean useAutoPadding) {
diff --git a/rs/java/android/renderscript/AllocationAdapter.java b/rs/java/android/renderscript/AllocationAdapter.java
index 35d59dd..9bfd6ec 100644
--- a/rs/java/android/renderscript/AllocationAdapter.java
+++ b/rs/java/android/renderscript/AllocationAdapter.java
@@ -208,7 +208,7 @@
}
/**
- *
+ * @hide
*/
public void setArray(int arrayNum, int arrayVal) {
if (mAdaptedAllocation.getType().getArray(arrayNum) == 0) {
diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java
index 7c927fd..e7f210b 100644
--- a/rs/java/android/renderscript/RenderScript.java
+++ b/rs/java/android/renderscript/RenderScript.java
@@ -951,6 +951,17 @@
rsnScriptIntrinsicBLAS_Z(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU);
}
+ native void rsnScriptIntrinsicBLAS_BNNM(long con, long id, int M, int N, int K,
+ long A, int a_offset, long B, int b_offset, long C, int c_offset,
+ int c_mult_int);
+ synchronized void nScriptIntrinsicBLAS_BNNM(long id, int M, int N, int K,
+ long A, int a_offset, long B, int b_offset, long C, int c_offset,
+ int c_mult_int) {
+ validate();
+ rsnScriptIntrinsicBLAS_BNNM(mContext, id, M, N, K, A, a_offset, B, b_offset, C, c_offset, c_mult_int);
+ }
+
+
long mDev;
long mContext;
diff --git a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java
index 90d2300..6cfdfee 100644
--- a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java
+++ b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java
@@ -24,7 +24,6 @@
*
* BLAS
*
- * @hide
**/
public final class ScriptIntrinsicBLAS extends ScriptIntrinsic {
private Allocation mLUT;
@@ -176,6 +175,9 @@
private static final int RsBlas_zherk = 141;
private static final int RsBlas_zher2k = 142;
+ // BLAS extensions start here
+ private static final int RsBlas_bnnm = 1000;
+
/**
*/
public static ScriptIntrinsicBLAS create(RenderScript rs) {
@@ -1485,5 +1487,22 @@
}
+ /**
+ *
+ * 8-bit GEMM-like operation for neural networks
+ *
+ **/
+ public void BNNM(Allocation A, int a_offset, Allocation B, int b_offset, Allocation C, int c_offset, int c_mult) {
+ validateL3(Element.U8(mRS), NO_TRANSPOSE, TRANSPOSE, 0, A, B, C);
+
+ int M = -1, N = -1, K = -1;
+ M = A.getType().getY();
+ N = B.getType().getY();
+ K = A.getType().getX();
+
+
+ mRS.nScriptIntrinsicBLAS_BNNM(getID(mRS), M, N, K, A.getID(mRS), a_offset, B.getID(mRS), b_offset, C.getID(mRS), c_offset, c_mult);
+
+ }
}
diff --git a/rs/java/android/renderscript/Type.java b/rs/java/android/renderscript/Type.java
index cc9b58b..dc23785 100644
--- a/rs/java/android/renderscript/Type.java
+++ b/rs/java/android/renderscript/Type.java
@@ -150,6 +150,7 @@
}
/**
+ * @hide
* Return the dimension of the specified array.
*
* @param arrayNum The array dimension to query
@@ -169,6 +170,7 @@
}
/**
+ * @hide
* Return the number of array dimensions.
*
* @return int
@@ -382,6 +384,7 @@
}
/**
+ * @hide
* Adds an array dimension to the builder
*
* @param dim
diff --git a/rs/jni/Android.mk b/rs/jni/Android.mk
index 0658620..94f0859 100644
--- a/rs/jni/Android.mk
+++ b/rs/jni/Android.mk
@@ -25,7 +25,6 @@
$(JNI_H_INCLUDE) \
frameworks/rs \
frameworks/base/core/jni \
- frameworks/base/libs/hwui \
$(rs_generated_include_dir)
LOCAL_CFLAGS += -Wno-unused-parameter -std=c++11
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index 49afa6d..ae48a5f 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -579,6 +579,32 @@
static void
+nScriptIntrinsicBLAS_BNNM(JNIEnv *_env, jobject _this, jlong con, jlong id, jint M, jint N, jint K,
+ jlong A, jint a_offset, jlong B, jint b_offset, jlong C, jint c_offset,
+ jint c_mult_int) {
+ RsBlasCall call;
+ memset(&call, 0, sizeof(call));
+ call.func = RsBlas_bnnm;
+ call.M = M;
+ call.N = N;
+ call.K = K;
+ call.a_offset = a_offset;
+ call.b_offset = b_offset;
+ call.c_offset = c_offset;
+ call.c_mult_int = c_mult_int;
+
+ RsAllocation in_allocs[3];
+ in_allocs[0] = (RsAllocation)A;
+ in_allocs[1] = (RsAllocation)B;
+ in_allocs[2] = (RsAllocation)C;
+
+ rsScriptForEachMulti((RsContext)con, (RsScript)id, 0,
+ in_allocs, sizeof(in_allocs), nullptr,
+ &call, sizeof(call), nullptr, 0);
+}
+
+
+static void
nAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str)
{
if (kLogApi) {
@@ -2417,6 +2443,8 @@
{"rsnScriptIntrinsicBLAS_Complex", "(JJIIIIIIIIIFFJJFFJIIII)V", (void*)nScriptIntrinsicBLAS_Complex },
{"rsnScriptIntrinsicBLAS_Z", "(JJIIIIIIIIIDDJJDDJIIII)V", (void*)nScriptIntrinsicBLAS_Z },
+{"rsnScriptIntrinsicBLAS_BNNM", "(JJIIIJIJIJII)V", (void*)nScriptIntrinsicBLAS_BNNM },
+
{"rsnProgramStoreCreate", "(JZZZZZZIII)J", (void*)nProgramStoreCreate },
{"rsnProgramBindConstants", "(JJIJ)V", (void*)nProgramBindConstants },
diff --git a/services/core/java/com/android/server/AssetAtlasService.java b/services/core/java/com/android/server/AssetAtlasService.java
index 26f4232..66cc29a 100644
--- a/services/core/java/com/android/server/AssetAtlasService.java
+++ b/services/core/java/com/android/server/AssetAtlasService.java
@@ -199,6 +199,11 @@
private final ArrayList<Bitmap> mBitmaps;
private final int mPixelCount;
+ private long mNativeBitmap;
+
+ // Used for debugging only
+ private Bitmap mAtlasBitmap;
+
Renderer(ArrayList<Bitmap> bitmaps, int pixelCount) {
mBitmaps = bitmaps;
mPixelCount = pixelCount;
@@ -253,9 +258,8 @@
// We always render the atlas into a bitmap. This bitmap is then
// uploaded into the GraphicBuffer using OpenGL to swizzle the content
- final Bitmap atlasBitmap = Bitmap.createBitmap(
- buffer.getWidth(), buffer.getHeight(), Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(atlasBitmap);
+ final Canvas canvas = acquireCanvas(buffer.getWidth(), buffer.getHeight());
+ if (canvas == null) return false;
final Atlas.Entry entry = new Atlas.Entry();
@@ -264,78 +268,108 @@
int mapIndex = 0;
boolean result = false;
- final long startRender = System.nanoTime();
- final int count = mBitmaps.size();
+ try {
+ final long startRender = System.nanoTime();
+ final int count = mBitmaps.size();
- for (int i = 0; i < count; i++) {
- final Bitmap bitmap = mBitmaps.get(i);
- if (atlas.pack(bitmap.getWidth(), bitmap.getHeight(), entry) != null) {
- // We have more bitmaps to pack than the current configuration
- // says, we were most likely not able to detect a change in the
- // list of preloaded drawables, abort and delete the configuration
- if (mapIndex >= mAtlasMap.length) {
- deleteDataFile();
- break;
- }
+ for (int i = 0; i < count; i++) {
+ final Bitmap bitmap = mBitmaps.get(i);
+ if (atlas.pack(bitmap.getWidth(), bitmap.getHeight(), entry) != null) {
+ // We have more bitmaps to pack than the current configuration
+ // says, we were most likely not able to detect a change in the
+ // list of preloaded drawables, abort and delete the configuration
+ if (mapIndex >= mAtlasMap.length) {
+ deleteDataFile();
+ break;
+ }
- canvas.save();
- canvas.translate(entry.x, entry.y);
- if (entry.rotated) {
- canvas.translate(bitmap.getHeight(), 0.0f);
- canvas.rotate(90.0f);
+ canvas.save();
+ canvas.translate(entry.x, entry.y);
+ if (entry.rotated) {
+ canvas.translate(bitmap.getHeight(), 0.0f);
+ canvas.rotate(90.0f);
+ }
+ canvas.drawBitmap(bitmap, 0.0f, 0.0f, null);
+ canvas.restore();
+ atlasMap[mapIndex++] = bitmap.getSkBitmap();
+ atlasMap[mapIndex++] = entry.x;
+ atlasMap[mapIndex++] = entry.y;
+ atlasMap[mapIndex++] = entry.rotated ? 1 : 0;
}
- canvas.drawBitmap(bitmap, 0.0f, 0.0f, null);
- canvas.restore();
- atlasMap[mapIndex++] = bitmap.refSkPixelRef();
- atlasMap[mapIndex++] = entry.x;
- atlasMap[mapIndex++] = entry.y;
- atlasMap[mapIndex++] = entry.rotated ? 1 : 0;
}
- }
- final long endRender = System.nanoTime();
- releaseCanvas(canvas, atlasBitmap);
- result = nUploadAtlas(buffer, atlasBitmap);
- atlasBitmap.recycle();
- final long endUpload = System.nanoTime();
+ final long endRender = System.nanoTime();
+ if (mNativeBitmap != 0) {
+ result = nUploadAtlas(buffer, mNativeBitmap);
+ }
- if (DEBUG_ATLAS) {
- float renderDuration = (endRender - startRender) / 1000.0f / 1000.0f;
- float uploadDuration = (endUpload - endRender) / 1000.0f / 1000.0f;
- Log.d(LOG_TAG, String.format("Rendered atlas in %.2fms (%.2f+%.2fms)",
- renderDuration + uploadDuration, renderDuration, uploadDuration));
+ final long endUpload = System.nanoTime();
+ if (DEBUG_ATLAS) {
+ float renderDuration = (endRender - startRender) / 1000.0f / 1000.0f;
+ float uploadDuration = (endUpload - endRender) / 1000.0f / 1000.0f;
+ Log.d(LOG_TAG, String.format("Rendered atlas in %.2fms (%.2f+%.2fms)",
+ renderDuration + uploadDuration, renderDuration, uploadDuration));
+ }
+
+ } finally {
+ releaseCanvas(canvas);
}
return result;
}
/**
+ * Returns a Canvas for the specified buffer. If {@link #DEBUG_ATLAS_TEXTURE}
+ * is turned on, the returned Canvas will render into a local bitmap that
+ * will then be saved out to disk for debugging purposes.
+ * @param width
+ * @param height
+ */
+ private Canvas acquireCanvas(int width, int height) {
+ if (DEBUG_ATLAS_TEXTURE) {
+ mAtlasBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ return new Canvas(mAtlasBitmap);
+ } else {
+ Canvas canvas = new Canvas();
+ mNativeBitmap = nAcquireAtlasCanvas(canvas, width, height);
+ return canvas;
+ }
+ }
+
+ /**
* Releases the canvas used to render into the buffer. Calling this method
* will release any resource previously acquired. If {@link #DEBUG_ATLAS_TEXTURE}
* is turend on, calling this method will write the content of the atlas
* to disk in /data/system/atlas.png for debugging.
*/
- private void releaseCanvas(Canvas canvas, Bitmap atlasBitmap) {
- canvas.setBitmap(null);
+ private void releaseCanvas(Canvas canvas) {
if (DEBUG_ATLAS_TEXTURE) {
+ canvas.setBitmap(null);
File systemDirectory = new File(Environment.getDataDirectory(), "system");
File dataFile = new File(systemDirectory, "atlas.png");
try {
FileOutputStream out = new FileOutputStream(dataFile);
- atlasBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+ mAtlasBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.close();
} catch (FileNotFoundException e) {
// Ignore
} catch (IOException e) {
// Ignore
}
+
+ mAtlasBitmap.recycle();
+ mAtlasBitmap = null;
+ } else {
+ nReleaseAtlasCanvas(canvas, mNativeBitmap);
}
}
}
- private static native boolean nUploadAtlas(GraphicBuffer buffer, Bitmap bitmap);
+ private static native long nAcquireAtlasCanvas(Canvas canvas, int width, int height);
+ private static native void nReleaseAtlasCanvas(Canvas canvas, long bitmap);
+ private static native boolean nUploadAtlas(GraphicBuffer buffer, long bitmap);
@Override
public boolean isCompatible(int ppid) {
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index ef51ad6..3e5eee8 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -112,6 +112,7 @@
private static final int SERVICE_IBLUETOOTHGATT = 2;
private final Context mContext;
+ private static int mBleAppCount = 0;
// Locks are not provided for mName and mAddress.
// They are accessed in handler or broadcast receiver, same thread context.
@@ -184,11 +185,40 @@
persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
}
}
+
+ int st = BluetoothAdapter.STATE_OFF;
+ if (mBluetooth != null) {
+ try {
+ st = mBluetooth.getState();
+ } catch (RemoteException e) {
+ Log.e(TAG,"Unable to call getState", e);
+ }
+ }
+ Log.d(TAG, "state" + st);
+
if (isAirplaneModeOn()) {
- // disable without persisting the setting
- sendDisableMsg();
+ // Clear registered LE apps to force shut-off
+ synchronized (this) {
+ mBleAppCount = 0;
+ }
+ if (st == BluetoothAdapter.STATE_BLE_ON) {
+ //if state is BLE_ON make sure you trigger disableBLE part
+ try {
+ if (mBluetooth != null) {
+ mBluetooth.onBrEdrDown();
+ mEnableExternal = false;
+ }
+ } catch(RemoteException e) {
+ Log.e(TAG,"Unable to call onBrEdrDown", e);
+ }
+ } else if (st == BluetoothAdapter.STATE_ON){
+ // disable without persisting the setting
+ Log.d(TAG, "Calling disable");
+ sendDisableMsg();
+ }
} else if (mEnableExternal) {
// enable without persisting the setting
+ Log.d(TAG, "Calling enable");
sendEnableMsg(mQuietEnableExternal);
}
}
@@ -203,12 +233,6 @@
sendEnableMsg(mQuietEnableExternal);
}
}
-
- if (!isNameAndAddressSet()) {
- //Sync the Bluetooth name and address from the Bluetooth Adapter
- if (DBG) Log.d(TAG,"Retrieving Bluetooth Adapter name and address...");
- getNameAndAddress();
- }
}
}
};
@@ -218,6 +242,7 @@
mContext = context;
mBluetooth = null;
+ mBluetoothGatt = null;
mBinding = false;
mUnbinding = false;
mEnable = false;
@@ -396,6 +421,133 @@
return false;
}
+ class ClientDeathRecipient implements IBinder.DeathRecipient {
+ public void binderDied() {
+ if (DBG) Log.d(TAG, "Binder is dead - unregister Ble App");
+ if (mBleAppCount > 0) --mBleAppCount;
+
+ if (mBleAppCount == 0) {
+ if (DBG) Log.d(TAG, "Disabling LE only mode after application crash");
+ try {
+ if (mBluetooth != null) {
+ mBluetooth.onBrEdrDown();
+ }
+ } catch(RemoteException e) {
+ Log.e(TAG,"Unable to call onBrEdrDown", e);
+ }
+ }
+ }
+ }
+
+ /** Internal death rec list */
+ Map<IBinder, ClientDeathRecipient> mBleApps = new HashMap<IBinder, ClientDeathRecipient>();
+
+ public int updateBleAppCount(IBinder token, boolean enable) {
+ if (enable) {
+ ClientDeathRecipient r = mBleApps.get(token);
+ if (r == null) {
+ ClientDeathRecipient deathRec = new ClientDeathRecipient();
+ try {
+ token.linkToDeath(deathRec, 0);
+ } catch (RemoteException ex) {
+ throw new IllegalArgumentException("Wake lock is already dead.");
+ }
+ mBleApps.put(token, deathRec);
+ synchronized (this) {
+ ++mBleAppCount;
+ }
+ if (DBG) Log.d(TAG, "Registered for death Notification");
+ }
+
+ } else {
+ ClientDeathRecipient r = mBleApps.get(token);
+ if (r != null) {
+ try {
+ token.linkToDeath(r, 0);
+ } catch (RemoteException ex) {
+ throw new IllegalArgumentException("Wake lock is already dead.");
+ }
+ mBleApps.remove(token);
+ synchronized (this) {
+ if (mBleAppCount > 0) --mBleAppCount;
+ }
+ if (DBG) Log.d(TAG, "Unregistered for death Notification");
+ }
+ }
+ if (DBG) Log.d(TAG, "Updated BleAppCount" + mBleAppCount);
+ if (mBleAppCount == 0 && mEnable) {
+ try {
+ if (mBluetooth != null && (mBluetooth.getState() != BluetoothAdapter.STATE_ON)) {
+ if (DBG) Log.d(TAG, "Reseting the mEnable flag for clean disable");
+ mEnable = false;
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "getState()", e);
+ }
+ }
+ return mBleAppCount;
+ }
+
+ /** @hide*/
+ public boolean isBleAppPresent() {
+ if (DBG) Log.d(TAG, "isBleAppPresent() count: " + mBleAppCount);
+ return (mBleAppCount > 0);
+ }
+
+ /**
+ * Action taken when GattService is turned off
+ */
+ private void onBluetoothGattServiceUp() {
+ if (DBG) Log.d(TAG,"BluetoothGatt Service is Up");
+ try{
+ if (isBleAppPresent() == false && mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) {
+ mBluetooth.onLeServiceUp();
+
+ // waive WRITE_SECURE_SETTINGS permission check
+ long callingIdentity = Binder.clearCallingIdentity();
+ persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
+ Binder.restoreCallingIdentity(callingIdentity);
+ }
+ } catch(RemoteException e) {
+ Log.e(TAG,"Unable to call onServiceUp", e);
+ }
+ }
+
+ /**
+ * Inform BluetoothAdapter instances that BREDR part is down
+ * and turn off all service and stack if no LE app needs it
+ */
+ private void sendBrEdrDownCallback() {
+ if (DBG) Log.d(TAG,"Calling sendBrEdrDownCallback callbacks");
+ int n = mCallbacks.beginBroadcast();
+
+ if (isBleAppPresent() == false) {
+ try {
+ mBluetooth.onBrEdrDown();
+ } catch(RemoteException e) {
+ Log.e(TAG,"Unable to call onBrEdrDown", e);
+ }
+ }
+ else{//need to stay at BLE ON. disconnect all Gatt connections
+ try{
+ mBluetoothGatt.unregAll();//disconnectAll();
+ } catch(RemoteException e) {
+ Log.e(TAG,"Unable to disconn all", e);
+ }
+ }
+
+ Log.d(TAG,"Broadcasting onBrEdrDown() to " + n + " receivers.");
+ for (int i=0; i <n; i++) {
+ try {
+ mCallbacks.getBroadcastItem(i).onBrEdrDown();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to call sendBrEdrDownCallback() on callback #" + i, e);
+ }
+ }
+ mCallbacks.finishBroadcast();
+ }
+
+ /** @hide*/
public void getNameAndAddress() {
if (DBG) {
Log.d(TAG,"getNameAndAddress(): mBluetooth = " + mBluetooth +
@@ -445,11 +597,9 @@
mQuietEnableExternal = false;
mEnableExternal = true;
// waive WRITE_SECURE_SETTINGS permission check
- long callingIdentity = Binder.clearCallingIdentity();
- persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
- Binder.restoreCallingIdentity(callingIdentity);
sendEnableMsg(false);
}
+ if (DBG) Log.d(TAG, "enable returning");
return true;
}
@@ -508,6 +658,7 @@
} else {
mUnbinding=false;
}
+ mBluetoothGatt = null;
}
}
@@ -1034,6 +1185,7 @@
synchronized(mConnection) {
if (msg.arg1 == SERVICE_IBLUETOOTHGATT) {
mBluetoothGatt = IBluetoothGatt.Stub.asInterface(service);
+ onBluetoothGattServiceUp();
break;
} // else must be SERVICE_IBLUETOOTH
@@ -1111,12 +1263,18 @@
bluetoothStateChangeHandler(prevState, newState);
// handle error state transition case from TURNING_ON to OFF
// unbind and rebind bluetooth service and enable bluetooth
- if ((prevState == BluetoothAdapter.STATE_TURNING_ON) &&
+ if ((prevState == BluetoothAdapter.STATE_BLE_TURNING_ON) &&
(newState == BluetoothAdapter.STATE_OFF) &&
(mBluetooth != null) && mEnable) {
recoverBluetoothServiceFromError();
}
- if (newState == BluetoothAdapter.STATE_ON) {
+ if ((prevState == BluetoothAdapter.STATE_TURNING_ON) &&
+ (newState == BluetoothAdapter.STATE_BLE_ON) &&
+ (mBluetooth != null) && mEnable) {
+ recoverBluetoothServiceFromError();
+ }
+ if (newState == BluetoothAdapter.STATE_ON ||
+ newState == BluetoothAdapter.STATE_BLE_ON) {
// bluetooth is working, reset the counter
if (mErrorRecoveryRetryCounter != 0) {
Log.w(TAG, "bluetooth is recovered from error");
@@ -1376,39 +1534,90 @@
return valid;
}
+ private void sendBleStateChanged(int prevState, int newState) {
+ if (DBG) Log.d(TAG,"BLE State Change Intent: " + prevState + " -> " + newState);
+ // Send broadcast message to everyone else
+ Intent intent = new Intent(BluetoothAdapter.ACTION_BLE_STATE_CHANGED);
+ intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
+ intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_PERM);
+ }
+
private void bluetoothStateChangeHandler(int prevState, int newState) {
+ boolean isStandardBroadcast = true;
if (prevState != newState) {
//Notify all proxy objects first of adapter state change
- if (newState == BluetoothAdapter.STATE_ON || newState == BluetoothAdapter.STATE_OFF) {
- boolean isUp = (newState==BluetoothAdapter.STATE_ON);
- sendBluetoothStateCallback(isUp);
+ if (newState == BluetoothAdapter.STATE_BLE_ON
+ || newState == BluetoothAdapter.STATE_OFF) {
+ boolean intermediate_off = (prevState == BluetoothAdapter.STATE_TURNING_OFF
+ && newState == BluetoothAdapter.STATE_BLE_ON);
- if (isUp) {
- // connect to GattService
- if (mContext.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_BLUETOOTH_LE)) {
- Intent i = new Intent(IBluetoothGatt.class.getName());
- doBind(i, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
- UserHandle.CURRENT);
- }
- } else {
- //If Bluetooth is off, send service down event to proxy objects, and unbind
- if (!isUp && canUnbindBluetoothService()) {
- unbindAllBluetoothProfileServices();
+ if (newState == BluetoothAdapter.STATE_OFF) {
+ // If Bluetooth is off, send service down event to proxy objects, and unbind
+ if (DBG) Log.d(TAG, "Bluetooth is complete turn off");
+ if (canUnbindBluetoothService()) {
+ if (DBG) Log.d(TAG, "Good to unbind!");
sendBluetoothServiceDownCallback();
unbindAndFinish();
+ sendBleStateChanged(prevState, newState);
+ // Don't broadcast as it has already been broadcast before
+ isStandardBroadcast = false;
}
+
+ } else if (!intermediate_off) {
+ // connect to GattService
+ if (DBG) Log.d(TAG, "Bluetooth is in LE only mode");
+ if (mBluetoothGatt != null) {
+ if (DBG) Log.d(TAG, "Calling BluetoothGattServiceUp");
+ onBluetoothGattServiceUp();
+ } else {
+ if (DBG) Log.d(TAG, "Binding Bluetooth GATT service");
+ if (mContext.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_BLUETOOTH_LE)) {
+ Intent i = new Intent(IBluetoothGatt.class.getName());
+ doBind(i, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.CURRENT);
+ }
+ }
+ sendBleStateChanged(prevState, newState);
+ //Don't broadcase this as std intent
+ isStandardBroadcast = false;
+
+ } else if (intermediate_off){
+ if (DBG) Log.d(TAG, "Intermediate off, back to LE only mode");
+ // For LE only mode, broadcast as is
+ sendBleStateChanged(prevState, newState);
+ sendBluetoothStateCallback(false); // BT is OFF for general users
+ // Broadcast as STATE_OFF
+ newState = BluetoothAdapter.STATE_OFF;
+ sendBrEdrDownCallback();
}
+ } else if (newState == BluetoothAdapter.STATE_ON) {
+ boolean isUp = (newState==BluetoothAdapter.STATE_ON);
+ sendBluetoothStateCallback(isUp);
+ sendBleStateChanged(prevState, newState);
+
+ } else if (newState == BluetoothAdapter.STATE_BLE_TURNING_ON
+ || newState == BluetoothAdapter.STATE_BLE_TURNING_OFF ) {
+ sendBleStateChanged(prevState, newState);
+ isStandardBroadcast = false;
+
+ } else if (newState == BluetoothAdapter.STATE_TURNING_ON
+ || newState == BluetoothAdapter.STATE_TURNING_OFF) {
+ sendBleStateChanged(prevState, newState);
}
- //Send broadcast message to everyone else
- Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
- intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
- intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- if (DBG) Log.d(TAG,"Bluetooth State Change Intent: " + prevState + " -> " + newState);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
- BLUETOOTH_PERM);
+ if (isStandardBroadcast) {
+ if (prevState == BluetoothAdapter.STATE_BLE_ON) {
+ // Show prevState of BLE_ON as OFF to standard users
+ prevState = BluetoothAdapter.STATE_OFF;
+ }
+ Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
+ intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
+ intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_PERM);
+ }
}
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index b5796c9..4e3abad 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -19,6 +19,7 @@
import static android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
+import static android.net.ConnectivityManager.NETID_UNSET;
import static android.net.ConnectivityManager.TYPE_NONE;
import static android.net.ConnectivityManager.TYPE_VPN;
import static android.net.ConnectivityManager.getNetworkTypeName;
@@ -89,6 +90,7 @@
import android.text.TextUtils;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.Xml;
@@ -709,16 +711,15 @@
return mNextNetworkRequestId++;
}
- private void assignNextNetId(NetworkAgentInfo nai) {
+ private int reserveNetId() {
synchronized (mNetworkForNetId) {
for (int i = MIN_NET_ID; i <= MAX_NET_ID; i++) {
int netId = mNextNetId;
if (++mNextNetId > MAX_NET_ID) mNextNetId = MIN_NET_ID;
// Make sure NetID unused. http://b/16815182
- if (mNetworkForNetId.get(netId) == null) {
- nai.network = new Network(netId);
- mNetworkForNetId.put(netId, nai);
- return;
+ if (!mNetIdInUse.get(netId)) {
+ mNetIdInUse.put(netId, true);
+ return netId;
}
}
}
@@ -739,7 +740,9 @@
info = new NetworkInfo(nai.networkInfo);
lp = new LinkProperties(nai.linkProperties);
nc = new NetworkCapabilities(nai.networkCapabilities);
- network = new Network(nai.network);
+ // Network objects are outwardly immutable so there is no point to duplicating.
+ // Duplicating also precludes sharing socket factories and connection pools.
+ network = nai.network;
subscriberId = (nai.networkMisc != null) ? nai.networkMisc.subscriberId : null;
}
info.setType(networkType);
@@ -807,7 +810,9 @@
info = new NetworkInfo(nai.networkInfo);
lp = new LinkProperties(nai.linkProperties);
nc = new NetworkCapabilities(nai.networkCapabilities);
- network = new Network(nai.network);
+ // Network objects are outwardly immutable so there is no point to duplicating.
+ // Duplicating also precludes sharing socket factories and connection pools.
+ network = nai.network;
subscriberId = (nai.networkMisc != null) ? nai.networkMisc.subscriberId : null;
}
}
@@ -873,6 +878,28 @@
return getFilteredNetworkInfo(state.networkInfo, state.linkProperties, uid);
}
+ @Override
+ public Network getActiveNetwork() {
+ enforceAccessPermission();
+ final int uid = Binder.getCallingUid();
+ final int user = UserHandle.getUserId(uid);
+ int vpnNetId = NETID_UNSET;
+ synchronized (mVpns) {
+ final Vpn vpn = mVpns.get(user);
+ if (vpn != null && vpn.appliesToUid(uid)) vpnNetId = vpn.getNetId();
+ }
+ NetworkAgentInfo nai;
+ if (vpnNetId != NETID_UNSET) {
+ synchronized (mNetworkForNetId) {
+ nai = mNetworkForNetId.get(vpnNetId);
+ }
+ if (nai != null) return nai.network;
+ }
+ nai = getDefaultNetwork();
+ if (nai != null && isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid)) nai = null;
+ return nai != null ? nai.network : null;
+ }
+
/**
* Find the first Provisioning network.
*
@@ -985,13 +1012,13 @@
@Override
public Network[] getAllNetworks() {
enforceAccessPermission();
- final ArrayList<Network> result = new ArrayList();
synchronized (mNetworkForNetId) {
+ final Network[] result = new Network[mNetworkForNetId.size()];
for (int i = 0; i < mNetworkForNetId.size(); i++) {
- result.add(new Network(mNetworkForNetId.valueAt(i).network));
+ result[i] = mNetworkForNetId.valueAt(i).network;
}
+ return result;
}
- return result.toArray(new Network[result.size()]);
}
private NetworkCapabilities getNetworkCapabilitiesAndValidation(NetworkAgentInfo nai) {
@@ -1960,6 +1987,7 @@
if (nai != null) {
synchronized (mNetworkForNetId) {
mNetworkForNetId.remove(nai.network.netId);
+ mNetIdInUse.delete(nai.network.netId);
}
// Just in case.
mLegacyTypeTracker.remove(nai);
@@ -2003,6 +2031,7 @@
mLegacyTypeTracker.remove(nai);
synchronized (mNetworkForNetId) {
mNetworkForNetId.remove(nai.network.netId);
+ mNetIdInUse.delete(nai.network.netId);
}
// Since we've lost the network, go through all the requests that
// it was satisfying and see if any other factory can satisfy them.
@@ -2549,25 +2578,27 @@
public void reportInetCondition(int networkType, int percentage) {
NetworkAgentInfo nai = mLegacyTypeTracker.getNetworkForType(networkType);
if (nai == null) return;
- boolean isGood = percentage > 50;
- // Revalidate if the app report does not match our current validated state.
- if (isGood != nai.lastValidated) {
- // Make the message logged by reportBadNetwork below less confusing.
- if (DBG && isGood) log("reportInetCondition: type=" + networkType + " ok, revalidate");
- reportBadNetwork(nai.network);
- }
+ reportNetworkConnectivity(nai.network, percentage > 50);
}
- public void reportBadNetwork(Network network) {
+ public void reportNetworkConnectivity(Network network, boolean hasConnectivity) {
enforceAccessPermission();
enforceInternetPermission();
- if (network == null) return;
-
- final int uid = Binder.getCallingUid();
- NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
+ NetworkAgentInfo nai;
+ if (network == null) {
+ nai = getDefaultNetwork();
+ } else {
+ nai = getNetworkAgentInfoForNetwork(network);
+ }
if (nai == null) return;
- if (DBG) log("reportBadNetwork(" + nai.name() + ") by " + uid);
+ // Revalidate if the app report does not match our current validated state.
+ if (hasConnectivity == nai.lastValidated) return;
+ final int uid = Binder.getCallingUid();
+ if (DBG) {
+ log("reportNetworkConnectivity(" + nai.network.netId + ", " + hasConnectivity +
+ ") by " + uid);
+ }
synchronized (nai) {
// Validating an uncreated network could result in a call to rematchNetworkAndRequests()
// which isn't meant to work on uncreated networks.
@@ -3026,23 +3057,6 @@
}
}
- public int findConnectionTypeForIface(String iface) {
- enforceConnectivityInternalPermission();
-
- if (TextUtils.isEmpty(iface)) return ConnectivityManager.TYPE_NONE;
-
- synchronized(mNetworkForNetId) {
- for (int i = 0; i < mNetworkForNetId.size(); i++) {
- NetworkAgentInfo nai = mNetworkForNetId.valueAt(i);
- LinkProperties lp = nai.linkProperties;
- if (lp != null && iface.equals(lp.getInterfaceName()) && nai.networkInfo != null) {
- return nai.networkInfo.getType();
- }
- }
- }
- return ConnectivityManager.TYPE_NONE;
- }
-
@Override
public int checkMobileProvisioning(int suggestedTimeOutMs) {
// TODO: Remove? Any reason to trigger a provisioning check?
@@ -3296,7 +3310,7 @@
loge("Starting user already has a VPN");
return;
}
- userVpn = new Vpn(mHandler.getLooper(), mContext, mNetd, this, userId);
+ userVpn = new Vpn(mHandler.getLooper(), mContext, mNetd, userId);
mVpns.put(userId, userVpn);
}
}
@@ -3441,6 +3455,24 @@
}
}
+ @Override
+ public boolean requestBwUpdate(Network network) {
+ enforceAccessPermission();
+ NetworkAgentInfo nai = null;
+ if (network == null) {
+ return false;
+ }
+ synchronized (mNetworkForNetId) {
+ nai = mNetworkForNetId.get(network.netId);
+ }
+ if (nai != null) {
+ nai.asyncChannel.sendMessage(android.net.NetworkAgent.CMD_REQUEST_BANDWIDTH_UPDATE);
+ return true;
+ }
+ return false;
+ }
+
+
private void enforceMeteredApnPolicy(NetworkCapabilities networkCapabilities) {
// if UID is restricted, don't allow them to bring up metered APNs
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
@@ -3548,14 +3580,23 @@
* and the are the highest scored network available.
* the are keyed off the Requests requestId.
*/
+ // TODO: Yikes, this is accessed on multiple threads: add synchronization.
private final SparseArray<NetworkAgentInfo> mNetworkForRequestId =
new SparseArray<NetworkAgentInfo>();
+ // NOTE: Accessed on multiple threads, must be synchronized on itself.
+ @GuardedBy("mNetworkForNetId")
private final SparseArray<NetworkAgentInfo> mNetworkForNetId =
new SparseArray<NetworkAgentInfo>();
+ // NOTE: Accessed on multiple threads, synchronized with mNetworkForNetId.
+ // An entry is first added to mNetIdInUse, prior to mNetworkForNetId, so
+ // there may not be a strict 1:1 correlation between the two.
+ @GuardedBy("mNetworkForNetId")
+ private final SparseBooleanArray mNetIdInUse = new SparseBooleanArray();
// NetworkAgentInfo keyed off its connecting messenger
// TODO - eval if we can reduce the number of lists/hashmaps/sparsearrays
+ // NOTE: Only should be accessed on ConnectivityServiceThread, except dump().
private final HashMap<Messenger, NetworkAgentInfo> mNetworkAgentInfos =
new HashMap<Messenger, NetworkAgentInfo>();
@@ -3570,7 +3611,7 @@
return nai == getDefaultNetwork();
}
- public void registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
+ public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
int currentScore, NetworkMisc networkMisc) {
enforceConnectivityInternalPermission();
@@ -3578,20 +3619,23 @@
// TODO: Instead of passing mDefaultRequest, provide an API to determine whether a Network
// satisfies mDefaultRequest.
NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
- new NetworkInfo(networkInfo), new LinkProperties(linkProperties),
- new NetworkCapabilities(networkCapabilities), currentScore, mContext, mTrackerHandler,
- new NetworkMisc(networkMisc), mDefaultRequest);
+ new Network(reserveNetId()), new NetworkInfo(networkInfo), new LinkProperties(
+ linkProperties), new NetworkCapabilities(networkCapabilities), currentScore,
+ mContext, mTrackerHandler, new NetworkMisc(networkMisc), mDefaultRequest);
synchronized (this) {
nai.networkMonitor.systemReady = mSystemReady;
}
if (DBG) log("registerNetworkAgent " + nai);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT, nai));
+ return nai.network.netId;
}
private void handleRegisterNetworkAgent(NetworkAgentInfo na) {
if (VDBG) log("Got NetworkAgent Messenger");
mNetworkAgentInfos.put(na.messenger, na);
- assignNextNetId(na);
+ synchronized (mNetworkForNetId) {
+ mNetworkForNetId.put(na.network.netId, na);
+ }
na.asyncChannel.connect(mContext, mTrackerHandler, na.messenger);
NetworkInfo networkInfo = na.networkInfo;
na.networkInfo = null;
@@ -4211,9 +4255,10 @@
networkAgent.created = true;
updateLinkProperties(networkAgent, null);
notifyIfacesChanged();
- notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_PRECHECK);
+
networkAgent.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
scheduleUnvalidatedPrompt(networkAgent);
+
if (networkAgent.isVPN()) {
// Temporarily disable the default proxy (not global).
synchronized (mProxyLock) {
@@ -4226,9 +4271,13 @@
}
// TODO: support proxy per network.
}
+
// Consider network even though it is not yet validated.
rematchNetworkAndRequests(networkAgent, NascentState.NOT_JUST_VALIDATED,
ReapUnvalidatedNetworks.REAP);
+
+ // This has to happen after matching the requests, because callbacks are just requests.
+ notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_PRECHECK);
} else if (state == NetworkInfo.State.DISCONNECTED ||
state == NetworkInfo.State.SUSPENDED) {
networkAgent.asyncChannel.disconnect();
@@ -4395,4 +4444,30 @@
}
return success;
}
+
+ @Override
+ public void factoryReset() {
+ enforceConnectivityInternalPermission();
+ // Turn airplane mode off
+ setAirplaneMode(false);
+
+ // Untether
+ for (String tether : getTetheredIfaces()) {
+ untether(tether);
+ }
+
+ // Turn VPN off
+ VpnConfig vpnConfig = getVpnConfig();
+ if (vpnConfig != null) {
+ if (vpnConfig.legacy) {
+ prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN);
+ } else {
+ // Prevent this app from initiating VPN connections in the future without
+ // user intervention.
+ setVpnPackageAuthorization(false);
+
+ prepareVpn(vpnConfig.user, VpnConfig.LEGACY_VPN);
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index ee73b1a..a31a1a7 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -134,7 +134,11 @@
public void systemReady() {
migrateOldData();
- getGateKeeperService();
+ try {
+ getGateKeeperService();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failure retrieving IGateKeeperService", e);
+ }
mStorage.prefetchUser(UserHandle.USER_OWNER);
}
@@ -388,7 +392,9 @@
byte[] currentHandle = getCurrentHandle(userId);
if (pattern == null) {
+ getGateKeeperService().clearSecureUserId(userId);
mStorage.writePatternHash(null, userId);
+ maybeUpdateKeystore(null, userId);
return;
}
@@ -414,7 +420,9 @@
byte[] currentHandle = getCurrentHandle(userId);
if (password == null) {
+ getGateKeeperService().clearSecureUserId(userId);
mStorage.writePasswordHash(null, userId);
+ maybeUpdateKeystore(null, userId);
return;
}
@@ -691,7 +699,16 @@
return null;
}
- private synchronized IGateKeeperService getGateKeeperService() {
+ private class GateKeeperDiedRecipient implements IBinder.DeathRecipient {
+ @Override
+ public void binderDied() {
+ mGateKeeperService.asBinder().unlinkToDeath(this, 0);
+ mGateKeeperService = null;
+ }
+ }
+
+ private synchronized IGateKeeperService getGateKeeperService()
+ throws RemoteException {
if (mGateKeeperService != null) {
return mGateKeeperService;
}
@@ -699,6 +716,7 @@
final IBinder service =
ServiceManager.getService("android.service.gatekeeper.IGateKeeperService");
if (service != null) {
+ service.linkToDeath(new GateKeeperDiedRecipient(), 0);
mGateKeeperService = IGateKeeperService.Stub.asInterface(service);
return mGateKeeperService;
}
diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java
index 9409615..e0352e0 100644
--- a/services/core/java/com/android/server/MmsServiceBroker.java
+++ b/services/core/java/com/android/server/MmsServiceBroker.java
@@ -372,7 +372,6 @@
@Override
public Uri importTextMessage(String callingPkg, String address, int type, String text,
long timestampMillis, boolean seen, boolean read) throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Import SMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
// Silently fail AppOps failure due to not being the default SMS app
@@ -387,7 +386,6 @@
public Uri importMultimediaMessage(String callingPkg, Uri contentUri,
String messageId, long timestampSecs, boolean seen, boolean read)
throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Import MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
// Silently fail AppOps failure due to not being the default SMS app
@@ -401,8 +399,6 @@
@Override
public boolean deleteStoredMessage(String callingPkg, Uri messageUri)
throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS,
- "Delete SMS/MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
return false;
@@ -413,7 +409,6 @@
@Override
public boolean deleteStoredConversation(String callingPkg, long conversationId)
throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Delete conversation");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
return false;
@@ -424,8 +419,10 @@
@Override
public boolean updateStoredMessageStatus(String callingPkg, Uri messageUri,
ContentValues statusValues) throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS,
- "Update SMS/MMS message");
+ if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
+ callingPkg) != AppOpsManager.MODE_ALLOWED) {
+ return false;
+ }
return getServiceGuarded()
.updateStoredMessageStatus(callingPkg, messageUri, statusValues);
}
@@ -433,8 +430,10 @@
@Override
public boolean archiveStoredConversation(String callingPkg, long conversationId,
boolean archived) throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS,
- "Update SMS/MMS message");
+ if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
+ callingPkg) != AppOpsManager.MODE_ALLOWED) {
+ return false;
+ }
return getServiceGuarded()
.archiveStoredConversation(callingPkg, conversationId, archived);
}
@@ -442,7 +441,6 @@
@Override
public Uri addTextMessageDraft(String callingPkg, String address, String text)
throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Add SMS draft");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
// Silently fail AppOps failure due to not being the default SMS app
@@ -455,7 +453,6 @@
@Override
public Uri addMultimediaMessageDraft(String callingPkg, Uri contentUri)
throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Add MMS draft");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
// Silently fail AppOps failure due to not being the default SMS app
@@ -468,8 +465,6 @@
@Override
public void sendStoredMessage(int subId, String callingPkg, Uri messageUri,
Bundle configOverrides, PendingIntent sentIntent) throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.SEND_SMS,
- "Send stored MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
return;
@@ -480,7 +475,6 @@
@Override
public void setAutoPersisting(String callingPkg, boolean enabled) throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Set auto persist");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
return;
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index 4c937f7..649fcde 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -61,6 +61,7 @@
import android.os.storage.StorageVolume;
import android.os.storage.VolumeInfo;
import android.text.TextUtils;
+import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.AtomicFile;
import android.util.DebugUtils;
@@ -214,8 +215,7 @@
public static final int DISK_CREATED = 640;
public static final int DISK_SIZE_CHANGED = 641;
public static final int DISK_LABEL_CHANGED = 642;
- public static final int DISK_VOLUME_CREATED = 643;
- public static final int DISK_VOLUME_DESTROYED = 644;
+ public static final int DISK_SCANNED = 643;
public static final int DISK_DESTROYED = 649;
public static final int VOLUME_CREATED = 650;
@@ -303,6 +303,10 @@
@GuardedBy("mLock")
private ArrayMap<String, VolumeMetadata> mMetadata = new ArrayMap<>();
+ /** Map from disk ID to latches */
+ @GuardedBy("mLock")
+ private ArrayMap<String, CountDownLatch> mDiskScanLatches = new ArrayMap<>();
+
private DiskInfo findDiskById(String id) {
synchronized (mLock) {
final DiskInfo disk = mDisks.get(id);
@@ -345,6 +349,17 @@
return meta;
}
+ private CountDownLatch findOrCreateDiskScanLatch(String diskId) {
+ synchronized (mLock) {
+ CountDownLatch latch = mDiskScanLatches.get(diskId);
+ if (latch == null) {
+ latch = new CountDownLatch(1);
+ mDiskScanLatches.put(diskId, latch);
+ }
+ return latch;
+ }
+ }
+
private static int sNextMtpIndex = 1;
private static int allocateMtpIndex(String volId) {
@@ -533,7 +548,11 @@
break;
}
case H_FSTRIM: {
- waitForReady();
+ if (!isReady()) {
+ Slog.i(TAG, "fstrim requested, but no daemon connection yet; trying again");
+ sendMessageDelayed(obtainMessage(H_FSTRIM), DateUtils.SECOND_IN_MILLIS);
+ }
+
Slog.i(TAG, "Running fstrim idle maintenance");
// Remember when we kicked it off
@@ -578,7 +597,8 @@
case H_VOLUME_MOUNT: {
final VolumeInfo vol = (VolumeInfo) msg.obj;
try {
- mConnector.execute("volume", "mount", vol.id, vol.flags, vol.userId);
+ mConnector.execute("volume", "mount", vol.id, vol.mountFlags,
+ vol.mountUserId);
} catch (NativeDaemonConnectorException ignored) {
}
break;
@@ -615,7 +635,7 @@
}
private void waitForLatch(CountDownLatch latch, String condition) {
- for (;;) {
+ while (true) {
try {
if (latch.await(5000, TimeUnit.MILLISECONDS)) {
return;
@@ -624,7 +644,7 @@
+ " still waiting for " + condition + "...");
}
} catch (InterruptedException e) {
- Slog.w(TAG, "Interrupt while waiting for MountService to be ready.");
+ Slog.w(TAG, "Interrupt while waiting for " + condition);
}
}
}
@@ -653,7 +673,7 @@
// Create a stub volume that represents internal storage
final VolumeInfo internal = new VolumeInfo(VolumeInfo.ID_PRIVATE_INTERNAL,
- VolumeInfo.TYPE_PRIVATE, 0);
+ VolumeInfo.TYPE_PRIVATE, null, 0);
internal.state = VolumeInfo.STATE_MOUNTED;
internal.path = Environment.getDataDirectory().getAbsolutePath();
mVolumes.put(internal.id, internal);
@@ -682,12 +702,12 @@
synchronized (mVolumes) {
for (int i = 0; i < mVolumes.size(); i++) {
final VolumeInfo vol = mVolumes.valueAt(i);
- if (vol.isVisibleToUser(userId) && vol.state == VolumeInfo.STATE_MOUNTED) {
+ if (vol.isVisibleToUser(userId) && vol.isMountedReadable()) {
final StorageVolume userVol = vol.buildStorageVolume(mContext, userId);
mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget();
- mCallbacks.notifyStorageStateChanged(userVol.getPath(),
- Environment.MEDIA_MOUNTED, Environment.MEDIA_MOUNTED);
+ final String envState = VolumeInfo.getEnvironmentForState(vol.getState());
+ mCallbacks.notifyStorageStateChanged(userVol.getPath(), envState, envState);
}
}
mStartedUsers = ArrayUtils.appendInt(mStartedUsers, userId);
@@ -816,38 +836,21 @@
break;
}
case VoldResponseCode.DISK_LABEL_CHANGED: {
- if (cooked.length != 3) break;
final DiskInfo disk = mDisks.get(cooked[1]);
if (disk != null) {
- disk.label = cooked[2];
+ final StringBuilder builder = new StringBuilder();
+ for (int i = 2; i < cooked.length; i++) {
+ builder.append(cooked[i]).append(' ');
+ }
+ disk.label = builder.toString().trim();
}
break;
}
- case VoldResponseCode.DISK_VOLUME_CREATED: {
- if (cooked.length != 3) break;
- final String diskId = cooked[1];
- final String volId = cooked[2];
- final DiskInfo disk = mDisks.get(diskId);
+ case VoldResponseCode.DISK_SCANNED: {
+ if (cooked.length != 2) break;
+ final DiskInfo disk = mDisks.get(cooked[1]);
if (disk != null) {
- disk.volumeIds = ArrayUtils.appendElement(String.class, disk.volumeIds, volId);
- }
- final VolumeInfo vol = mVolumes.get(volId);
- if (vol != null) {
- vol.diskId = diskId;
- }
- break;
- }
- case VoldResponseCode.DISK_VOLUME_DESTROYED: {
- if (cooked.length != 3) break;
- final String diskId = cooked[1];
- final String volId = cooked[2];
- final DiskInfo disk = mDisks.get(diskId);
- if (disk != null) {
- disk.volumeIds = ArrayUtils.removeElement(String.class, disk.volumeIds, volId);
- }
- final VolumeInfo vol = mVolumes.get(volId);
- if (vol != null) {
- vol.diskId = null;
+ onDiskScannedLocked(disk);
}
break;
}
@@ -858,11 +861,12 @@
}
case VoldResponseCode.VOLUME_CREATED: {
- if (cooked.length != 3) break;
final String id = cooked[1];
final int type = Integer.parseInt(cooked[2]);
+ final String diskId = (cooked.length == 4) ? cooked[3] : null;
+ final DiskInfo disk = mDisks.get(diskId);
final int mtpIndex = allocateMtpIndex(id);
- final VolumeInfo vol = new VolumeInfo(id, type, mtpIndex);
+ final VolumeInfo vol = new VolumeInfo(id, type, disk, mtpIndex);
mVolumes.put(id, vol);
onVolumeCreatedLocked(vol);
break;
@@ -874,7 +878,7 @@
final int oldState = vol.state;
final int newState = Integer.parseInt(cooked[2]);
vol.state = newState;
- onVolumeStateChangedLocked(vol, oldState, newState);
+ onVolumeStateChangedLocked(vol.clone(), oldState, newState);
}
break;
}
@@ -898,10 +902,13 @@
break;
}
case VoldResponseCode.VOLUME_FS_LABEL_CHANGED: {
- if (cooked.length != 3) break;
final VolumeInfo vol = mVolumes.get(cooked[1]);
if (vol != null) {
- vol.fsLabel = cooked[2];
+ final StringBuilder builder = new StringBuilder();
+ for (int i = 2; i < cooked.length; i++) {
+ builder.append(cooked[i]).append(' ');
+ }
+ vol.fsLabel = builder.toString().trim();
}
mCallbacks.notifyVolumeMetadataChanged(vol.clone());
break;
@@ -932,21 +939,48 @@
return true;
}
+ private void onDiskScannedLocked(DiskInfo disk) {
+ final CountDownLatch latch = mDiskScanLatches.remove(disk.id);
+ if (latch != null) {
+ latch.countDown();
+ }
+
+ boolean empty = true;
+ for (int i = 0; i < mVolumes.size(); i++) {
+ final VolumeInfo vol = mVolumes.valueAt(i);
+ if (Objects.equals(disk.id, vol.getDiskId())) {
+ empty = false;
+ }
+ }
+
+ if (empty) {
+ mCallbacks.notifyDiskUnsupported(disk);
+ }
+ }
+
private void onVolumeCreatedLocked(VolumeInfo vol) {
final boolean primaryPhysical = SystemProperties.getBoolean(
StorageManager.PROP_PRIMARY_PHYSICAL, false);
// TODO: enable switching to another emulated primary
if (VolumeInfo.ID_EMULATED_INTERNAL.equals(vol.id) && !primaryPhysical) {
- vol.flags |= VolumeInfo.FLAG_PRIMARY;
- vol.flags |= VolumeInfo.FLAG_VISIBLE;
+ vol.mountFlags |= VolumeInfo.MOUNT_FLAG_PRIMARY;
+ vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE;
mHandler.obtainMessage(H_VOLUME_MOUNT, vol).sendToTarget();
} else if (vol.type == VolumeInfo.TYPE_PUBLIC) {
if (primaryPhysical) {
- vol.flags |= VolumeInfo.FLAG_PRIMARY;
+ vol.mountFlags |= VolumeInfo.MOUNT_FLAG_PRIMARY;
+ vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE;
}
- vol.flags |= VolumeInfo.FLAG_VISIBLE;
- vol.userId = UserHandle.USER_OWNER;
+
+ // Adoptable public disks are visible to apps, since they meet
+ // public API requirement of being in a stable location.
+ final DiskInfo disk = mDisks.get(vol.getDiskId());
+ if (disk != null && disk.isAdoptable()) {
+ vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE;
+ }
+
+ vol.mountUserId = UserHandle.USER_OWNER;
mHandler.obtainMessage(H_VOLUME_MOUNT, vol).sendToTarget();
} else if (vol.type == VolumeInfo.TYPE_PRIVATE) {
@@ -957,8 +991,37 @@
}
}
+ private boolean isBroadcastWorthy(VolumeInfo vol) {
+ switch (vol.getType()) {
+ case VolumeInfo.TYPE_PUBLIC:
+ case VolumeInfo.TYPE_EMULATED:
+ break;
+ default:
+ return false;
+ }
+
+ switch (vol.getState()) {
+ case VolumeInfo.STATE_MOUNTED:
+ case VolumeInfo.STATE_MOUNTED_READ_ONLY:
+ case VolumeInfo.STATE_EJECTING:
+ case VolumeInfo.STATE_UNMOUNTED:
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+ }
+
private void onVolumeStateChangedLocked(VolumeInfo vol, int oldState, int newState) {
- mCallbacks.notifyVolumeStateChanged(vol.clone(), oldState, newState);
+ mCallbacks.notifyVolumeStateChanged(vol, oldState, newState);
+
+ if (isBroadcastWorthy(vol)) {
+ final Intent intent = new Intent(VolumeInfo.ACTION_VOLUME_STATE_CHANGED);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ // TODO: require receiver to hold permission
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ }
final String oldStateEnv = VolumeInfo.getEnvironmentForState(oldState);
final String newStateEnv = VolumeInfo.getEnvironmentForState(newState);
@@ -978,7 +1041,7 @@
}
}
- if (vol.type == VolumeInfo.TYPE_PUBLIC && vol.state == VolumeInfo.STATE_UNMOUNTING) {
+ if (vol.type == VolumeInfo.TYPE_PUBLIC && vol.state == VolumeInfo.STATE_EJECTING) {
// TODO: this should eventually be handled by new ObbVolume state changes
/*
* Some OBBs might have been unmounted when this volume was
@@ -1216,7 +1279,7 @@
enforceUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA);
}
try {
- mConnector.execute("volume", "mount", vol.id, vol.flags, vol.userId);
+ mConnector.execute("volume", "mount", vol.id, vol.mountFlags, vol.mountUserId);
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
@@ -1264,11 +1327,13 @@
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
waitForReady();
+ final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
try {
mConnector.execute("volume", "partition", diskId, "public");
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
+ waitForLatch(latch, "partitionPublic");
}
@Override
@@ -1276,11 +1341,13 @@
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
waitForReady();
+ final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
try {
mConnector.execute("volume", "partition", diskId, "private");
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
+ waitForLatch(latch, "partitionPrivate");
}
@Override
@@ -1288,11 +1355,13 @@
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
waitForReady();
+ final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
try {
mConnector.execute("volume", "partition", diskId, "mixed", ratio);
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
+ waitForLatch(latch, "partitionMixed");
}
@Override
@@ -1356,7 +1425,7 @@
synchronized (mLock) {
for (int i = 0; i < mVolumes.size(); i++) {
final VolumeInfo vol = mVolumes.valueAt(i);
- if (vol.isPrimary() && vol.state == VolumeInfo.STATE_MOUNTED) {
+ if (vol.isPrimary() && vol.isMountedWritable()) {
// Cool beans, we have a mounted primary volume
return;
}
@@ -2628,6 +2697,7 @@
private static final int MSG_STORAGE_STATE_CHANGED = 1;
private static final int MSG_VOLUME_STATE_CHANGED = 2;
private static final int MSG_VOLUME_METADATA_CHANGED = 3;
+ private static final int MSG_DISK_UNSUPPORTED = 4;
private final RemoteCallbackList<IMountServiceListener>
mCallbacks = new RemoteCallbackList<>();
@@ -2675,6 +2745,10 @@
callback.onVolumeMetadataChanged((VolumeInfo) args.arg1);
break;
}
+ case MSG_DISK_UNSUPPORTED: {
+ callback.onDiskUnsupported((DiskInfo) args.arg1);
+ break;
+ }
}
}
@@ -2699,15 +2773,59 @@
args.arg1 = vol;
obtainMessage(MSG_VOLUME_METADATA_CHANGED, args).sendToTarget();
}
+
+ private void notifyDiskUnsupported(DiskInfo disk) {
+ final SomeArgs args = SomeArgs.obtain();
+ args.arg1 = disk;
+ obtainMessage(MSG_DISK_UNSUPPORTED, args).sendToTarget();
+ }
}
@Override
protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+ for (String arg : args) {
+ if ("--clear-metadata".equals(arg)) {
+ synchronized (mLock) {
+ mMetadata.clear();
+ writeMetadataLocked();
+ }
+ }
+ }
+
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ", 160);
+ synchronized (mLock) {
+ pw.println("Disks:");
+ pw.increaseIndent();
+ for (int i = 0; i < mDisks.size(); i++) {
+ final DiskInfo disk = mDisks.valueAt(i);
+ disk.dump(pw);
+ }
+ pw.decreaseIndent();
+
+ pw.println();
+ pw.println("Volumes:");
+ pw.increaseIndent();
+ for (int i = 0; i < mVolumes.size(); i++) {
+ final VolumeInfo vol = mVolumes.valueAt(i);
+ if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.id)) continue;
+ vol.dump(pw);
+ }
+ pw.decreaseIndent();
+
+ pw.println();
+ pw.println("Metadata:");
+ pw.increaseIndent();
+ for (int i = 0; i < mMetadata.size(); i++) {
+ final VolumeMetadata meta = mMetadata.valueAt(i);
+ meta.dump(pw);
+ }
+ pw.decreaseIndent();
+ }
synchronized (mObbMounts) {
+ pw.println();
pw.println("mObbMounts:");
pw.increaseIndent();
final Iterator<Entry<IBinder, List<ObbState>>> binders = mObbMounts.entrySet()
@@ -2737,35 +2855,6 @@
pw.decreaseIndent();
}
- synchronized (mLock) {
- pw.println();
- pw.println("Disks:");
- pw.increaseIndent();
- for (int i = 0; i < mDisks.size(); i++) {
- final DiskInfo disk = mDisks.valueAt(i);
- disk.dump(pw);
- }
- pw.decreaseIndent();
-
- pw.println();
- pw.println("Volumes:");
- pw.increaseIndent();
- for (int i = 0; i < mVolumes.size(); i++) {
- final VolumeInfo vol = mVolumes.valueAt(i);
- vol.dump(pw);
- }
- pw.decreaseIndent();
-
- pw.println();
- pw.println("Metadata:");
- pw.increaseIndent();
- for (int i = 0; i < mMetadata.size(); i++) {
- final VolumeMetadata meta = mMetadata.valueAt(i);
- meta.dump(pw);
- }
- pw.decreaseIndent();
- }
-
pw.println();
pw.println("mConnection:");
pw.increaseIndent();
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index d153233..4ee6657 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -17,6 +17,7 @@
package com.android.server;
import android.app.ActivityManager;
+import android.app.AppOpsManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -84,7 +85,7 @@
private static final boolean VDBG = false; // STOPSHIP if true
private static class Record {
- String pkgForDebug;
+ String callingPackage;
IBinder binder;
@@ -109,7 +110,8 @@
@Override
public String toString() {
- return "{pkgForDebug=" + pkgForDebug + " binder=" + binder + " callback=" + callback
+ return "{callingPackage=" + callingPackage + " binder=" + binder
+ + " callback=" + callback
+ " onSubscriptionsChangedListenererCallback="
+ onSubscriptionsChangedListenerCallback
+ " callerUid=" + callerUid + " subId=" + subId + " phoneId=" + phoneId
@@ -125,6 +127,8 @@
private final IBatteryStats mBatteryStats;
+ private final AppOpsManager mAppOps;
+
private boolean hasNotifySubscriptionInfoChangedOccurred = false;
private int mNumPhones;
@@ -181,6 +185,8 @@
private PreciseCallState mPreciseCallState = new PreciseCallState();
+ private boolean mCarrierNetworkChangeState = false;
+
private PreciseDataConnectionState mPreciseDataConnectionState =
new PreciseDataConnectionState();
@@ -325,6 +331,8 @@
}
}
mConnectedApns = new ArrayList<String>();
+
+ mAppOps = mContext.getSystemService(AppOpsManager.class);
}
public void systemRunning() {
@@ -338,18 +346,24 @@
}
@Override
- public void addOnSubscriptionsChangedListener(String pkgForDebug,
+ public void addOnSubscriptionsChangedListener(String callingPackage,
IOnSubscriptionsChangedListener callback) {
int callerUid = UserHandle.getCallingUserId();
int myUid = UserHandle.myUserId();
if (VDBG) {
- log("listen oscl: E pkg=" + pkgForDebug + " myUid=" + myUid
+ log("listen oscl: E pkg=" + callingPackage + " myUid=" + myUid
+ " callerUid=" + callerUid + " callback=" + callback
+ " callback.asBinder=" + callback.asBinder());
}
- /* Checks permission and throws Security exception */
- checkOnSubscriptionsChangedListenerPermission();
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_PHONE_STATE, null);
+
+ if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(),
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ return;
+ }
+
Record r = null;
synchronized (mRecords) {
@@ -370,7 +384,7 @@
}
r.onSubscriptionsChangedListenerCallback = callback;
- r.pkgForDebug = pkgForDebug;
+ r.callingPackage = callingPackage;
r.callerUid = callerUid;
r.events = 0;
if (DBG) {
@@ -399,12 +413,6 @@
remove(callback.asBinder());
}
- private void checkOnSubscriptionsChangedListenerPermission() {
- mContext.enforceCallingOrSelfPermission(
- SubscriptionManager.OnSubscriptionsChangedListener
- .PERMISSION_ON_SUBSCRIPTIONS_CHANGED, null);
- }
-
@Override
public void notifySubscriptionInfoChanged() {
if (VDBG) log("notifySubscriptionInfoChanged:");
@@ -444,12 +452,12 @@
listen(pkgForDebug, callback, events, notifyNow, subId);
}
- private void listen(String pkgForDebug, IPhoneStateListener callback, int events,
+ private void listen(String callingPackage, IPhoneStateListener callback, int events,
boolean notifyNow, int subId) {
int callerUid = UserHandle.getCallingUserId();
int myUid = UserHandle.myUserId();
if (VDBG) {
- log("listen: E pkg=" + pkgForDebug + " events=0x" + Integer.toHexString(events)
+ log("listen: E pkg=" + callingPackage + " events=0x" + Integer.toHexString(events)
+ " notifyNow=" + notifyNow + " subId=" + subId + " myUid=" + myUid
+ " callerUid=" + callerUid);
}
@@ -457,6 +465,14 @@
if (events != PhoneStateListener.LISTEN_NONE) {
/* Checks permission and throws Security exception */
checkListenerPermission(events);
+
+ if ((events & PHONE_STATE_PERMISSION_MASK) != 0) {
+ if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(),
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ return;
+ }
+ }
+
synchronized (mRecords) {
// register
Record r = null;
@@ -476,7 +492,7 @@
}
r.callback = callback;
- r.pkgForDebug = pkgForDebug;
+ r.callingPackage = callingPackage;
r.callerUid = callerUid;
// Legacy applications pass SubscriptionManager.DEFAULT_SUB_ID,
// force all illegal subId to SubscriptionManager.DEFAULT_SUB_ID
@@ -607,6 +623,13 @@
remove(r.binder);
}
}
+ if ((events & PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE) != 0) {
+ try {
+ r.callback.onCarrierNetworkChange(mCarrierNetworkChangeState);
+ } catch (RemoteException ex) {
+ remove(r.binder);
+ }
+ }
}
}
} else {
@@ -622,7 +645,7 @@
if (mRecords.get(i).binder == binder) {
if (DBG) {
Record r = mRecords.get(i);
- log("remove: binder=" + binder + "r.pkgForDebug" + r.pkgForDebug
+ log("remove: binder=" + binder + "r.callingPackage" + r.callingPackage
+ "r.callback" + r.callback);
}
mRecords.remove(i);
@@ -790,6 +813,31 @@
broadcastSignalStrengthChanged(signalStrength, subId);
}
+ @Override
+ public void notifyCarrierNetworkChange(boolean active) {
+ if (!checkNotifyPermissionOrCarrierPrivilege("notifyCarrierNetworkChange()")) {
+ return;
+ }
+ if (VDBG) {
+ log("notifyCarrierNetworkChange: active=" + active);
+ }
+
+ synchronized (mRecords) {
+ mCarrierNetworkChangeState = active;
+ for (Record r : mRecords) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE)) {
+ try {
+ r.callback.onCarrierNetworkChange(active);
+ } catch (RemoteException ex) {
+ mRemoveList.add(r.binder);
+ }
+ }
+ }
+ handleRemoveListLocked();
+ }
+ }
+
public void notifyCellInfo(List<CellInfo> cellInfo) {
notifyCellInfoForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, cellInfo);
}
@@ -1346,7 +1394,8 @@
}
intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
- android.Manifest.permission.READ_PHONE_STATE);
+ android.Manifest.permission.READ_PHONE_STATE,
+ AppOpsManager.OP_READ_PHONE_STATE);
}
private void broadcastDataConnectionStateChanged(int state,
@@ -1422,9 +1471,19 @@
android.Manifest.permission.READ_PRECISE_PHONE_STATE);
}
+ private boolean checkNotifyPermissionOrCarrierPrivilege(String method) {
+ if (checkNotifyPermission() || checkCarrierPrivilege()) {
+ return true;
+ }
+
+ String msg = "Modify Phone State or Carrier Privilege Permission Denial: " + method
+ + " from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid();
+ if (DBG) log(msg);
+ return false;
+ }
+
private boolean checkNotifyPermission(String method) {
- if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
- == PackageManager.PERMISSION_GRANTED) {
+ if (checkNotifyPermission()) {
return true;
}
String msg = "Modify Phone State Permission Denial: " + method + " from pid="
@@ -1433,6 +1492,24 @@
return false;
}
+ private boolean checkNotifyPermission() {
+ return mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
+ private boolean checkCarrierPrivilege() {
+ TelephonyManager tm = TelephonyManager.getDefault();
+ String[] pkgs = mContext.getPackageManager().getPackagesForUid(Binder.getCallingUid());
+ for (String pkg : pkgs) {
+ if (tm.checkCarrierPrivilegesForPackage(pkg) ==
+ TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private void checkListenerPermission(int events) {
if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) {
mContext.enforceCallingOrSelfPermission(
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index b606353..b658932 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -26,10 +26,14 @@
import static com.android.internal.util.XmlUtils.writeBooleanAttribute;
import static com.android.internal.util.XmlUtils.writeIntAttribute;
import static com.android.internal.util.XmlUtils.writeLongAttribute;
-import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
-import static com.android.server.am.ActivityManagerDebugConfig.*;
-import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
import static com.android.server.Watchdog.NATIVE_STACKS_OF_INTEREST;
+import static com.android.server.am.ActivityManagerDebugConfig.*;
+import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
+import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED;
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
@@ -3982,13 +3986,13 @@
if (rootR == null) {
Slog.w(TAG, "Finishing task with all activities already finished");
}
- // Do not allow task to finish in Lock Task mode.
- if (tr == mStackSupervisor.mLockTaskModeTask) {
- if (rootR == r) {
- Slog.i(TAG, "Not finishing task in lock task mode");
- mStackSupervisor.showLockTaskToast();
- return false;
- }
+ // Do not allow task to finish if last task in lockTask mode. Launchable apps can
+ // finish themselves.
+ if (tr.mLockTaskAuth != LOCK_TASK_AUTH_LAUNCHABLE && rootR == r &&
+ mStackSupervisor.isLastLockedTask(tr)) {
+ Slog.i(TAG, "Not finishing task in lock task mode");
+ mStackSupervisor.showLockTaskToast();
+ return false;
}
if (mController != null) {
// Find the first activity that is not finishing.
@@ -4142,20 +4146,18 @@
final long origId = Binder.clearCallingIdentity();
try {
ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return false;
+ }
- ActivityRecord rootR = r.task.getRootActivity();
- // Do not allow task to finish in Lock Task mode.
- if (r.task == mStackSupervisor.mLockTaskModeTask) {
- if (rootR == r) {
- mStackSupervisor.showLockTaskToast();
- return false;
- }
+ // Do not allow the last non-launchable task to finish in Lock Task mode.
+ final TaskRecord task = r.task;
+ if (task.mLockTaskAuth != LOCK_TASK_AUTH_LAUNCHABLE &&
+ mStackSupervisor.isLastLockedTask(task) && task.getRootActivity() == r) {
+ mStackSupervisor.showLockTaskToast();
+ return false;
}
- boolean res = false;
- if (r != null) {
- res = r.task.stack.finishActivityAffinityLocked(r);
- }
- return res;
+ return task.stack.finishActivityAffinityLocked(r);
} finally {
Binder.restoreCallingIdentity(origId);
}
@@ -7849,6 +7851,27 @@
rti.lastActiveTime = tr.lastActiveTime;
rti.affiliatedTaskId = tr.mAffiliatedTaskId;
rti.affiliatedTaskColor = tr.mAffiliatedTaskColor;
+ rti.numActivities = 0;
+
+ ActivityRecord base = null;
+ ActivityRecord top = null;
+ ActivityRecord tmp;
+
+ for (int i = tr.mActivities.size() - 1; i >= 0; --i) {
+ tmp = tr.mActivities.get(i);
+ if (tmp.finishing) {
+ continue;
+ }
+ base = tmp;
+ if (top == null || (top.state == ActivityState.INITIALIZING)) {
+ top = base;
+ }
+ rti.numActivities++;
+ }
+
+ rti.baseActivity = (base != null) ? base.intent.getComponent() : null;
+ rti.topActivity = (top != null) ? top.intent.getComponent() : null;
+
return rti;
}
@@ -8336,9 +8359,9 @@
final long origId = Binder.clearCallingIdentity();
try {
int taskId = ActivityRecord.getTaskForActivityLocked(token, !nonRoot);
- if (taskId >= 0) {
- if ((mStackSupervisor.mLockTaskModeTask != null)
- && (mStackSupervisor.mLockTaskModeTask.taskId == taskId)) {
+ final TaskRecord task = mRecentTasks.taskForIdLocked(taskId);
+ if (task != null) {
+ if (mStackSupervisor.isLockedTask(task)) {
mStackSupervisor.showLockTaskToast();
return false;
}
@@ -8520,47 +8543,45 @@
@Override
public void updateLockTaskPackages(int userId, String[] packages) {
- if (Binder.getCallingUid() != Process.SYSTEM_UID) {
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid != 0 && callingUid != Process.SYSTEM_UID) {
throw new SecurityException("updateLockTaskPackage called from non-system process");
}
synchronized (this) {
mLockTaskPackages.put(userId, packages);
+ mStackSupervisor.onLockTaskPackagesUpdatedLocked();
}
}
- private boolean isLockTaskAuthorizedLocked(String pkg) {
- String[] packages = mLockTaskPackages.get(mCurrentUserId);
- if (packages == null) {
- return false;
- }
- for (int i = packages.length - 1; i >= 0; --i) {
- if (pkg.equals(packages[i])) {
- return true;
- }
- }
- return false;
- }
void startLockTaskModeLocked(TaskRecord task) {
- final String pkg = task.intent.getComponent().getPackageName();
+ if (task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) {
+ return;
+ }
+
// isSystemInitiated is used to distinguish between locked and pinned mode, as pinned mode
// is initiated by system after the pinning request was shown and locked mode is initiated
// by an authorized app directly
- boolean isSystemInitiated = Binder.getCallingUid() == Process.SYSTEM_UID;
+ final int callingUid = Binder.getCallingUid();
+ boolean isSystemInitiated = callingUid == Process.SYSTEM_UID;
long ident = Binder.clearCallingIdentity();
try {
- if (!isSystemInitiated && !isLockTaskAuthorizedLocked(pkg)) {
- StatusBarManagerInternal statusBarManager =
- LocalServices.getService(StatusBarManagerInternal.class);
- if (statusBarManager != null) {
- statusBarManager.showScreenPinningRequest();
- }
- return;
- }
-
final ActivityStack stack = mStackSupervisor.getFocusedStack();
- if (!isSystemInitiated && (stack == null || task != stack.topTask())) {
- throw new IllegalArgumentException("Invalid task, not in foreground");
+ if (!isSystemInitiated) {
+ task.mLockTaskUid = callingUid;
+ if (task.mLockTaskAuth == LOCK_TASK_AUTH_PINNABLE) {
+ // startLockTask() called by app and task mode is lockTaskModeDefault.
+ StatusBarManagerInternal statusBarManager =
+ LocalServices.getService(StatusBarManagerInternal.class);
+ if (statusBarManager != null) {
+ statusBarManager.showScreenPinningRequest();
+ }
+ return;
+ }
+
+ if (stack == null || task != stack.topTask()) {
+ throw new IllegalArgumentException("Invalid task, not in foreground");
+ }
}
mStackSupervisor.setLockTaskModeLocked(task, isSystemInitiated ?
ActivityManager.LOCK_TASK_MODE_PINNED :
@@ -8614,23 +8635,15 @@
@Override
public void stopLockTaskMode() {
- // Verify that the user matches the package of the intent for the TaskRecord
- // we are locked to or systtem. This will ensure the same caller for startLockTaskMode
- // and stopLockTaskMode.
- final int callingUid = Binder.getCallingUid();
- if (callingUid != Process.SYSTEM_UID) {
- try {
- String pkg =
- mStackSupervisor.mLockTaskModeTask.intent.getComponent().getPackageName();
- int uid = mContext.getPackageManager().getPackageUid(pkg,
- Binder.getCallingUserHandle().getIdentifier());
- if (uid != callingUid) {
- throw new SecurityException("Invalid uid, expected " + uid);
- }
- } catch (NameNotFoundException e) {
- Log.d(TAG, "stopLockTaskMode " + e);
- return;
- }
+ final TaskRecord lockTask = mStackSupervisor.getLockedTaskLocked();
+ if (lockTask == null) {
+ // Our work here is done.
+ return;
+ }
+ // Ensure the same caller for startLockTaskMode and stopLockTaskMode.
+ if (getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_LOCKED &&
+ Binder.getCallingUid() != lockTask.mLockTaskUid) {
+ throw new SecurityException("Invalid uid, expected " + lockTask.mLockTaskUid);
}
long ident = Binder.clearCallingIdentity();
try {
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 2362d28..33f915f 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -16,7 +16,7 @@
package com.android.server.am;
-import static android.content.pm.ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN;
+import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
import static com.android.server.am.ActivityManagerDebugConfig.*;
@@ -363,19 +363,9 @@
mOverrideConfig = Configuration.EMPTY;
}
- /**
- * Checks whether the userid is a profile of the current user.
- */
- private boolean isCurrentProfileLocked(int userId) {
- if (userId == mCurrentUser) return true;
- for (int i = 0; i < mService.mCurrentProfileIds.length; i++) {
- if (mService.mCurrentProfileIds[i] == userId) return true;
- }
- return false;
- }
-
boolean okToShowLocked(ActivityRecord r) {
- return isCurrentProfileLocked(r.userId) || (r.info.flags & FLAG_SHOW_ON_LOCK_SCREEN) != 0;
+ return mStackSupervisor.isCurrentProfileLocked(r.userId)
+ || (r.info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0;
}
final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) {
@@ -619,12 +609,13 @@
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
- final boolean notCurrentUserTask = !isCurrentProfileLocked(task.userId);
+ final boolean notCurrentUserTask =
+ !mStackSupervisor.isCurrentProfileLocked(task.userId);
final ArrayList<ActivityRecord> activities = task.mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
ActivityRecord r = activities.get(activityNdx);
- if (notCurrentUserTask && (r.info.flags & FLAG_SHOW_ON_LOCK_SCREEN) == 0) {
+ if (notCurrentUserTask && (r.info.flags & FLAG_SHOW_FOR_ALL_USERS) == 0) {
return null;
}
if (!r.finishing && r.intent.getComponent().equals(cls) && r.userId == userId) {
@@ -655,7 +646,7 @@
// NOTE: If {@link TaskRecord#topRunningActivityLocked} return is not null then it is
// okay to show the activity when locked.
- if (isCurrentProfileLocked(task.userId)
+ if (mStackSupervisor.isCurrentProfileLocked(task.userId)
|| task.topRunningActivityLocked(null) != null) {
if (DEBUG_TASKS) Slog.d(TAG_TASKS, "switchUserLocked: stack=" + getStackId() +
" moving " + task + " to top");
@@ -817,8 +808,14 @@
final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, boolean resuming,
boolean dontWait) {
if (mPausingActivity != null) {
- Slog.wtf(TAG, "Going to pause when pause is already pending for " + mPausingActivity);
- completePauseLocked(false);
+ Slog.wtf(TAG, "Going to pause when pause is already pending for " + mPausingActivity
+ + " state=" + mPausingActivity.state);
+ if (!mService.isSleeping()) {
+ // Avoid recursion among check for sleep and complete pause during sleeping.
+ // Because activity will be paused immediately after resume, just let pause
+ // be completed by the order of activity paused from clients.
+ completePauseLocked(false);
+ }
}
ActivityRecord prev = mResumedActivity;
if (prev == null) {
@@ -2024,13 +2021,13 @@
// Now put task at top.
int taskNdx = mTaskHistory.size();
final boolean notShownWhenLocked =
- (newActivity != null && (newActivity.info.flags & FLAG_SHOW_ON_LOCK_SCREEN) == 0)
+ (newActivity != null && (newActivity.info.flags & FLAG_SHOW_FOR_ALL_USERS) == 0)
|| (newActivity == null && task.topRunningActivityLocked(null) == null);
- if (!isCurrentProfileLocked(task.userId) && notShownWhenLocked) {
+ if (!mStackSupervisor.isCurrentProfileLocked(task.userId) && notShownWhenLocked) {
// Put non-current user tasks below current user tasks.
while (--taskNdx >= 0) {
final TaskRecord tmpTask = mTaskHistory.get(taskNdx);
- if (!isCurrentProfileLocked(tmpTask.userId)
+ if (!mStackSupervisor.isCurrentProfileLocked(tmpTask.userId)
|| tmpTask.topRunningActivityLocked(null) == null) {
break;
}
@@ -2074,7 +2071,7 @@
r.putInHistory();
mWindowManager.addAppToken(task.mActivities.indexOf(r), r.appToken,
r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,
- (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0,
+ (r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0,
r.userId, r.info.configChanges, task.voiceSession != null,
r.mLaunchTaskBehind);
if (VALIDATE_TOKENS) {
@@ -2138,7 +2135,7 @@
}
mWindowManager.addAppToken(task.mActivities.indexOf(r),
r.appToken, r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,
- (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0, r.userId,
+ (r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0, r.userId,
r.info.configChanges, task.voiceSession != null, r.mLaunchTaskBehind);
boolean doShow = true;
if (newTask) {
@@ -2190,7 +2187,7 @@
// because there is nothing for it to animate on top of.
mWindowManager.addAppToken(task.mActivities.indexOf(r), r.appToken,
r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,
- (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0, r.userId,
+ (r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0, r.userId,
r.info.configChanges, task.voiceSession != null, r.mLaunchTaskBehind);
ActivityOptions.abort(options);
options = null;
@@ -2875,7 +2872,7 @@
}
if (endTask) {
- mStackSupervisor.endLockTaskModeIfTaskEnding(task);
+ mStackSupervisor.removeLockedTaskLocked(task);
}
} else if (r.state != ActivityState.PAUSING) {
// If the activity is PAUSING, we will complete the finish once
@@ -3674,8 +3671,7 @@
}
Slog.i(TAG, "moveTaskToBack: " + tr);
-
- mStackSupervisor.endLockTaskModeIfTaskEnding(tr);
+ mStackSupervisor.removeLockedTaskLocked(tr);
// If we have a watcher, preflight the move before committing to it. First check
// for *other* available tasks, but if none are available, then try again allowing the
@@ -4062,6 +4058,7 @@
}
ActivityRecord r = null;
ActivityRecord top = null;
+ ActivityRecord tmp;
int numActivities = 0;
int numRunning = 0;
final ArrayList<ActivityRecord> activities = task.mActivities;
@@ -4069,7 +4066,11 @@
continue;
}
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- r = activities.get(activityNdx);
+ tmp = activities.get(activityNdx);
+ if (tmp.finishing) {
+ continue;
+ }
+ r = tmp;
// Initialize state for next task if needed.
if (top == null || (top.state == ActivityState.INITIALIZING)) {
@@ -4240,7 +4241,7 @@
*/
void removeTask(TaskRecord task, String reason, boolean notMoving) {
if (notMoving) {
- mStackSupervisor.endLockTaskModeIfTaskEnding(task);
+ mStackSupervisor.removeLockedTaskLocked(task);
mWindowManager.removeTask(task.taskId);
}
@@ -4345,4 +4346,10 @@
mFullscreen = Configuration.EMPTY.equals(mOverrideConfig);
return !mOverrideConfig.equals(oldConfig);
}
+
+ void onLockTaskPackagesUpdatedLocked() {
+ for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
+ mTaskHistory.get(taskNdx).setLockTaskAuth();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index c2f6bfd..1585f61 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -17,10 +17,15 @@
package com.android.server.am;
import static android.Manifest.permission.START_ANY_ACTIVITY;
+import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
+import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
+import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
+import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
+import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static com.android.server.am.ActivityManagerDebugConfig.*;
import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
@@ -28,6 +33,10 @@
import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE;
import static com.android.server.am.ActivityStack.ActivityState.*;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED;
import android.app.Activity;
import android.app.ActivityManager;
@@ -261,17 +270,17 @@
// TODO: Add listener for removal of references.
/** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
- private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>();
+ private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<>();
/** Mapping from displayId to display current state */
- private final SparseArray<ActivityDisplay> mActivityDisplays =
- new SparseArray<ActivityDisplay>();
+ private final SparseArray<ActivityDisplay> mActivityDisplays = new SparseArray<>();
InputManagerInternal mInputManagerInternal;
- /** If non-null then the task specified remains in front and no other tasks may be started
- * until the task exits or #stopLockTaskMode() is called. */
- TaskRecord mLockTaskModeTask;
+ /** The chain of tasks in lockTask mode. The current frontmost task is at the top, and tasks
+ * may be finished until there is only one entry left. If this is empty the system is not
+ * in lockTask mode. */
+ ArrayList<TaskRecord> mLockTaskModeTasks = new ArrayList<>();
/** Store the current lock task mode. Possible values:
* {@link ActivityManager#LOCK_TASK_MODE_NONE}, {@link ActivityManager#LOCK_TASK_MODE_LOCKED},
* {@link ActivityManager#LOCK_TASK_MODE_PINNED}
@@ -282,8 +291,7 @@
*/
private LockTaskNotify mLockTaskNotify;
- final ArrayList<PendingActivityLaunch> mPendingActivityLaunches
- = new ArrayList<PendingActivityLaunch>();
+ final ArrayList<PendingActivityLaunch> mPendingActivityLaunches = new ArrayList<>();
/** Used to keep resumeTopActivityLocked() from being entered recursively */
boolean inResumeTopActivity;
@@ -796,7 +804,7 @@
ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStack stack = stacks.get(stackNdx);
- ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>();
+ ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<>();
runningTaskLists.add(stackTaskList);
stack.getTasksLocked(stackTaskList, callingUid, allowed);
}
@@ -894,8 +902,8 @@
intent = new Intent(intent);
// Collect information about the target of the Intent.
- ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
- profilerInfo, userId);
+ ActivityInfo aInfo =
+ resolveActivity(intent, resolvedType, startFlags, profilerInfo, userId);
ActivityContainer container = (ActivityContainer)iContainer;
synchronized (mService) {
@@ -1170,7 +1178,12 @@
mService.updateLruProcessLocked(app, true, null);
mService.updateOomAdjLocked();
- final ActivityStack stack = r.task.stack;
+ final TaskRecord task = r.task;
+ if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE) {
+ setLockTaskModeLocked(task, LOCK_TASK_MODE_LOCKED, "lockTaskLaunchMode attribute");
+ }
+
+ final ActivityStack stack = task.stack;
try {
if (app.thread == null) {
throw new RemoteException();
@@ -1187,11 +1200,11 @@
if (andResume) {
EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
r.userId, System.identityHashCode(r),
- r.task.taskId, r.shortComponentName);
+ task.taskId, r.shortComponentName);
}
if (r.isHomeActivity() && r.isNotResolverActivity()) {
// Home process is the root process of the task.
- mService.mHomeProcess = r.task.mActivities.get(0).app;
+ mService.mHomeProcess = task.mActivities.get(0).app;
}
mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
r.sleeping = false;
@@ -1233,7 +1246,7 @@
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage,
- r.task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
+ task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
if ((app.info.privateFlags&ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) {
@@ -1369,8 +1382,9 @@
}
}
+ final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
+
if (err == ActivityManager.START_SUCCESS) {
- final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
+ "} from uid " + callingUid
+ " on display " + (container == null ? (mFocusedStack == null ?
@@ -1394,7 +1408,7 @@
final int launchFlags = intent.getFlags();
- if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) {
+ if ((launchFlags & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) {
// Transfer the result target from the source activity to the new
// one being started, including any failures.
if (requestCode >= 0) {
@@ -1438,6 +1452,13 @@
err = ActivityManager.START_CLASS_NOT_FOUND;
}
+ if (err == ActivityManager.START_SUCCESS
+ && !isCurrentProfileLocked(userId)
+ && (aInfo.flags & FLAG_SHOW_FOR_ALL_USERS) == 0) {
+ // Trying to launch a background activity that doesn't show for all users.
+ err = ActivityManager.START_NOT_CURRENT_USER_ACTIVITY;
+ }
+
if (err == ActivityManager.START_SUCCESS && sourceRecord != null
&& sourceRecord.task.voiceSession != null) {
// If this activity is being launched as part of a voice session, we need
@@ -1946,7 +1967,7 @@
if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
}
- if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
+ if ((startFlags & ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
// We don't need to start a new activity, and
// the client said not to do anything if that
// is the case, so this is it! And for paranoia, make
@@ -1964,8 +1985,7 @@
}
return ActivityManager.START_RETURN_INTENT_TO_CALLER;
}
- if ((launchFlags &
- (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
+ if ((launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
== (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) {
// The caller has requested to completely replace any
// existing task with its new activity. Well that should
@@ -2128,10 +2148,6 @@
// Should this be considered a new task?
if (r.resultTo == null && inTask == null && !addingToTask
&& (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
- if (isLockTaskModeViolation(reuseTask)) {
- Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
- return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
- }
newTask = true;
targetStack = computeStackFocus(r, newTask);
targetStack.moveToFront("startingNewTask");
@@ -2147,6 +2163,10 @@
} else {
r.setTask(reuseTask, taskToAffiliate);
}
+ if (isLockTaskModeViolation(r.task)) {
+ Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
+ return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
+ }
if (!movedHome) {
if ((launchFlags &
(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
@@ -2815,7 +2835,7 @@
final ActivityRecord r = activities.get(activityNdx);
mWindowManager.addAppToken(0, r.appToken, task.taskId, stack.mStackId,
r.info.screenOrientation, r.fullscreen,
- (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0,
+ (r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0,
r.userId, r.info.configChanges, task.voiceSession != null,
r.mLaunchTaskBehind);
}
@@ -3220,6 +3240,15 @@
mStartingBackgroundUsers.add(uss);
}
+ /** Checks whether the userid is a profile of the current user. */
+ boolean isCurrentProfileLocked(int userId) {
+ if (userId == mCurrentUser) return true;
+ for (int i = 0; i < mService.mCurrentProfileIds.length; i++) {
+ if (mService.mCurrentProfileIds[i] == userId) return true;
+ }
+ return false;
+ }
+
final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
ArrayList<ActivityRecord> stops = null;
@@ -3292,6 +3321,7 @@
pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId);
pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers);
+ pw.print(prefix); pw.println("mLockTaskModeTasks" + mLockTaskModeTasks);
}
ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
@@ -3592,6 +3622,32 @@
return list;
}
+ TaskRecord getLockedTaskLocked() {
+ final int top = mLockTaskModeTasks.size() - 1;
+ if (top >= 0) {
+ return mLockTaskModeTasks.get(top);
+ }
+ return null;
+ }
+
+ boolean isLockedTask(TaskRecord task) {
+ return mLockTaskModeTasks.contains(task);
+ }
+
+ boolean isLastLockedTask(TaskRecord task) {
+ return mLockTaskModeTasks.size() == 1 && mLockTaskModeTasks.contains(task);
+ }
+
+ void removeLockedTaskLocked(final TaskRecord task) {
+ if (mLockTaskModeTasks.remove(task) && mLockTaskModeTasks.isEmpty()) {
+ // Last one.
+ final Message lockTaskMsg = Message.obtain();
+ lockTaskMsg.arg1 = task.userId;
+ lockTaskMsg.what = LOCK_TASK_END_MSG;
+ mHandler.sendMessage(lockTaskMsg);
+ }
+ }
+
void showLockTaskToast() {
mLockTaskNotify.showToast(mLockTaskModeState);
}
@@ -3599,42 +3655,93 @@
void setLockTaskModeLocked(TaskRecord task, int lockTaskModeState, String reason) {
if (task == null) {
// Take out of lock task mode if necessary
- if (mLockTaskModeTask != null) {
- final Message lockTaskMsg = Message.obtain();
- lockTaskMsg.arg1 = mLockTaskModeTask.userId;
- lockTaskMsg.what = LOCK_TASK_END_MSG;
- mLockTaskModeTask = null;
- mHandler.sendMessage(lockTaskMsg);
+ final TaskRecord lockedTask = getLockedTaskLocked();
+ if (lockedTask != null) {
+ removeLockedTaskLocked(lockedTask);
+ if (!mLockTaskModeTasks.isEmpty()) {
+ // There are locked tasks remaining, can only finish this task, not unlock it.
+ lockedTask.performClearTaskLocked();
+ resumeTopActivitiesLocked();
+ return;
+ }
}
return;
}
- if (isLockTaskModeViolation(task)) {
- Slog.e(TAG, "setLockTaskMode: Attempt to start a second Lock Task Mode task.");
+
+ // Should have already been checked, but do it again.
+ if (task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) {
return;
}
- mLockTaskModeTask = task;
+ if (isLockTaskModeViolation(task)) {
+ Slog.e(TAG, "setLockTaskMode: Attempt to start an unauthorized lock task.");
+ return;
+ }
+
+ if (mLockTaskModeTasks.isEmpty()) {
+ // First locktask.
+ final Message lockTaskMsg = Message.obtain();
+ lockTaskMsg.obj = task.intent.getComponent().getPackageName();
+ lockTaskMsg.arg1 = task.userId;
+ lockTaskMsg.what = LOCK_TASK_START_MSG;
+ lockTaskMsg.arg2 = lockTaskModeState;
+ mHandler.sendMessage(lockTaskMsg);
+ }
+ // Add it or move it to the top.
+ mLockTaskModeTasks.remove(task);
+ mLockTaskModeTasks.add(task);
+
+ if (task.mLockTaskUid == -1) {
+ task.mLockTaskUid = task.mCallingUid;
+ }
findTaskToMoveToFrontLocked(task, 0, null, reason);
resumeTopActivitiesLocked();
-
- final Message lockTaskMsg = Message.obtain();
- lockTaskMsg.obj = mLockTaskModeTask.intent.getComponent().getPackageName();
- lockTaskMsg.arg1 = mLockTaskModeTask.userId;
- lockTaskMsg.what = LOCK_TASK_START_MSG;
- lockTaskMsg.arg2 = lockTaskModeState;
- mHandler.sendMessage(lockTaskMsg);
}
boolean isLockTaskModeViolation(TaskRecord task) {
- return mLockTaskModeTask != null && mLockTaskModeTask != task;
+ if (getLockedTaskLocked() == task) {
+ return false;
+ }
+ final int lockTaskAuth = task.mLockTaskAuth;
+ switch (lockTaskAuth) {
+ case LOCK_TASK_AUTH_DONT_LOCK:
+ return !mLockTaskModeTasks.isEmpty();
+ case LOCK_TASK_AUTH_LAUNCHABLE:
+ case LOCK_TASK_AUTH_WHITELISTED:
+ return false;
+ case LOCK_TASK_AUTH_PINNABLE:
+ // Pinnable tasks can't be launched on top of locktask tasks.
+ return !mLockTaskModeTasks.isEmpty();
+ default:
+ Slog.w(TAG, "isLockTaskModeViolation: invalid lockTaskAuth value=" + lockTaskAuth);
+ return true;
+ }
}
- void endLockTaskModeIfTaskEnding(TaskRecord task) {
- if (mLockTaskModeTask != null && mLockTaskModeTask == task) {
- final Message lockTaskMsg = Message.obtain();
- lockTaskMsg.arg1 = mLockTaskModeTask.userId;
- lockTaskMsg.what = LOCK_TASK_END_MSG;
- mLockTaskModeTask = null;
- mHandler.sendMessage(lockTaskMsg);
+ void onLockTaskPackagesUpdatedLocked() {
+ boolean didSomething = false;
+ for (int taskNdx = mLockTaskModeTasks.size() - 1; taskNdx >= 0; --taskNdx) {
+ final TaskRecord lockedTask = mLockTaskModeTasks.get(taskNdx);
+ if (lockedTask.mLockTaskMode != LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED) {
+ continue;
+ }
+ final boolean wasLaunchable = lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE;
+ lockedTask.setLockTaskAuth();
+ if (wasLaunchable && lockedTask.mLockTaskAuth != LOCK_TASK_AUTH_LAUNCHABLE) {
+ // Lost whitelisting authorization. End it now.
+ removeLockedTaskLocked(lockedTask);
+ lockedTask.performClearTaskLocked();
+ didSomething = true;
+ }
+ }
+ for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
+ ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
+ for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
+ final ActivityStack stack = stacks.get(stackNdx);
+ stack.onLockTaskPackagesUpdatedLocked();
+ }
+ }
+ if (didSomething) {
+ resumeTopActivitiesLocked();
}
}
@@ -3734,11 +3841,10 @@
mLockTaskModeState = msg.arg2;
if (getStatusBarService() != null) {
int flags = 0;
- if (mLockTaskModeState == ActivityManager.LOCK_TASK_MODE_LOCKED) {
+ if (mLockTaskModeState == LOCK_TASK_MODE_LOCKED) {
flags = StatusBarManager.DISABLE_MASK
& (~StatusBarManager.DISABLE_BACK);
- } else if (mLockTaskModeState ==
- ActivityManager.LOCK_TASK_MODE_PINNED) {
+ } else if (mLockTaskModeState == LOCK_TASK_MODE_PINNED) {
flags = StatusBarManager.DISABLE_MASK
& (~StatusBarManager.DISABLE_BACK)
& (~StatusBarManager.DISABLE_HOME)
@@ -3776,8 +3882,7 @@
boolean shouldLockKeyguard = Settings.Secure.getInt(
mService.mContext.getContentResolver(),
Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0;
- if (mLockTaskModeState == ActivityManager.LOCK_TASK_MODE_PINNED &&
- shouldLockKeyguard) {
+ if (mLockTaskModeState == LOCK_TASK_MODE_PINNED && shouldLockKeyguard) {
mWindowManager.lockNow(null);
mWindowManager.dismissKeyguard();
new LockPatternUtils(mService.mContext)
@@ -3789,7 +3894,7 @@
} catch (RemoteException ex) {
throw new RuntimeException(ex);
} finally {
- mLockTaskModeState = ActivityManager.LOCK_TASK_MODE_NONE;
+ mLockTaskModeState = LOCK_TASK_MODE_NONE;
}
} break;
case CONTAINER_CALLBACK_TASK_LIST_EMPTY: {
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index bfc4fc7..905adc0 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -18,8 +18,6 @@
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -40,7 +38,6 @@
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.WorkSource;
-import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Slog;
@@ -71,8 +68,6 @@
final BatteryStatsImpl mStats;
final BatteryStatsHandler mHandler;
Context mContext;
- private boolean mBluetoothPendingStats;
- private BluetoothHeadset mBluetoothHeadset;
PowerManagerInternal mPowerManagerInternal;
class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
@@ -87,11 +82,11 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SYNC_EXTERNAL_STATS:
- updateExternalStats();
+ updateExternalStats((String)msg.obj);
break;
case MSG_WRITE_TO_DISK:
- updateExternalStats();
+ updateExternalStats("write");
synchronized (mStats) {
mStats.writeAsyncLocked();
}
@@ -100,9 +95,10 @@
}
@Override
- public void scheduleSync() {
+ public void scheduleSync(String reason) {
if (!hasMessages(MSG_SYNC_EXTERNAL_STATS)) {
- sendEmptyMessage(MSG_SYNC_EXTERNAL_STATS);
+ Message msg = Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason);
+ sendMessage(msg);
}
}
}
@@ -140,7 +136,7 @@
public void shutdown() {
Slog.w("BatteryStats", "Writing battery stats before shutdown...");
- updateExternalStats();
+ updateExternalStats("shutdown");
synchronized (mStats) {
mStats.shutdownLocked();
}
@@ -231,7 +227,7 @@
//Slog.i("foo", "SENDING BATTERY INFO:");
//mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
Parcel out = Parcel.obtain();
- updateExternalStats();
+ updateExternalStats("get-stats");
synchronized (mStats) {
mStats.writeToParcel(out, 0);
}
@@ -246,7 +242,7 @@
//Slog.i("foo", "SENDING BATTERY INFO:");
//mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
Parcel out = Parcel.obtain();
- updateExternalStats();
+ updateExternalStats("get-stats");
synchronized (mStats) {
mStats.writeToParcel(out, 0);
}
@@ -569,7 +565,10 @@
// There was a change in WiFi power state.
// Collect data now for the past activity.
- mHandler.scheduleSync();
+ mHandler.scheduleSync("wifi-data");
+ synchronized (mStats) {
+ mStats.noteWifiRadioPowerState(powerState, tsNanos);
+ }
}
public void noteWifiRunning(WorkSource ws) {
@@ -614,56 +613,6 @@
}
}
- public void noteBluetoothOn() {
- enforceCallingPermission();
- BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- if (adapter != null) {
- adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
- BluetoothProfile.HEADSET);
- }
- synchronized (mStats) {
- if (mBluetoothHeadset != null) {
- mStats.noteBluetoothOnLocked();
- mStats.setBtHeadset(mBluetoothHeadset);
- } else {
- mBluetoothPendingStats = true;
- }
- }
- }
-
- private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
- new BluetoothProfile.ServiceListener() {
- public void onServiceConnected(int profile, BluetoothProfile proxy) {
- mBluetoothHeadset = (BluetoothHeadset) proxy;
- synchronized (mStats) {
- if (mBluetoothPendingStats) {
- mStats.noteBluetoothOnLocked();
- mStats.setBtHeadset(mBluetoothHeadset);
- mBluetoothPendingStats = false;
- }
- }
- }
-
- public void onServiceDisconnected(int profile) {
- mBluetoothHeadset = null;
- }
- };
-
- public void noteBluetoothOff() {
- enforceCallingPermission();
- synchronized (mStats) {
- mBluetoothPendingStats = false;
- mStats.noteBluetoothOffLocked();
- }
- }
-
- public void noteBluetoothState(int bluetoothState) {
- enforceCallingPermission();
- synchronized (mStats) {
- mStats.noteBluetoothStateLocked(bluetoothState);
- }
- }
-
public void noteFullWifiLockAcquired(int uid) {
enforceCallingPermission();
synchronized (mStats) {
@@ -820,7 +769,7 @@
// Sync external stats first as the battery has changed states. If we don't sync
// immediately here, we may not collect the relevant data later.
- updateExternalStats();
+ updateExternalStats("battery-state");
synchronized (mStats) {
mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
}
@@ -974,9 +923,9 @@
pw.println("Battery stats reset.");
noOutput = true;
}
- updateExternalStats();
+ updateExternalStats("dump");
} else if ("--write".equals(arg)) {
- updateExternalStats();
+ updateExternalStats("dump");
synchronized (mStats) {
mStats.writeSyncLocked();
pw.println("Battery stats written.");
@@ -1047,7 +996,7 @@
}
// Fetch data from external sources and update the BatteryStatsImpl object with them.
- updateExternalStats();
+ updateExternalStats("dump");
if (useCheckinFormat) {
List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0);
@@ -1178,7 +1127,7 @@
* We first grab a lock specific to this method, then once all the data has been collected,
* we grab the mStats lock and update the data.
*/
- void updateExternalStats() {
+ void updateExternalStats(String reason) {
synchronized (mExternalStatsLock) {
if (mContext == null) {
// We haven't started yet (which means the BatteryStatsImpl object has
@@ -1189,6 +1138,12 @@
final WifiActivityEnergyInfo wifiEnergyInfo = pullWifiEnergyInfoLocked();
final BluetoothActivityEnergyInfo bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked();
synchronized (mStats) {
+ if (mStats.mRecordAllHistory) {
+ final long elapsedRealtime = SystemClock.elapsedRealtime();
+ final long uptime = SystemClock.uptimeMillis();
+ mStats.addHistoryEventLocked(elapsedRealtime, uptime,
+ BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0);
+ }
mStats.updateKernelWakelocksLocked();
mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime());
mStats.updateWifiStateLocked(wifiEnergyInfo);
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 82e6d47..790a78d 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -18,6 +18,10 @@
import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
import static android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS;
+import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS;
+import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_DEFAULT;
+import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED;
+import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_NEVER;
import static com.android.server.am.ActivityManagerDebugConfig.*;
import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE;
@@ -121,6 +125,20 @@
boolean mResizeable; // Activities in the task resizeable. Based on the resizable setting of
// the root activity.
+ int mLockTaskMode; // Which tasklock mode to launch this task in. One of
+ // ActivityManager.LOCK_TASK_LAUNCH_MODE_*
+ /** Can't be put in lockTask mode. */
+ final static int LOCK_TASK_AUTH_DONT_LOCK = 0;
+ /** Can enter lockTask with user approval if not already in lockTask. */
+ final static int LOCK_TASK_AUTH_PINNABLE = 1;
+ /** Starts in LOCK_TASK_MODE_LOCKED automatically. Can start over existing lockTask task. */
+ final static int LOCK_TASK_AUTH_LAUNCHABLE = 2;
+ /** Enters LOCK_TASK_MODE_LOCKED via startLockTask(), enters LOCK_TASK_MODE_PINNED from
+ * Overview. Can start over existing lockTask task. */
+ final static int LOCK_TASK_AUTH_WHITELISTED = 3;
+ int mLockTaskAuth = LOCK_TASK_AUTH_PINNABLE;
+
+ int mLockTaskUid = -1; // The uid of the application that called startLockTask().
// This represents the last resolved activity values for this task
// NOTE: This value needs to be persisted with each task
@@ -186,6 +204,8 @@
voiceInteractor = _voiceInteractor;
isAvailable = true;
mActivities = new ArrayList<>();
+ mCallingUid = info.applicationInfo.uid;
+ mCallingPackage = info.packageName;
setIntent(_intent, info);
}
@@ -201,12 +221,12 @@
voiceInteractor = null;
isAvailable = true;
mActivities = new ArrayList<>();
+ mCallingUid = info.applicationInfo.uid;
+ mCallingPackage = info.packageName;
setIntent(_intent, info);
taskType = ActivityRecord.APPLICATION_ACTIVITY_TYPE;
isPersistable = true;
- mCallingUid = info.applicationInfo.uid;
- mCallingPackage = info.packageName;
// Clamp to [1, max].
maxRecents = Math.min(Math.max(info.maxRecents, 1),
ActivityManager.getMaxAppRecentsLimitStatic());
@@ -215,8 +235,6 @@
mTaskToReturnTo = HOME_ACTIVITY_TYPE;
userId = UserHandle.getUserId(info.applicationInfo.uid);
lastTaskDescription = _taskDescription;
- mCallingUid = info.applicationInfo.uid;
- mCallingPackage = info.packageName;
}
private TaskRecord(ActivityManagerService service, int _taskId, Intent _intent,
@@ -278,9 +296,9 @@
/** Sets the original intent, and the calling uid and package. */
void setIntent(ActivityRecord r) {
- setIntent(r.intent, r.info);
mCallingUid = r.launchedFromUid;
mCallingPackage = r.launchedFromPackage;
+ setIntent(r.intent, r.info);
}
/** Sets the original intent, _without_ updating the calling uid or package. */
@@ -362,6 +380,8 @@
autoRemoveRecents = false;
}
mResizeable = info.resizeable;
+ mLockTaskMode = info.lockTaskLaunchMode;
+ setLockTaskAuth();
}
void setTaskToReturnTo(int taskToReturnTo) {
@@ -716,6 +736,53 @@
performClearTaskAtIndexLocked(0);
}
+ private boolean isPrivileged() {
+ final ProcessRecord proc = mService.mProcessNames.get(mCallingPackage, mCallingUid);
+ if (proc != null) {
+ return (proc.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
+ }
+ return false;
+ }
+
+ void setLockTaskAuth() {
+ switch (mLockTaskMode) {
+ case LOCK_TASK_LAUNCH_MODE_DEFAULT:
+ mLockTaskAuth = isLockTaskWhitelistedLocked() ?
+ LOCK_TASK_AUTH_WHITELISTED : LOCK_TASK_AUTH_PINNABLE;
+ break;
+
+ case LOCK_TASK_LAUNCH_MODE_NEVER:
+ mLockTaskAuth = isPrivileged() ?
+ LOCK_TASK_AUTH_DONT_LOCK : LOCK_TASK_AUTH_PINNABLE;
+ break;
+
+ case LOCK_TASK_LAUNCH_MODE_ALWAYS:
+ mLockTaskAuth = isPrivileged() ?
+ LOCK_TASK_AUTH_LAUNCHABLE: LOCK_TASK_AUTH_PINNABLE;
+ break;
+
+ case LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED:
+ mLockTaskAuth = isLockTaskWhitelistedLocked() ?
+ LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_PINNABLE;
+ break;
+ }
+ }
+
+ boolean isLockTaskWhitelistedLocked() {
+ if (mCallingPackage == null) {
+ return false;
+ }
+ String[] packages = mService.mLockTaskPackages.get(userId);
+ if (packages == null) {
+ return false;
+ }
+ for (int i = packages.length - 1; i >= 0; --i) {
+ if (mCallingPackage.equals(packages[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
boolean isHomeTask() {
return taskType == HOME_ACTIVITY_TYPE;
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index dac0580..8a7c902 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -40,7 +40,10 @@
*/
public class NetworkAgentInfo {
public NetworkInfo networkInfo;
- public Network network;
+ // This Network object should always be used if possible, so as to encourage reuse of the
+ // enclosed socket factory and connection pool. Avoid creating other Network objects.
+ // This Network object is always valid.
+ public final Network network;
public LinkProperties linkProperties;
public NetworkCapabilities networkCapabilities;
public final NetworkMonitor networkMonitor;
@@ -86,12 +89,12 @@
// Used by ConnectivityService to keep track of 464xlat.
public Nat464Xlat clatd;
- public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, NetworkInfo info,
+ public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
NetworkMisc misc, NetworkRequest defaultRequest) {
this.messenger = messenger;
asyncChannel = ac;
- network = null;
+ network = net;
networkInfo = info;
linkProperties = lp;
networkCapabilities = nc;
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index d0e1665..7e20276 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -216,7 +216,7 @@
// If a network is not validated, make one attempt every 10 mins to see if it starts working.
private static final int REEVALUATE_PAUSE_MS = 10*60*1000;
private static final int PERIODIC_ATTEMPTS = 1;
- // When an application calls reportBadNetwork, only make one attempt.
+ // When an application calls reportNetworkConnectivity, only make one attempt.
private static final int REEVALUATE_ATTEMPTS = 1;
private final int mReevaluateDelayMs;
private int mReevaluateToken = 0;
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 0b430ea..3d478f9 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -17,8 +17,13 @@
package com.android.server.connectivity;
import static android.Manifest.permission.BIND_VPN_SERVICE;
+import static android.net.ConnectivityManager.NETID_UNSET;
import static android.net.RouteInfo.RTN_THROW;
import static android.net.RouteInfo.RTN_UNREACHABLE;
+import static android.os.UserHandle.PER_USER_RANGE;
+import static android.system.OsConstants.AF_INET;
+import static android.system.OsConstants.AF_INET6;
+
import android.Manifest;
import android.app.AppGlobals;
import android.app.AppOpsManager;
@@ -29,6 +34,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
@@ -64,6 +70,7 @@
import android.os.UserManager;
import android.security.Credentials;
import android.security.KeyStore;
+import android.text.TextUtils;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
@@ -110,7 +117,6 @@
private LegacyVpnRunner mLegacyVpnRunner;
private PendingIntent mStatusIntent;
private volatile boolean mEnableTeardown = true;
- private final IConnectivityManager mConnService;
private final INetworkManagementService mNetd;
private VpnConfig mConfig;
private NetworkAgent mNetworkAgent;
@@ -126,10 +132,9 @@
private final int mUserHandle;
public Vpn(Looper looper, Context context, INetworkManagementService netService,
- IConnectivityManager connService, int userHandle) {
+ int userHandle) {
mContext = context;
mNetd = netService;
- mConnService = connService;
mUserHandle = userHandle;
mLooper = looper;
@@ -336,6 +341,10 @@
return mNetworkInfo;
}
+ public int getNetId() {
+ return mNetworkAgent != null ? mNetworkAgent.netId : NETID_UNSET;
+ }
+
private LinkProperties makeLinkProperties() {
boolean allowIPv4 = mConfig.allowIPv4;
boolean allowIPv6 = mConfig.allowIPv6;
@@ -1106,11 +1115,15 @@
// registering
mOuterInterface = mConfig.interfaze;
- try {
- mOuterConnection.set(
- mConnService.findConnectionTypeForIface(mOuterInterface));
- } catch (Exception e) {
- mOuterConnection.set(ConnectivityManager.TYPE_NONE);
+ if (!TextUtils.isEmpty(mOuterInterface)) {
+ final ConnectivityManager cm = ConnectivityManager.from(mContext);
+ for (Network network : cm.getAllNetworks()) {
+ final LinkProperties lp = cm.getLinkProperties(network);
+ if (lp != null && mOuterInterface.equals(lp.getInterfaceName())) {
+ final NetworkInfo networkInfo = cm.getNetworkInfo(network);
+ if (networkInfo != null) mOuterConnection.set(networkInfo.getType());
+ }
+ }
}
IntentFilter filter = new IntentFilter();
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index e16be71..ee36972 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -47,6 +47,10 @@
// within a transaction from performTraversalInTransactionLocked.
private Surface mCurrentSurface;
+ // DEBUG STATE: Last device info which was written to the log, or null if none.
+ // Do not use for any other purpose.
+ DisplayDeviceInfo mDebugLastLoggedDeviceInfo;
+
public DisplayDevice(DisplayAdapter displayAdapter, IBinder displayToken, String uniqueId) {
mDisplayAdapter = displayAdapter;
mDisplayToken = displayToken;
diff --git a/services/core/java/com/android/server/display/DisplayDeviceInfo.java b/services/core/java/com/android/server/display/DisplayDeviceInfo.java
index d1e73f0..ebf6e4e 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceInfo.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceInfo.java
@@ -104,6 +104,16 @@
public static final int TOUCH_EXTERNAL = 2;
/**
+ * Diff result: The {@link #state} fields differ.
+ */
+ public static final int DIFF_STATE = 1 << 0;
+
+ /**
+ * Diff result: Other fields differ.
+ */
+ public static final int DIFF_OTHER = 1 << 1;
+
+ /**
* Gets the name of the display device, which may be derived from EDID or
* other sources. The name may be localized and displayed to the user.
*/
@@ -238,26 +248,39 @@
}
public boolean equals(DisplayDeviceInfo other) {
- return other != null
- && Objects.equal(name, other.name)
- && Objects.equal(uniqueId, other.uniqueId)
- && width == other.width
- && height == other.height
- && refreshRate == other.refreshRate
- && Arrays.equals(supportedRefreshRates, other.supportedRefreshRates)
- && densityDpi == other.densityDpi
- && xDpi == other.xDpi
- && yDpi == other.yDpi
- && appVsyncOffsetNanos == other.appVsyncOffsetNanos
- && presentationDeadlineNanos == other.presentationDeadlineNanos
- && flags == other.flags
- && touch == other.touch
- && rotation == other.rotation
- && type == other.type
- && Objects.equal(address, other.address)
- && state == other.state
- && ownerUid == other.ownerUid
- && Objects.equal(ownerPackageName, other.ownerPackageName);
+ return other != null && diff(other) == 0;
+ }
+
+ /**
+ * Computes the difference between display device infos.
+ * Assumes other is not null.
+ */
+ public int diff(DisplayDeviceInfo other) {
+ int diff = 0;
+ if (state != other.state) {
+ diff |= DIFF_STATE;
+ }
+ if (!Objects.equal(name, other.name)
+ || !Objects.equal(uniqueId, other.uniqueId)
+ || width != other.width
+ || height != other.height
+ || refreshRate != other.refreshRate
+ || !Arrays.equals(supportedRefreshRates, other.supportedRefreshRates)
+ || densityDpi != other.densityDpi
+ || xDpi != other.xDpi
+ || yDpi != other.yDpi
+ || appVsyncOffsetNanos != other.appVsyncOffsetNanos
+ || presentationDeadlineNanos != other.presentationDeadlineNanos
+ || flags != other.flags
+ || touch != other.touch
+ || rotation != other.rotation
+ || type != other.type
+ || !Objects.equal(address, other.address)
+ || ownerUid != other.ownerUid
+ || !Objects.equal(ownerPackageName, other.ownerPackageName)) {
+ diff |= DIFF_OTHER;
+ }
+ return diff;
}
@Override
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 9ea0444..1e87433 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -668,13 +668,14 @@
}
private void handleDisplayDeviceAddedLocked(DisplayDevice device) {
+ DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
if (mDisplayDevices.contains(device)) {
- Slog.w(TAG, "Attempted to add already added display device: "
- + device.getDisplayDeviceInfoLocked());
+ Slog.w(TAG, "Attempted to add already added display device: " + info);
return;
}
- Slog.i(TAG, "Display device added: " + device.getDisplayDeviceInfoLocked());
+ Slog.i(TAG, "Display device added: " + info);
+ device.mDebugLastLoggedDeviceInfo = info;
mDisplayDevices.add(device);
addLogicalDisplayLocked(device);
@@ -687,13 +688,20 @@
private void handleDisplayDeviceChanged(DisplayDevice device) {
synchronized (mSyncRoot) {
+ DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
if (!mDisplayDevices.contains(device)) {
- Slog.w(TAG, "Attempted to change non-existent display device: "
- + device.getDisplayDeviceInfoLocked());
+ Slog.w(TAG, "Attempted to change non-existent display device: " + info);
return;
}
- Slog.i(TAG, "Display device changed: " + device.getDisplayDeviceInfoLocked());
+ int diff = device.mDebugLastLoggedDeviceInfo.diff(info);
+ if (diff == DisplayDeviceInfo.DIFF_STATE) {
+ Slog.i(TAG, "Display device changed state: \"" + info.name
+ + "\", " + Display.stateToString(info.state));
+ } else if (diff != 0) {
+ Slog.i(TAG, "Display device changed: " + info);
+ }
+ device.mDebugLastLoggedDeviceInfo = info;
device.applyPendingDisplayDeviceInfoChangesLocked();
if (updateLogicalDisplaysLocked()) {
@@ -708,13 +716,14 @@
}
}
private void handleDisplayDeviceRemovedLocked(DisplayDevice device) {
+ DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
if (!mDisplayDevices.remove(device)) {
- Slog.w(TAG, "Attempted to remove non-existent display device: "
- + device.getDisplayDeviceInfoLocked());
+ Slog.w(TAG, "Attempted to remove non-existent display device: " + info);
return;
}
- Slog.i(TAG, "Display device removed: " + device.getDisplayDeviceInfoLocked());
+ Slog.i(TAG, "Display device removed: " + info);
+ device.mDebugLastLoggedDeviceInfo = info;
updateLogicalDisplaysLocked();
scheduleTraversalLocked(false);
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 3bb7818..65dc72f 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -302,7 +302,10 @@
// multiplying the fractions by the product of their denominators before
// comparing them.
int displayRectWidth, displayRectHeight;
- if (physWidth * displayInfo.logicalHeight
+ if ((displayInfo.flags & Display.FLAG_SCALING_DISABLED) != 0) {
+ displayRectWidth = displayInfo.logicalWidth;
+ displayRectHeight = displayInfo.logicalHeight;
+ } else if (physWidth * displayInfo.logicalHeight
< physHeight * displayInfo.logicalWidth) {
// Letter box.
displayRectWidth = physWidth;
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 90e69d7..770df82 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -143,75 +143,67 @@
+ ", mAuthClients = " + mAuthClient + ", mEnrollClient = " + mEnrollClient);
if (mEnrollClient != null) {
final IBinder token = mEnrollClient.token;
- if (doNotify(mEnrollClient, type, arg1, arg2, arg3)) {
- stopEnrollment(token);
+ if (dispatchNotify(mEnrollClient, type, arg1, arg2, arg3)) {
+ stopEnrollment(token, false);
+ removeClient(mEnrollClient);
}
}
if (mAuthClient != null) {
final IBinder token = mAuthClient.token;
- if (doNotify(mAuthClient, type, arg1, arg2, arg3)) {
- stopAuthentication(token);
+ if (dispatchNotify(mAuthClient, type, arg1, arg2, arg3)) {
+ stopAuthentication(token, false);
+ removeClient(mAuthClient);
}
}
if (mRemoveClient != null) {
- if (doNotify(mRemoveClient, type, arg1, arg2, arg3)) {
+ if (dispatchNotify(mRemoveClient, type, arg1, arg2, arg3)) {
removeClient(mRemoveClient);
}
}
}
- // Returns true if the operation is done, i.e. authentication completed
- boolean doNotify(ClientMonitor clientMonitor, int type, int arg1, int arg2, int arg3) {
+ /*
+ * Dispatch notify events to clients.
+ *
+ * @return true if the operation is done, i.e. authentication completed
+ */
+ boolean dispatchNotify(ClientMonitor clientMonitor, int type, int arg1, int arg2, int arg3) {
ContentResolver contentResolver = mContext.getContentResolver();
boolean operationCompleted = false;
+ int fpId;
+ int groupId;
+ int remaining;
+ int acquireInfo;
switch (type) {
case FINGERPRINT_ERROR:
- {
- final int error = arg1;
- clientMonitor.sendError(error);
- removeClient(clientMonitor);
- operationCompleted = true; // any error means the operation is done
- }
+ fpId = arg1;
+ operationCompleted = clientMonitor.sendError(fpId);
break;
case FINGERPRINT_ACQUIRED:
- clientMonitor.sendAcquired(arg1 /* acquireInfo */);
+ acquireInfo = arg1;
+ operationCompleted = clientMonitor.sendAcquired(acquireInfo);
break;
case FINGERPRINT_AUTHENTICATED:
- {
- final int fpId = arg1;
- final int groupId = arg2;
- clientMonitor.sendAuthenticated(fpId, groupId);
- if (fpId == 0) {
- if (clientMonitor == mAuthClient) {
- operationCompleted = handleFailedAttempt(clientMonitor);
- }
- } else {
- mLockoutReset.run(); // a valid fingerprint resets lockout
- }
- }
+ fpId = arg1;
+ groupId = arg2;
+ operationCompleted = clientMonitor.sendAuthenticated(fpId, groupId);
break;
case FINGERPRINT_TEMPLATE_ENROLLING:
- {
- final int fpId = arg1;
- final int groupId = arg2;
- final int remaining = arg3;
- clientMonitor.sendEnrollResult(fpId, groupId, remaining);
- if (remaining == 0) {
- addTemplateForUser(clientMonitor, contentResolver, fpId);
- operationCompleted = true; // enroll completed
- }
+ fpId = arg1;
+ groupId = arg2;
+ remaining = arg3;
+ operationCompleted = clientMonitor.sendEnrollResult(fpId, groupId, remaining);
+ if (remaining == 0) {
+ addTemplateForUser(clientMonitor, contentResolver, fpId);
+ operationCompleted = true; // enroll completed
}
break;
case FINGERPRINT_TEMPLATE_REMOVED:
- {
- final int fingerId = arg1;
- final int groupId = arg2;
- removeTemplateForUser(clientMonitor, contentResolver, fingerId);
- if (fingerId == 0) {
- operationCompleted = true; // remove completed
- } else {
- clientMonitor.sendRemoved(fingerId, groupId);
- }
+ fpId = arg1;
+ groupId = arg2;
+ operationCompleted = clientMonitor.sendRemoved(fpId, groupId);
+ if (fpId != 0) {
+ removeTemplateForUser(clientMonitor, contentResolver, fpId);
}
break;
}
@@ -235,7 +227,9 @@
}
private void resetFailedAttempts() {
- if (DEBUG) Slog.v(TAG, "Reset fingerprint lockout");
+ if (DEBUG && inLockoutMode()) {
+ Slog.v(TAG, "Reset fingerprint lockout");
+ }
mFailedAttempts = 0;
}
@@ -283,19 +277,21 @@
private void stopPendingOperations() {
if (mEnrollClient != null) {
- stopEnrollment(mEnrollClient.token);
+ stopEnrollment(mEnrollClient.token, true);
}
if (mAuthClient != null) {
- stopAuthentication(mAuthClient.token);
+ stopAuthentication(mAuthClient.token, true);
}
// mRemoveClient is allowed to continue
}
- void stopEnrollment(IBinder token) {
+ void stopEnrollment(IBinder token, boolean notify) {
final ClientMonitor client = mEnrollClient;
if (client == null || client.token != token) return;
int result = nativeStopEnrollment();
- client.sendError(FingerprintManager.FINGERPRINT_ERROR_CANCELED);
+ if (notify) {
+ client.sendError(FingerprintManager.FINGERPRINT_ERROR_CANCELED);
+ }
removeClient(mEnrollClient);
if (result != 0) {
Slog.w(TAG, "startEnrollCancel failed, result=" + result);
@@ -321,11 +317,13 @@
}
}
- void stopAuthentication(IBinder token) {
+ void stopAuthentication(IBinder token, boolean notify) {
final ClientMonitor client = mAuthClient;
if (client == null || client.token != token) return;
int result = nativeStopAuthentication();
- client.sendError(FingerprintManager.FINGERPRINT_ERROR_CANCELED);
+ if (notify) {
+ client.sendError(FingerprintManager.FINGERPRINT_ERROR_CANCELED);
+ }
removeClient(mAuthClient);
if (result != 0) {
Slog.w(TAG, "stopAuthentication failed, result=" + result);
@@ -358,6 +356,11 @@
return result;
}
+ public boolean hasEnrolledFingerprints(int groupId) {
+ ContentResolver resolver = mContext.getContentResolver();
+ return FingerprintUtils.getFingerprintIdsForUser(resolver, groupId).length > 0;
+ }
+
void checkPermission(String permission) {
getContext().enforceCallingOrSelfPermission(permission,
"Must have " + permission + " permission.");
@@ -403,74 +406,89 @@
}
}
+ /*
+ * @return true if we're done.
+ */
private boolean sendRemoved(int fingerId, int groupId) {
IFingerprintServiceReceiver rx = receiver.get();
- if (rx != null) {
- try {
- rx.onRemoved(mHalDeviceId, fingerId, groupId);
- return true;
- } catch (RemoteException e) {
- if (DEBUG) Slog.v(TAG, "Failed to invoke sendRemoved:", e);
- }
+ if (rx == null) return true; // client not listening
+ try {
+ rx.onRemoved(mHalDeviceId, fingerId, groupId);
+ return fingerId == 0;
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to notify Removed:", e);
}
- removeClient(this);
return false;
}
+ /*
+ * @return true if we're done.
+ */
private boolean sendEnrollResult(int fpId, int groupId, int remaining) {
IFingerprintServiceReceiver rx = receiver.get();
- if (rx != null) {
- try {
- rx.onEnrollResult(mHalDeviceId, fpId, groupId, remaining);
- return true;
- } catch (RemoteException e) {
- if (DEBUG) Slog.v(TAG, "Failed to invoke sendEnrollResult:", e);
- }
+ if (rx == null) return true; // client not listening
+ try {
+ rx.onEnrollResult(mHalDeviceId, fpId, groupId, remaining);
+ return remaining == 0;
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to notify EnrollResult:", e);
+ return true;
}
- removeClient(this);
- return false;
}
+ /*
+ * @return true if we're done.
+ */
private boolean sendAuthenticated(int fpId, int groupId) {
IFingerprintServiceReceiver rx = receiver.get();
+ boolean result = false;
if (rx != null) {
try {
rx.onAuthenticated(mHalDeviceId, fpId, groupId);
- return true;
} catch (RemoteException e) {
- if (DEBUG) Slog.v(TAG, "Failed to invoke sendProcessed:", e);
+ Slog.w(TAG, "Failed to notify Authenticated:", e);
+ result = true; // client failed
}
+ } else {
+ result = true; // client not listening
}
- removeClient(this);
- return false;
+ if (fpId <= 0) {
+ result |= handleFailedAttempt(this);
+ } else {
+ result |= true; // we have a valid fingerprint
+ mLockoutReset.run();
+ }
+ return result;
}
+ /*
+ * @return true if we're done.
+ */
private boolean sendAcquired(int acquiredInfo) {
IFingerprintServiceReceiver rx = receiver.get();
- if (rx != null) {
- try {
- rx.onAcquired(mHalDeviceId, acquiredInfo);
- return true;
- } catch (RemoteException e) {
- if (DEBUG) Slog.v(TAG, "Failed to invoke sendAcquired:", e);
- }
+ if (rx == null) return true; // client not listening
+ try {
+ rx.onAcquired(mHalDeviceId, acquiredInfo);
+ return false; // acquisition continues...
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to invoke sendAcquired:", e);
+ return true; // client failed
}
- removeClient(this);
- return false;
}
+ /*
+ * @return true if we're done.
+ */
private boolean sendError(int error) {
IFingerprintServiceReceiver rx = receiver.get();
if (rx != null) {
try {
rx.onError(mHalDeviceId, error);
- return true;
} catch (RemoteException e) {
- if (DEBUG) Slog.v(TAG, "Failed to invoke sendError:", e);
+ Slog.w(TAG, "Failed to invoke sendError:", e);
}
}
- removeClient(this);
- return false;
+ return true; // errors always terminate progress
}
}
@@ -502,7 +520,7 @@
mHandler.post(new Runnable() {
@Override
public void run() {
- stopEnrollment(token);
+ stopEnrollment(token, true);
}
});
}
@@ -528,7 +546,7 @@
mHandler.post(new Runnable() {
@Override
public void run() {
- stopAuthentication(token);
+ stopAuthentication(token, true);
}
});
}
@@ -572,6 +590,13 @@
checkPermission(USE_FINGERPRINT);
return FingerprintService.this.getEnrolledFingerprints(groupId);
}
+
+ @Override
+ // Binder call
+ public boolean hasEnrolledFingerprints(int groupId) {
+ checkPermission(USE_FINGERPRINT);
+ return FingerprintService.this.hasEnrolledFingerprints(groupId);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 4ac2b48..94f8dee 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -913,6 +913,12 @@
}
}
+ @ServiceThreadOnly
+ boolean isConnected(int portId) {
+ assertRunOnServiceThread();
+ return mService.isConnected(portId);
+ }
+
private void notifyArcStatusToAudioService(boolean enabled) {
// Note that we don't set any name to ARC.
mService.getAudioManager().setWiredDeviceConnectionState(
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 49a96d8..2cbc1b9 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -780,6 +780,12 @@
return false;
}
+ @ServiceThreadOnly
+ boolean isConnected(int portId) {
+ assertRunOnServiceThread();
+ return mCecController.isConnected(portId);
+ }
+
void runOnServiceThread(Runnable runnable) {
mHandler.post(runnable);
}
diff --git a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
index a944a27..5f2d651 100644
--- a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
+++ b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
@@ -156,10 +156,13 @@
int index = -1;
while ((index = removed.nextSetBit(index + 1)) != -1) {
if (index == Constants.ADDR_AUDIO_SYSTEM) {
- ++mAvrStatusCount;
- Slog.w(TAG, "Ack not returned from AVR. count: " + mAvrStatusCount);
- if (mAvrStatusCount < AVR_COUNT_MAX) {
- continue;
+ HdmiDeviceInfo avr = tv().getAvrDeviceInfo();
+ if (avr != null && tv().isConnected(avr.getPortId())) {
+ ++mAvrStatusCount;
+ Slog.w(TAG, "Ack not returned from AVR. count: " + mAvrStatusCount);
+ if (mAvrStatusCount < AVR_COUNT_MAX) {
+ continue;
+ }
}
}
Slog.v(TAG, "Remove device by hot-plug detection:" + index);
diff --git a/services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java b/services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java
index d200d35..9b4950b 100644
--- a/services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java
+++ b/services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java
@@ -54,7 +54,7 @@
boolean start() {
// Seq #37.
if (mEnabled) {
- // Enable ARC status immediately after sending <Report Arc Initiated>.
+ // Enable ARC status immediately before sending <Report Arc Initiated>.
// If AVR responds with <Feature Abort>, disable ARC status again.
// This is different from spec that says that turns ARC status to
// "Enabled" if <Report ARC Initiated> is acknowledged and no
@@ -80,12 +80,21 @@
sendCommand(command, new HdmiControlService.SendMessageCallback() {
@Override
public void onSendCompleted(int error) {
- if (error != Constants.SEND_RESULT_SUCCESS) {
- // If fails to send <Report ARC Initiated>, disable ARC and
- // send <Report ARC Terminated> directly.
- setArcStatus(false);
- HdmiLogger.debug("Failed to send <Report Arc Initiated>.");
- finish();
+ switch (error) {
+ case Constants.SEND_RESULT_SUCCESS:
+ case Constants.SEND_RESULT_BUSY:
+ case Constants.SEND_RESULT_FAILURE:
+ // The result of the command transmission, unless it is an obvious
+ // failure indicated by the target device (or lack thereof), should
+ // not affect the ARC status. Ignores it silently.
+ break;
+ case Constants.SEND_RESULT_NAK:
+ // If <Report ARC Initiated> is negatively ack'ed, disable ARC and
+ // send <Report ARC Terminated> directly.
+ setArcStatus(false);
+ HdmiLogger.debug("Failed to send <Report Arc Initiated>.");
+ finish();
+ break;
}
}
});
diff --git a/services/core/java/com/android/server/job/controllers/AppIdleController.java b/services/core/java/com/android/server/job/controllers/AppIdleController.java
index 23d5c05..98fb11b 100644
--- a/services/core/java/com/android/server/job/controllers/AppIdleController.java
+++ b/services/core/java/com/android/server/job/controllers/AppIdleController.java
@@ -107,7 +107,16 @@
@Override
public void dumpControllerState(PrintWriter pw) {
- // TODO:
+ pw.println("AppIdle");
+ pw.println("Plugged In: " + mPluggedIn);
+ synchronized (mTrackedTasks) {
+ for (JobStatus task : mTrackedTasks) {
+ pw.print(task.job.getService().getPackageName());
+ pw.print(":idle=" + !task.appNotIdleConstraintSatisfied.get());
+ pw.print(", ");
+ }
+ pw.println();
+ }
}
@Override
diff --git a/services/core/java/com/android/server/location/GpsLocationProvider.java b/services/core/java/com/android/server/location/GpsLocationProvider.java
index 7c41abbc..d0b25f7 100644
--- a/services/core/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/core/java/com/android/server/location/GpsLocationProvider.java
@@ -197,6 +197,8 @@
private static final int REMOVE_LISTENER = 9;
private static final int INJECT_NTP_TIME_FINISHED = 10;
private static final int DOWNLOAD_XTRA_DATA_FINISHED = 11;
+ private static final int SUBSCRIPTION_OR_SIM_CHANGED = 12;
+ private static final int INITIALIZE_HANDLER = 13;
// Request setid
private static final int AGPS_RIL_REQUEST_SETID_IMSI = 1;
@@ -338,8 +340,12 @@
// True if gps should be disabled (used to support battery saver mode in settings).
private boolean mDisableGps = false;
- // properties loaded from PROPERTIES_FILE
+ /**
+ * Properties loaded from PROPERTIES_FILE.
+ * It must be accessed only inside {@link #mHandler}.
+ */
private Properties mProperties;
+
private String mSuplServerHost;
private int mSuplServerPort = TCP_MIN_PORT;
private String mC2KServerHost;
@@ -430,7 +436,7 @@
checkSmsSuplInit(intent);
} else if (action.equals(Intents.WAP_PUSH_RECEIVED_ACTION)) {
checkWapSuplInit(intent);
- } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE)) {
+ } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
// retrieve NetworkInfo result for this UID
NetworkInfo info =
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
@@ -462,7 +468,7 @@
new OnSubscriptionsChangedListener() {
@Override
public void onSubscriptionsChanged() {
- subscriptionOrSimChanged(mContext);
+ sendMessage(SUBSCRIPTION_OR_SIM_CHANGED, 0, null);
}
};
@@ -627,53 +633,22 @@
mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
BatteryStats.SERVICE_NAME));
- // Load GPS configuration.
+ // Construct internal handler
+ mHandler = new ProviderHandler(looper);
+
+ // Load GPS configuration and register listeners in the background:
+ // some operations, such as opening files and registering broadcast receivers, can take a
+ // relative long time, so the ctor() is kept to create objects needed by this instance,
+ // while IO initialization and registration is delegated to our internal handler
+ // this approach is just fine because events are posted to our handler anyway
mProperties = new Properties();
- reloadGpsProperties(mContext, mProperties);
+ sendMessage(INITIALIZE_HANDLER, 0, null);
// Create a GPS net-initiated handler.
mNIHandler = new GpsNetInitiatedHandler(context,
mNetInitiatedListener,
mSuplEsEnabled);
- // TODO: When this object "finishes" we should unregister by invoking
- // SubscriptionManager.getInstance(mContext).unregister(mOnSubscriptionsChangedListener);
- // This is not strictly necessary because it will be unregistered if the
- // notification fails but it is good form.
-
- // Register for SubscriptionInfo list changes which is guaranteed
- // to invoke onSubscriptionsChanged the first time.
- SubscriptionManager.from(mContext)
- .addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
-
- // construct handler, listen for events
- mHandler = new ProviderHandler(looper);
- listenForBroadcasts();
-
- // also listen for PASSIVE_PROVIDER updates
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- LocationManager locManager =
- (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
- final long minTime = 0;
- final float minDistance = 0;
- final boolean oneShot = false;
- LocationRequest request = LocationRequest.createFromDeprecatedProvider(
- LocationManager.PASSIVE_PROVIDER,
- minTime,
- minDistance,
- oneShot);
- // Don't keep track of this request since it's done on behalf of other clients
- // (which are kept track of separately).
- request.setHideFromAppOps(true);
- locManager.requestLocationUpdates(
- request,
- new NetworkLocationListener(),
- mHandler.getLooper());
- }
- });
-
mListenerHelper = new GpsStatusListenerHelper(mHandler) {
@Override
protected boolean isAvailableInPlatform() {
@@ -731,33 +706,6 @@
};
}
- private void listenForBroadcasts() {
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(Intents.DATA_SMS_RECEIVED_ACTION);
- intentFilter.addDataScheme("sms");
- intentFilter.addDataAuthority("localhost","7275");
- mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);
-
- intentFilter = new IntentFilter();
- intentFilter.addAction(Intents.WAP_PUSH_RECEIVED_ACTION);
- try {
- intentFilter.addDataType("application/vnd.omaloc-supl-init");
- } catch (IntentFilter.MalformedMimeTypeException e) {
- Log.w(TAG, "Malformed SUPL init mime type");
- }
- mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);
-
- intentFilter = new IntentFilter();
- intentFilter.addAction(ALARM_WAKEUP);
- intentFilter.addAction(ALARM_TIMEOUT);
- intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE);
- intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
- intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
- intentFilter.addAction(Intent.ACTION_SCREEN_ON);
- intentFilter.addAction(SIM_STATE_CHANGED);
- mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);
- }
-
/**
* Returns the name of this provider.
*/
@@ -2012,13 +1960,85 @@
case UPDATE_LOCATION:
handleUpdateLocation((Location)msg.obj);
break;
+ case SUBSCRIPTION_OR_SIM_CHANGED:
+ subscriptionOrSimChanged(mContext);
+ break;
+ case INITIALIZE_HANDLER:
+ initialize();
+ break;
}
if (msg.arg2 == 1) {
// wakelock was taken for this message, release it
mWakeLock.release();
}
}
- };
+
+ /**
+ * This method is bound to {@link #GpsLocationProvider(Context, ILocationManager, Looper)}.
+ * It is in charge of loading properties and registering for events that will be posted to
+ * this handler.
+ */
+ private void initialize() {
+ // load default GPS configuration
+ // (this configuration might change in the future based on SIM changes)
+ reloadGpsProperties(mContext, mProperties);
+
+ // TODO: When this object "finishes" we should unregister by invoking
+ // SubscriptionManager.getInstance(mContext).unregister(mOnSubscriptionsChangedListener);
+ // This is not strictly necessary because it will be unregistered if the
+ // notification fails but it is good form.
+
+ // Register for SubscriptionInfo list changes which is guaranteed
+ // to invoke onSubscriptionsChanged the first time.
+ SubscriptionManager.from(mContext)
+ .addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
+
+ // listen for events
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(Intents.DATA_SMS_RECEIVED_ACTION);
+ intentFilter.addDataScheme("sms");
+ intentFilter.addDataAuthority("localhost","7275");
+ mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this);
+
+ intentFilter = new IntentFilter();
+ intentFilter.addAction(Intents.WAP_PUSH_RECEIVED_ACTION);
+ try {
+ intentFilter.addDataType("application/vnd.omaloc-supl-init");
+ } catch (IntentFilter.MalformedMimeTypeException e) {
+ Log.w(TAG, "Malformed SUPL init mime type");
+ }
+ mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this);
+
+ intentFilter = new IntentFilter();
+ intentFilter.addAction(ALARM_WAKEUP);
+ intentFilter.addAction(ALARM_TIMEOUT);
+ intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE);
+ intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
+ intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
+ intentFilter.addAction(Intent.ACTION_SCREEN_ON);
+ intentFilter.addAction(SIM_STATE_CHANGED);
+ mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this);
+
+ // listen for PASSIVE_PROVIDER updates
+ LocationManager locManager =
+ (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
+ long minTime = 0;
+ float minDistance = 0;
+ boolean oneShot = false;
+ LocationRequest request = LocationRequest.createFromDeprecatedProvider(
+ LocationManager.PASSIVE_PROVIDER,
+ minTime,
+ minDistance,
+ oneShot);
+ // Don't keep track of this request since it's done on behalf of other clients
+ // (which are kept track of separately).
+ request.setHideFromAppOps(true);
+ locManager.requestLocationUpdates(
+ request,
+ new NetworkLocationListener(),
+ getLooper());
+ }
+ }
private final class NetworkLocationListener implements LocationListener {
@Override
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 5de7d42..818f0aa 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -27,7 +27,7 @@
import static android.content.Intent.ACTION_USER_ADDED;
import static android.content.Intent.ACTION_USER_REMOVED;
import static android.content.Intent.EXTRA_UID;
-import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIMAX;
import static android.net.ConnectivityManager.isNetworkTypeMobile;
@@ -74,6 +74,7 @@
import android.Manifest;
import android.app.ActivityManager;
import android.app.AppGlobals;
+import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.INotificationManager;
import android.app.IProcessObserver;
@@ -136,6 +137,7 @@
import android.util.TrustedTime;
import android.util.Xml;
+import com.android.server.AppOpsService;
import libcore.io.IoUtils;
import com.android.internal.R;
@@ -292,6 +294,8 @@
private final AtomicFile mPolicyFile;
+ private final AppOpsManager mAppOps;
+
// TODO: keep whitelist of system-critical services that should never have
// rules enforced, such as system, phone, and radio UIDs.
@@ -326,6 +330,8 @@
mSuppressDefaultPolicy = suppressDefaultPolicy;
mPolicyFile = new AtomicFile(new File(systemDir, "netpolicy.xml"));
+
+ mAppOps = context.getSystemService(AppOpsManager.class);
}
public void bindConnectivityManager(IConnectivityManager connManager) {
@@ -401,7 +407,7 @@
mContext.registerReceiver(mScreenReceiver, screenFilter);
// watch for network interfaces to be claimed
- final IntentFilter connFilter = new IntentFilter(CONNECTIVITY_ACTION_IMMEDIATE);
+ final IntentFilter connFilter = new IntentFilter(CONNECTIVITY_ACTION);
mContext.registerReceiver(mConnReceiver, connFilter, CONNECTIVITY_INTERNAL, mHandler);
// listen for package changes to update policy
@@ -1593,16 +1599,21 @@
}
void addNetworkPolicyLocked(NetworkPolicy policy) {
- NetworkPolicy[] policies = getNetworkPolicies();
+ NetworkPolicy[] policies = getNetworkPolicies(mContext.getOpPackageName());
policies = ArrayUtils.appendElement(NetworkPolicy.class, policies, policy);
setNetworkPolicies(policies);
}
@Override
- public NetworkPolicy[] getNetworkPolicies() {
+ public NetworkPolicy[] getNetworkPolicies(String callingPackage) {
mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, TAG);
+ if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(),
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ return new NetworkPolicy[0];
+ }
+
synchronized (mRulesLock) {
final int size = mNetworkPolicy.size();
final NetworkPolicy[] policies = new NetworkPolicy[size];
@@ -1614,7 +1625,7 @@
}
private void normalizePoliciesLocked() {
- normalizePoliciesLocked(getNetworkPolicies());
+ normalizePoliciesLocked(getNetworkPolicies(mContext.getOpPackageName()));
}
private void normalizePoliciesLocked(NetworkPolicy[] policies) {
@@ -2290,4 +2301,29 @@
}
fout.print("]");
}
+
+ @Override
+ public void factoryReset(String subscriber) {
+ mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
+
+ // Turn mobile data limit off
+ NetworkPolicy[] policies = getNetworkPolicies(mContext.getOpPackageName());
+ NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriber);
+ for (NetworkPolicy policy : policies) {
+ if (policy.template.equals(template)) {
+ policy.limitBytes = NetworkPolicy.LIMIT_DISABLED;
+ policy.inferred = false;
+ policy.clearSnooze();
+ }
+ }
+ setNetworkPolicies(policies);
+
+ // Turn restrict background data off
+ setRestrictBackground(false);
+
+ // Remove app's "restrict background data" flag
+ for (int uid : getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND)) {
+ setUidPolicy(uid, POLICY_NONE);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 4cf2909..997d546 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -29,9 +29,11 @@
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.INotificationManager;
+import android.app.INotificationManagerCallback;
import android.app.ITransientNotification;
import android.app.Notification;
import android.app.NotificationManager;
+import android.app.NotificationManager.Policy;
import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
@@ -227,6 +229,8 @@
new ArrayMap<String, NotificationRecord>();
final ArrayList<ToastRecord> mToastQueue = new ArrayList<ToastRecord>();
final ArrayMap<String, NotificationRecord> mSummaryByGroupKey = new ArrayMap<>();
+ private final ArrayMap<String, Policy.Token> mPolicyTokens = new ArrayMap<>();
+
// The last key in this list owns the hardware.
ArrayList<String> mLights = new ArrayList<>();
@@ -893,6 +897,13 @@
updateInterruptionFilterLocked();
}
}
+
+ @Override
+ void onPolicyChanged() {
+ getContext().sendBroadcast(
+ new Intent(NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY));
+ }
});
final File systemDir = new File(Environment.getDataDirectory(), "system");
mPolicyFile = new AtomicFile(new File(systemDir, "notification_policy.xml"));
@@ -1551,6 +1562,18 @@
message);
}
+ private void enforcePolicyToken(Policy.Token token, String method) {
+ if (!checkPolicyToken(token)) {
+ Slog.w(TAG, "Invalid notification policy token calling " + method);
+ throw new SecurityException("Invalid notification policy token");
+ }
+ }
+
+ private boolean checkPolicyToken(Policy.Token token) {
+ return mPolicyTokens.containsValue(token)
+ || mListeners.mPolicyTokens.containsValue(token);
+ }
+
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
@@ -1586,24 +1609,73 @@
enforceSystemOrSystemUIOrVolume("INotificationManager.isSystemConditionProviderEnabled");
return mConditionProviders.isSystemProviderEnabled(path);
}
- };
- private String[] getActiveNotificationKeys(INotificationListener token) {
- final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
- final ArrayList<String> keys = new ArrayList<String>();
- if (info.isEnabledForCurrentProfiles()) {
- synchronized (mNotificationList) {
- final int N = mNotificationList.size();
- for (int i = 0; i < N; i++) {
- final StatusBarNotification sbn = mNotificationList.get(i).sbn;
- if (info.enabledAndUserMatches(sbn.getUserId())) {
- keys.add(sbn.getKey());
- }
- }
+ @Override
+ public Policy.Token getPolicyTokenFromListener(INotificationListener listener) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return mListeners.getPolicyToken(listener);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
- return keys.toArray(new String[keys.size()]);
- }
+
+ @Override
+ public void requestNotificationPolicyToken(String pkg,
+ INotificationManagerCallback callback) throws RemoteException {
+ if (callback == null) {
+ Slog.w(TAG, "requestNotificationPolicyToken: no callback specified");
+ return;
+ }
+ if (pkg == null) {
+ Slog.w(TAG, "requestNotificationPolicyToken denied: no package specified");
+ callback.onPolicyToken(null);
+ return;
+ }
+ Policy.Token token = null;
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mNotificationList) {
+ token = mPolicyTokens.get(pkg);
+ if (token == null) {
+ token = new Policy.Token(new Binder());
+ mPolicyTokens.put(pkg, token);
+ }
+ if (DBG) Slog.w(TAG, "requestNotificationPolicyToken granted for " + pkg);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ callback.onPolicyToken(token);
+ }
+
+ @Override
+ public boolean isNotificationPolicyTokenValid(String pkg, Policy.Token token) {
+ return checkPolicyToken(token);
+ }
+
+ @Override
+ public Policy getNotificationPolicy(Policy.Token token) {
+ enforcePolicyToken(token, "getNotificationPolicy");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return mZenModeHelper.getNotificationPolicy();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void setNotificationPolicy(Policy.Token token, Policy policy) {
+ enforcePolicyToken(token, "setNotificationPolicy");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mZenModeHelper.setNotificationPolicy(policy);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ };
private String disableNotificationEffects(NotificationRecord record) {
if (mDisableNotificationEffects) {
@@ -1718,6 +1790,10 @@
pw.print(listener.component);
}
pw.println(')');
+ pw.print(" mPolicyTokens.keys: ");
+ pw.println(TextUtils.join(",", mPolicyTokens.keySet()));
+ pw.print(" mListeners.mPolicyTokens.keys: ");
+ pw.println(TextUtils.join(",", mListeners.mPolicyTokens.keySet()));
}
pw.println("\n Condition providers:");
@@ -2970,12 +3046,18 @@
public class NotificationListeners extends ManagedServices {
private final ArraySet<ManagedServiceInfo> mLightTrimListeners = new ArraySet<>();
+ private final ArrayMap<ComponentName, Policy.Token> mPolicyTokens = new ArrayMap<>();
private boolean mNotificationGroupsDesired;
public NotificationListeners() {
super(getContext(), mHandler, mNotificationList, mUserProfiles);
}
+ public Policy.Token getPolicyToken(INotificationListener listener) {
+ final ManagedServiceInfo info = checkServiceTokenLocked(listener);
+ return info == null ? null : mPolicyTokens.get(info.component);
+ }
+
@Override
protected Config getConfig() {
Config c = new Config();
@@ -3000,6 +3082,7 @@
synchronized (mNotificationList) {
updateNotificationGroupsDesiredLocked();
update = makeRankingUpdateLocked(info);
+ mPolicyTokens.put(info.component, new Policy.Token(new Binder()));
}
try {
listener.onListenerConnected(update);
@@ -3016,6 +3099,7 @@
}
mLightTrimListeners.remove(removed);
updateNotificationGroupsDesiredLocked();
+ mPolicyTokens.remove(removed.component);
}
public void setOnNotificationPostedTrimLocked(ManagedServiceInfo info, int trim) {
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 40218bb..9cb8af5 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -21,6 +21,7 @@
import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
import android.app.AppOpsManager;
+import android.app.NotificationManager.Policy;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -57,6 +58,7 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Objects;
/**
* NotificationManagerService helper for functionality related to zen mode.
@@ -230,6 +232,21 @@
mConfig.writeXml(out);
}
+ public Policy getNotificationPolicy() {
+ return getNotificationPolicy(mConfig);
+ }
+
+ private static Policy getNotificationPolicy(ZenModeConfig config) {
+ return config == null ? null : config.toNotificationPolicy();
+ }
+
+ public void setNotificationPolicy(Policy policy) {
+ if (policy == null || mConfig == null) return;
+ final ZenModeConfig newConfig = mConfig.copy();
+ newConfig.applyNotificationPolicy(policy);
+ setConfig(newConfig, "setNotificationPolicy");
+ }
+
public ZenModeConfig getConfig() {
return mConfig;
}
@@ -247,8 +264,13 @@
if (config.equals(mConfig)) return true;
if (DEBUG) Log.d(TAG, "setConfig reason=" + reason);
ZenLog.traceConfig(mConfig, config);
+ final boolean policyChanged = !Objects.equals(getNotificationPolicy(mConfig),
+ getNotificationPolicy(config));
mConfig = config;
dispatchOnConfigChanged();
+ if (policyChanged){
+ dispatchOnPolicyChanged();
+ }
final String val = Integer.toString(mConfig.hashCode());
Global.putString(mContext.getContentResolver(), Global.ZEN_MODE_CONFIG_ETAG, val);
if (!evaluateZenMode(reason, setRingerMode)) {
@@ -355,6 +377,12 @@
}
}
+ private void dispatchOnPolicyChanged() {
+ for (Callback callback : mCallbacks) {
+ callback.onPolicyChanged();
+ }
+ }
+
private void dispatchOnZenModeChanged() {
for (Callback callback : mCallbacks) {
callback.onZenModeChanged();
@@ -617,6 +645,7 @@
public static class Callback {
void onConfigChanged() {}
void onZenModeChanged() {}
+ void onPolicyChanged() {}
}
}
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index a32363d..0f3b4e6b 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -48,6 +48,9 @@
if (TextUtils.isEmpty(arg)) {
return "!";
} else {
+ if (arg.indexOf('\0') != -1 || arg.indexOf(' ') != -1) {
+ throw new IllegalArgumentException(arg);
+ }
return arg;
}
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 46db2d8..89ca00e 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -371,7 +371,7 @@
final long deltaBytes = lengthBytes - stat.st_size;
// Only need to free up space when writing to internal stage
if (stageDir != null && deltaBytes > 0) {
- mPm.freeStorage(deltaBytes);
+ mPm.freeStorage(params.volumeUuid, deltaBytes);
}
Libcore.os.posix_fallocate(targetFd, 0, lengthBytes);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index a260b0e..24cc909 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1533,16 +1533,18 @@
public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
if (vol.type == VolumeInfo.TYPE_PRIVATE) {
if (vol.state == VolumeInfo.STATE_MOUNTED) {
+ // TODO: ensure that private directories exist for all active users
+ // TODO: remove user data whose serial number doesn't match
loadPrivatePackages(vol);
- } else if (vol.state == VolumeInfo.STATE_UNMOUNTING) {
+ } else if (vol.state == VolumeInfo.STATE_EJECTING) {
unloadPrivatePackages(vol);
}
}
- if (vol.isPrimary() && vol.type == VolumeInfo.TYPE_PUBLIC) {
+ if (vol.type == VolumeInfo.TYPE_PUBLIC && vol.isPrimary()) {
if (vol.state == VolumeInfo.STATE_MOUNTED) {
updateExternalMediaStatus(true, false);
- } else if (vol.state == VolumeInfo.STATE_UNMOUNTING) {
+ } else if (vol.state == VolumeInfo.STATE_EJECTING) {
updateExternalMediaStatus(false, false);
}
}
@@ -1967,7 +1969,7 @@
psit.remove();
logCriticalInfo(Log.WARN, "System package " + ps.name
+ " no longer exists; wiping its data");
- removeDataDirsLI(ps.name);
+ removeDataDirsLI(null, ps.name);
} else {
final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(ps.name);
if (disabledPs.codePath == null || !disabledPs.codePath.exists()) {
@@ -2012,7 +2014,7 @@
if (deletedPkg == null) {
msg = "Updated system package " + deletedAppName
+ " no longer exists; wiping its data";
- removeDataDirsLI(deletedAppName);
+ removeDataDirsLI(null, deletedAppName);
} else {
msg = "Updated system app + " + deletedAppName
+ " no longer present; removing system privileges for "
@@ -2128,8 +2130,9 @@
mIsUpgrade = !Build.FINGERPRINT.equals(mSettings.mFingerprint);
if (mIsUpgrade && !onlyCore) {
Slog.i(TAG, "Build fingerprint changed; clearing code caches");
- for (String pkgName : mSettings.mPackages.keySet()) {
- deleteCodeCacheDirsLI(pkgName);
+ for (int i = 0; i < mSettings.mPackages.size(); i++) {
+ final PackageSetting ps = mSettings.mPackages.valueAt(i);
+ deleteCodeCacheDirsLI(ps.volumeUuid, ps.name);
}
mSettings.mFingerprint = Build.FINGERPRINT;
}
@@ -2309,7 +2312,7 @@
void cleanupInstallFailedPackage(PackageSetting ps) {
logCriticalInfo(Log.WARN, "Cleaning up incompletely installed app: " + ps.name);
- removeDataDirsLI(ps.name);
+ removeDataDirsLI(ps.volumeUuid, ps.name);
if (ps.codePath != null) {
if (ps.codePath.isDirectory()) {
mInstaller.rmPackageDir(ps.codePath.getAbsolutePath());
@@ -2604,9 +2607,9 @@
return null;
}
-
@Override
- public void freeStorageAndNotify(final long freeStorageSize, final IPackageDataObserver observer) {
+ public void freeStorageAndNotify(final String volumeUuid, final long freeStorageSize,
+ final IPackageDataObserver observer) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CLEAR_APP_CACHE, null);
// Queue up an async operation since clearing cache may take a little while.
@@ -2615,7 +2618,7 @@
mHandler.removeCallbacks(this);
int retCode = -1;
synchronized (mInstallLock) {
- retCode = mInstaller.freeCache(freeStorageSize);
+ retCode = mInstaller.freeCache(volumeUuid, freeStorageSize);
if (retCode < 0) {
Slog.w(TAG, "Couldn't clear application caches");
}
@@ -2632,7 +2635,8 @@
}
@Override
- public void freeStorage(final long freeStorageSize, final IntentSender pi) {
+ public void freeStorage(final String volumeUuid, final long freeStorageSize,
+ final IntentSender pi) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CLEAR_APP_CACHE, null);
// Queue up an async operation since clearing cache may take a little while.
@@ -2641,7 +2645,7 @@
mHandler.removeCallbacks(this);
int retCode = -1;
synchronized (mInstallLock) {
- retCode = mInstaller.freeCache(freeStorageSize);
+ retCode = mInstaller.freeCache(volumeUuid, freeStorageSize);
if (retCode < 0) {
Slog.w(TAG, "Couldn't clear application caches");
}
@@ -2660,9 +2664,9 @@
});
}
- void freeStorage(long freeStorageSize) throws IOException {
+ void freeStorage(String volumeUuid, long freeStorageSize) throws IOException {
synchronized (mInstallLock) {
- if (mInstaller.freeCache(freeStorageSize) < 0) {
+ if (mInstaller.freeCache(volumeUuid, freeStorageSize) < 0) {
throw new IOException("Failed to free enough space");
}
}
@@ -5481,15 +5485,15 @@
return true;
}
- private int createDataDirsLI(String packageName, int uid, String seinfo) {
+ private int createDataDirsLI(String volumeUuid, String packageName, int uid, String seinfo) {
int[] users = sUserManager.getUserIds();
- int res = mInstaller.install(packageName, uid, uid, seinfo);
+ int res = mInstaller.install(volumeUuid, packageName, uid, uid, seinfo);
if (res < 0) {
return res;
}
for (int user : users) {
if (user != 0) {
- res = mInstaller.createUserData(packageName,
+ res = mInstaller.createUserData(volumeUuid, packageName,
UserHandle.getUid(user, uid), user, seinfo);
if (res < 0) {
return res;
@@ -5499,11 +5503,11 @@
return res;
}
- private int removeDataDirsLI(String packageName) {
+ private int removeDataDirsLI(String volumeUuid, String packageName) {
int[] users = sUserManager.getUserIds();
int res = 0;
for (int user : users) {
- int resInner = mInstaller.remove(packageName, user);
+ int resInner = mInstaller.remove(volumeUuid, packageName, user);
if (resInner < 0) {
res = resInner;
}
@@ -5512,11 +5516,11 @@
return res;
}
- private int deleteCodeCacheDirsLI(String packageName) {
+ private int deleteCodeCacheDirsLI(String volumeUuid, String packageName) {
int[] users = sUserManager.getUserIds();
int res = 0;
for (int user : users) {
- int resInner = mInstaller.deleteCodeCacheFiles(packageName, user);
+ int resInner = mInstaller.deleteCodeCacheFiles(volumeUuid, packageName, user);
if (resInner < 0) {
res = resInner;
}
@@ -5651,7 +5655,7 @@
return res;
} finally {
if (!success && (scanFlags & SCAN_DELETE_DATA_ON_FAILURES) != 0) {
- removeDataDirsLI(pkg.packageName);
+ removeDataDirsLI(pkg.volumeUuid, pkg.packageName);
}
}
}
@@ -6021,8 +6025,8 @@
// This is probably because the system was stopped while
// installd was in the middle of messing with its libs
// directory. Ask installd to fix that.
- int ret = mInstaller.fixUid(pkgName, pkg.applicationInfo.uid,
- pkg.applicationInfo.uid);
+ int ret = mInstaller.fixUid(pkg.volumeUuid, pkgName,
+ pkg.applicationInfo.uid, pkg.applicationInfo.uid);
if (ret >= 0) {
recovered = true;
String msg = "Package " + pkg.packageName
@@ -6035,7 +6039,7 @@
|| (scanFlags&SCAN_BOOTING) != 0)) {
// If this is a system app, we can at least delete its
// current data so the application will still work.
- int ret = removeDataDirsLI(pkgName);
+ int ret = removeDataDirsLI(pkg.volumeUuid, pkgName);
if (ret >= 0) {
// TODO: Kill the processes first
// Old data gone!
@@ -6049,8 +6053,8 @@
recovered = true;
// And now re-install the app.
- ret = createDataDirsLI(pkgName, pkg.applicationInfo.uid,
- pkg.applicationInfo.seinfo);
+ ret = createDataDirsLI(pkg.volumeUuid, pkgName, pkg.applicationInfo.uid,
+ pkg.applicationInfo.seinfo);
if (ret == -1) {
// Ack should not happen!
msg = prefix + pkg.packageName
@@ -6093,8 +6097,8 @@
pkg.applicationInfo.dataDir = dataPath.getPath();
if (mShouldRestoreconData) {
Slog.i(TAG, "SELinux relabeling of " + pkg.packageName + " issued.");
- mInstaller.restoreconData(pkg.packageName, pkg.applicationInfo.seinfo,
- pkg.applicationInfo.uid);
+ mInstaller.restoreconData(pkg.volumeUuid, pkg.packageName,
+ pkg.applicationInfo.seinfo, pkg.applicationInfo.uid);
}
} else {
if (DEBUG_PACKAGE_SCANNING) {
@@ -6102,8 +6106,8 @@
Log.v(TAG, "Want this data dir: " + dataPath);
}
//invoke installer to do the actual installation
- int ret = createDataDirsLI(pkgName, pkg.applicationInfo.uid,
- pkg.applicationInfo.seinfo);
+ int ret = createDataDirsLI(pkg.volumeUuid, pkgName, pkg.applicationInfo.uid,
+ pkg.applicationInfo.seinfo);
if (ret < 0) {
// Error from installer
throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE,
@@ -6280,7 +6284,8 @@
!VMRuntime.is64BitAbi(pkg.applicationInfo.primaryCpuAbi)) {
final String nativeLibPath = pkg.applicationInfo.nativeLibraryDir;
for (int userId : userIds) {
- if (mInstaller.linkNativeLibraryDirectory(pkg.packageName, nativeLibPath, userId) < 0) {
+ if (mInstaller.linkNativeLibraryDirectory(pkg.volumeUuid, pkg.packageName,
+ nativeLibPath, userId) < 0) {
throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
"Failed linking native library dir (user=" + userId + ")");
}
@@ -9589,7 +9594,7 @@
final long sizeBytes = mContainerService.calculateInstalledSize(
origin.resolvedPath, isForwardLocked(), packageAbiOverride);
- if (mInstaller.freeCache(sizeBytes + lowThreshold) >= 0) {
+ if (mInstaller.freeCache(null, sizeBytes + lowThreshold) >= 0) {
pkgLite = mContainerService.getMinimalPackageInfo(origin.resolvedPath,
installFlags, packageAbiOverride);
}
@@ -10817,7 +10822,7 @@
sendResourcesChangedBroadcast(false, true, pkgList, uidArray, null);
}
- deleteCodeCacheDirsLI(pkgName);
+ deleteCodeCacheDirsLI(pkg.volumeUuid, pkgName);
try {
final PackageParser.Package newPackage = scanPackageLI(pkg, parseFlags,
scanFlags | SCAN_UPDATE_TIME, System.currentTimeMillis(), user);
@@ -10929,7 +10934,7 @@
}
// Successfully disabled the old package. Now proceed with re-installation
- deleteCodeCacheDirsLI(packageName);
+ deleteCodeCacheDirsLI(pkg.volumeUuid, packageName);
res.returnCode = PackageManager.INSTALL_SUCCEEDED;
pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
@@ -11660,7 +11665,7 @@
}
}
if ((flags&PackageManager.DELETE_KEEP_DATA) == 0) {
- removeDataDirsLI(packageName);
+ removeDataDirsLI(ps.volumeUuid, packageName);
schedulePackageCleaning(packageName, UserHandle.USER_ALL, true);
}
// writer
@@ -11965,7 +11970,7 @@
outInfo.removedAppId = appId;
outInfo.removedUsers = new int[] {removeUser};
}
- mInstaller.clearUserData(packageName, removeUser);
+ mInstaller.clearUserData(ps.volumeUuid, packageName, removeUser);
removeKeystoreDataIfNeeded(removeUser, appId);
schedulePackageCleaning(packageName, removeUser, false);
synchronized (mPackages) {
@@ -12134,7 +12139,7 @@
// Always delete data directories for package, even if we found no other
// record of app. This helps users recover from UID mismatches without
// resorting to a full data wipe.
- int retCode = mInstaller.clearUserData(packageName, userId);
+ int retCode = mInstaller.clearUserData(pkg.volumeUuid, packageName, userId);
if (retCode < 0) {
Slog.w(TAG, "Couldn't remove cache files for package: " + packageName);
return false;
@@ -12155,7 +12160,8 @@
if (pkg != null && pkg.applicationInfo.primaryCpuAbi != null &&
!VMRuntime.is64BitAbi(pkg.applicationInfo.primaryCpuAbi)) {
final String nativeLibPath = pkg.applicationInfo.nativeLibraryDir;
- if (mInstaller.linkNativeLibraryDirectory(pkg.packageName, nativeLibPath, userId) < 0) {
+ if (mInstaller.linkNativeLibraryDirectory(pkg.volumeUuid, pkg.packageName,
+ nativeLibPath, userId) < 0) {
Slog.w(TAG, "Failed linking native library dir");
return false;
}
@@ -12231,7 +12237,7 @@
Slog.w(TAG, "Package " + packageName + " has no applicationInfo.");
return false;
}
- int retCode = mInstaller.deleteCacheFiles(packageName, userId);
+ int retCode = mInstaller.deleteCacheFiles(p.volumeUuid, packageName, userId);
if (retCode < 0) {
Slog.w(TAG, "Couldn't remove cache files for package: "
+ packageName + " u" + userId);
@@ -12309,8 +12315,8 @@
// TODO(multiArch): Extend getSizeInfo to look at *all* instruction sets, not
// just the primary.
String[] dexCodeInstructionSets = getDexCodeInstructionSets(getAppDexInstructionSets(ps));
- int res = mInstaller.getSizeInfo(packageName, userHandle, p.baseCodePath, libDirRoot,
- publicSrcDir, asecPath, dexCodeInstructionSets, pStats);
+ int res = mInstaller.getSizeInfo(p.volumeUuid, packageName, userHandle, p.baseCodePath,
+ libDirRoot, publicSrcDir, asecPath, dexCodeInstructionSets, pStats);
if (res < 0) {
return false;
}
@@ -14304,7 +14310,15 @@
// Technically, we shouldn't be doing this with the package lock
// held. However, this is very rare, and there is already so much
// other disk I/O going on, that we'll let it slide for now.
- mInstaller.removeUserDataDirs(userHandle);
+ final StorageManager storage = StorageManager.from(mContext);
+ final List<VolumeInfo> vols = storage.getVolumes();
+ for (VolumeInfo vol : vols) {
+ if (vol.getType() == VolumeInfo.TYPE_PRIVATE && vol.isMountedWritable()) {
+ final String volumeUuid = vol.getFsUuid();
+ Slog.d(TAG, "Removing user data on volume " + volumeUuid);
+ mInstaller.removeUserDataDirs(volumeUuid, userHandle);
+ }
+ }
}
mUserNeedsBadging.delete(userHandle);
removeUnusedPackagesLILPw(userManager, userHandle);
diff --git a/services/core/java/com/android/server/pm/PermissionsState.java b/services/core/java/com/android/server/pm/PermissionsState.java
index fbb5090..829ec39 100644
--- a/services/core/java/com/android/server/pm/PermissionsState.java
+++ b/services/core/java/com/android/server/pm/PermissionsState.java
@@ -290,7 +290,9 @@
permissions.add(permission);
}
} else {
- if (hasRuntimePermission(permission, userId)) {
+ if (hasInstallPermission(permission)) {
+ permissions.add(permission);
+ } else if (hasRuntimePermission(permission, userId)) {
permissions.add(permission);
}
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index d2964bb..f3fdb0d 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -207,6 +207,8 @@
private static int mFirstAvailableUid = 0;
+ // TODO: store SDK versions and fingerprint for each volume UUID
+
// These are the last platform API version we were using for
// the apps installed on internal and external storage. It is
// used to grant newer permissions one time during a system upgrade.
@@ -3437,7 +3439,7 @@
// Only system apps are initially installed.
ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle);
// Need to create a data directory for all apps under this user.
- installer.createUserData(ps.name,
+ installer.createUserData(ps.volumeUuid, ps.name,
UserHandle.getUid(userHandle, ps.appId), userHandle,
ps.pkg.applicationInfo.seinfo);
}
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 75c33af..1a52933 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -145,6 +145,9 @@
if (mKeyguardState.bootCompleted) {
mKeyguardService.onBootCompleted();
}
+ if (mKeyguardState.occluded) {
+ mKeyguardService.setOccluded(mKeyguardState.occluded);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
index 2673557..cbbcb0e 100644
--- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
@@ -74,6 +74,8 @@
public class DeviceStorageMonitorService extends SystemService {
static final String TAG = "DeviceStorageMonitorService";
+ // TODO: extend to watch and manage caches on all private volumes
+
static final boolean DEBUG = false;
static final boolean localLOGV = false;
@@ -220,7 +222,7 @@
try {
if (localLOGV) Slog.i(TAG, "Clearing cache");
IPackageManager.Stub.asInterface(ServiceManager.getService("package")).
- freeStorageAndNotify(mMemCacheTrimToThreshold, mClearCacheObserver);
+ freeStorageAndNotify(null, mMemCacheTrimToThreshold, mClearCacheObserver);
} catch (RemoteException e) {
Slog.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
mClearingCache = false;
diff --git a/services/core/java/com/android/server/trust/TrustAgentWrapper.java b/services/core/java/com/android/server/trust/TrustAgentWrapper.java
index dec195d..fb7d186 100644
--- a/services/core/java/com/android/server/trust/TrustAgentWrapper.java
+++ b/services/core/java/com/android/server/trust/TrustAgentWrapper.java
@@ -116,7 +116,7 @@
}
mTrusted = true;
mMessage = (CharSequence) msg.obj;
- boolean initiatedByUser = msg.arg1 != 0;
+ int flags = msg.arg1;
long durationMs = msg.getData().getLong(DATA_DURATION);
if (durationMs > 0) {
final long duration;
@@ -141,8 +141,8 @@
}
mTrustManagerService.mArchive.logGrantTrust(mUserId, mName,
(mMessage != null ? mMessage.toString() : null),
- durationMs, initiatedByUser);
- mTrustManagerService.updateTrust(mUserId, initiatedByUser);
+ durationMs, flags);
+ mTrustManagerService.updateTrust(mUserId, flags);
break;
case MSG_TRUST_TIMEOUT:
if (DEBUG) Slog.v(TAG, "Trust timed out : " + mName.flattenToShortString());
@@ -156,7 +156,7 @@
if (msg.what == MSG_REVOKE_TRUST) {
mTrustManagerService.mArchive.logRevokeTrust(mUserId, mName);
}
- mTrustManagerService.updateTrust(mUserId, false);
+ mTrustManagerService.updateTrust(mUserId, 0);
break;
case MSG_RESTART_TIMEOUT:
destroy();
@@ -171,7 +171,7 @@
if (DEBUG) Log.v(TAG, "Re-enabling agent because it acknowledged "
+ "enabled features: " + mName);
mTrustDisabledByDpm = false;
- mTrustManagerService.updateTrust(mUserId, false);
+ mTrustManagerService.updateTrust(mUserId, 0);
}
} else {
if (DEBUG) Log.w(TAG, "Ignoring MSG_SET_TRUST_AGENT_FEATURES_COMPLETED "
@@ -185,7 +185,7 @@
mMessage = null;
}
mTrustManagerService.mArchive.logManagingTrust(mUserId, mName, mManagingTrust);
- mTrustManagerService.updateTrust(mUserId, false);
+ mTrustManagerService.updateTrust(mUserId, 0);
break;
}
}
@@ -194,12 +194,12 @@
private ITrustAgentServiceCallback mCallback = new ITrustAgentServiceCallback.Stub() {
@Override
- public void grantTrust(CharSequence userMessage, long durationMs, boolean initiatedByUser) {
+ public void grantTrust(CharSequence userMessage, long durationMs, int flags) {
if (DEBUG) Slog.v(TAG, "enableTrust(" + userMessage + ", durationMs = " + durationMs
- + ", initiatedByUser = " + initiatedByUser + ")");
+ + ", flags = " + flags + ")");
Message msg = mHandler.obtainMessage(
- MSG_GRANT_TRUST, initiatedByUser ? 1 : 0, 0, userMessage);
+ MSG_GRANT_TRUST, flags, 0, userMessage);
msg.getData().putLong(DATA_DURATION, durationMs);
msg.sendToTarget();
}
@@ -381,7 +381,7 @@
}
if (mTrustDisabledByDpm != trustDisabled) {
mTrustDisabledByDpm = trustDisabled;
- mTrustManagerService.updateTrust(mUserId, false);
+ mTrustManagerService.updateTrust(mUserId, 0);
}
return trustDisabled;
}
diff --git a/services/core/java/com/android/server/trust/TrustArchive.java b/services/core/java/com/android/server/trust/TrustArchive.java
index 7253716..fd63d48 100644
--- a/services/core/java/com/android/server/trust/TrustArchive.java
+++ b/services/core/java/com/android/server/trust/TrustArchive.java
@@ -19,6 +19,7 @@
import android.content.ComponentName;
import android.os.SystemClock;
import android.os.UserHandle;
+import android.service.trust.TrustAgentService;
import android.util.TimeUtils;
import java.io.PrintWriter;
@@ -48,20 +49,20 @@
// grantTrust
final String message;
final long duration;
- final boolean userInitiated;
+ final int flags;
// managingTrust
final boolean managingTrust;
private Event(int type, int userId, ComponentName agent, String message,
- long duration, boolean userInitiated, boolean managingTrust) {
+ long duration, int flags, boolean managingTrust) {
this.type = type;
this.userId = userId;
this.agent = agent;
this.elapsedTimestamp = SystemClock.elapsedRealtime();
this.message = message;
this.duration = duration;
- this.userInitiated = userInitiated;
+ this.flags = flags;
this.managingTrust = managingTrust;
}
}
@@ -69,33 +70,33 @@
ArrayDeque<Event> mEvents = new ArrayDeque<Event>();
public void logGrantTrust(int userId, ComponentName agent, String message,
- long duration, boolean userInitiated) {
+ long duration, int flags) {
addEvent(new Event(TYPE_GRANT_TRUST, userId, agent, message, duration,
- userInitiated, false));
+ flags, false));
}
public void logRevokeTrust(int userId, ComponentName agent) {
- addEvent(new Event(TYPE_REVOKE_TRUST, userId, agent, null, 0, false, false));
+ addEvent(new Event(TYPE_REVOKE_TRUST, userId, agent, null, 0, 0, false));
}
public void logTrustTimeout(int userId, ComponentName agent) {
- addEvent(new Event(TYPE_TRUST_TIMEOUT, userId, agent, null, 0, false, false));
+ addEvent(new Event(TYPE_TRUST_TIMEOUT, userId, agent, null, 0, 0, false));
}
public void logAgentDied(int userId, ComponentName agent) {
- addEvent(new Event(TYPE_AGENT_DIED, userId, agent, null, 0, false, false));
+ addEvent(new Event(TYPE_AGENT_DIED, userId, agent, null, 0, 0, false));
}
public void logAgentConnected(int userId, ComponentName agent) {
- addEvent(new Event(TYPE_AGENT_CONNECTED, userId, agent, null, 0, false, false));
+ addEvent(new Event(TYPE_AGENT_CONNECTED, userId, agent, null, 0, 0, false));
}
public void logAgentStopped(int userId, ComponentName agent) {
- addEvent(new Event(TYPE_AGENT_STOPPED, userId, agent, null, 0, false, false));
+ addEvent(new Event(TYPE_AGENT_STOPPED, userId, agent, null, 0, 0, false));
}
public void logManagingTrust(int userId, ComponentName agent, boolean managing) {
- addEvent(new Event(TYPE_MANAGING_TRUST, userId, agent, null, 0, false, managing));
+ addEvent(new Event(TYPE_MANAGING_TRUST, userId, agent, null, 0, 0, managing));
}
private void addEvent(Event e) {
@@ -129,8 +130,8 @@
}
switch (ev.type) {
case TYPE_GRANT_TRUST:
- writer.printf(", message=\"%s\", duration=%s, initiatedByUser=%d",
- ev.message, formatDuration(ev.duration), ev.userInitiated ? 1 : 0);
+ writer.printf(", message=\"%s\", duration=%s, flags=%s",
+ ev.message, formatDuration(ev.duration), dumpGrantFlags(ev.flags));
break;
case TYPE_MANAGING_TRUST:
writer.printf(", managingTrust=" + ev.managingTrust);
@@ -184,4 +185,20 @@
return "Unknown(" + type + ")";
}
}
+
+ private String dumpGrantFlags(int flags) {
+ StringBuilder sb = new StringBuilder();
+ if ((flags & TrustAgentService.FLAG_GRANT_TRUST_INITIATED_BY_USER) != 0) {
+ if (sb.length() != 0) sb.append('|');
+ sb.append("INITIATED_BY_USER");
+ }
+ if ((flags & TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD) != 0) {
+ if (sb.length() != 0) sb.append('|');
+ sb.append("DISMISS_KEYGUARD");
+ }
+ if (sb.length() == 0) {
+ sb.append('0');
+ }
+ return sb.toString();
+ }
}
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index b38d33d..7d2fb43 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -179,11 +179,11 @@
private void updateTrustAll() {
List<UserInfo> userInfos = mUserManager.getUsers(true /* excludeDying */);
for (UserInfo userInfo : userInfos) {
- updateTrust(userInfo.id, false);
+ updateTrust(userInfo.id, 0);
}
}
- public void updateTrust(int userId, boolean initiatedByUser) {
+ public void updateTrust(int userId, int flags) {
dispatchOnTrustManagedChanged(aggregateIsTrustManaged(userId), userId);
boolean trusted = aggregateIsTrusted(userId);
boolean changed;
@@ -191,7 +191,7 @@
changed = mUserIsTrusted.get(userId) != trusted;
mUserIsTrusted.put(userId, trusted);
}
- dispatchOnTrustChanged(trusted, userId, initiatedByUser);
+ dispatchOnTrustChanged(trusted, userId, flags);
if (changed) {
refreshDeviceLockedForUser(userId);
}
@@ -281,7 +281,7 @@
if (userId == UserHandle.USER_ALL) {
updateTrustAll();
} else {
- updateTrust(userId, false /* initiatedByUser */);
+ updateTrust(userId, 0);
}
}
}
@@ -394,7 +394,7 @@
}
}
if (trustMayHaveChanged) {
- updateTrust(userId, false);
+ updateTrust(userId, 0);
}
refreshAgentList(userId);
}
@@ -587,11 +587,11 @@
}
}
- private void dispatchOnTrustChanged(boolean enabled, int userId, boolean initiatedByUser) {
- if (!enabled) initiatedByUser = false;
+ private void dispatchOnTrustChanged(boolean enabled, int userId, int flags) {
+ if (!enabled) flags = 0;
for (int i = 0; i < mTrustListeners.size(); i++) {
try {
- mTrustListeners.get(i).onTrustChanged(enabled, userId, initiatedByUser);
+ mTrustListeners.get(i).onTrustChanged(enabled, userId, flags);
} catch (DeadObjectException e) {
Slog.d(TAG, "Removing dead TrustListener.");
mTrustListeners.remove(i);
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
index d4c5f87..ac79b36 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
@@ -40,6 +40,8 @@
private boolean mRelroReady32Bit = false;
private boolean mRelroReady64Bit = false;
+ private String oldWebViewPackageName = null;
+
private BroadcastReceiver mWebViewUpdatedReceiver;
public WebViewUpdateService(Context context) {
@@ -51,9 +53,22 @@
mWebViewUpdatedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- String webviewPackage = "package:" + WebViewFactory.getWebViewPackageName();
- if (webviewPackage.equals(intent.getDataString())) {
- onWebViewUpdateInstalled();
+
+ for (String packageName : WebViewFactory.getWebViewPackageNames()) {
+ String webviewPackage = "package:" + packageName;
+
+ if (webviewPackage.equals(intent.getDataString())) {
+ String usedPackageName =
+ WebViewFactory.findPreferredWebViewPackage().packageName;
+ // Only trigger update actions if the updated package is the one that
+ // will be used, or the one that was in use before the update.
+ if (packageName.equals(usedPackageName) ||
+ packageName.equals(oldWebViewPackageName)) {
+ onWebViewUpdateInstalled();
+ oldWebViewPackageName = usedPackageName;
+ }
+ return;
+ }
}
}
};
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index a04f6cb..e914cd4 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -56,7 +56,7 @@
boolean appFullscreen;
int requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
boolean layoutConfigChanges;
- boolean showWhenLocked;
+ boolean showForAllUsers;
// The input dispatching timeout for this application token in nanoseconds.
long inputDispatchingTimeoutNanos;
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index f073c23..f914369 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -66,6 +66,7 @@
int mBaseDisplayWidth = 0;
int mBaseDisplayHeight = 0;
int mBaseDisplayDensity = 0;
+ boolean mDisplayScalingDisabled;
private final DisplayInfo mDisplayInfo = new DisplayInfo();
private final Display mDisplay;
@@ -360,6 +361,9 @@
pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight);
pw.print(" "); pw.print(mBaseDisplayDensity); pw.print("dpi");
}
+ if (mDisplayScalingDisabled) {
+ pw.println(" noscale");
+ }
pw.print(" cur=");
pw.print(mDisplayInfo.logicalWidth);
pw.print("x"); pw.print(mDisplayInfo.logicalHeight);
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 34120a0..0c3cf65 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -107,9 +107,9 @@
}
}
- boolean showWhenLocked() {
+ boolean showForAllUsers() {
final int tokensCount = mAppTokens.size();
- return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showWhenLocked;
+ return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers;
}
@Override
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index e845f83..7cdf8b2 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -276,27 +276,26 @@
}
void addTask(Task task, boolean toTop) {
- addTask(task, toTop, task.showWhenLocked());
+ addTask(task, toTop, task.showForAllUsers());
}
/**
* Put a Task in this stack. Used for adding and moving.
* @param task The task to add.
* @param toTop Whether to add it to the top or bottom.
- * @param showWhenLocked Whether to show the task when the device is locked
- * regardless of the current user.
+ * @param showForAllUsers Whether to show the task regardless of the current user.
*/
- void addTask(Task task, boolean toTop, boolean showWhenLocked) {
+ void addTask(Task task, boolean toTop, boolean showForAllUsers) {
int stackNdx;
if (!toTop) {
stackNdx = 0;
} else {
stackNdx = mTasks.size();
- if (!showWhenLocked && !mService.isCurrentProfileLocked(task.mUserId)) {
+ if (!showForAllUsers && !mService.isCurrentProfileLocked(task.mUserId)) {
// Place the task below all current user tasks.
while (--stackNdx >= 0) {
final Task tmpTask = mTasks.get(stackNdx);
- if (!tmpTask.showWhenLocked()
+ if (!tmpTask.showForAllUsers()
|| !mService.isCurrentProfileLocked(tmpTask.mUserId)) {
break;
}
@@ -498,7 +497,7 @@
int top = mTasks.size();
for (int taskNdx = 0; taskNdx < top; ++taskNdx) {
Task task = mTasks.get(taskNdx);
- if (mService.isCurrentProfileLocked(task.mUserId) || task.showWhenLocked()) {
+ if (mService.isCurrentProfileLocked(task.mUserId) || task.showForAllUsers()) {
mTasks.remove(taskNdx);
mTasks.add(task);
--top;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index e790fb0..f29d524 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -709,6 +709,11 @@
private WindowContentFrameStats mTempWindowRenderStats;
final class DragInputEventReceiver extends InputEventReceiver {
+ // Set, if stylus button was down at the start of the drag.
+ private boolean mStylusButtonDownAtStart;
+ // Indicates the first event to check for button state.
+ private boolean mIsStartEvent = true;
+
public DragInputEventReceiver(InputChannel inputChannel, Looper looper) {
super(inputChannel, looper);
}
@@ -724,6 +729,18 @@
boolean endDrag = false;
final float newX = motionEvent.getRawX();
final float newY = motionEvent.getRawY();
+ final boolean isStylusButtonDown =
+ (motionEvent.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS)
+ && (motionEvent.getButtonState() & MotionEvent.BUTTON_SECONDARY) != 0;
+
+ if (mIsStartEvent) {
+ if (isStylusButtonDown) {
+ // First event and the button was down, check for the button being
+ // lifted in the future, if that happens we'll drop the item.
+ mStylusButtonDownAtStart = true;
+ }
+ mIsStartEvent = false;
+ }
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: {
@@ -733,9 +750,17 @@
} break;
case MotionEvent.ACTION_MOVE: {
- synchronized (mWindowMap) {
- // move the surface and tell the involved window(s) where we are
- mDragState.notifyMoveLw(newX, newY);
+ if (mStylusButtonDownAtStart && !isStylusButtonDown) {
+ if (DEBUG_DRAG) Slog.d(TAG, "Button no longer pressed; dropping at "
+ + newX + "," + newY);
+ synchronized (mWindowMap) {
+ endDrag = mDragState.notifyDropLw(newX, newY);
+ }
+ } else {
+ synchronized (mWindowMap) {
+ // move the surface and tell the involved window(s) where we are
+ mDragState.notifyMoveLw(newX, newY);
+ }
}
} break;
@@ -759,6 +784,8 @@
synchronized (mWindowMap) {
mDragState.endDragLw();
}
+ mStylusButtonDownAtStart = false;
+ mIsStartEvent = true;
}
handled = true;
@@ -3620,13 +3647,13 @@
EventLog.writeEvent(EventLogTags.WM_TASK_CREATED, taskId, stackId);
Task task = new Task(taskId, stack, userId, this);
mTaskIdToTask.put(taskId, task);
- stack.addTask(task, !atoken.mLaunchTaskBehind /* toTop */, atoken.showWhenLocked);
+ stack.addTask(task, !atoken.mLaunchTaskBehind /* toTop */, atoken.showForAllUsers);
return task;
}
@Override
public void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
- int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int userId,
+ int requestedOrientation, boolean fullscreen, boolean showForAllUsers, int userId,
int configChanges, boolean voiceInteraction, boolean launchTaskBehind) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"addAppToken()")) {
@@ -3656,7 +3683,7 @@
atoken = new AppWindowToken(this, token, voiceInteraction);
atoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
atoken.appFullscreen = fullscreen;
- atoken.showWhenLocked = showWhenLocked;
+ atoken.showForAllUsers = showForAllUsers;
atoken.requestedOrientation = requestedOrientation;
atoken.layoutConfigChanges = (configChanges &
(ActivityInfo.CONFIG_SCREEN_SIZE | ActivityInfo.CONFIG_ORIENTATION)) != 0;
@@ -7249,8 +7276,15 @@
displayInfo.getLogicalMetrics(mRealDisplayMetrics,
CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null);
displayInfo.getAppMetrics(mDisplayMetrics);
+ if (displayContent.mDisplayScalingDisabled) {
+ displayInfo.flags |= Display.FLAG_SCALING_DISABLED;
+ } else {
+ displayInfo.flags &= ~Display.FLAG_SCALING_DISABLED;
+ }
+
mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(
displayContent.getDisplayId(), displayInfo);
+
displayContent.mBaseDisplayRect.set(0, 0, dw, dh);
}
if (false) {
@@ -7547,7 +7581,7 @@
synchronized(mWindowMap) {
final DisplayContent displayContent = getDefaultDisplayContentLocked();
- readForcedDisplaySizeAndDensityLocked(displayContent);
+ readForcedDisplayPropertiesLocked(displayContent);
mDisplayReady = true;
}
@@ -8320,7 +8354,47 @@
}
}
- private void readForcedDisplaySizeAndDensityLocked(final DisplayContent displayContent) {
+ @Override
+ public void setForcedDisplayScalingMode(int displayId, int mode) {
+ if (mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.WRITE_SECURE_SETTINGS) !=
+ PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Must hold permission " +
+ android.Manifest.permission.WRITE_SECURE_SETTINGS);
+ }
+ if (displayId != Display.DEFAULT_DISPLAY) {
+ throw new IllegalArgumentException("Can only set the default display");
+ }
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized(mWindowMap) {
+ final DisplayContent displayContent = getDisplayContentLocked(displayId);
+ if (displayContent != null) {
+ if (mode < 0 || mode > 1) {
+ mode = 0;
+ }
+ setForcedDisplayScalingModeLocked(displayContent, mode);
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DISPLAY_SCALING_FORCE, mode);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ private void setForcedDisplayScalingModeLocked(DisplayContent displayContent,
+ int mode) {
+ Slog.i(TAG, "Using display scaling mode: " + (mode == 0 ? "auto" : "off"));
+
+ synchronized(displayContent.mDisplaySizeLock) {
+ displayContent.mDisplayScalingDisabled = (mode != 0);
+ }
+ reconfigureDisplayLocked(displayContent);
+ }
+
+ private void readForcedDisplayPropertiesLocked(final DisplayContent displayContent) {
+ // Display size.
String sizeStr = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.DISPLAY_SIZE_FORCED);
if (sizeStr == null || sizeStr.length() == 0) {
@@ -8345,6 +8419,8 @@
}
}
}
+
+ // Display density.
String densityStr = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.DISPLAY_DENSITY_FORCED);
if (densityStr == null || densityStr.length() == 0) {
@@ -8363,6 +8439,16 @@
} catch (NumberFormatException ex) {
}
}
+
+ // Display scaling mode.
+ int mode = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.DISPLAY_SCALING_FORCE, 0);
+ if (mode != 0) {
+ synchronized(displayContent.mDisplaySizeLock) {
+ Slog.i(TAG, "FORCED DISPLAY SCALING DISABLED");
+ displayContent.mDisplayScalingDisabled = true;
+ }
+ }
}
// displayContent must not be null
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index db3268d..4f795a6 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
+import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
@@ -478,6 +479,12 @@
if (mAppToken != null) {
final DisplayContent appDisplay = getDisplayContent();
mNotOnAppsDisplay = displayContent != appDisplay;
+
+ if (mAppToken.showForAllUsers) {
+ // Windows for apps that can show for all users should also show when the
+ // device is locked.
+ mAttrs.flags |= FLAG_SHOW_WHEN_LOCKED;
+ }
}
mWinAnimator = new WindowStateAnimator(this);
@@ -1353,7 +1360,7 @@
win = win.mAttachedWindow;
}
if (win.mAttrs.type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
- && win.mAppToken != null && win.mAppToken.showWhenLocked) {
+ && win.mAppToken != null && win.mAppToken.showForAllUsers) {
// Save some cycles by not calling getDisplayInfo unless it is an application
// window intended for all users.
final DisplayContent displayContent = win.getDisplayContent();
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index a5546cf..19ca2b4 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -33,7 +33,6 @@
$(JNI_H_INCLUDE) \
frameworks/base/services \
frameworks/base/libs \
- frameworks/base/libs/hwui \
frameworks/base/core/jni \
frameworks/native/services \
libcore/include \
diff --git a/services/core/jni/com_android_server_AssetAtlasService.cpp b/services/core/jni/com_android_server_AssetAtlasService.cpp
index 8f4fb51..e4f242e 100644
--- a/services/core/jni/com_android_server_AssetAtlasService.cpp
+++ b/services/core/jni/com_android_server_AssetAtlasService.cpp
@@ -47,9 +47,40 @@
#define FENCE_TIMEOUT 2000000000
// ----------------------------------------------------------------------------
+// JNI Helpers
+// ----------------------------------------------------------------------------
+
+static struct {
+ jmethodID setNativeBitmap;
+} gCanvasClassInfo;
+
+#define INVOKEV(object, method, ...) \
+ env->CallVoidMethod(object, method, __VA_ARGS__)
+
+// ----------------------------------------------------------------------------
// Canvas management
// ----------------------------------------------------------------------------
+static jlong com_android_server_AssetAtlasService_acquireCanvas(JNIEnv* env, jobject,
+ jobject canvas, jint width, jint height) {
+
+ SkBitmap* bitmap = new SkBitmap;
+ bitmap->allocN32Pixels(width, height);
+ bitmap->eraseColor(0);
+ INVOKEV(canvas, gCanvasClassInfo.setNativeBitmap, reinterpret_cast<jlong>(bitmap));
+
+ return reinterpret_cast<jlong>(bitmap);
+}
+
+static void com_android_server_AssetAtlasService_releaseCanvas(JNIEnv* env, jobject,
+ jobject canvas, jlong bitmapHandle) {
+
+ SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
+ INVOKEV(canvas, gCanvasClassInfo.setNativeBitmap, (jlong)0);
+
+ delete bitmap;
+}
+
#define CLEANUP_GL_AND_RETURN(result) \
if (fence != EGL_NO_SYNC_KHR) eglDestroySyncKHR(display, fence); \
if (image) eglDestroyImageKHR(display, image); \
@@ -62,12 +93,9 @@
return result;
static jboolean com_android_server_AssetAtlasService_upload(JNIEnv* env, jobject,
- jobject graphicBuffer, jobject bitmapHandle) {
+ jobject graphicBuffer, jlong bitmapHandle) {
- SkBitmap bitmap;
- GraphicsJNI::getSkBitmap(env, bitmapHandle, &bitmap);
- SkAutoLockPixels alp(bitmap);
-
+ SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
// The goal of this method is to copy the bitmap into the GraphicBuffer
// using the GPU to swizzle the texture content
sp<GraphicBuffer> buffer(graphicBufferForJavaObject(env, graphicBuffer));
@@ -158,9 +186,9 @@
}
// Upload the content of the bitmap in the GraphicBuffer
- glPixelStorei(GL_UNPACK_ALIGNMENT, bitmap.bytesPerPixel());
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap.width(), bitmap.height(),
- GL_RGBA, GL_UNSIGNED_BYTE, bitmap.getPixels());
+ glPixelStorei(GL_UNPACK_ALIGNMENT, bitmap->bytesPerPixel());
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap->width(), bitmap->height(),
+ GL_RGBA, GL_UNSIGNED_BYTE, bitmap->getPixels());
if (glGetError() != GL_NO_ERROR) {
ALOGW("Could not upload to texture");
CLEANUP_GL_AND_RETURN(JNI_FALSE);
@@ -205,11 +233,20 @@
const char* const kClassPathName = "com/android/server/AssetAtlasService";
static JNINativeMethod gMethods[] = {
- { "nUploadAtlas", "(Landroid/view/GraphicBuffer;Landroid/graphics/Bitmap;)Z",
+ { "nAcquireAtlasCanvas", "(Landroid/graphics/Canvas;II)J",
+ (void*) com_android_server_AssetAtlasService_acquireCanvas },
+ { "nReleaseAtlasCanvas", "(Landroid/graphics/Canvas;J)V",
+ (void*) com_android_server_AssetAtlasService_releaseCanvas },
+ { "nUploadAtlas", "(Landroid/view/GraphicBuffer;J)Z",
(void*) com_android_server_AssetAtlasService_upload },
};
int register_android_server_AssetAtlasService(JNIEnv* env) {
+ jclass clazz;
+
+ FIND_CLASS(clazz, "android/graphics/Canvas");
+ GET_METHOD_ID(gCanvasClassInfo.setNativeBitmap, clazz, "setNativeBitmap", "(J)V");
+
return jniRegisterNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
}
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 7c5980a..f3edbd1 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -752,7 +752,7 @@
void NativeInputManager::reloadCalibration() {
mInputManager->getReader()->requestRefreshConfiguration(
- InputReaderConfiguration::TOUCH_AFFINE_TRANSFORMATION);
+ InputReaderConfiguration::CHANGE_TOUCH_AFFINE_TRANSFORMATION);
}
TouchAffineTransformation NativeInputManager::getTouchAffineTransformation(
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 452b3eb..e22a2cc 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -1638,10 +1638,13 @@
private void updateLockTaskPackagesLocked(DevicePolicyData policy, int userId) {
IActivityManager am = ActivityManagerNative.getDefault();
+ long ident = Binder.clearCallingIdentity();
try {
am.updateLockTaskPackages(userId, policy.mLockTaskPackages.toArray(new String[0]));
} catch (RemoteException e) {
// Not gonna happen.
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
index c198900..48d8ffb 100644
--- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
@@ -16,7 +16,7 @@
package com.android.server;
-import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.getNetworkTypeName;
@@ -157,7 +157,7 @@
// mMobile.link.addRoute(MOBILE_ROUTE_V6);
// mMobile.doReturnDefaults();
//
-// nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE);
+// nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION);
// mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget();
// nextConnBroadcast.get();
//
@@ -177,7 +177,7 @@
// mMobile.link.addRoute(MOBILE_ROUTE_V6);
// mMobile.doReturnDefaults();
//
-// nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE);
+// nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION);
// mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget();
// nextConnBroadcast.get();
//
@@ -193,7 +193,7 @@
// // expect that mobile will be torn down
// doReturn(true).when(mMobile.tracker).teardown();
//
-// nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE);
+// nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION);
// mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mWifi.info).sendToTarget();
// nextConnBroadcast.get();
//
@@ -212,7 +212,7 @@
// mMobile.link.clear();
// mMobile.doReturnDefaults();
//
-// nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION_IMMEDIATE);
+// nextConnBroadcast = mServiceContext.nextBroadcastIntent(CONNECTIVITY_ACTION);
// mTrackerHandler.obtainMessage(EVENT_STATE_CHANGED, mMobile.info).sendToTarget();
// nextConnBroadcast.get();
//
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 0b4d42e..72a458b 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -18,7 +18,7 @@
import static android.content.Intent.ACTION_UID_REMOVED;
import static android.content.Intent.EXTRA_UID;
-import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.NetworkPolicy.LIMIT_DISABLED;
import static android.net.NetworkPolicy.WARNING_DISABLED;
@@ -597,7 +597,7 @@
future = expectMeteredIfacesChanged();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
future.get();
verifyAndReset();
@@ -708,7 +708,7 @@
future = expectMeteredIfacesChanged(TEST_IFACE);
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
future.get();
verifyAndReset();
}
diff --git a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
index 7ea5aa7..90b4f43 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
@@ -18,7 +18,7 @@
import static android.content.Intent.ACTION_UID_REMOVED;
import static android.content.Intent.EXTRA_UID;
-import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIMAX;
@@ -192,7 +192,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
// verify service has empty history for wifi
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
@@ -246,7 +246,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
// verify service has empty history for wifi
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
@@ -337,7 +337,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
verifyAndReset();
// modify some number on wifi, and trigger poll event
@@ -389,7 +389,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
verifyAndReset();
// create some traffic on first network
@@ -431,7 +431,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
verifyAndReset();
@@ -477,7 +477,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
verifyAndReset();
// create some traffic
@@ -546,7 +546,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
verifyAndReset();
// create some traffic
@@ -580,7 +580,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
verifyAndReset();
@@ -617,7 +617,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
verifyAndReset();
// create some traffic for two apps
@@ -683,7 +683,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
verifyAndReset();
// create some initial traffic
@@ -748,7 +748,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
verifyAndReset();
// create some tethering traffic
@@ -788,7 +788,7 @@
expectNetworkStatsPoll();
replay();
- mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
+ mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
verifyAndReset();
// create some traffic, but only for DEV, and across 1.5 buckets
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 8a28d51..7dce83e 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -393,12 +393,9 @@
throw new SecurityException(
"Caller is not the current voice interaction service");
}
- final int callingPid = Binder.getCallingPid();
- final int callingUid = Binder.getCallingUid();
final long caller = Binder.clearCallingIdentity();
try {
- mImpl.showSessionLocked(callingPid, callingUid, args, flags,
- null /* showCallback */);
+ mImpl.showSessionLocked(args, flags, null /* showCallback */);
} finally {
Binder.restoreCallingIdentity(caller);
}
@@ -432,12 +429,9 @@
Slog.w(TAG, "showSessionFromSession without running voice interaction service");
return false;
}
- final int callingPid = Binder.getCallingPid();
- final int callingUid = Binder.getCallingUid();
final long caller = Binder.clearCallingIdentity();
try {
- return mImpl.showSessionLocked(callingPid, callingUid, sessionArgs, flags,
- null /* showCallback */);
+ return mImpl.showSessionLocked(sessionArgs, flags, null /* showCallback */);
} finally {
Binder.restoreCallingIdentity(caller);
}
@@ -506,11 +500,9 @@
Slog.w(TAG, "finish without running voice interaction service");
return;
}
- final int callingPid = Binder.getCallingPid();
- final int callingUid = Binder.getCallingUid();
final long caller = Binder.clearCallingIdentity();
try {
- mImpl.finishLocked(callingPid, callingUid, token);
+ mImpl.finishLocked(token);
} finally {
Binder.restoreCallingIdentity(caller);
}
@@ -708,11 +700,9 @@
+ "service");
return;
}
- final int callingPid = Binder.getCallingPid();
- final int callingUid = Binder.getCallingUid();
final long caller = Binder.clearCallingIdentity();
try {
- mImpl.showSessionLocked(callingPid, callingUid, new Bundle() /* sessionArgs */,
+ mImpl.showSessionLocked(new Bundle() /* sessionArgs */,
VoiceInteractionService.START_SOURCE_ASSIST_GESTURE
| VoiceInteractionService.START_WITH_ASSIST
| VoiceInteractionService.START_WITH_SCREENSHOT,
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
index bca757b..61ec162 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
@@ -135,11 +135,11 @@
mContext.registerReceiver(mBroadcastReceiver, filter, null, handler);
}
- public boolean showSessionLocked(int callingPid, int callingUid, Bundle args, int flags,
+ public boolean showSessionLocked(Bundle args, int flags,
IVoiceInteractionSessionShowCallback showCallback) {
if (mActiveSession == null) {
mActiveSession = new VoiceInteractionSessionConnection(mLock, mSessionComponentName,
- mUser, mContext, this, callingPid, callingUid);
+ mUser, mContext, this, mInfo.getServiceInfo().applicationInfo.uid);
}
return mActiveSession.showLocked(args, flags, showCallback);
}
@@ -196,7 +196,7 @@
}
}
- public void finishLocked(int callingPid, int callingUid, IBinder token) {
+ public void finishLocked(IBinder token) {
if (mActiveSession == null || token != mActiveSession.mToken) {
Slog.w(TAG, "finish does not match active session");
return;
@@ -267,7 +267,7 @@
@Override
public void sessionConnectionGone(VoiceInteractionSessionConnection connection) {
synchronized (mLock) {
- finishLocked(connection.mCallingPid, connection.mCallingUid, connection.mToken);
+ finishLocked(connection.mToken);
}
}
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
index fb83956..9634ab8 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
@@ -59,7 +59,6 @@
final int mUser;
final Context mContext;
final Callback mCallback;
- final int mCallingPid;
final int mCallingUid;
final IActivityManager mAm;
final IWindowManager mIWindowManager;
@@ -139,13 +138,12 @@
};
public VoiceInteractionSessionConnection(Object lock, ComponentName component, int user,
- Context context, Callback callback, int callingPid, int callingUid) {
+ Context context, Callback callback, int callingUid) {
mLock = lock;
mSessionComponentName = component;
mUser = user;
mContext = context;
mCallback = callback;
- mCallingPid = callingPid;
mCallingUid = callingUid;
mAm = ActivityManagerNative.getDefault();
mIWindowManager = IWindowManager.Stub.asInterface(
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 719dd76..a46585a 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Bundle;
@@ -203,14 +204,21 @@
*/
public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 0x00040000;
- /**
- * Call type can be modified for IMS call
+ /**
+ * Call can be upgraded to a video call.
* @hide
*/
public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 0x00080000;
+ /**
+ * For video calls, indicates whether the outgoing video for the call can be paused using
+ * the {@link android.telecom.VideoProfile.VideoState#PAUSED} VideoState.
+ * @hide
+ */
+ public static final int CAPABILITY_CAN_PAUSE_VIDEO = 0x00100000;
+
//******************************************************************************************
- // Next CAPABILITY value: 0x00100000
+ // Next CAPABILITY value: 0x00200000
//******************************************************************************************
private final Uri mHandle;
@@ -226,7 +234,6 @@
private final int mVideoState;
private final StatusHints mStatusHints;
private final Bundle mExtras;
- private final int mCallSubstate;
/**
* Whether the supplied capabilities supports the specified capability.
@@ -315,6 +322,9 @@
if (can(capabilities, CAPABILITY_CAN_UPGRADE_TO_VIDEO)) {
builder.append(" CAPABILITY_CAN_UPGRADE_TO_VIDEO");
}
+ if (can(capabilities, CAPABILITY_CAN_PAUSE_VIDEO)) {
+ builder.append(" CAPABILITY_CAN_PAUSE_VIDEO");
+ }
builder.append("]");
return builder.toString();
}
@@ -420,14 +430,6 @@
return mExtras;
}
- /**
- * @return The substate of the {@code Call}.
- * @hide
- */
- public int getCallSubstate() {
- return mCallSubstate;
- }
-
@Override
public boolean equals(Object o) {
if (o instanceof Details) {
@@ -446,8 +448,7 @@
Objects.equals(mGatewayInfo, d.mGatewayInfo) &&
Objects.equals(mVideoState, d.mVideoState) &&
Objects.equals(mStatusHints, d.mStatusHints) &&
- Objects.equals(mExtras, d.mExtras) &&
- Objects.equals(mCallSubstate, d.mCallSubstate);
+ Objects.equals(mExtras, d.mExtras);
}
return false;
}
@@ -467,8 +468,7 @@
Objects.hashCode(mGatewayInfo) +
Objects.hashCode(mVideoState) +
Objects.hashCode(mStatusHints) +
- Objects.hashCode(mExtras) +
- Objects.hashCode(mCallSubstate);
+ Objects.hashCode(mExtras);
}
/** {@hide} */
@@ -485,8 +485,7 @@
GatewayInfo gatewayInfo,
int videoState,
StatusHints statusHints,
- Bundle extras,
- int callSubstate) {
+ Bundle extras) {
mHandle = handle;
mHandlePresentation = handlePresentation;
mCallerDisplayName = callerDisplayName;
@@ -500,11 +499,10 @@
mVideoState = videoState;
mStatusHints = statusHints;
mExtras = extras;
- mCallSubstate = callSubstate;
}
}
- public static abstract class Listener {
+ public static abstract class Callback {
/**
* Invoked when the state of this {@code Call} has changed. See {@link #getState()}.
*
@@ -588,13 +586,21 @@
public void onConferenceableCallsChanged(Call call, List<Call> conferenceableCalls) {}
}
+ /**
+ * @deprecated Use {@code Call.Callback} instead.
+ * @hide
+ */
+ @Deprecated
+ @SystemApi
+ public static abstract class Listener extends Callback { }
+
private final Phone mPhone;
private final String mTelecomCallId;
private final InCallAdapter mInCallAdapter;
private final List<String> mChildrenIds = new ArrayList<>();
private final List<Call> mChildren = new ArrayList<>();
private final List<Call> mUnmodifiableChildren = Collections.unmodifiableList(mChildren);
- private final List<Listener> mListeners = new CopyOnWriteArrayList<>();
+ private final List<Callback> mCallbacks = new CopyOnWriteArrayList<>();
private final List<Call> mConferenceableCalls = new ArrayList<>();
private final List<Call> mUnmodifiableConferenceableCalls =
Collections.unmodifiableList(mConferenceableCalls);
@@ -689,8 +695,8 @@
* {@code Call} will temporarily pause playing the tones for a pre-defined period of time.
*
* If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_WAIT} symbol, this
- * {@code Call} will pause playing the tones and notify listeners via
- * {@link Listener#onPostDialWait(Call, String)}. At this point, the in-call app
+ * {@code Call} will pause playing the tones and notify callbacks via
+ * {@link Callback#onPostDialWait(Call, String)}. At this point, the in-call app
* should display to the user an indication of this state and an affordance to continue
* the postdial sequence. When the user decides to continue the postdial sequence, the in-call
* app should invoke the {@link #postDialContinue(boolean)} method.
@@ -831,25 +837,52 @@
}
/**
+ * Registers a callback to this {@code Call}.
+ *
+ * @param callback A {@code Callback}.
+ */
+ public void registerCallback(Callback callback) {
+ mCallbacks.add(callback);
+ }
+
+ /**
+ * Unregisters a callback from this {@code Call}.
+ *
+ * @param callback A {@code Callback}.
+ */
+ public void unregisterCallback(Callback callback) {
+ if (callback != null) {
+ mCallbacks.remove(callback);
+ }
+ }
+
+ /**
* Adds a listener to this {@code Call}.
*
* @param listener A {@code Listener}.
+ * @deprecated Use {@link #registerCallback} instead.
+ * @hide
*/
+ @Deprecated
+ @SystemApi
public void addListener(Listener listener) {
- mListeners.add(listener);
+ registerCallback(listener);
}
/**
* Removes a listener from this {@code Call}.
*
* @param listener A {@code Listener}.
+ * @deprecated Use {@link #unregisterCallback} instead.
+ * @hide
*/
+ @Deprecated
+ @SystemApi
public void removeListener(Listener listener) {
- if (listener != null) {
- mListeners.remove(listener);
- }
+ unregisterCallback(listener);
}
+
/** {@hide} */
Call(Phone phone, String telecomCallId, InCallAdapter inCallAdapter) {
mPhone = phone;
@@ -879,8 +912,7 @@
parcelableCall.getGatewayInfo(),
parcelableCall.getVideoState(),
parcelableCall.getStatusHints(),
- parcelableCall.getExtras(),
- parcelableCall.getCallSubstate());
+ parcelableCall.getExtras());
boolean detailsChanged = !Objects.equals(mDetails, details);
if (detailsChanged) {
mDetails = details;
@@ -981,56 +1013,56 @@
}
private void fireStateChanged(int newState) {
- for (Listener listener : mListeners) {
- listener.onStateChanged(this, newState);
+ for (Callback callback : mCallbacks) {
+ callback.onStateChanged(this, newState);
}
}
private void fireParentChanged(Call newParent) {
- for (Listener listener : mListeners) {
- listener.onParentChanged(this, newParent);
+ for (Callback callback : mCallbacks) {
+ callback.onParentChanged(this, newParent);
}
}
private void fireChildrenChanged(List<Call> children) {
- for (Listener listener : mListeners) {
- listener.onChildrenChanged(this, children);
+ for (Callback callback : mCallbacks) {
+ callback.onChildrenChanged(this, children);
}
}
private void fireDetailsChanged(Details details) {
- for (Listener listener : mListeners) {
- listener.onDetailsChanged(this, details);
+ for (Callback callback : mCallbacks) {
+ callback.onDetailsChanged(this, details);
}
}
private void fireCannedTextResponsesLoaded(List<String> cannedTextResponses) {
- for (Listener listener : mListeners) {
- listener.onCannedTextResponsesLoaded(this, cannedTextResponses);
+ for (Callback callback : mCallbacks) {
+ callback.onCannedTextResponsesLoaded(this, cannedTextResponses);
}
}
private void fireVideoCallChanged(InCallService.VideoCall videoCall) {
- for (Listener listener : mListeners) {
- listener.onVideoCallChanged(this, videoCall);
+ for (Callback callback : mCallbacks) {
+ callback.onVideoCallChanged(this, videoCall);
}
}
private void firePostDialWait(String remainingPostDialSequence) {
- for (Listener listener : mListeners) {
- listener.onPostDialWait(this, remainingPostDialSequence);
+ for (Callback callback : mCallbacks) {
+ callback.onPostDialWait(this, remainingPostDialSequence);
}
}
private void fireCallDestroyed() {
- for (Listener listener : mListeners) {
- listener.onCallDestroyed(this);
+ for (Callback callback : mCallbacks) {
+ callback.onCallDestroyed(this);
}
}
private void fireConferenceableCallsChanged() {
- for (Listener listener : mListeners) {
- listener.onConferenceableCallsChanged(this, mUnmodifiableConferenceableCalls);
+ for (Callback callback : mCallbacks) {
+ callback.onConferenceableCallsChanged(this, mUnmodifiableConferenceableCalls);
}
}
diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java
index 15a1da1..bab60fe 100644
--- a/telecomm/java/android/telecom/Conference.java
+++ b/telecomm/java/android/telecom/Conference.java
@@ -29,7 +29,7 @@
/**
* Represents a conference call which can contain any number of {@link Connection} objects.
*/
-public abstract class Conference implements IConferenceable {
+public abstract class Conference implements Conferenceable {
/**
* Used to indicate that the conference connection time is not specified. If not specified,
diff --git a/telecomm/java/android/telecom/Conferenceable.java b/telecomm/java/android/telecom/Conferenceable.java
new file mode 100644
index 0000000..5c4cbc5
--- /dev/null
+++ b/telecomm/java/android/telecom/Conferenceable.java
@@ -0,0 +1,26 @@
+/*
+ * 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 android.telecom;
+
+/**
+ * Interface used to identify entities with which another entity can participate in a conference
+ * call with. The {@link ConnectionService} implementation will only recognize
+ * {@link Conferenceable}s which are {@link Connection}s or {@link Conference}s.
+ */
+public interface Conferenceable {
+
+}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 3a54b1c..e79584f 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -44,7 +44,7 @@
* must call {@link #destroy()} to signal to the framework that the {@code Connection} is no
* longer used and associated resources may be recovered.
*/
-public abstract class Connection implements IConferenceable {
+public abstract class Connection implements Conferenceable {
public static final int STATE_INITIALIZING = 0;
@@ -184,57 +184,22 @@
public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 0x00040000;
/**
- * Call type can be modified for IMS call
+ * Call can be upgraded to a video call.
* @hide
*/
public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 0x00080000;
+ /**
+ * For video calls, indicates whether the outgoing video for the call can be paused using
+ * the {@link android.telecom.VideoProfile.VideoState#PAUSED} VideoState.
+ * @hide
+ */
+ public static final int CAPABILITY_CAN_PAUSE_VIDEO = 0x00100000;
+
//**********************************************************************************************
- // Next CAPABILITY value: 0x00100000
+ // Next CAPABILITY value: 0x00200000
//**********************************************************************************************
- /**
- * Call substate bitmask values
- */
-
- /* Default case */
- /**
- * @hide
- */
- public static final int SUBSTATE_NONE = 0;
-
- /* Indicates that the call is connected but audio attribute is suspended */
- /**
- * @hide
- */
- public static final int SUBSTATE_AUDIO_CONNECTED_SUSPENDED = 0x1;
-
- /* Indicates that the call is connected but video attribute is suspended */
- /**
- * @hide
- */
- public static final int SUBSTATE_VIDEO_CONNECTED_SUSPENDED = 0x2;
-
- /* Indicates that the call is established but media retry is needed */
- /**
- * @hide
- */
- public static final int SUBSTATE_AVP_RETRY = 0x4;
-
- /* Indicates that the call is multitasking */
- /**
- * @hide
- */
- public static final int SUBSTATE_MEDIA_PAUSED = 0x8;
-
- /* Mask containing all the call substate bits set */
- /**
- * @hide
- */
- public static final int SUBSTATE_ALL = SUBSTATE_AUDIO_CONNECTED_SUSPENDED |
- SUBSTATE_VIDEO_CONNECTED_SUSPENDED | SUBSTATE_AVP_RETRY |
- SUBSTATE_MEDIA_PAUSED;
-
// Flag controlling whether PII is emitted into the logs
private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG);
@@ -342,6 +307,9 @@
if (can(capabilities, CAPABILITY_CAN_UPGRADE_TO_VIDEO)) {
builder.append(" CAPABILITY_CAN_UPGRADE_TO_VIDEO");
}
+ if (can(capabilities, CAPABILITY_CAN_PAUSE_VIDEO)) {
+ builder.append(" CAPABILITY_CAN_PAUSE_VIDEO");
+ }
builder.append("]");
return builder.toString();
}
@@ -364,13 +332,12 @@
public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {}
public void onStatusHintsChanged(Connection c, StatusHints statusHints) {}
public void onConferenceablesChanged(
- Connection c, List<IConferenceable> conferenceables) {}
+ Connection c, List<Conferenceable> conferenceables) {}
public void onConferenceChanged(Connection c, Conference conference) {}
/** @hide */
public void onConferenceParticipantsChanged(Connection c,
List<ConferenceParticipant> participants) {}
public void onConferenceStarted() {}
- public void onCallSubstateChanged(Connection c, int substate) {}
}
public static abstract class VideoProvider {
@@ -778,8 +745,8 @@
*/
private final Set<Listener> mListeners = Collections.newSetFromMap(
new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
- private final List<IConferenceable> mConferenceables = new ArrayList<>();
- private final List<IConferenceable> mUnmodifiableConferenceables =
+ private final List<Conferenceable> mConferenceables = new ArrayList<>();
+ private final List<Conferenceable> mUnmodifiableConferenceables =
Collections.unmodifiableList(mConferenceables);
private int mState = STATE_NEW;
@@ -797,7 +764,6 @@
private DisconnectCause mDisconnectCause;
private Conference mConference;
private ConnectionService mConnectionService;
- private int mCallSubstate;
/**
* Create a new Connection.
@@ -856,21 +822,6 @@
}
/**
- * Returns the call substate of the call.
- * Valid values: {@link Connection#SUBSTATE_NONE},
- * {@link Connection#SUBSTATE_AUDIO_CONNECTED_SUSPENDED},
- * {@link Connection#SUBSTATE_VIDEO_CONNECTED_SUSPENDED},
- * {@link Connection#SUBSTATE_AVP_RETRY},
- * {@link Connection#SUBSTATE_MEDIA_PAUSED}.
- *
- * @param callSubstate The new call substate.
- * @hide
- */
- public final int getCallSubstate() {
- return mCallSubstate;
- }
-
- /**
* @return The audio state of the connection, describing how its audio is currently
* being routed by the system. This is {@code null} if this Connection
* does not directly know about its audio state.
@@ -1044,25 +995,6 @@
}
/**
- * Set the call substate for the connection.
- * Valid values: {@link Connection#SUBSTATE_NONE},
- * {@link Connection#SUBSTATE_AUDIO_CONNECTED_SUSPENDED},
- * {@link Connection#SUBSTATE_VIDEO_CONNECTED_SUSPENDED},
- * {@link Connection#SUBSTATE_AVP_RETRY},
- * {@link Connection#SUBSTATE_MEDIA_PAUSED}.
- *
- * @param callSubstate The new call substate.
- * @hide
- */
- public final void setCallSubstate(int callSubstate) {
- Log.d(this, "setCallSubstate %d", callSubstate);
- mCallSubstate = callSubstate;
- for (Listener l : mListeners) {
- l.onCallSubstateChanged(this, mCallSubstate);
- }
- }
-
- /**
* Sets state to active (e.g., an ongoing connection where two or more parties can actively
* communicate).
*/
@@ -1267,9 +1199,9 @@
*
* @param conferenceables The conferenceables.
*/
- public final void setConferenceables(List<IConferenceable> conferenceables) {
+ public final void setConferenceables(List<Conferenceable> conferenceables) {
clearConferenceableList();
- for (IConferenceable c : conferenceables) {
+ for (Conferenceable c : conferenceables) {
// If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
// small amount of items here.
if (!mConferenceables.contains(c)) {
@@ -1289,7 +1221,7 @@
/**
* Returns the connections or conferences with which this connection can be conferenced.
*/
- public final List<IConferenceable> getConferenceables() {
+ public final List<Conferenceable> getConferenceables() {
return mUnmodifiableConferenceables;
}
@@ -1554,7 +1486,7 @@
}
private final void clearConferenceableList() {
- for (IConferenceable c : mConferenceables) {
+ for (Conferenceable c : mConferenceables) {
if (c instanceof Connection) {
Connection connection = (Connection) c;
connection.removeConnectionListener(mConnectionDeathListener);
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index e36d32b..9812815 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -539,7 +539,7 @@
@Override
public void onConferenceablesChanged(
- Connection connection, List<IConferenceable> conferenceables) {
+ Connection connection, List<Conferenceable> conferenceables) {
mAdapter.setConferenceableConnections(
mIdByConnection.get(connection),
createIdList(conferenceables));
@@ -556,13 +556,6 @@
mAdapter.setIsConferenced(id, conferenceId);
}
}
-
- @Override
- public void onCallSubstateChanged(Connection c, int callSubstate) {
- String id = mIdByConnection.get(c);
- Log.d(this, "Adapter set call substate %d", callSubstate);
- mAdapter.setCallSubstate(id, callSubstate);
- }
};
/** {@inheritDoc} */
@@ -632,8 +625,7 @@
connection.getAudioModeIsVoip(),
connection.getStatusHints(),
connection.getDisconnectCause(),
- createIdList(connection.getConferenceables()),
- connection.getCallSubstate()));
+ createIdList(connection.getConferenceables())));
}
private void abort(String callId) {
@@ -956,7 +948,7 @@
connection.getAudioModeIsVoip(),
connection.getStatusHints(),
connection.getDisconnectCause(),
- emptyList, connection.getCallSubstate());
+ emptyList);
mAdapter.addExistingConnection(id, parcelableConnection);
}
}
@@ -1176,14 +1168,14 @@
/**
* Builds a list of {@link Connection} and {@link Conference} IDs based on the list of
- * {@link IConferenceable}s passed in.
+ * {@link Conferenceable}s passed in.
*
- * @param conferenceables The {@link IConferenceable} connections and conferences.
+ * @param conferenceables The {@link Conferenceable} connections and conferences.
* @return List of string conference and call Ids.
*/
- private List<String> createIdList(List<IConferenceable> conferenceables) {
+ private List<String> createIdList(List<Conferenceable> conferenceables) {
List<String> ids = new ArrayList<>();
- for (IConferenceable c : conferenceables) {
+ for (Conferenceable c : conferenceables) {
// Only allow Connection and Conference conferenceables.
if (c instanceof Connection) {
Connection connection = (Connection) c;
diff --git a/telecomm/java/android/telecom/ConnectionServiceAdapter.java b/telecomm/java/android/telecom/ConnectionServiceAdapter.java
index a410976..d026a28 100644
--- a/telecomm/java/android/telecom/ConnectionServiceAdapter.java
+++ b/telecomm/java/android/telecom/ConnectionServiceAdapter.java
@@ -369,26 +369,4 @@
}
}
}
-
- /**
- * Set the call substate for the connection.
- * Valid values: {@link Connection#CALL_SUBSTATE_NONE},
- * {@link Connection#CALL_SUBSTATE_AUDIO_CONNECTED_SUSPENDED},
- * {@link Connection#CALL_SUBSTATE_VIDEO_CONNECTED_SUSPENDED},
- * {@link Connection#CALL_SUBSTATE_AVP_RETRY},
- * {@link Connection#CALL_SUBSTATE_MEDIA_PAUSED}.
- *
- * @param callId The unique ID of the call to set the substate for.
- * @param callSubstate The new call substate.
- * @hide
- */
- public final void setCallSubstate(String callId, int callSubstate) {
- Log.v(this, "setCallSubstate: %d", callSubstate);
- for (IConnectionServiceAdapter adapter : mAdapters) {
- try {
- adapter.setCallSubstate(callId, callSubstate);
- } catch (RemoteException ignored) {
- }
- }
- }
}
diff --git a/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java b/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java
index 5f93789..429f296 100644
--- a/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java
+++ b/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java
@@ -59,7 +59,6 @@
private static final int MSG_SET_CONFERENCEABLE_CONNECTIONS = 20;
private static final int MSG_ADD_EXISTING_CONNECTION = 21;
private static final int MSG_ON_POST_DIAL_CHAR = 22;
- private static final int MSG_SET_CALL_SUBSTATE = 23;
private final IConnectionServiceAdapter mDelegate;
@@ -221,10 +220,6 @@
}
break;
}
- case MSG_SET_CALL_SUBSTATE: {
- mDelegate.setCallSubstate((String) msg.obj, msg.arg1);
- break;
- }
}
}
};
@@ -389,12 +384,6 @@
args.arg2 = connection;
mHandler.obtainMessage(MSG_ADD_EXISTING_CONNECTION, args).sendToTarget();
}
-
- @Override
- public void setCallSubstate(String connectionId, int callSubstate) {
- mHandler.obtainMessage(MSG_SET_CALL_SUBSTATE, callSubstate, 0,
- connectionId).sendToTarget();
- }
};
public ConnectionServiceAdapterServant(IConnectionServiceAdapter delegate) {
diff --git a/telecomm/java/android/telecom/IConferenceable.java b/telecomm/java/android/telecom/IConferenceable.java
index a9be20b..a664baa 100644
--- a/telecomm/java/android/telecom/IConferenceable.java
+++ b/telecomm/java/android/telecom/IConferenceable.java
@@ -19,8 +19,10 @@
/**
* Interface used to identify entities with which another entity can participate in a conference
* call with. The {@link ConnectionService} implementation will only recognize
- * {@link IConferenceable}s which are {@link Connection}s or {@link Conference}s.
+ * {@link Conferenceable}s which are {@link Connection}s or {@link Conference}s.
+ * <p>
+ * @deprecated use {@link Conferenceable} instead.
+ * @hide
*/
-public interface IConferenceable {
-
+public interface IConferenceable extends Conferenceable {
}
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index 66072da..7cbc0fc 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -17,6 +17,7 @@
package android.telecom;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
@@ -30,6 +31,8 @@
import com.android.internal.telecom.IInCallService;
import java.lang.String;
+import java.util.Collections;
+import java.util.List;
/**
* This service is implemented by any app that wishes to provide the user-interface for managing
@@ -63,6 +66,7 @@
switch (msg.what) {
case MSG_SET_IN_CALL_ADAPTER:
mPhone = new Phone(new InCallAdapter((IInCallAdapter) msg.obj));
+ mPhone.addListener(mPhoneListener);
onPhoneCreated(mPhone);
break;
case MSG_ADD_CALL:
@@ -144,6 +148,39 @@
}
}
+ private Phone.Listener mPhoneListener = new Phone.Listener() {
+ /** ${inheritDoc} */
+ @Override
+ public void onAudioStateChanged(Phone phone, AudioState audioState) {
+ InCallService.this.onAudioStateChanged(audioState);
+ }
+
+ /** ${inheritDoc} */
+ @Override
+ public void onBringToForeground(Phone phone, boolean showDialpad) {
+ InCallService.this.onBringToForeground(showDialpad);
+ }
+
+ /** ${inheritDoc} */
+ @Override
+ public void onCallAdded(Phone phone, Call call) {
+ InCallService.this.onCallAdded(call);
+ }
+
+ /** ${inheritDoc} */
+ @Override
+ public void onCallRemoved(Phone phone, Call call) {
+ InCallService.this.onCallRemoved(call);
+ }
+
+ /** ${inheritDoc} */
+ @Override
+ public void onCanAddCallChanged(Phone phone, boolean canAddCall) {
+ InCallService.this.onCanAddCallChanged(canAddCall);
+ }
+
+ };
+
private Phone mPhone;
public InCallService() {
@@ -161,8 +198,14 @@
mPhone = null;
oldPhone.destroy();
+ // destroy sets all the calls to disconnected if any live ones still exist. Therefore,
+ // it is important to remove the Listener *after* the call to destroy so that
+ // InCallService.on* callbacks are appropriately called.
+ oldPhone.removeListener(mPhoneListener);
+
onPhoneDestroyed(oldPhone);
}
+
return false;
}
@@ -172,19 +215,79 @@
* @return The {@code Phone} object associated with this {@code InCallService}, or {@code null}
* if the {@code InCallService} is not in a state where it has an associated
* {@code Phone}.
+ * @hide
+ * @deprecated Use direct methods on InCallService instead of {@link Phone}.
*/
- public final Phone getPhone() {
+ @SystemApi
+ @Deprecated
+ public Phone getPhone() {
return mPhone;
}
/**
+ * Obtains the current list of {@code Call}s to be displayed by this in-call experience.
+ *
+ * @return A list of the relevant {@code Call}s.
+ */
+ public final List<Call> getCalls() {
+ return mPhone == null ? Collections.<Call>emptyList() : mPhone.getCalls();
+ }
+
+ /**
+ * Returns if the device can support additional calls.
+ *
+ * @return Whether the phone supports adding more calls.
+ */
+ public final boolean canAddCall() {
+ return mPhone == null ? false : mPhone.canAddCall();
+ }
+
+ /**
+ * Obtains the current phone call audio state.
+ *
+ * @return An object encapsulating the audio state. Returns null if the service is not
+ * fully initialized.
+ */
+ public final AudioState getAudioState() {
+ return mPhone == null ? null : mPhone.getAudioState();
+ }
+
+ /**
+ * Sets the microphone mute state. When this request is honored, there will be change to
+ * the {@link #getAudioState()}.
+ *
+ * @param state {@code true} if the microphone should be muted; {@code false} otherwise.
+ */
+ public final void setMuted(boolean state) {
+ if (mPhone != null) {
+ mPhone.setMuted(state);
+ }
+ }
+
+ /**
+ * Sets the audio route (speaker, bluetooth, etc...). When this request is honored, there will
+ * be change to the {@link #getAudioState()}.
+ *
+ * @param route The audio route to use.
+ */
+ public final void setAudioRoute(int route) {
+ if (mPhone != null) {
+ mPhone.setAudioRoute(route);
+ }
+ }
+
+ /**
* Invoked when the {@code Phone} has been created. This is a signal to the in-call experience
* to start displaying in-call information to the user. Each instance of {@code InCallService}
* will have only one {@code Phone}, and this method will be called exactly once in the lifetime
* of the {@code InCallService}.
*
* @param phone The {@code Phone} object associated with this {@code InCallService}.
+ * @hide
+ * @deprecated Use direct methods on InCallService instead of {@link Phone}.
*/
+ @SystemApi
+ @Deprecated
public void onPhoneCreated(Phone phone) {
}
@@ -195,22 +298,76 @@
* call to {@link #onPhoneCreated(Phone)}.
*
* @param phone The {@code Phone} object associated with this {@code InCallService}.
+ * @hide
+ * @deprecated Use direct methods on InCallService instead of {@link Phone}.
*/
+ @SystemApi
+ @Deprecated
public void onPhoneDestroyed(Phone phone) {
}
/**
+ * Called when the audio state changes.
+ *
+ * @param audioState The new {@link AudioState}.
+ */
+ public void onAudioStateChanged(AudioState audioState) {
+ }
+
+ /**
+ * Called to bring the in-call screen to the foreground. The in-call experience should
+ * respond immediately by coming to the foreground to inform the user of the state of
+ * ongoing {@code Call}s.
+ *
+ * @param showDialpad If true, put up the dialpad when the screen is shown.
+ */
+ public void onBringToForeground(boolean showDialpad) {
+ }
+
+ /**
+ * Called when a {@code Call} has been added to this in-call session. The in-call user
+ * experience should add necessary state listeners to the specified {@code Call} and
+ * immediately start to show the user information about the existence
+ * and nature of this {@code Call}. Subsequent invocations of {@link #getCalls()} will
+ * include this {@code Call}.
+ *
+ * @param call A newly added {@code Call}.
+ */
+ public void onCallAdded(Call call) {
+ }
+
+ /**
+ * Called when a {@code Call} has been removed from this in-call session. The in-call user
+ * experience should remove any state listeners from the specified {@code Call} and
+ * immediately stop displaying any information about this {@code Call}.
+ * Subsequent invocations of {@link #getCalls()} will no longer include this {@code Call}.
+ *
+ * @param call A newly removed {@code Call}.
+ */
+ public void onCallRemoved(Call call) {
+ }
+
+ /**
+ * Called when the ability to add more calls changes. If the phone cannot
+ * support more calls then {@code canAddCall} is set to {@code false}. If it can, then it
+ * is set to {@code true}. This can be used to control the visibility of UI to add more calls.
+ *
+ * @param canAddCall Indicates whether an additional call can be added.
+ */
+ public void onCanAddCallChanged(boolean canAddCall) {
+ }
+
+ /**
* Class to invoke functionality related to video calls.
*/
public static abstract class VideoCall {
/**
- * Sets a listener to invoke callback methods in the InCallUI after performing video
- * telephony actions.
+ * Registers a callback to receive commands and state changes for video calls.
*
- * @param videoCallListener The call video client.
+ * @param callback The video call callback.
*/
- public abstract void setVideoCallListener(VideoCall.Listener videoCallListener);
+ public abstract void registerCallback(VideoCall.Callback callback);
/**
* Sets the camera to be used for video recording in a video call.
@@ -253,7 +410,7 @@
/**
* Issues a request to modify the properties of the current session. The request is sent to
* the remote device where it it handled by
- * {@link VideoCall.Listener#onSessionModifyRequestReceived}.
+ * {@link VideoCall.Callback#onSessionModifyRequestReceived}.
* Some examples of session modification requests: upgrade call from audio to video,
* downgrade call from video to audio, pause video.
*
@@ -265,9 +422,9 @@
* Provides a response to a request to change the current call session video
* properties.
* This is in response to a request the InCall UI has received via
- * {@link VideoCall.Listener#onSessionModifyRequestReceived}.
+ * {@link VideoCall.Callback#onSessionModifyRequestReceived}.
* The response is handled on the remove device by
- * {@link VideoCall.Listener#onSessionModifyResponseReceived}.
+ * {@link VideoCall.Callback#onSessionModifyResponseReceived}.
*
* @param responseProfile The response call video properties.
*/
@@ -276,14 +433,14 @@
/**
* Issues a request to the video provider to retrieve the camera capabilities.
* Camera capabilities are reported back to the caller via
- * {@link VideoCall.Listener#onCameraCapabilitiesChanged(CameraCapabilities)}.
+ * {@link VideoCall.Callback#onCameraCapabilitiesChanged(CameraCapabilities)}.
*/
public abstract void requestCameraCapabilities();
/**
* Issues a request to the video telephony framework to retrieve the cumulative data usage for
* the current call. Data usage is reported back to the caller via
- * {@link VideoCall.Listener#onCallDataUsageChanged}.
+ * {@link VideoCall.Callback#onCallDataUsageChanged}.
*/
public abstract void requestCallDataUsage();
@@ -296,9 +453,9 @@
public abstract void setPauseImage(String uri);
/**
- * Listener class which invokes callbacks after video call actions occur.
+ * Callback class which invokes callbacks after video call actions occur.
*/
- public static abstract class Listener {
+ public static abstract class Callback {
/**
* Called when a session modification request is received from the remote device.
* The remote request is sent via
@@ -373,8 +530,7 @@
*
* @param cameraCapabilities The changed camera capabilities.
*/
- public abstract void onCameraCapabilitiesChanged(
- CameraCapabilities cameraCapabilities);
+ public abstract void onCameraCapabilitiesChanged(CameraCapabilities cameraCapabilities);
}
}
}
diff --git a/telecomm/java/android/telecom/ParcelableCall.java b/telecomm/java/android/telecom/ParcelableCall.java
index adc648f..c5c3d11 100644
--- a/telecomm/java/android/telecom/ParcelableCall.java
+++ b/telecomm/java/android/telecom/ParcelableCall.java
@@ -54,7 +54,6 @@
private final int mVideoState;
private final List<String> mConferenceableCallIds;
private final Bundle mExtras;
- private int mCallSubstate;
public ParcelableCall(
String id,
@@ -76,8 +75,7 @@
StatusHints statusHints,
int videoState,
List<String> conferenceableCallIds,
- Bundle extras,
- int callSubstate) {
+ Bundle extras) {
mId = id;
mState = state;
mDisconnectCause = disconnectCause;
@@ -98,7 +96,6 @@
mVideoState = videoState;
mConferenceableCallIds = Collections.unmodifiableList(conferenceableCallIds);
mExtras = extras;
- mCallSubstate = callSubstate;
}
/** The unique ID of the call. */
@@ -235,14 +232,6 @@
return mExtras;
}
- /**
- * The call substate.
- * @return The substate of the call.
- */
- public int getCallSubstate() {
- return mCallSubstate;
- }
-
/** Responsible for creating ParcelableCall objects for deserialized Parcels. */
public static final Parcelable.Creator<ParcelableCall> CREATOR =
new Parcelable.Creator<ParcelableCall> () {
@@ -273,7 +262,6 @@
List<String> conferenceableCallIds = new ArrayList<>();
source.readList(conferenceableCallIds, classLoader);
Bundle extras = source.readParcelable(classLoader);
- int callSubstate = source.readInt();
return new ParcelableCall(
id,
state,
@@ -294,8 +282,7 @@
statusHints,
videoState,
conferenceableCallIds,
- extras,
- callSubstate);
+ extras);
}
@Override
@@ -334,7 +321,6 @@
destination.writeInt(mVideoState);
destination.writeList(mConferenceableCallIds);
destination.writeParcelable(mExtras, 0);
- destination.writeInt(mCallSubstate);
}
@Override
diff --git a/telecomm/java/android/telecom/ParcelableConnection.java b/telecomm/java/android/telecom/ParcelableConnection.java
index b60b99d..552e250 100644
--- a/telecomm/java/android/telecom/ParcelableConnection.java
+++ b/telecomm/java/android/telecom/ParcelableConnection.java
@@ -46,7 +46,6 @@
private final StatusHints mStatusHints;
private final DisconnectCause mDisconnectCause;
private final List<String> mConferenceableConnectionIds;
- private final int mCallSubstate;
/** @hide */
public ParcelableConnection(
@@ -63,8 +62,7 @@
boolean isVoipAudioMode,
StatusHints statusHints,
DisconnectCause disconnectCause,
- List<String> conferenceableConnectionIds,
- int callSubstate) {
+ List<String> conferenceableConnectionIds) {
mPhoneAccount = phoneAccount;
mState = state;
mConnectionCapabilities = capabilities;
@@ -79,7 +77,6 @@
mStatusHints = statusHints;
mDisconnectCause = disconnectCause;
this.mConferenceableConnectionIds = conferenceableConnectionIds;
- mCallSubstate = callSubstate;
}
public PhoneAccountHandle getPhoneAccount() {
@@ -139,10 +136,6 @@
return mConferenceableConnectionIds;
}
- public int getCallSubstate() {
- return mCallSubstate;
- }
-
@Override
public String toString() {
return new StringBuilder()
@@ -177,7 +170,6 @@
DisconnectCause disconnectCause = source.readParcelable(classLoader);
List<String> conferenceableConnectionIds = new ArrayList<>();
source.readStringList(conferenceableConnectionIds);
- int callSubstate = source.readInt();
return new ParcelableConnection(
phoneAccount,
@@ -193,8 +185,7 @@
audioModeIsVoip,
statusHints,
disconnectCause,
- conferenceableConnectionIds,
- callSubstate);
+ conferenceableConnectionIds);
}
@Override
@@ -227,6 +218,5 @@
destination.writeParcelable(mStatusHints, 0);
destination.writeParcelable(mDisconnectCause, 0);
destination.writeStringList(mConferenceableConnectionIds);
- destination.writeInt(mCallSubstate);
}
}
diff --git a/telecomm/java/android/telecom/Phone.java b/telecomm/java/android/telecom/Phone.java
index d9a9cdf..c1c1129 100644
--- a/telecomm/java/android/telecom/Phone.java
+++ b/telecomm/java/android/telecom/Phone.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.util.ArrayMap;
import java.util.Collections;
@@ -26,7 +27,12 @@
/**
* A unified virtual device providing a means of voice (and other) communication on a device.
+ *
+ * @hide
+ * @deprecated Use {@link InCallService} directly instead of using this class.
*/
+@SystemApi
+@Deprecated
public final class Phone {
public abstract static class Listener {
@@ -100,12 +106,10 @@
private boolean mCanAddCall = true;
- /** {@hide} */
Phone(InCallAdapter adapter) {
mInCallAdapter = adapter;
}
- /** {@hide} */
final void internalAddCall(ParcelableCall parcelableCall) {
Call call = new Call(this, parcelableCall.getId(), mInCallAdapter);
mCallByTelecomCallId.put(parcelableCall.getId(), call);
@@ -115,14 +119,12 @@
fireCallAdded(call);
}
- /** {@hide} */
final void internalRemoveCall(Call call) {
mCallByTelecomCallId.remove(call.internalGetCallId());
mCalls.remove(call);
fireCallRemoved(call);
}
- /** {@hide} */
final void internalUpdateCall(ParcelableCall parcelableCall) {
Call call = mCallByTelecomCallId.get(parcelableCall.getId());
if (call != null) {
@@ -131,7 +133,6 @@
}
}
- /** {@hide} */
final void internalSetPostDialWait(String telecomId, String remaining) {
Call call = mCallByTelecomCallId.get(telecomId);
if (call != null) {
@@ -139,7 +140,6 @@
}
}
- /** {@hide} */
final void internalAudioStateChanged(AudioState audioState) {
if (!Objects.equals(mAudioState, audioState)) {
mAudioState = audioState;
@@ -147,17 +147,14 @@
}
}
- /** {@hide} */
final Call internalGetCallByTelecomId(String telecomId) {
return mCallByTelecomCallId.get(telecomId);
}
- /** {@hide} */
final void internalBringToForeground(boolean showDialpad) {
fireBringToForeground(showDialpad);
}
- /** {@hide} */
final void internalSetCanAddCall(boolean canAddCall) {
if (mCanAddCall != canAddCall) {
mCanAddCall = canAddCall;
@@ -167,7 +164,6 @@
/**
* Called to destroy the phone and cleanup any lingering calls.
- * @hide
*/
final void destroy() {
for (Call call : mCalls) {
diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java
index 009ec5b..4c423f2 100644
--- a/telecomm/java/android/telecom/RemoteConnection.java
+++ b/telecomm/java/android/telecom/RemoteConnection.java
@@ -153,16 +153,6 @@
public void onVideoStateChanged(RemoteConnection connection, int videoState) {}
/**
- * Indicates that the call substate of this {@code RemoteConnection} has changed.
- * See {@link #getCallSubstate()}.
- *
- * @param connection The {@code RemoteConnection} invoking this method.
- * @param callSubstate The new call substate of the {@code RemoteConnection}.
- * @hide
- */
- public void onCallSubstateChanged(RemoteConnection connection, int callSubstate) {}
-
- /**
* Indicates that this {@code RemoteConnection} has been destroyed. No further requests
* should be made to the {@code RemoteConnection}, and references to it should be cleared.
*
@@ -414,7 +404,6 @@
private boolean mConnected;
private int mConnectionCapabilities;
private int mVideoState;
- private int mCallSubstate;
private VideoProvider mVideoProvider;
private boolean mIsVoipAudioMode;
private StatusHints mStatusHints;
@@ -595,15 +584,6 @@
}
/**
- *
- * @return The call substate of the {@code RemoteConnection}. See
- * @hide
- */
- public int getCallSubstate() {
- return mCallSubstate;
- }
-
- /**
* Obtains the video provider of this {@code RemoteConnection}.
* @return The video provider associated with this {@code RemoteConnection}.
* @hide
@@ -916,16 +896,6 @@
/**
* @hide
*/
- void setCallSubstate(int callSubstate) {
- mCallSubstate = callSubstate;
- for (Callback c : mCallbacks) {
- c.onCallSubstateChanged(this, callSubstate);
- }
- }
-
- /**
- * @hide
- */
void setVideoProvider(VideoProvider videoProvider) {
mVideoProvider = videoProvider;
for (Callback c : mCallbacks) {
diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java
index 7374a3b..a9b725b 100644
--- a/telecomm/java/android/telecom/RemoteConnectionService.java
+++ b/telecomm/java/android/telecom/RemoteConnectionService.java
@@ -84,7 +84,6 @@
}
connection.setConferenceableConnections(conferenceable);
connection.setVideoState(parcel.getVideoState());
- connection.setCallSubstate(parcel.getCallSubstate());
if (connection.getState() == Connection.STATE_DISCONNECTED) {
// ... then, if it was created in a disconnected state, that indicates
// failure on the providing end, so immediately mark it destroyed
@@ -312,12 +311,6 @@
mOurConnectionServiceImpl.addRemoteExistingConnection(remoteConnction);
}
-
- @Override
- public void setCallSubstate(String callId, int callSubstate) {
- findConnectionForAction(callId, "callSubstate")
- .setCallSubstate(callSubstate);
- }
};
private final ConnectionServiceAdapterServant mServant =
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 28534ea..a72172c 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -359,7 +359,8 @@
public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme) {
try {
if (isServiceConnected()) {
- return getTelecomService().getDefaultOutgoingPhoneAccount(uriScheme);
+ return getTelecomService().getDefaultOutgoingPhoneAccount(uriScheme,
+ mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getDefaultOutgoingPhoneAccount", e);
@@ -376,6 +377,7 @@
* exists no user-chosen default {@code PhoneAccount}.
*
* @return The user outgoing phone account selected by the user.
+ * @hide
*/
public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() {
try {
@@ -442,7 +444,7 @@
public List<PhoneAccountHandle> getSimCallManagers() {
try {
if (isServiceConnected()) {
- return getTelecomService().getSimCallManagers();
+ return getTelecomService().getSimCallManagers(mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getSimCallManagers");
@@ -490,7 +492,8 @@
public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme) {
try {
if (isServiceConnected()) {
- return getTelecomService().getPhoneAccountsSupportingScheme(uriScheme);
+ return getTelecomService().getPhoneAccountsSupportingScheme(uriScheme,
+ mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsSupportingScheme", e);
@@ -510,7 +513,7 @@
public List<PhoneAccountHandle> getCallCapablePhoneAccounts() {
try {
if (isServiceConnected()) {
- return getTelecomService().getCallCapablePhoneAccounts();
+ return getTelecomService().getCallCapablePhoneAccounts(mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts", e);
@@ -710,7 +713,8 @@
public boolean isVoiceMailNumber(PhoneAccountHandle accountHandle, String number) {
try {
if (isServiceConnected()) {
- return getTelecomService().isVoiceMailNumber(accountHandle, number);
+ return getTelecomService().isVoiceMailNumber(accountHandle, number,
+ mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException calling ITelecomService#isVoiceMailNumber.", e);
@@ -719,20 +723,22 @@
}
/**
- * Return whether a given phone account has a voicemail number configured.
+ * Return the voicemail number for a given phone account.
*
- * @param accountHandle The handle for the account to check for a voicemail number.
- * @return {@code true} If the given phone account has a voicemail number.
+ * @param accountHandle The handle for the phone account.
+ * @return The voicemail number for the phone account, and {@code null} if one has not been
+ * configured.
*/
- public boolean hasVoiceMailNumber(PhoneAccountHandle accountHandle) {
+ public String getVoiceMailNumber(PhoneAccountHandle accountHandle) {
try {
if (isServiceConnected()) {
- return getTelecomService().hasVoiceMailNumber(accountHandle);
+ return getTelecomService().getVoiceMailNumber(accountHandle,
+ mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException calling ITelecomService#hasVoiceMailNumber.", e);
}
- return false;
+ return null;
}
/**
@@ -744,7 +750,8 @@
public String getLine1Number(PhoneAccountHandle accountHandle) {
try {
if (isServiceConnected()) {
- return getTelecomService().getLine1Number(accountHandle);
+ return getTelecomService().getLine1Number(accountHandle,
+ mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException calling ITelecomService#getLine1Number.", e);
@@ -762,7 +769,7 @@
public boolean isInCall() {
try {
if (isServiceConnected()) {
- return getTelecomService().isInCall();
+ return getTelecomService().isInCall(mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException calling isInCall().", e);
@@ -804,7 +811,7 @@
public boolean isRinging() {
try {
if (isServiceConnected()) {
- return getTelecomService().isRinging();
+ return getTelecomService().isRinging(mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException attempting to get ringing state of phone app.", e);
@@ -870,7 +877,7 @@
public boolean isTtySupported() {
try {
if (isServiceConnected()) {
- return getTelecomService().isTtySupported();
+ return getTelecomService().isTtySupported(mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException attempting to get TTY supported state.", e);
@@ -891,7 +898,7 @@
public int getCurrentTtyMode() {
try {
if (isServiceConnected()) {
- return getTelecomService().getCurrentTtyMode();
+ return getTelecomService().getCurrentTtyMode(mContext.getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException attempting to get the current TTY mode.", e);
@@ -1043,7 +1050,7 @@
ITelecomService service = getTelecomService();
if (service != null) {
try {
- service.showInCallScreen(showDialpad);
+ service.showInCallScreen(showDialpad, mContext.getOpPackageName());
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#showCallScreen", e);
}
diff --git a/telecomm/java/android/telecom/VideoCallImpl.java b/telecomm/java/android/telecom/VideoCallImpl.java
index 0445448..7bef688 100644
--- a/telecomm/java/android/telecom/VideoCallImpl.java
+++ b/telecomm/java/android/telecom/VideoCallImpl.java
@@ -46,7 +46,7 @@
private final IVideoProvider mVideoProvider;
private final VideoCallListenerBinder mBinder;
- private VideoCall.Listener mVideoCallListener;
+ private VideoCall.Callback mCallback;
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
@Override
@@ -109,14 +109,14 @@
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
- if (mVideoCallListener == null) {
+ if (mCallback == null) {
return;
}
SomeArgs args;
switch (msg.what) {
case MSG_RECEIVE_SESSION_MODIFY_REQUEST:
- mVideoCallListener.onSessionModifyRequestReceived((VideoProfile) msg.obj);
+ mCallback.onSessionModifyRequestReceived((VideoProfile) msg.obj);
break;
case MSG_RECEIVE_SESSION_MODIFY_RESPONSE:
args = (SomeArgs) msg.obj;
@@ -125,34 +125,34 @@
VideoProfile requestProfile = (VideoProfile) args.arg2;
VideoProfile responseProfile = (VideoProfile) args.arg3;
- mVideoCallListener.onSessionModifyResponseReceived(
+ mCallback.onSessionModifyResponseReceived(
status, requestProfile, responseProfile);
} finally {
args.recycle();
}
break;
case MSG_HANDLE_CALL_SESSION_EVENT:
- mVideoCallListener.onCallSessionEvent((int) msg.obj);
+ mCallback.onCallSessionEvent((int) msg.obj);
break;
case MSG_CHANGE_PEER_DIMENSIONS:
args = (SomeArgs) msg.obj;
try {
int width = (int) args.arg1;
int height = (int) args.arg2;
- mVideoCallListener.onPeerDimensionsChanged(width, height);
+ mCallback.onPeerDimensionsChanged(width, height);
} finally {
args.recycle();
}
break;
case MSG_CHANGE_CALL_DATA_USAGE:
- mVideoCallListener.onCallDataUsageChanged((long) msg.obj);
+ mCallback.onCallDataUsageChanged((long) msg.obj);
break;
case MSG_CHANGE_CAMERA_CAPABILITIES:
- mVideoCallListener.onCameraCapabilitiesChanged(
+ mCallback.onCameraCapabilitiesChanged(
(CameraCapabilities) msg.obj);
break;
case MSG_CHANGE_VIDEO_QUALITY:
- mVideoCallListener.onVideoQualityChanged(msg.arg1);
+ mCallback.onVideoQualityChanged(msg.arg1);
break;
default:
break;
@@ -170,8 +170,8 @@
}
/** {@inheritDoc} */
- public void setVideoCallListener(VideoCall.Listener videoCallListener) {
- mVideoCallListener = videoCallListener;
+ public void registerCallback(VideoCall.Callback callback) {
+ mCallback = callback;
}
/** {@inheritDoc} */
diff --git a/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl b/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl
index e6c28f3..7e7e9cc 100644
--- a/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl
+++ b/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl
@@ -81,6 +81,4 @@
void setConferenceableConnections(String callId, in List<String> conferenceableCallIds);
void addExistingConnection(String callId, in ParcelableConnection connection);
-
- void setCallSubstate(String callId, int callSubstate);
}
diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
index d2030f2..727fd4bb 100644
--- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
@@ -33,12 +33,12 @@
*
* @param showDialpad if true, make the dialpad visible initially.
*/
- void showInCallScreen(boolean showDialpad);
+ void showInCallScreen(boolean showDialpad, String callingPackage);
/**
* @see TelecomServiceImpl#getDefaultOutgoingPhoneAccount
*/
- PhoneAccountHandle getDefaultOutgoingPhoneAccount(in String uriScheme);
+ PhoneAccountHandle getDefaultOutgoingPhoneAccount(in String uriScheme, String callingPackage);
/**
* @see TelecomServiceImpl#getUserSelectedOutgoingPhoneAccount
@@ -53,12 +53,13 @@
/**
* @see TelecomServiceImpl#getCallCapablePhoneAccounts
*/
- List<PhoneAccountHandle> getCallCapablePhoneAccounts();
+ List<PhoneAccountHandle> getCallCapablePhoneAccounts(String callingPackage);
/**
* @see TelecomManager#getPhoneAccountsSupportingScheme
*/
- List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(in String uriScheme);
+ List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(in String uriScheme,
+ String callingPackage);
/**
* @see TelecomManager#getPhoneAccountsForPackage
@@ -98,7 +99,7 @@
/**
* @see TelecomServiceImpl#getSimCallManagers
*/
- List<PhoneAccountHandle> getSimCallManagers();
+ List<PhoneAccountHandle> getSimCallManagers(String callingPackage);
/**
* @see TelecomServiceImpl#registerPhoneAccount
@@ -118,17 +119,18 @@
/**
* @see TelecomServiceImpl#isVoiceMailNumber
*/
- boolean isVoiceMailNumber(in PhoneAccountHandle accountHandle, String number);
+ boolean isVoiceMailNumber(in PhoneAccountHandle accountHandle, String number,
+ String callingPackage);
/**
- * @see TelecomServiceImpl#hasVoiceMailNumber
+ * @see TelecomServiceImpl#getVoiceMailNumber
*/
- boolean hasVoiceMailNumber(in PhoneAccountHandle accountHandle);
+ String getVoiceMailNumber(in PhoneAccountHandle accountHandle, String callingPackage);
/**
* @see TelecomServiceImpl#getLine1Number
*/
- String getLine1Number(in PhoneAccountHandle accountHandle);
+ String getLine1Number(in PhoneAccountHandle accountHandle, String callingPackage);
/**
* @see TelecomServiceImpl#getDefaultPhoneApp
@@ -147,12 +149,12 @@
/**
* @see TelecomServiceImpl#isInCall
*/
- boolean isInCall();
+ boolean isInCall(String callingPackage);
/**
* @see TelecomServiceImpl#isRinging
*/
- boolean isRinging();
+ boolean isRinging(String callingPackage);
/**
* @see TelecomServiceImpl#getCallState
@@ -192,12 +194,12 @@
/**
* @see TelecomServiceImpl#isTtySupported
*/
- boolean isTtySupported();
+ boolean isTtySupported(String callingPackage);
/**
* @see TelecomServiceImpl#getCurrentTtyMode
*/
- int getCurrentTtyMode();
+ int getCurrentTtyMode(String callingPackage);
/**
* @see TelecomServiceImpl#addNewIncomingCall
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
new file mode 100644
index 0000000..d103fbf
--- /dev/null
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -0,0 +1,219 @@
+/*
+ * 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 android.telephony;
+
+import com.android.internal.telephony.ICarrierConfigLoader;
+
+import android.annotation.SystemApi;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+
+/**
+ * Provides access to telephony configuration values that are carrier-specific.
+ * <p>
+ * Users should obtain an instance of this class by calling
+ * {@code mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);}
+ * </p>
+ *
+ * @see Context#getSystemService
+ * @see Context#CARRIER_CONFIG_SERVICE
+ */
+public class CarrierConfigManager {
+ /**
+ * @hide
+ */
+ public CarrierConfigManager() {
+ }
+
+ /**
+ * This intent is broadcast by the system when carrier config changes.
+ */
+ public static final String
+ ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
+
+ /**
+ * Flag specifying whether VoLTE should be available for carrier, independent of carrier
+ * provisioning. If false: hard disabled. If true: then depends on carrier provisioning,
+ * availability, etc.
+ */
+ public static final String BOOL_CARRIER_VOLTE_AVAILABLE = "bool_carrier_volte_available";
+
+ /**
+ * Flag specifying whether VoLTE availability is based on provisioning.
+ */
+ public static final String BOOL_CARRIER_VOLTE_PROVISIONED = "bool_carrier_volte_provisioned";
+
+ /**
+ * Flag specifying whether VoLTE TTY is supported.
+ */
+ public static final String BOOL_CARRIER_VOLTE_TTY_SUPPORTED
+ = "bool_carrier_volte_tty_supported";
+
+ /**
+ * Show APN Settings for some CDMA carriers.
+ */
+ public static final String BOOL_SHOW_APN_SETTING_CDMA = "bool_show_apn_setting_cdma";
+
+ /**
+ * If Voice Radio Technology is RIL_RADIO_TECHNOLOGY_LTE:14 or RIL_RADIO_TECHNOLOGY_UNKNOWN:0
+ * this is the value that should be used instead. A configuration value of
+ * RIL_RADIO_TECHNOLOGY_UNKNOWN:0 means there is no replacement value and that the default
+ * assumption for phone type (GSM) should be used.
+ */
+ public static final String INT_VOLTE_REPLACEMENT_RAT = "int_volte_replacement_rat";
+
+ /* The following 3 fields are related to carrier visual voicemail. */
+
+ /**
+ * The carrier number MO sms messages are sent to.
+ *
+ * @hide
+ */
+ public static final String STRING_VVM_DESTINATION_NUMBER = "string_vvm_destination_number";
+
+ /**
+ * The port through which the MO sms messages are sent through.
+ *
+ * @hide
+ */
+ public static final String INT_VVM_PORT_NUMBER = "int_vvm_port_number";
+
+ /**
+ * The type of visual voicemail protocol the carrier adheres to (see below).
+ *
+ * @hide
+ */
+ public static final String STRING_VVM_TYPE = "string_vvm_type";
+
+ /* Visual voicemail protocols */
+
+ /**
+ * The OMTP protocol.
+ *
+ * @hide
+ */
+ public static final String VVM_TYPE_OMTP = "vvm_type_omtp";
+
+ private final static String TAG = "CarrierConfigManager";
+
+ /** The default value for every variable. */
+ private final static Bundle sDefaults;
+
+ static {
+ sDefaults = new Bundle();
+ sDefaults.putBoolean(BOOL_CARRIER_VOLTE_AVAILABLE, false);
+ sDefaults.putBoolean(BOOL_CARRIER_VOLTE_PROVISIONED, false);
+ sDefaults.putBoolean(BOOL_CARRIER_VOLTE_TTY_SUPPORTED, true);
+ sDefaults.putBoolean(BOOL_SHOW_APN_SETTING_CDMA, false);
+
+ sDefaults.putInt(INT_VOLTE_REPLACEMENT_RAT, 0);
+
+ sDefaults.putString(STRING_VVM_DESTINATION_NUMBER, "");
+ sDefaults.putString(STRING_VVM_TYPE, "");
+ sDefaults.putInt(INT_VVM_PORT_NUMBER, 0);
+ }
+
+ /**
+ * Gets the configuration values for a particular subscription, which is associated with a
+ * specific SIM card. If an invalid subId is used, the returned config will contain default
+ * values.
+ *
+ * @param subId the subscription ID, normally obtained from {@link SubscriptionManager}.
+ * @return A {@link Bundle} containing the config for the given subId, or default values for an
+ * invalid subId.
+ */
+ public Bundle getConfigForSubId(int subId) {
+ try {
+ return getICarrierConfigLoader().getConfigForSubId(subId);
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "Error getting config for subId " + Integer.toString(subId) + ": "
+ + ex.toString());
+ } catch (NullPointerException ex) {
+ Rlog.e(TAG, "Error getting config for subId " + Integer.toString(subId) + ": "
+ + ex.toString());
+ }
+ return null;
+ }
+
+ /**
+ * Gets the configuration values for the default subscription.
+ *
+ * @see #getConfigForSubId
+ */
+ public Bundle getConfig() {
+ return getConfigForSubId(SubscriptionManager.getDefaultSubId());
+ }
+
+ /**
+ * Calling this method triggers telephony services to fetch the current carrier configuration.
+ * <p>
+ * Normally this does not need to be called because the platform reloads config on its own. Call
+ * this method if your app wants to update config at an arbitrary moment.
+ * </p>
+ * <p>
+ * This method returns before the reload has completed, and
+ * {@link android.service.carrier.CarrierConfigService#onLoadConfig} will be called from an
+ * arbitrary thread.
+ * </p>
+ */
+ public void reloadCarrierConfigForSubId(int subId) {
+ try {
+ getICarrierConfigLoader().reloadCarrierConfigForSubId(subId);
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "Error reloading config for subId=" + subId + ": " + ex.toString());
+ } catch (NullPointerException ex) {
+ Rlog.e(TAG, "Error reloading config for subId=" + subId + ": " + ex.toString());
+ }
+ }
+
+ /**
+ * Request the carrier config loader to update the cofig for phoneId.
+ *
+ * Depending on simState, the config may be cleared or loaded from config app.
+ * This is only used by SubscriptionInfoUpdater.
+ *
+ * @hide
+ */
+ @SystemApi
+ public void updateConfigForPhoneId(int phoneId, String simState) {
+ try {
+ getICarrierConfigLoader().updateConfigForPhoneId(phoneId, simState);
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "Error updating config for phoneId=" + phoneId + ": " + ex.toString());
+ } catch (NullPointerException ex) {
+ Rlog.e(TAG, "Error updating config for phoneId=" + phoneId + ": " + ex.toString());
+ }
+ }
+
+ /**
+ * Returns a bundle with the default value for every supported configuration variable.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static Bundle getDefaultConfig() {
+ return sDefaults;
+ }
+
+ /** @hide */
+ private ICarrierConfigLoader getICarrierConfigLoader() {
+ return ICarrierConfigLoader.Stub
+ .asInterface(ServiceManager.getService(Context.CARRIER_CONFIG_SERVICE));
+ }
+}
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index 611dd7bd..d192288 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -219,6 +219,15 @@
*/
public static final int LISTEN_OEM_HOOK_RAW_EVENT = 0x00008000;
+ /**
+ * Listen for carrier network changes indicated by a carrier app.
+ *
+ * @see #onCarrierNetworkRequest
+ * @see TelephonyManager#notifyCarrierNetworkChange(boolean)
+ * @hide
+ */
+ public static final int LISTEN_CARRIER_NETWORK_CHANGE = 0x00010000;
+
/*
* Subscription used to listen to the phone state changes
* @hide
@@ -321,6 +330,9 @@
case LISTEN_OEM_HOOK_RAW_EVENT:
PhoneStateListener.this.onOemHookRawEvent((byte[])msg.obj);
break;
+ case LISTEN_CARRIER_NETWORK_CHANGE:
+ PhoneStateListener.this.onCarrierNetworkChange((boolean)msg.obj);
+ break;
}
}
@@ -500,6 +512,22 @@
}
/**
+ * Callback invoked when telephony has received notice from a carrier
+ * app that a network action that could result in connectivity loss
+ * has been requested by an app using
+ * {@link android.telephony.TelephonyManager#notifyCarrierNetworkChange(boolean)}
+ *
+ * @param active Whether the carrier network change is or shortly
+ * will be active. This value is true to indicate
+ * showing alternative UI and false to stop.
+ *
+ * @hide
+ */
+ public void onCarrierNetworkChange(boolean active) {
+ // default implementation empty
+ }
+
+ /**
* The callback methods need to be called on the handler thread where
* this object was created. If the binder did that for us it'd be nice.
*/
@@ -575,6 +603,10 @@
public void onOemHookRawEvent(byte[] rawData) {
Message.obtain(mHandler, LISTEN_OEM_HOOK_RAW_EVENT, 0, 0, rawData).sendToTarget();
}
+
+ public void onCarrierNetworkChange(boolean active) {
+ Message.obtain(mHandler, LISTEN_CARRIER_NETWORK_CHANGE, 0, 0, active).sendToTarget();
+ }
};
private void log(String s) {
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 08aec08..3ecf5ac 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -272,10 +272,6 @@
* for #onSubscriptionsChanged to be invoked.
*/
public static class OnSubscriptionsChangedListener {
- /** @hide */
- public static final String PERMISSION_ON_SUBSCRIPTIONS_CHANGED =
- android.Manifest.permission.READ_PHONE_STATE;
-
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 4486c95..ee7f0ea 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -664,7 +664,7 @@
ITelephony telephony = getITelephony();
if (telephony == null)
return null;
- return telephony.getDeviceId();
+ return telephony.getDeviceId(mContext.getOpPackageName());
} catch (RemoteException ex) {
return null;
} catch (NullPointerException ex) {
@@ -782,7 +782,7 @@
ITelephony telephony = getITelephony();
if (telephony == null)
return null;
- Bundle bundle = telephony.getCellLocation();
+ Bundle bundle = telephony.getCellLocation(mContext.getOpPackageName());
if (bundle.isEmpty()) return null;
CellLocation cl = CellLocation.newFromBundle(bundle);
if (cl.isEmpty())
@@ -1975,7 +1975,7 @@
try {
ITelephony telephony = getITelephony();
if (telephony != null)
- number = telephony.getLine1NumberForDisplay(subId);
+ number = telephony.getLine1NumberForDisplay(subId, mContext.getOpPackageName());
} catch (RemoteException ex) {
} catch (NullPointerException ex) {
}
@@ -2039,6 +2039,35 @@
}
/**
+ * Informs the system of an intentional upcoming carrier network change by
+ * a carrier app. This call is optional and is only used to allow the
+ * system to provide alternative UI while telephony is performing an action
+ * that may result in intentional, temporary network lack of connectivity.
+ * <p>
+ * Based on the active parameter passed in, this method will either show or
+ * hide the alternative UI. There is no timeout associated with showing
+ * this UX, so a carrier app must be sure to call with active set to false
+ * sometime after calling with it set to true.
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+ * Or the calling app has carrier privileges.
+ * @see #hasCarrierPrivileges
+ *
+ * @param active Whether the carrier network change is or shortly will be
+ * active. Set this value to true to begin showing
+ * alternative UI and false to stop.
+ */
+ public void notifyCarrierNetworkChange(boolean active) {
+ try {
+ if (sRegistry != null)
+ sRegistry.notifyCarrierNetworkChange(active);
+ } catch (RemoteException ex) {
+ } catch (NullPointerException ex) {
+ }
+ }
+
+ /**
* Returns the alphabetic identifier associated with the line 1 number.
* Return null if it is unavailable.
* <p>
@@ -2067,7 +2096,8 @@
try {
ITelephony telephony = getITelephony();
if (telephony != null)
- alphaTag = telephony.getLine1AlphaTagForDisplay(subId);
+ alphaTag = telephony.getLine1AlphaTagForDisplay(subId,
+ mContext.getOpPackageName());
} catch (RemoteException ex) {
} catch (NullPointerException ex) {
}
@@ -2541,10 +2571,11 @@
* LISTEN_ flags.
*/
public void listen(PhoneStateListener listener, int events) {
- String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";
+ if (mContext == null) return;
try {
Boolean notifyNow = (getITelephony() != null);
- sRegistry.listenForSubscriber(listener.mSubId, pkgForDebug, listener.callback, events, notifyNow);
+ sRegistry.listenForSubscriber(listener.mSubId, mContext.getOpPackageName(),
+ listener.callback, events, notifyNow);
} catch (RemoteException ex) {
// system process dead
} catch (NullPointerException ex) {
@@ -2699,7 +2730,7 @@
ITelephony telephony = getITelephony();
if (telephony == null)
return null;
- return telephony.getAllCellInfo();
+ return telephony.getAllCellInfo(mContext.getOpPackageName());
} catch (RemoteException ex) {
return null;
} catch (NullPointerException ex) {
@@ -3313,7 +3344,7 @@
ITelephony telephony = getITelephony();
if (telephony == null)
return new String[0];
- return telephony.getPcscfAddress(apnType);
+ return telephony.getPcscfAddress(apnType, mContext.getOpPackageName());
} catch (RemoteException e) {
return new String[0];
}
@@ -3601,14 +3632,20 @@
/** @hide */
@SystemApi
public List<String> getCarrierPackageNamesForIntent(Intent intent) {
+ return getCarrierPackageNamesForIntentAndPhone(intent, getDefaultPhone());
+ }
+
+ /** @hide */
+ @SystemApi
+ public List<String> getCarrierPackageNamesForIntentAndPhone(Intent intent, int phoneId) {
try {
ITelephony telephony = getITelephony();
if (telephony != null)
- return telephony.getCarrierPackageNamesForIntent(intent);
+ return telephony.getCarrierPackageNamesForIntentAndPhone(intent, phoneId);
} catch (RemoteException ex) {
- Rlog.e(TAG, "getCarrierPackageNamesForIntent RemoteException", ex);
+ Rlog.e(TAG, "getCarrierPackageNamesForIntentAndPhone RemoteException", ex);
} catch (NullPointerException ex) {
- Rlog.e(TAG, "getCarrierPackageNamesForIntent NPE", ex);
+ Rlog.e(TAG, "getCarrierPackageNamesForIntentAndPhone NPE", ex);
}
return null;
}
@@ -3730,7 +3767,7 @@
try {
ITelephony telephony = getITelephony();
if (telephony != null)
- return telephony.isSimPinEnabled();
+ return telephony.isSimPinEnabled(mContext.getOpPackageName());
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#isSimPinEnabled", e);
}
@@ -3997,7 +4034,7 @@
try {
ITelephony telephony = getITelephony();
if (telephony != null)
- return telephony.isVideoCallingEnabled();
+ return telephony.isVideoCallingEnabled(mContext.getOpPackageName());
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#isVideoCallingEnabled", e);
}
@@ -4519,15 +4556,12 @@
* @hide
*/
public void factoryReset(int subId) {
- if (SubscriptionManager.isUsableSubIdValue(subId)) {
- // Enable data
- setDataEnabled(subId, true);
- // Set network selection mode to automatic
- setNetworkSelectionModeAutomatic(subId);
- // Set preferred mobile network type to the best available
- setPreferredNetworkType(subId, RILConstants.PREFERRED_NETWORK_MODE);
- // Turn off roaming
- SubscriptionManager.from(mContext).setDataRoaming(0, subId);
+ try {
+ Log.d(TAG, "factoryReset: subId=" + subId);
+ ITelephony telephony = getITelephony();
+ if (telephony != null)
+ telephony.factoryReset(subId);
+ } catch (RemoteException e) {
}
}
}
diff --git a/telephony/java/com/android/ims/internal/IImsCallSession.aidl b/telephony/java/com/android/ims/internal/IImsCallSession.aidl
index 9b435dc..b1f2d32 100644
--- a/telephony/java/com/android/ims/internal/IImsCallSession.aidl
+++ b/telephony/java/com/android/ims/internal/IImsCallSession.aidl
@@ -255,11 +255,4 @@
* @return {@code True} if the session is multiparty.
*/
boolean isMultiparty();
-
- /**
- * Gets the call substate for this session.
- *
- * @return the call substate for this session.
- */
- int getCallSubstate();
}
diff --git a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
new file mode 100644
index 0000000..b5cdd9a2
--- /dev/null
+++ b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
@@ -0,0 +1,31 @@
+/*
+ * 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.internal.telephony;
+
+import android.os.Bundle;
+
+/**
+ * Interface used to interact with the CarrierConfigLoader
+ */
+interface ICarrierConfigLoader {
+
+ Bundle getConfigForSubId(int subId);
+
+ void reloadCarrierConfigForSubId(int subId);
+
+ void updateConfigForPhoneId(int phoneId, String simState);
+}
diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
index cea62ba..cbedb95 100644
--- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
@@ -44,5 +44,6 @@
void onDataConnectionRealTimeInfoChanged(in DataConnectionRealTimeInfo dcRtInfo);
void onVoLteServiceStateChanged(in VoLteServiceState lteState);
void onOemHookRawEvent(in byte[] rawData);
+ void onCarrierNetworkChange(in boolean active);
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index a24859b..25fe97c 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -45,6 +45,7 @@
/**
* Place a call to the specified number.
+ * @param callingPackage The package making the call.
* @param number the number to be called.
*/
void call(String callingPackage, String number);
@@ -169,8 +170,9 @@
/**
* Check if the SIM pin lock is enabled.
* @return true if the SIM pin lock is enabled.
+ * @param callingPackage The package making the call.
*/
- boolean isSimPinEnabled();
+ boolean isSimPinEnabled(String callingPackage);
/**
* Supply a pin to unlock the SIM. Blocks until a result is determined.
@@ -341,7 +343,7 @@
*/
boolean isDataConnectivityPossible();
- Bundle getCellLocation();
+ Bundle getCellLocation(String callingPkg);
/**
* Returns the neighboring cell information of the device.
@@ -505,7 +507,7 @@
/**
* Returns the all observed cell information of the device.
*/
- List<CellInfo> getAllCellInfo();
+ List<CellInfo> getAllCellInfo(String callingPkg);
/**
* Sets minimum time in milli-seconds between onCellInfoChanged
@@ -644,10 +646,11 @@
/*
* Get the calculated preferred network type.
* Used for device configuration by some CDMA operators.
+ * @param callingPackage The package making the call.
*
* @return the calculated preferred network type, defined in RILConstants.java.
*/
- int getCalculatedPreferredNetworkType();
+ int getCalculatedPreferredNetworkType(String callingPackage);
/*
* Get the preferred network type.
@@ -701,8 +704,9 @@
/**
* Get P-CSCF address from PCO after data connection is established or modified.
* @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN
+ * @param callingPackage The package making the call.
*/
- String[] getPcscfAddress(String apnType);
+ String[] getPcscfAddress(String apnType, String callingPackage);
/**
* Set IMS registration state
@@ -740,15 +744,16 @@
int checkCarrierPrivilegesForPackage(String pkgname);
/**
- * Returns the package name of the carrier apps that should handle the input intent.
+ * Returns list of the package names of the carrier apps that should handle the input intent
+ * and have carrier privileges for the given phoneId.
*
- * @param packageManager PackageManager for getting receivers.
* @param intent Intent that will be sent.
- * @return list of carrier app package names that can handle the intent.
+ * @param phoneId The phoneId on which the carrier app has carrier privileges.
+ * @return list of carrier app package names that can handle the intent on phoneId.
* Returns null if there is an error and an empty list if there
* are no matching packages.
*/
- List<String> getCarrierPackageNamesForIntent(in Intent intent);
+ List<String> getCarrierPackageNamesForIntentAndPhone(in Intent intent, int phoneId);
/**
* Set the line 1 phone number string and its alphatag for the current ICCID
@@ -768,19 +773,21 @@
* {@link #setLine1NumberForDisplay}. Otherwise returns null.
*
* @param subId whose dialing number for line 1 is returned.
+ * @param callingPackage The package making the call.
* @return the displayed dialing number if set, or null if not set.
*/
- String getLine1NumberForDisplay(int subId);
+ String getLine1NumberForDisplay(int subId, String callingPackage);
/**
* Returns the displayed alphatag of the dialing number if it was set
* previously via {@link #setLine1NumberForDisplay}. Otherwise returns null.
*
* @param subId whose alphatag associated with line 1 is returned.
+ * @param callingPackage The package making the call.
* @return the displayed alphatag of the dialing number if set, or null if
* not set.
*/
- String getLine1AlphaTagForDisplay(int subId);
+ String getLine1AlphaTagForDisplay(int subId, String callingPackage);
String[] getMergedSubscriberIds();
@@ -872,9 +879,10 @@
/**
* Whether video calling has been enabled by the user.
*
+ * @param callingPackage The package making the call.
* @return {@code true} if the user has enabled video calling, {@code false} otherwise.
*/
- boolean isVideoCallingEnabled();
+ boolean isVideoCallingEnabled(String callingPackage);
/**
* Whether the DTMF tone length can be changed.
@@ -925,13 +933,16 @@
* Returns the unique device ID of phone, for example, the IMEI for
* GSM and the MEID for CDMA phones. Return null if device ID is not available.
*
+ * @param callingPackage The package making the call.
* <p>Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
- String getDeviceId();
+ String getDeviceId(String callingPackage);
/**
* Returns the subscription ID associated with the specified PhoneAccount.
*/
int getSubIdForPhoneAccount(in PhoneAccount phoneAccount);
+
+ void factoryReset(int subId);
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index 7d8a8d6..76b69ce 100644
--- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -69,4 +69,5 @@
void notifyVoLteServiceStateChanged(in VoLteServiceState lteState);
void notifyOemHookRawEventForSubscriber(in int subId, in byte[] rawData);
void notifySubscriptionInfoChanged();
+ void notifyCarrierNetworkChange(in boolean active);
}
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 082e8bbb..12541d8 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -69,6 +69,14 @@
int SS_MODIFIED_TO_USSD = 25; /* SS request modified to USSD */
int SUBSCRIPTION_NOT_SUPPORTED = 26; /* Subscription not supported */
int SS_MODIFIED_TO_SS = 27; /* SS request modified to different SS request */
+ int SIM_ALREADY_POWERED_OFF = 29; /* SAP: 0x03, Error card aleready powered off */
+ int SIM_ALREADY_POWERED_ON = 30; /* SAP: 0x05, Error card already powered on */
+ int SIM_DATA_NOT_AVAILABLE = 31; /* SAP: 0x06, Error data not available */
+ int SIM_SAP_CONNECT_FAILURE = 32;
+ int SIM_SAP_MSG_SIZE_TOO_LARGE = 33;
+ int SIM_SAP_MSG_SIZE_TOO_SMALL = 34;
+ int SIM_SAP_CONNECT_OK_CALL_ONGOING = 35;
+ int LCE_NOT_SUPPORTED = 36; /* Link Capacity Estimation (LCE) not supported */
/* NETWORK_MODE_* See ril.h RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE */
@@ -135,6 +143,11 @@
int NV_CONFIG_ERASE_RESET = 2;
int NV_CONFIG_FACTORY_RESET = 3;
+ /* LCE service related constants. */
+ int LCE_NOT_AVAILABLE = -1;
+ int LCE_STOPPED = 0;
+ int LCE_ACTIVE = 1;
+
/*
cat include/telephony/ril.h | \
egrep '^#define' | \
@@ -307,6 +320,9 @@
int RIL_REQUEST_SHUTDOWN = 129;
int RIL_REQUEST_GET_RADIO_CAPABILITY = 130;
int RIL_REQUEST_SET_RADIO_CAPABILITY = 131;
+ int RIL_REQUEST_START_LCE = 132;
+ int RIL_REQUEST_STOP_LCE = 133;
+ int RIL_REQUEST_PULL_LCEDATA = 134;
int RIL_UNSOL_RESPONSE_BASE = 1000;
int RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED = 1000;
@@ -354,4 +370,5 @@
int RIL_UNSOL_RADIO_CAPABILITY = 1042;
int RIL_UNSOL_ON_SS = 1043;
int RIL_UNSOL_STK_CC_ALPHA_NOTIFY = 1044;
+ int RIL_UNSOL_LCEDATA_RECV = 1045;
}
diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java
index b265d47..04ded9d 100644
--- a/test-runner/src/android/test/mock/MockContext.java
+++ b/test-runner/src/android/test/mock/MockContext.java
@@ -354,6 +354,13 @@
throw new UnsupportedOperationException();
}
+ /** @hide */
+ @Override
+ public void sendBroadcastAsUser(Intent intent, UserHandle user,
+ String receiverPermission, int appOp) {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index e78750c..276b713 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -16,6 +16,7 @@
package android.test.mock;
+import android.annotation.NonNull;
import android.app.PackageInstallObserver;
import android.content.ComponentName;
import android.content.Intent;
@@ -51,6 +52,7 @@
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.UserHandle;
+import android.os.storage.VolumeInfo;
import java.util.List;
@@ -498,6 +500,18 @@
throw new UnsupportedOperationException();
}
+ /** {@hide} */
+ @Override
+ public @NonNull VolumeInfo getApplicationCurrentVolume(ApplicationInfo app) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@hide} */
+ @Override
+ public @NonNull List<VolumeInfo> getApplicationCandidateVolumes(ApplicationInfo app) {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public String getInstallerPackageName(String packageName) {
throw new UnsupportedOperationException();
@@ -521,21 +535,16 @@
throw new UnsupportedOperationException();
}
- /**
- * @hide - to match hiding in superclass
- */
+ /** {@hide} */
@Override
- public void freeStorageAndNotify(
- long idealStorageSize, IPackageDataObserver observer) {
+ public void freeStorageAndNotify(String volumeUuid, long idealStorageSize,
+ IPackageDataObserver observer) {
throw new UnsupportedOperationException();
}
- /**
- * @hide - to match hiding in superclass
- */
+ /** {@hide} */
@Override
- public void freeStorage(
- long idealStorageSize, IntentSender pi) {
+ public void freeStorage(String volumeUuid, long idealStorageSize, IntentSender pi) {
throw new UnsupportedOperationException();
}
diff --git a/tests/LockTaskTests/Android.mk b/tests/LockTaskTests/Android.mk
new file mode 100644
index 0000000..ed58643
--- /dev/null
+++ b/tests/LockTaskTests/Android.mk
@@ -0,0 +1,15 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/priv-app
+
+LOCAL_PACKAGE_NAME := LockTaskTests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_SRC_FILES := $(call all-Iaidl-files-under, src) $(call all-java-files-under, src)
+
+include $(BUILD_PACKAGE)
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/LockTaskTests/AndroidManifest.xml b/tests/LockTaskTests/AndroidManifest.xml
new file mode 100644
index 0000000..f88744e
--- /dev/null
+++ b/tests/LockTaskTests/AndroidManifest.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.google.android.example.locktasktests"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="22"
+ android:targetSdkVersion="22" />
+ <uses-permission android:name="android.permission.INTERNET"/>
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme"
+ android:allowBackup="true" >
+ <activity
+ android:name="com.google.android.example.locktasktests.MainActivity"
+ android:label="@string/app_name"
+ android:screenOrientation="portrait"
+ android:theme="@style/AppTheme" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name="com.google.android.example.locktasktests.LockDefaultActivity"
+ android:label="@string/title_activity_default"
+ android:taskAffinity=""
+ android:documentLaunchMode="always"
+ android:lockTaskMode="lockTaskModeDefault" >
+ </activity>
+ <activity
+ android:name="com.google.android.example.locktasktests.LockTaskNeverActivity"
+ android:label="@string/title_activity_never"
+ android:taskAffinity=""
+ android:documentLaunchMode="always"
+ android:lockTaskMode="lockTaskModeNever" >
+ </activity>
+ <activity
+ android:name="com.google.android.example.locktasktests.LockWhitelistedActivity"
+ android:label="@string/title_activity_whitelist"
+ android:taskAffinity=""
+ android:documentLaunchMode="always"
+ android:lockTaskMode="lockTaskModeIfWhitelisted" >
+ </activity>
+ <activity
+ android:name="com.google.android.example.locktasktests.LockAtLaunchActivity"
+ android:label="@string/title_activity_always"
+ android:taskAffinity=""
+ android:documentLaunchMode="always"
+ android:lockTaskMode="lockTaskModeAlways" >
+ </activity>
+ </application>
+
+</manifest>
diff --git a/tests/LockTaskTests/res/drawable-hdpi/ic_launcher.png b/tests/LockTaskTests/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..288b665
--- /dev/null
+++ b/tests/LockTaskTests/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/tests/LockTaskTests/res/drawable-mdpi/ic_launcher.png b/tests/LockTaskTests/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..6ae570b
--- /dev/null
+++ b/tests/LockTaskTests/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/tests/LockTaskTests/res/drawable-xhdpi/ic_launcher.png b/tests/LockTaskTests/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..d4fb7cd
--- /dev/null
+++ b/tests/LockTaskTests/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/tests/LockTaskTests/res/drawable-xxhdpi/ic_launcher.png b/tests/LockTaskTests/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..85a6081
--- /dev/null
+++ b/tests/LockTaskTests/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/tests/LockTaskTests/res/layout/activity_launch.xml b/tests/LockTaskTests/res/layout/activity_launch.xml
new file mode 100644
index 0000000..b619743
--- /dev/null
+++ b/tests/LockTaskTests/res/layout/activity_launch.xml
@@ -0,0 +1,32 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/root_launch"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ tools:context="com.google.android.example.locktasktests.LaunchActivity" >
+
+ <Button
+ android:id="@+id/button_try_lock"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:onClick="onTryLock"
+ android:text="@string/try_lock" />
+ <Button
+ android:id="@+id/button_try_unlock"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:onClick="onTryUnlock"
+ android:text="@string/try_unlock" />
+ <Button
+ android:id="@+id/button_launch_main"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:onClick="onLaunchMain"
+ android:text="@string/launch_main" />
+
+</LinearLayout>
diff --git a/tests/LockTaskTests/res/layout/activity_main.xml b/tests/LockTaskTests/res/layout/activity_main.xml
new file mode 100644
index 0000000..c2e93c4
--- /dev/null
+++ b/tests/LockTaskTests/res/layout/activity_main.xml
@@ -0,0 +1,41 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/root_launch"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ tools:context="com.google.android.example.locktasktests.MainActivity" >
+ <Button
+ android:id="@+id/button_default"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:onClick="onButtonPressed"
+ android:text="@string/launch_default" />
+ <Button
+ android:id="@+id/button_never"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:onClick="onButtonPressed"
+ android:text="@string/launch_never" />
+ <Button
+ android:id="@+id/button_whitelist"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:onClick="onButtonPressed"
+ android:text="@string/launch_whitelist" />
+ <Button
+ android:id="@+id/button_always"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:onClick="onButtonPressed"
+ android:text="@string/launch_always" />
+
+</LinearLayout>
diff --git a/tests/LockTaskTests/res/values-v11/styles.xml b/tests/LockTaskTests/res/values-v11/styles.xml
new file mode 100644
index 0000000..3c02242
--- /dev/null
+++ b/tests/LockTaskTests/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+<resources>
+
+ <!--
+ Base application theme for API 11+. This theme completely replaces
+ AppBaseTheme from res/values/styles.xml on API 11+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
+ <!-- API 11 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/tests/LockTaskTests/res/values-v14/styles.xml b/tests/LockTaskTests/res/values-v14/styles.xml
new file mode 100644
index 0000000..a91fd03
--- /dev/null
+++ b/tests/LockTaskTests/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+<resources>
+
+ <!--
+ Base application theme for API 14+. This theme completely replaces
+ AppBaseTheme from BOTH res/values/styles.xml and
+ res/values-v11/styles.xml on API 14+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+ <!-- API 14 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/tests/LockTaskTests/res/values-w820dp/dimens.xml b/tests/LockTaskTests/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..f3e7020
--- /dev/null
+++ b/tests/LockTaskTests/res/values-w820dp/dimens.xml
@@ -0,0 +1,10 @@
+<resources>
+
+ <!--
+ Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively).
+ -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+
+</resources>
diff --git a/tests/LockTaskTests/res/values/dimens.xml b/tests/LockTaskTests/res/values/dimens.xml
new file mode 100644
index 0000000..55c1e590
--- /dev/null
+++ b/tests/LockTaskTests/res/values/dimens.xml
@@ -0,0 +1,7 @@
+<resources>
+
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+
+</resources>
diff --git a/tests/LockTaskTests/res/values/strings.xml b/tests/LockTaskTests/res/values/strings.xml
new file mode 100644
index 0000000..ae7768e
--- /dev/null
+++ b/tests/LockTaskTests/res/values/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_name">Lock Task Tests</string>
+ <string name="title_activity_default">LockDefaultActivity</string>
+ <string name="title_activity_never">LockTaskNeverActivity</string>
+ <string name="title_activity_whitelist">LockWhitelistedActivity</string>
+ <string name="title_activity_always">LockAtLaunchActivity</string>
+ <string name="launch_default">android:lockTaskMode=\n
+ \"lockTaskModeDefault\"\n
+ Pinnable from Overview.</string>
+ <string name="launch_never">android:lockTaskMode=\n
+ \"lockTaskModeNever\"\n
+ Not Lockable or Pinnable.</string>
+ <string name="launch_whitelist">android:lockTaskMode=\n\"lockTaskModeIfWhitelisted\"\n
+ Lockable if whitelisted, Pinnable.\n
+ Use SampleDeviceOwner app to set whitelist.</string>
+ <string name="launch_always">android:lockTaskMode=\n
+ \"lockTaskModeAlways\"\n
+ Launches into lock mode.</string>
+ <string name="launch_main">launch MainActivity (as activity)"</string>
+ <string name="try_lock">Call startLockMode()</string>
+ <string name="try_unlock">Call stopLockMode()</string>
+
+</resources>
diff --git a/tests/LockTaskTests/res/values/styles.xml b/tests/LockTaskTests/res/values/styles.xml
new file mode 100644
index 0000000..6ce89c7
--- /dev/null
+++ b/tests/LockTaskTests/res/values/styles.xml
@@ -0,0 +1,20 @@
+<resources>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Light">
+ <!--
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+ -->
+ </style>
+
+ <!-- Application theme. -->
+ <style name="AppTheme" parent="AppBaseTheme">
+ <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+ </style>
+
+</resources>
diff --git a/tests/LockTaskTests/src/com/google/android/example/locktasktests/LaunchActivity.java b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LaunchActivity.java
new file mode 100644
index 0000000..1fc53cb
--- /dev/null
+++ b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LaunchActivity.java
@@ -0,0 +1,67 @@
+/*
+ * 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.google.android.example.locktasktests;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.EditText;
+
+public class LaunchActivity extends Activity {
+
+ EditText mEditText;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_launch);
+ setBackgroundOnLockTaskMode();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ setBackgroundOnLockTaskMode();
+ }
+
+ public void onTryLock(View view) {
+ startLockTask();
+ setBackgroundOnLockTaskMode();
+ }
+
+ public void onTryUnlock(View view) {
+ stopLockTask();
+ setBackgroundOnLockTaskMode();
+ }
+
+ public void onLaunchMain(View view) {
+ Intent intent = new Intent(this, MainActivity.class);
+ startActivity(intent);
+ }
+
+ private void setBackgroundOnLockTaskMode() {
+ ActivityManager activityManager =
+ (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+ final int color =
+ activityManager.getLockTaskModeState() != ActivityManager.LOCK_TASK_MODE_NONE ?
+ 0xFFFFC0C0 : 0xFFFFFFFF;
+ findViewById(R.id.root_launch).setBackgroundColor(color);
+ }
+}
diff --git a/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockAtLaunchActivity.java b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockAtLaunchActivity.java
new file mode 100644
index 0000000..4390c94
--- /dev/null
+++ b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockAtLaunchActivity.java
@@ -0,0 +1,20 @@
+/*
+ * 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.google.android.example.locktasktests;
+
+public class LockAtLaunchActivity extends LaunchActivity {
+}
diff --git a/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockDefaultActivity.java b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockDefaultActivity.java
new file mode 100644
index 0000000..7e57ab7
--- /dev/null
+++ b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockDefaultActivity.java
@@ -0,0 +1,20 @@
+/*
+ * 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.google.android.example.locktasktests;
+
+public class LockDefaultActivity extends LaunchActivity {
+}
diff --git a/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockTaskNeverActivity.java b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockTaskNeverActivity.java
new file mode 100644
index 0000000..69c2cbc
--- /dev/null
+++ b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockTaskNeverActivity.java
@@ -0,0 +1,20 @@
+/*
+ * 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.google.android.example.locktasktests;
+
+public class LockTaskNeverActivity extends LaunchActivity {
+}
diff --git a/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockWhitelistedActivity.java b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockWhitelistedActivity.java
new file mode 100644
index 0000000..387baa2
--- /dev/null
+++ b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LockWhitelistedActivity.java
@@ -0,0 +1,20 @@
+/*
+ * 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.google.android.example.locktasktests;
+
+public class LockWhitelistedActivity extends LaunchActivity {
+}
diff --git a/tests/LockTaskTests/src/com/google/android/example/locktasktests/MainActivity.java b/tests/LockTaskTests/src/com/google/android/example/locktasktests/MainActivity.java
new file mode 100644
index 0000000..82fac03
--- /dev/null
+++ b/tests/LockTaskTests/src/com/google/android/example/locktasktests/MainActivity.java
@@ -0,0 +1,58 @@
+
+package com.google.android.example.locktasktests;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+
+public class MainActivity extends Activity {
+
+ private final static String TAG = "LockTaskTests";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ setBackgroundOnLockTaskMode();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ setBackgroundOnLockTaskMode();
+ }
+
+ public void onButtonPressed(View v) {
+ Class activity = null;
+ switch (v.getId()) {
+ case R.id.button_default:
+ activity = LockDefaultActivity.class;
+ break;
+ case R.id.button_never:
+ activity = LockTaskNeverActivity.class;
+ break;
+ case R.id.button_whitelist:
+ activity = LockWhitelistedActivity.class;
+ break;
+ case R.id.button_always:
+ activity = LockAtLaunchActivity.class;
+ break;
+ }
+ Intent intent = new Intent(this, activity);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ }
+
+ private void setBackgroundOnLockTaskMode() {
+ ActivityManager activityManager =
+ (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+ final int color =
+ activityManager.getLockTaskModeState() != ActivityManager.LOCK_TASK_MODE_NONE ?
+ 0xFFFFC0C0 : 0xFFFFFFFF;
+ findViewById(R.id.root_launch).setBackgroundColor(color);
+ }
+}
diff --git a/tools/aapt2/Android.mk b/tools/aapt2/Android.mk
index 0622dc6..05034c3 100644
--- a/tools/aapt2/Android.mk
+++ b/tools/aapt2/Android.mk
@@ -27,6 +27,7 @@
sources := \
BigBuffer.cpp \
BinaryResourceParser.cpp \
+ BinaryXmlPullParser.cpp \
BindingXmlPullParser.cpp \
ConfigDescription.cpp \
Files.cpp \
@@ -51,7 +52,9 @@
ScopedXmlPullParser.cpp \
SourceXmlPullParser.cpp \
XliffXmlPullParser.cpp \
- XmlFlattener.cpp
+ XmlFlattener.cpp \
+ ZipEntry.cpp \
+ ZipFile.cpp
testSources := \
BigBuffer_test.cpp \
@@ -63,6 +66,7 @@
Locale_test.cpp \
ManifestParser_test.cpp \
Maybe_test.cpp \
+ NameMangler_test.cpp \
ResourceParser_test.cpp \
Resource_test.cpp \
ResourceTable_test.cpp \
diff --git a/tools/aapt2/BinaryResourceParser.cpp b/tools/aapt2/BinaryResourceParser.cpp
index 3eb96bc..71016c1 100644
--- a/tools/aapt2/BinaryResourceParser.cpp
+++ b/tools/aapt2/BinaryResourceParser.cpp
@@ -17,6 +17,7 @@
#include "BinaryResourceParser.h"
#include "Logger.h"
#include "ResChunkPullParser.h"
+#include "Resolver.h"
#include "ResourceParser.h"
#include "ResourceTable.h"
#include "ResourceTypeExtensions.h"
@@ -33,28 +34,14 @@
using namespace android;
-template <typename T>
-inline static const T* convertTo(const ResChunk_header* chunk) {
- if (chunk->headerSize < sizeof(T)) {
- return nullptr;
- }
- return reinterpret_cast<const T*>(chunk);
-}
-
-inline static const uint8_t* getChunkData(const ResChunk_header& chunk) {
- return reinterpret_cast<const uint8_t*>(&chunk) + chunk.headerSize;
-}
-
-inline static size_t getChunkDataLen(const ResChunk_header& chunk) {
- return chunk.size - chunk.headerSize;
-}
-
/*
* Visitor that converts a reference's resource ID to a resource name,
* given a mapping from resource ID to resource name.
*/
struct ReferenceIdToNameVisitor : ValueVisitor {
- ReferenceIdToNameVisitor(const std::map<ResourceId, ResourceName>& cache) : mCache(cache) {
+ ReferenceIdToNameVisitor(const std::shared_ptr<Resolver>& resolver,
+ std::map<ResourceId, ResourceName>* cache) :
+ mResolver(resolver), mCache(cache) {
}
void visit(Reference& reference, ValueVisitorArgs&) override {
@@ -104,24 +91,39 @@
return;
}
- auto cacheIter = mCache.find(reference.id);
- if (cacheIter == std::end(mCache)) {
- Logger::note() << "failed to find " << reference.id << std::endl;
- } else {
+ auto cacheIter = mCache->find(reference.id);
+ if (cacheIter != mCache->end()) {
reference.name = cacheIter->second;
reference.id = 0;
+ } else {
+ const android::ResTable& table = mResolver->getResTable();
+ android::ResTable::resource_name resourceName;
+ if (table.getResourceName(reference.id.id, false, &resourceName)) {
+ const ResourceType* type = parseResourceType(StringPiece16(resourceName.type,
+ resourceName.typeLen));
+ assert(type);
+ reference.name.package.assign(resourceName.package, resourceName.packageLen);
+ reference.name.type = *type;
+ reference.name.entry.assign(resourceName.name, resourceName.nameLen);
+ reference.id = 0;
+
+ // Add to cache.
+ mCache->insert({reference.id, reference.name});
+ }
}
}
- const std::map<ResourceId, ResourceName>& mCache;
+ std::shared_ptr<Resolver> mResolver;
+ std::map<ResourceId, ResourceName>* mCache;
};
-BinaryResourceParser::BinaryResourceParser(std::shared_ptr<ResourceTable> table,
+BinaryResourceParser::BinaryResourceParser(const std::shared_ptr<ResourceTable>& table,
+ const std::shared_ptr<Resolver>& resolver,
const Source& source,
const void* data,
size_t len) :
- mTable(table), mSource(source), mData(data), mDataLen(len) {
+ mTable(table), mResolver(resolver), mSource(source), mData(data), mDataLen(len) {
}
bool BinaryResourceParser::parse() {
@@ -421,7 +423,7 @@
// Now go through the table and change resource ID references to
// symbolic references.
- ReferenceIdToNameVisitor visitor(mIdIndex);
+ ReferenceIdToNameVisitor visitor(mResolver, &mIdIndex);
for (auto& type : *mTable) {
for (auto& entry : type->entries) {
for (auto& configValue : entry->values) {
@@ -676,7 +678,8 @@
std::unique_ptr<Style> BinaryResourceParser::parseStyle(const ResourceNameRef& name,
const ConfigDescription& config,
const ResTable_map_entry* map) {
- std::unique_ptr<Style> style = util::make_unique<Style>();
+ const bool isWeak = (map->flags & ResTable_entry::FLAG_WEAK) != 0;
+ std::unique_ptr<Style> style = util::make_unique<Style>(isWeak);
if (map->parent.ident == 0) {
// The parent is either not set or it is an unresolved symbol.
// Check to see if it is a symbol.
@@ -759,7 +762,17 @@
const ResTable_map_entry* map) {
std::unique_ptr<Styleable> styleable = util::make_unique<Styleable>();
for (const ResTable_map& mapEntry : map) {
- styleable->entries.emplace_back(mapEntry.name.ident);
+ if (mapEntry.name.ident == 0) {
+ // The map entry's key (attribute) is not set. This must be
+ // a symbol reference, so resolve it.
+ ResourceNameRef symbol;
+ bool result = getSymbol(&mapEntry.name.ident, &symbol);
+ assert(result);
+ styleable->entries.emplace_back(symbol);
+ } else {
+ // The map entry's key (attribute) is a regular reference.
+ styleable->entries.emplace_back(mapEntry.name.ident);
+ }
}
return styleable;
}
diff --git a/tools/aapt2/BinaryResourceParser.h b/tools/aapt2/BinaryResourceParser.h
index 9268078..f95a0c8 100644
--- a/tools/aapt2/BinaryResourceParser.h
+++ b/tools/aapt2/BinaryResourceParser.h
@@ -17,6 +17,7 @@
#ifndef AAPT_BINARY_RESOURCE_PARSER_H
#define AAPT_BINARY_RESOURCE_PARSER_H
+#include "Resolver.h"
#include "ResourceTable.h"
#include "ResourceValues.h"
#include "Source.h"
@@ -41,7 +42,9 @@
* Creates a parser, which will read `len` bytes from `data`, and
* add any resources parsed to `table`. `source` is for logging purposes.
*/
- BinaryResourceParser(std::shared_ptr<ResourceTable> table, const Source& source,
+ BinaryResourceParser(const std::shared_ptr<ResourceTable>& table,
+ const std::shared_ptr<Resolver>& resolver,
+ const Source& source,
const void* data, size_t len);
BinaryResourceParser(const BinaryResourceParser&) = delete; // No copy.
@@ -89,6 +92,8 @@
std::shared_ptr<ResourceTable> mTable;
+ std::shared_ptr<Resolver> mResolver;
+
const Source mSource;
const void* mData;
diff --git a/tools/aapt2/BinaryXmlPullParser.cpp b/tools/aapt2/BinaryXmlPullParser.cpp
new file mode 100644
index 0000000..7a07c06
--- /dev/null
+++ b/tools/aapt2/BinaryXmlPullParser.cpp
@@ -0,0 +1,204 @@
+/*
+ * 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.
+ */
+
+#include "BinaryXmlPullParser.h"
+
+#include <androidfw/ResourceTypes.h>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace aapt {
+
+static XmlPullParser::Event codeToEvent(android::ResXMLParser::event_code_t code) {
+ switch (code) {
+ case android::ResXMLParser::START_DOCUMENT:
+ return XmlPullParser::Event::kStartDocument;
+ case android::ResXMLParser::END_DOCUMENT:
+ return XmlPullParser::Event::kEndDocument;
+ case android::ResXMLParser::START_NAMESPACE:
+ return XmlPullParser::Event::kStartNamespace;
+ case android::ResXMLParser::END_NAMESPACE:
+ return XmlPullParser::Event::kEndNamespace;
+ case android::ResXMLParser::START_TAG:
+ return XmlPullParser::Event::kStartElement;
+ case android::ResXMLParser::END_TAG:
+ return XmlPullParser::Event::kEndElement;
+ case android::ResXMLParser::TEXT:
+ return XmlPullParser::Event::kText;
+ default:
+ break;
+ }
+ return XmlPullParser::Event::kBadDocument;
+}
+
+BinaryXmlPullParser::BinaryXmlPullParser(const std::shared_ptr<android::ResXMLTree>& parser)
+ : mParser(parser), mEvent(Event::kStartDocument), mHasComment(false), sEmpty(), sEmpty8(),
+ mDepth(0) {
+}
+
+XmlPullParser::Event BinaryXmlPullParser::next() {
+ mStr1.clear();
+ mStr2.clear();
+ mAttributes.clear();
+
+ android::ResXMLParser::event_code_t code;
+ if (mHasComment) {
+ mHasComment = false;
+ code = mParser->getEventType();
+ } else {
+ code = mParser->next();
+ if (code != android::ResXMLParser::BAD_DOCUMENT) {
+ size_t len;
+ const char16_t* comment = mParser->getComment(&len);
+ if (comment) {
+ mHasComment = true;
+ mStr1.assign(comment, len);
+ return XmlPullParser::Event::kComment;
+ }
+ }
+ }
+
+ size_t len;
+ const char16_t* data;
+ mEvent = codeToEvent(code);
+ switch (mEvent) {
+ case Event::kStartNamespace:
+ case Event::kEndNamespace:
+ data = mParser->getNamespacePrefix(&len);
+ mStr1.assign(data, len);
+ data = mParser->getNamespaceUri(&len);
+ mStr2.assign(data, len);
+ break;
+
+ case Event::kStartElement:
+ copyAttributes();
+ // fallthrough
+
+ case Event::kEndElement:
+ data = mParser->getElementNamespace(&len);
+ mStr1.assign(data, len);
+ data = mParser->getElementName(&len);
+ mStr2.assign(data, len);
+ break;
+
+ case Event::kText:
+ data = mParser->getText(&len);
+ mStr1.assign(data, len);
+ break;
+
+ default:
+ break;
+ }
+ return mEvent;
+}
+
+XmlPullParser::Event BinaryXmlPullParser::getEvent() const {
+ if (mHasComment) {
+ return XmlPullParser::Event::kComment;
+ }
+ return mEvent;
+}
+
+const std::string& BinaryXmlPullParser::getLastError() const {
+ return sEmpty8;
+}
+
+const std::u16string& BinaryXmlPullParser::getComment() const {
+ if (mHasComment) {
+ return mStr1;
+ }
+ return sEmpty;
+}
+
+size_t BinaryXmlPullParser::getLineNumber() const {
+ return mParser->getLineNumber();
+}
+
+size_t BinaryXmlPullParser::getDepth() const {
+ return mDepth;
+}
+
+const std::u16string& BinaryXmlPullParser::getText() const {
+ if (!mHasComment && mEvent == XmlPullParser::Event::kText) {
+ return mStr1;
+ }
+ return sEmpty;
+}
+
+const std::u16string& BinaryXmlPullParser::getNamespacePrefix() const {
+ if (!mHasComment && (mEvent == XmlPullParser::Event::kStartNamespace ||
+ mEvent == XmlPullParser::Event::kEndNamespace)) {
+ return mStr1;
+ }
+ return sEmpty;
+}
+
+const std::u16string& BinaryXmlPullParser::getNamespaceUri() const {
+ if (!mHasComment && (mEvent == XmlPullParser::Event::kStartNamespace ||
+ mEvent == XmlPullParser::Event::kEndNamespace)) {
+ return mStr2;
+ }
+ return sEmpty;
+}
+
+const std::u16string& BinaryXmlPullParser::getElementNamespace() const {
+ if (!mHasComment && (mEvent == XmlPullParser::Event::kStartElement ||
+ mEvent == XmlPullParser::Event::kEndElement)) {
+ return mStr1;
+ }
+ return sEmpty;
+}
+
+const std::u16string& BinaryXmlPullParser::getElementName() const {
+ if (!mHasComment && (mEvent == XmlPullParser::Event::kStartElement ||
+ mEvent == XmlPullParser::Event::kEndElement)) {
+ return mStr2;
+ }
+ return sEmpty;
+}
+
+size_t BinaryXmlPullParser::getAttributeCount() const {
+ return mAttributes.size();
+}
+
+XmlPullParser::const_iterator BinaryXmlPullParser::beginAttributes() const {
+ return mAttributes.begin();
+}
+
+XmlPullParser::const_iterator BinaryXmlPullParser::endAttributes() const {
+ return mAttributes.end();
+}
+
+void BinaryXmlPullParser::copyAttributes() {
+ const size_t attrCount = mParser->getAttributeCount();
+ if (attrCount > 0) {
+ mAttributes.reserve(attrCount);
+ for (size_t i = 0; i < attrCount; i++) {
+ XmlPullParser::Attribute attr;
+ size_t len;
+ const char16_t* str = mParser->getAttributeNamespace(i, &len);
+ attr.namespaceUri.assign(str, len);
+ str = mParser->getAttributeName(i, &len);
+ attr.name.assign(str, len);
+ str = mParser->getAttributeStringValue(i, &len);
+ attr.value.assign(str, len);
+ mAttributes.push_back(std::move(attr));
+ }
+ }
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/BinaryXmlPullParser.h b/tools/aapt2/BinaryXmlPullParser.h
new file mode 100644
index 0000000..2d4256a
--- /dev/null
+++ b/tools/aapt2/BinaryXmlPullParser.h
@@ -0,0 +1,73 @@
+/*
+ * 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.
+ */
+
+#ifndef AAPT_BINARY_XML_PULL_PARSER_H
+#define AAPT_BINARY_XML_PULL_PARSER_H
+
+#include "XmlPullParser.h"
+
+#include <androidfw/ResourceTypes.h>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace aapt {
+
+/**
+ * Wraps a ResTable into the canonical XmlPullParser interface.
+ */
+class BinaryXmlPullParser : public XmlPullParser {
+public:
+ BinaryXmlPullParser(const std::shared_ptr<android::ResXMLTree>& parser);
+ BinaryXmlPullParser(const BinaryXmlPullParser& rhs) = delete;
+
+ Event getEvent() const;
+ const std::string& getLastError() const;
+ Event next();
+
+ const std::u16string& getComment() const;
+ size_t getLineNumber() const;
+ size_t getDepth() const;
+
+ const std::u16string& getText() const;
+
+ const std::u16string& getNamespacePrefix() const;
+ const std::u16string& getNamespaceUri() const;
+
+ const std::u16string& getElementNamespace() const;
+ const std::u16string& getElementName() const;
+
+ const_iterator beginAttributes() const;
+ const_iterator endAttributes() const;
+ size_t getAttributeCount() const;
+
+private:
+ void copyAttributes();
+
+ std::shared_ptr<android::ResXMLTree> mParser;
+ std::u16string mStr1;
+ std::u16string mStr2;
+ std::vector<Attribute> mAttributes;
+ Event mEvent;
+ bool mHasComment;
+ const std::u16string sEmpty;
+ const std::string sEmpty8;
+ size_t mDepth;
+};
+
+} // namespace aapt
+
+#endif // AAPT_BINARY_XML_PULL_PARSER_H
diff --git a/tools/aapt2/Flag.cpp b/tools/aapt2/Flag.cpp
index b1ee8e7..3b2ff51 100644
--- a/tools/aapt2/Flag.cpp
+++ b/tools/aapt2/Flag.cpp
@@ -16,6 +16,7 @@
std::function<void(const StringPiece&)> action;
bool required;
bool* flagResult;
+ bool flagValueWhenSet;
bool parsed;
};
@@ -25,21 +26,22 @@
void optionalFlag(const StringPiece& name, const StringPiece& description,
std::function<void(const StringPiece&)> action) {
sFlags.push_back(
- Flag{ name.toString(), description.toString(), action, false, nullptr, false });
+ Flag{ name.toString(), description.toString(), action, false, nullptr, false, false });
}
void requiredFlag(const StringPiece& name, const StringPiece& description,
std::function<void(const StringPiece&)> action) {
sFlags.push_back(
- Flag{ name.toString(), description.toString(), action, true, nullptr, false });
+ Flag{ name.toString(), description.toString(), action, true, nullptr, false, false });
}
-void optionalSwitch(const StringPiece& name, const StringPiece& description, bool* result) {
- sFlags.push_back(
- Flag{ name.toString(), description.toString(), {}, false, result, false });
+void optionalSwitch(const StringPiece& name, const StringPiece& description, bool resultWhenSet,
+ bool* result) {
+ sFlags.push_back(Flag{
+ name.toString(), description.toString(), {}, false, result, resultWhenSet, false });
}
-static void usageAndDie(const StringPiece& command) {
+void usageAndDie(const StringPiece& command) {
std::cerr << command << " [options]";
for (const Flag& flag : sFlags) {
if (flag.required) {
@@ -73,7 +75,7 @@
match = true;
flag.parsed = true;
if (flag.flagResult) {
- *flag.flagResult = true;
+ *flag.flagResult = flag.flagValueWhenSet;
} else {
i++;
if (i >= argc) {
diff --git a/tools/aapt2/Flag.h b/tools/aapt2/Flag.h
index 32f5f2c..4745c35 100644
--- a/tools/aapt2/Flag.h
+++ b/tools/aapt2/Flag.h
@@ -16,7 +16,10 @@
void optionalFlag(const StringPiece& name, const StringPiece& description,
std::function<void(const StringPiece&)> action);
-void optionalSwitch(const StringPiece& name, const StringPiece& description, bool* result);
+void optionalSwitch(const StringPiece& name, const StringPiece& description, bool resultWhenSet,
+ bool* result);
+
+void usageAndDie(const StringPiece& command);
void parse(int argc, char** argv, const StringPiece& command);
diff --git a/tools/aapt2/JavaClassGenerator.cpp b/tools/aapt2/JavaClassGenerator.cpp
index 779a346..3f92f18 100644
--- a/tools/aapt2/JavaClassGenerator.cpp
+++ b/tools/aapt2/JavaClassGenerator.cpp
@@ -15,6 +15,7 @@
*/
#include "JavaClassGenerator.h"
+#include "NameMangler.h"
#include "Resource.h"
#include "ResourceTable.h"
#include "ResourceValues.h"
@@ -31,7 +32,7 @@
// The number of attributes to emit per line in a Styleable array.
constexpr size_t kAttribsPerLine = 4;
-JavaClassGenerator::JavaClassGenerator(std::shared_ptr<const ResourceTable> table,
+JavaClassGenerator::JavaClassGenerator(const std::shared_ptr<const ResourceTable>& table,
Options options) :
mTable(table), mOptions(options) {
}
@@ -79,42 +80,18 @@
return output;
}
-bool JavaClassGenerator::generateType(std::ostream& out, const ResourceTableType& type,
- size_t packageId) {
- const StringPiece finalModifier = mOptions.useFinal ? " final" : "";
-
- for (const auto& entry : type.entries) {
- ResourceId id = { packageId, type.typeId, entry->entryId };
- assert(id.isValid());
-
- if (!isValidSymbol(entry->name)) {
- std::stringstream err;
- err << "invalid symbol name '"
- << StringPiece16(entry->name)
- << "'";
- mError = err.str();
- return false;
- }
-
- out << " "
- << "public static" << finalModifier
- << " int " << transform(entry->name) << " = " << id << ";" << std::endl;
- }
- return true;
-}
-
struct GenArgs : ValueVisitorArgs {
- GenArgs(std::ostream& o, const ResourceEntry& e) : out(o), entry(e) {
+ GenArgs(std::ostream* o, std::u16string* e) : out(o), entryName(e) {
}
- std::ostream& out;
- const ResourceEntry& entry;
+ std::ostream* out;
+ std::u16string* entryName;
};
void JavaClassGenerator::visit(const Styleable& styleable, ValueVisitorArgs& a) {
const StringPiece finalModifier = mOptions.useFinal ? " final" : "";
- std::ostream& out = static_cast<GenArgs&>(a).out;
- const ResourceEntry& entry = static_cast<GenArgs&>(a).entry;
+ std::ostream* out = static_cast<GenArgs&>(a).out;
+ std::u16string* entryName = static_cast<GenArgs&>(a).entryName;
// This must be sorted by resource ID.
std::vector<std::pair<ResourceId, StringPiece16>> sortedAttributes;
@@ -127,59 +104,86 @@
std::sort(sortedAttributes.begin(), sortedAttributes.end());
// First we emit the array containing the IDs of each attribute.
- out << " "
- << "public static final int[] " << transform(entry.name) << " = {";
+ *out << " "
+ << "public static final int[] " << transform(*entryName) << " = {";
const size_t attrCount = sortedAttributes.size();
for (size_t i = 0; i < attrCount; i++) {
if (i % kAttribsPerLine == 0) {
- out << std::endl << " ";
+ *out << std::endl << " ";
}
- out << sortedAttributes[i].first;
+ *out << sortedAttributes[i].first;
if (i != attrCount - 1) {
- out << ", ";
+ *out << ", ";
}
}
- out << std::endl << " };" << std::endl;
+ *out << std::endl << " };" << std::endl;
// Now we emit the indices into the array.
for (size_t i = 0; i < attrCount; i++) {
- out << " "
- << "public static" << finalModifier
- << " int " << transform(entry.name) << "_" << transform(sortedAttributes[i].second)
- << " = " << i << ";" << std::endl;
+ *out << " "
+ << "public static" << finalModifier
+ << " int " << transform(*entryName) << "_" << transform(sortedAttributes[i].second)
+ << " = " << i << ";" << std::endl;
}
}
-bool JavaClassGenerator::generate(std::ostream& out) {
+bool JavaClassGenerator::generateType(const std::u16string& package, size_t packageId,
+ const ResourceTableType& type, std::ostream& out) {
+ const StringPiece finalModifier = mOptions.useFinal ? " final" : "";
+
+ std::u16string unmangledPackage;
+ std::u16string unmangledName;
+ for (const auto& entry : type.entries) {
+ ResourceId id = { packageId, type.typeId, entry->entryId };
+ assert(id.isValid());
+
+ unmangledName = entry->name;
+ if (NameMangler::unmangle(&unmangledName, &unmangledPackage)) {
+ // The entry name was mangled, and we successfully unmangled it.
+ // Check that we want to emit this symbol.
+ if (package != unmangledPackage) {
+ // Skip the entry if it doesn't belong to the package we're writing.
+ continue;
+ }
+ } else {
+ if (package != mTable->getPackage()) {
+ // We are processing a mangled package name,
+ // but this is a non-mangled resource.
+ continue;
+ }
+ }
+
+ if (!isValidSymbol(unmangledName)) {
+ ResourceNameRef resourceName = { package, type.type, unmangledName };
+ std::stringstream err;
+ err << "invalid symbol name '" << resourceName << "'";
+ mError = err.str();
+ return false;
+ }
+
+ if (type.type == ResourceType::kStyleable) {
+ assert(!entry->values.empty());
+ entry->values.front().value->accept(*this, GenArgs{ &out, &unmangledName });
+ } else {
+ out << " " << "public static" << finalModifier
+ << " int " << transform(unmangledName) << " = " << id << ";" << std::endl;
+ }
+ }
+ return true;
+}
+
+bool JavaClassGenerator::generate(const std::u16string& package, std::ostream& out) {
const size_t packageId = mTable->getPackageId();
- generateHeader(out, mTable->getPackage());
+ generateHeader(out, package);
out << "public final class R {" << std::endl;
for (const auto& type : *mTable) {
out << " public static final class " << type->type << " {" << std::endl;
- bool result;
- if (type->type == ResourceType::kStyleable) {
- for (const auto& entry : type->entries) {
- assert(!entry->values.empty());
- if (!isValidSymbol(entry->name)) {
- std::stringstream err;
- err << "invalid symbol name '"
- << StringPiece16(entry->name)
- << "'";
- mError = err.str();
- return false;
- }
- entry->values.front().value->accept(*this, GenArgs{ out, *entry });
- }
- } else {
- result = generateType(out, *type, packageId);
- }
-
- if (!result) {
+ if (!generateType(package, packageId, *type, out)) {
return false;
}
out << " }" << std::endl;
diff --git a/tools/aapt2/JavaClassGenerator.h b/tools/aapt2/JavaClassGenerator.h
index 5b8e500..f8b9ee3 100644
--- a/tools/aapt2/JavaClassGenerator.h
+++ b/tools/aapt2/JavaClassGenerator.h
@@ -41,12 +41,16 @@
bool useFinal = true;
};
- JavaClassGenerator(std::shared_ptr<const ResourceTable> table, Options options);
+ JavaClassGenerator(const std::shared_ptr<const ResourceTable>& table, Options options);
/*
- * Writes the R.java file to `out`. Returns true on success.
+ * Writes the R.java file to `out`. Only symbols belonging to `package` are written.
+ * All symbols technically belong to a single package, but linked libraries will
+ * have their names mangled, denoting that they came from a different package.
+ * We need to generate these symbols in a separate file.
+ * Returns true on success.
*/
- bool generate(std::ostream& out);
+ bool generate(const std::u16string& package, std::ostream& out);
/*
* ConstValueVisitor implementation.
@@ -56,7 +60,8 @@
const std::string& getError() const;
private:
- bool generateType(std::ostream& out, const ResourceTableType& type, size_t packageId);
+ bool generateType(const std::u16string& package, size_t packageId,
+ const ResourceTableType& type, std::ostream& out);
std::shared_ptr<const ResourceTable> mTable;
Options mOptions;
diff --git a/tools/aapt2/JavaClassGenerator_test.cpp b/tools/aapt2/JavaClassGenerator_test.cpp
index 32050e3..96bb10b 100644
--- a/tools/aapt2/JavaClassGenerator_test.cpp
+++ b/tools/aapt2/JavaClassGenerator_test.cpp
@@ -15,6 +15,8 @@
*/
#include "JavaClassGenerator.h"
+#include "Linker.h"
+#include "Resolver.h"
#include "ResourceTable.h"
#include "ResourceValues.h"
#include "Util.h"
@@ -47,7 +49,7 @@
JavaClassGenerator generator(mTable, {});
std::stringstream out;
- EXPECT_FALSE(generator.generate(out));
+ EXPECT_FALSE(generator.generate(mTable->getPackage(), out));
}
TEST_F(JavaClassGeneratorTest, TransformInvalidJavaIdentifierCharacter) {
@@ -69,7 +71,7 @@
JavaClassGenerator generator(mTable, {});
std::stringstream out;
- EXPECT_TRUE(generator.generate(out));
+ EXPECT_TRUE(generator.generate(mTable->getPackage(), out));
std::string output = out.str();
EXPECT_NE(std::string::npos,
@@ -82,4 +84,33 @@
output.find("public static final int hey_dude_cool_attr = 0;"));
}
+TEST_F(JavaClassGeneratorTest, EmitPackageMangledSymbols) {
+ ASSERT_TRUE(addResource(ResourceName{ {}, ResourceType::kId, u"foo" },
+ ResourceId{ 0x01, 0x02, 0x0000 }));
+ ResourceTable table;
+ table.setPackage(u"com.lib");
+ ASSERT_TRUE(table.addResource(ResourceName{ {}, ResourceType::kId, u"test" }, {},
+ SourceLine{ "lib.xml", 33 }, util::make_unique<Id>()));
+ ASSERT_TRUE(mTable->merge(std::move(table)));
+
+ std::shared_ptr<Resolver> resolver = std::make_shared<Resolver>(mTable,
+ std::make_shared<const android::AssetManager>());
+ Linker linker(mTable, resolver);
+ ASSERT_TRUE(linker.linkAndValidate());
+
+ JavaClassGenerator generator(mTable, {});
+
+ std::stringstream out;
+ EXPECT_TRUE(generator.generate(mTable->getPackage(), out));
+ std::string output = out.str();
+ EXPECT_NE(std::string::npos, output.find("int foo ="));
+ EXPECT_EQ(std::string::npos, output.find("int test ="));
+
+ out.str("");
+ EXPECT_TRUE(generator.generate(u"com.lib", out));
+ output = out.str();
+ EXPECT_NE(std::string::npos, output.find("int test ="));
+ EXPECT_EQ(std::string::npos, output.find("int foo ="));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/Linker.cpp b/tools/aapt2/Linker.cpp
index 1cfb297..4346c8b 100644
--- a/tools/aapt2/Linker.cpp
+++ b/tools/aapt2/Linker.cpp
@@ -128,6 +128,20 @@
void Linker::visit(Reference& reference, ValueVisitorArgs& a) {
Args& args = static_cast<Args&>(a);
+ if (!reference.name.isValid()) {
+ // We can't have a completely bad reference.
+ assert(reference.id.isValid());
+
+ // This reference has no name but has an ID.
+ // It is a really bad error to have no name and have the same
+ // package ID.
+ assert(reference.id.packageId() != mTable->getPackageId());
+
+ // The reference goes outside this package, let it stay as a
+ // resource ID because it will not change.
+ return;
+ }
+
Maybe<ResourceId> result = mResolver->findId(reference.name);
if (!result) {
addUnresolvedSymbol(reference.name, args.source);
@@ -206,7 +220,7 @@
void Linker::visit(Style& style, ValueVisitorArgs& a) {
Args& args = static_cast<Args&>(a);
- if (style.parent.name.isValid()) {
+ if (style.parent.name.isValid() || style.parent.id.isValid()) {
visit(style.parent, a);
}
diff --git a/tools/aapt2/Linker_test.cpp b/tools/aapt2/Linker_test.cpp
index b1e201b..4d2d360 100644
--- a/tools/aapt2/Linker_test.cpp
+++ b/tools/aapt2/Linker_test.cpp
@@ -30,6 +30,7 @@
virtual void SetUp() override {
mTable = std::make_shared<ResourceTable>();
mTable->setPackage(u"android");
+ mTable->setPackageId(0x01);
mLinker = std::make_shared<Linker>(mTable, std::make_shared<Resolver>(
mTable, std::make_shared<android::AssetManager>()));
@@ -75,7 +76,7 @@
}
TEST_F(LinkerTest, EscapeAndConvertRawString) {
- std::unique_ptr<Style> style = util::make_unique<Style>();
+ std::unique_ptr<Style> style = util::make_unique<Style>(false);
style->entries.push_back(Style::Entry{
ResourceNameRef{ u"android", ResourceType::kAttr, u"integer" },
util::make_unique<RawString>(mTable->getValueStringPool().makeRef(u" 123"))
@@ -91,7 +92,7 @@
}
TEST_F(LinkerTest, FailToConvertRawString) {
- std::unique_ptr<Style> style = util::make_unique<Style>();
+ std::unique_ptr<Style> style = util::make_unique<Style>(false);
style->entries.push_back(Style::Entry{
ResourceNameRef{ u"android", ResourceType::kAttr, u"integer" },
util::make_unique<RawString>(mTable->getValueStringPool().makeRef(u"yo what is up?"))
@@ -103,7 +104,7 @@
}
TEST_F(LinkerTest, ConvertRawStringToString) {
- std::unique_ptr<Style> style = util::make_unique<Style>();
+ std::unique_ptr<Style> style = util::make_unique<Style>(false);
style->entries.push_back(Style::Entry{
ResourceNameRef{ u"android", ResourceType::kAttr, u"string" },
util::make_unique<RawString>(
@@ -122,7 +123,7 @@
}
TEST_F(LinkerTest, ConvertRawStringToFlags) {
- std::unique_ptr<Style> style = util::make_unique<Style>();
+ std::unique_ptr<Style> style = util::make_unique<Style>(false);
style->entries.push_back(Style::Entry{
ResourceNameRef{ u"android", ResourceType::kAttr, u"flags" },
util::make_unique<RawString>(mTable->getValueStringPool().makeRef(u"banana | apple"))
@@ -140,4 +141,12 @@
EXPECT_EQ(bin->value.data, 1u | 2u);
}
+TEST_F(LinkerTest, AllowReferenceWithOnlyResourceIdPointingToDifferentPackage) {
+ ASSERT_TRUE(addResource(ResourceName{ u"android", ResourceType::kInteger, u"foo" },
+ util::make_unique<Reference>(ResourceId{ 0x02, 0x01, 0x01 })));
+
+ ASSERT_TRUE(mLinker->linkAndValidate());
+ EXPECT_TRUE(mLinker->getUnresolvedReferences().empty());
+}
+
} // namespace aapt
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index 87127fd..03b9ba4 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -17,6 +17,7 @@
#include "AppInfo.h"
#include "BigBuffer.h"
#include "BinaryResourceParser.h"
+#include "BinaryXmlPullParser.h"
#include "BindingXmlPullParser.h"
#include "Files.h"
#include "Flag.h"
@@ -34,6 +35,7 @@
#include "TableFlattener.h"
#include "Util.h"
#include "XmlFlattener.h"
+#include "ZipFile.h"
#include <algorithm>
#include <androidfw/AssetManager.h>
@@ -44,8 +46,11 @@
#include <iostream>
#include <sstream>
#include <sys/stat.h>
+#include <unordered_set>
#include <utils/Errors.h>
+constexpr const char* kAaptVersionStr = "2.0-alpha";
+
using namespace aapt;
void printTable(const ResourceTable& table) {
@@ -96,17 +101,6 @@
}
}
-std::unique_ptr<FileReference> makeFileReference(StringPool& pool, const StringPiece& filename,
- ResourceType type, const ConfigDescription& config) {
- std::stringstream path;
- path << "res/" << type;
- if (config != ConfigDescription{}) {
- path << "-" << config;
- }
- path << "/" << filename;
- return util::make_unique<FileReference>(pool.makeRef(util::utf8ToUtf16(path.str())));
-}
-
/**
* Collect files from 'root', filtering out any files that do not
* match the FileFilter 'filter'.
@@ -148,30 +142,6 @@
return !error;
}
-bool loadBinaryResourceTable(std::shared_ptr<ResourceTable> table, const Source& source) {
- std::ifstream ifs(source.path, std::ifstream::in | std::ifstream::binary);
- if (!ifs) {
- Logger::error(source) << strerror(errno) << std::endl;
- return false;
- }
-
- std::streampos fsize = ifs.tellg();
- ifs.seekg(0, std::ios::end);
- fsize = ifs.tellg() - fsize;
- ifs.seekg(0, std::ios::beg);
-
- assert(fsize >= 0);
- size_t dataSize = static_cast<size_t>(fsize);
- char* buf = new char[dataSize];
- ifs.read(buf, dataSize);
-
- BinaryResourceParser parser(table, source, buf, dataSize);
- bool result = parser.parse();
-
- delete [] buf;
- return result;
-}
-
bool loadResTable(android::ResTable* table, const Source& source) {
std::ifstream ifs(source.path, std::ifstream::in | std::ifstream::binary);
if (!ifs) {
@@ -195,7 +165,7 @@
return result;
}
-void versionStylesForCompat(std::shared_ptr<ResourceTable> table) {
+void versionStylesForCompat(const std::shared_ptr<ResourceTable>& table) {
for (auto& type : *table) {
if (type->type != ResourceType::kStyle) {
continue;
@@ -251,10 +221,12 @@
{},
// Create a copy of the original style.
- std::unique_ptr<Value>(configValue.value->clone())
+ std::unique_ptr<Value>(configValue.value->clone(
+ &table->getValueStringPool()))
};
Style& newStyle = static_cast<Style&>(*value.value);
+ newStyle.weak = true;
// Move the recorded stripped attributes into this new style.
std::move(stripped.begin(), stripped.end(),
@@ -285,59 +257,6 @@
}
}
-bool collectXml(std::shared_ptr<ResourceTable> table, const Source& source,
- const ResourceName& name, const ConfigDescription& config) {
- std::ifstream in(source.path, std::ifstream::binary);
- if (!in) {
- Logger::error(source) << strerror(errno) << std::endl;
- return false;
- }
-
- std::set<size_t> sdkLevels;
-
- SourceXmlPullParser parser(in);
- while (XmlPullParser::isGoodEvent(parser.next())) {
- if (parser.getEvent() != XmlPullParser::Event::kStartElement) {
- continue;
- }
-
- const auto endIter = parser.endAttributes();
- for (auto iter = parser.beginAttributes(); iter != endIter; ++iter) {
- if (iter->namespaceUri == u"http://schemas.android.com/apk/res/android") {
- size_t sdkLevel = findAttributeSdkLevel(iter->name);
- if (sdkLevel > 1) {
- sdkLevels.insert(sdkLevel);
- }
- }
-
- ResourceNameRef refName;
- bool create = false;
- bool privateRef = false;
- if (ResourceParser::tryParseReference(iter->value, &refName, &create, &privateRef) &&
- create) {
- table->addResource(refName, {}, source.line(parser.getLineNumber()),
- util::make_unique<Id>());
- }
- }
- }
-
- for (size_t level : sdkLevels) {
- Logger::note(source)
- << "creating v" << level << " versioned file."
- << std::endl;
- ConfigDescription newConfig = config;
- newConfig.sdkVersion = level;
-
- std::unique_ptr<FileReference> fileResource = makeFileReference(
- table->getValueStringPool(),
- util::utf16ToUtf8(name.entry) + ".xml",
- name.type,
- newConfig);
- table->addResource(name, newConfig, source.line(0), std::move(fileResource));
- }
- return true;
-}
-
struct CompileItem {
Source source;
ResourceName name;
@@ -345,28 +264,99 @@
std::string extension;
};
-bool compileXml(std::shared_ptr<Resolver> resolver, const CompileItem& item,
- const Source& outputSource, std::queue<CompileItem>* queue) {
+struct LinkItem {
+ Source source;
+ std::string apkPath;
+};
+
+std::string buildFileReference(const CompileItem& item) {
+ std::stringstream path;
+ path << "res/" << item.name.type;
+ if (item.config != ConfigDescription{}) {
+ path << "-" << item.config;
+ }
+ path << "/" << util::utf16ToUtf8(item.name.entry) + "." + item.extension;
+ return path.str();
+}
+
+bool addFileReference(const std::shared_ptr<ResourceTable>& table, const CompileItem& item) {
+ StringPool& pool = table->getValueStringPool();
+ StringPool::Ref ref = pool.makeRef(util::utf8ToUtf16(buildFileReference(item)));
+ return table->addResource(item.name, item.config, item.source.line(0),
+ util::make_unique<FileReference>(ref));
+}
+
+struct AaptOptions {
+ enum class Phase {
+ Link,
+ Compile,
+ };
+
+ // The phase to process.
+ Phase phase;
+
+ // Details about the app.
+ AppInfo appInfo;
+
+ // The location of the manifest file.
+ Source manifest;
+
+ // The APK files to link.
+ std::vector<Source> input;
+
+ // The libraries these files may reference.
+ std::vector<Source> libraries;
+
+ // Output path. This can be a directory or file
+ // depending on the phase.
+ Source output;
+
+ // Directory in which to write binding xml files.
+ Source bindingOutput;
+
+ // Directory to in which to generate R.java.
+ Maybe<Source> generateJavaClass;
+
+ // Whether to output verbose details about
+ // compilation.
+ bool verbose = false;
+
+ // Whether or not to auto-version styles or layouts
+ // referencing attributes defined in a newer SDK
+ // level than the style or layout is defined for.
+ bool versionStylesAndLayouts = true;
+};
+
+
+bool compileXml(const AaptOptions& options, const std::shared_ptr<ResourceTable>& table,
+ const CompileItem& item, std::queue<CompileItem>* outQueue, ZipFile* outApk) {
std::ifstream in(item.source.path, std::ifstream::binary);
if (!in) {
Logger::error(item.source) << strerror(errno) << std::endl;
return false;
}
- std::shared_ptr<BindingXmlPullParser> binding;
- std::shared_ptr<XmlPullParser> xmlParser = std::make_shared<SourceXmlPullParser>(in);
- if (item.name.type == ResourceType::kLayout) {
- binding = std::make_shared<BindingXmlPullParser>(xmlParser);
- xmlParser = binding;
+ BigBuffer outBuffer(1024);
+
+ // No resolver, since we are not compiling attributes here.
+ XmlFlattener flattener(table, {});
+
+ XmlFlattener::Options xmlOptions;
+ if (options.versionStylesAndLayouts) {
+ // We strip attributes that do not belong in this version of the resource.
+ // Non-version qualified resources have an implicit version 1 requirement.
+ xmlOptions.maxSdkAttribute = item.config.sdkVersion ? item.config.sdkVersion : 1;
}
- BigBuffer outBuffer(1024);
- XmlFlattener flattener(resolver);
+ std::shared_ptr<BindingXmlPullParser> binding;
+ std::shared_ptr<XmlPullParser> parser = std::make_shared<SourceXmlPullParser>(in);
+ if (item.name.type == ResourceType::kLayout) {
+ // Layouts may have defined bindings, so we need to make sure they get processed.
+ binding = std::make_shared<BindingXmlPullParser>(parser);
+ parser = binding;
+ }
- // We strip attributes that do not belong in this version of the resource.
- // Non-version qualified resources have an implicit version 1 requirement.
- XmlFlattener::Options options = { item.config.sdkVersion ? item.config.sdkVersion : 1 };
- Maybe<size_t> minStrippedSdk = flattener.flatten(item.source, xmlParser, &outBuffer, options);
+ Maybe<size_t> minStrippedSdk = flattener.flatten(item.source, parser, &outBuffer, xmlOptions);
if (!minStrippedSdk) {
return false;
}
@@ -376,24 +366,29 @@
// with the version of the smallest SDK version stripped.
CompileItem newWork = item;
newWork.config.sdkVersion = minStrippedSdk.value();
- queue->push(newWork);
+ outQueue->push(newWork);
}
- std::ofstream out(outputSource.path, std::ofstream::binary);
- if (!out) {
- Logger::error(outputSource) << strerror(errno) << std::endl;
+ // Write the resulting compiled XML file to the output APK.
+ if (outApk->add(outBuffer, buildFileReference(item).data(), ZipEntry::kCompressStored,
+ nullptr) != android::NO_ERROR) {
+ Logger::error(options.output) << "failed to write compiled '" << item.source << "' to apk."
+ << std::endl;
return false;
}
- if (!util::writeAll(out, outBuffer)) {
- Logger::error(outputSource) << strerror(errno) << std::endl;
- return false;
- }
+ if (binding && !options.bindingOutput.path.empty()) {
+ // We generated a binding xml file, write it out.
+ Source bindingOutput = options.bindingOutput;
+ appendPath(&bindingOutput.path, buildFileReference(item));
- if (binding) {
- // We generated a binding xml file, write it out beside the output file.
- Source bindingOutput = outputSource;
- bindingOutput.path += ".bind.xml";
+ if (!mkdirs(bindingOutput.path)) {
+ Logger::error(bindingOutput) << strerror(errno) << std::endl;
+ return false;
+ }
+
+ appendPath(&bindingOutput.path, "bind.xml");
+
std::ofstream bout(bindingOutput.path);
if (!bout) {
Logger::error(bindingOutput) << strerror(errno) << std::endl;
@@ -408,100 +403,68 @@
return true;
}
-bool compilePng(const Source& source, const Source& output) {
- std::ifstream in(source.path, std::ifstream::binary);
- if (!in) {
- Logger::error(source) << strerror(errno) << std::endl;
+bool linkXml(const AaptOptions& options, const std::shared_ptr<Resolver>& resolver,
+ const LinkItem& item, const void* data, size_t dataLen, ZipFile* outApk) {
+ std::shared_ptr<android::ResXMLTree> tree = std::make_shared<android::ResXMLTree>();
+ if (tree->setTo(data, dataLen, false) != android::NO_ERROR) {
return false;
}
- std::ofstream out(output.path, std::ofstream::binary);
- if (!out) {
- Logger::error(output) << strerror(errno) << std::endl;
+ std::shared_ptr<XmlPullParser> xmlParser = std::make_shared<BinaryXmlPullParser>(tree);
+
+ BigBuffer outBuffer(1024);
+ XmlFlattener flattener({}, resolver);
+ if (!flattener.flatten(item.source, xmlParser, &outBuffer, {})) {
return false;
}
- std::string err;
- Png png;
- if (!png.process(source, in, out, {}, &err)) {
- Logger::error(source) << err << std::endl;
+ if (outApk->add(outBuffer, item.apkPath.data(), ZipEntry::kCompressDeflated, nullptr) !=
+ android::NO_ERROR) {
+ Logger::error(options.output) << "failed to write linked file '" << item.source
+ << "' to apk." << std::endl;
return false;
}
return true;
}
-bool copyFile(const Source& source, const Source& output) {
- std::ifstream in(source.path, std::ifstream::binary);
+bool compilePng(const AaptOptions& options, const CompileItem& item, ZipFile* outApk) {
+ std::ifstream in(item.source.path, std::ifstream::binary);
if (!in) {
- Logger::error(source) << strerror(errno) << std::endl;
+ Logger::error(item.source) << strerror(errno) << std::endl;
return false;
}
- std::ofstream out(output.path, std::ofstream::binary);
- if (!out) {
- Logger::error(output) << strerror(errno) << std::endl;
+ BigBuffer outBuffer(4096);
+ std::string err;
+ Png png;
+ if (!png.process(item.source, in, &outBuffer, {}, &err)) {
+ Logger::error(item.source) << err << std::endl;
return false;
}
- if (out << in.rdbuf()) {
- Logger::error(output) << strerror(errno) << std::endl;
- return true;
+ if (outApk->add(outBuffer, buildFileReference(item).data(), ZipEntry::kCompressStored,
+ nullptr) != android::NO_ERROR) {
+ Logger::error(options.output) << "failed to write compiled '" << item.source
+ << "' to apk." << std::endl;
+ return false;
}
- return false;
+ return true;
}
-struct AaptOptions {
- enum class Phase {
- Full,
- Collect,
- Link,
- Compile,
- Manifest
- };
+bool copyFile(const AaptOptions& options, const CompileItem& item, ZipFile* outApk) {
+ if (outApk->add(item.source.path.data(), buildFileReference(item).data(),
+ ZipEntry::kCompressStored, nullptr) != android::NO_ERROR) {
+ Logger::error(options.output) << "failed to copy file '" << item.source << "' to apk."
+ << std::endl;
+ return false;
+ }
+ return true;
+}
- // The phase to process.
- Phase phase;
-
- // Details about the app.
- AppInfo appInfo;
-
- // The location of the manifest file.
- Source manifest;
-
- // The source directories to walk and find resource files.
- std::vector<Source> sourceDirs;
-
- // The resource files to process and collect.
- std::vector<Source> collectFiles;
-
- // The binary table files to link.
- std::vector<Source> linkFiles;
-
- // The resource files to compile.
- std::vector<Source> compileFiles;
-
- // The libraries these files may reference.
- std::vector<Source> libraries;
-
- // Output path. This can be a directory or file
- // depending on the phase.
- Source output;
-
- // Directory to in which to generate R.java.
- Maybe<Source> generateJavaClass;
-
- // Whether to output verbose details about
- // compilation.
- bool verbose = false;
-};
-
-bool compileAndroidManifest(const std::shared_ptr<Resolver>& resolver,
- const AaptOptions& options) {
- Source outSource = options.output;
- appendPath(&outSource.path, "AndroidManifest.xml");
-
+bool compileManifest(const AaptOptions& options, const std::shared_ptr<Resolver>& resolver,
+ ZipFile* outApk) {
if (options.verbose) {
- Logger::note(outSource) << "compiling AndroidManifest.xml." << std::endl;
+ Logger::note(options.manifest) << "compiling AndroidManifest.xml." << std::endl;
}
std::ifstream in(options.manifest.path, std::ifstream::binary);
@@ -512,23 +475,16 @@
BigBuffer outBuffer(1024);
std::shared_ptr<XmlPullParser> xmlParser = std::make_shared<SourceXmlPullParser>(in);
- XmlFlattener flattener(resolver);
+ XmlFlattener flattener({}, resolver);
- Maybe<size_t> result = flattener.flatten(options.manifest, xmlParser, &outBuffer,
- XmlFlattener::Options{});
- if (!result) {
+ if (!flattener.flatten(options.manifest, xmlParser, &outBuffer, {})) {
return false;
}
- std::unique_ptr<uint8_t[]> data = std::unique_ptr<uint8_t[]>(new uint8_t[outBuffer.size()]);
- uint8_t* p = data.get();
- for (const auto& b : outBuffer) {
- memcpy(p, b.buffer.get(), b.size);
- p += b.size;
- }
+ std::unique_ptr<uint8_t[]> data = util::copy(outBuffer);
android::ResXMLTree tree;
- if (tree.setTo(data.get(), outBuffer.size()) != android::NO_ERROR) {
+ if (tree.setTo(data.get(), outBuffer.size(), false) != android::NO_ERROR) {
return false;
}
@@ -537,14 +493,10 @@
return false;
}
- std::ofstream out(outSource.path, std::ofstream::binary);
- if (!out) {
- Logger::error(outSource) << strerror(errno) << std::endl;
- return false;
- }
-
- if (!util::writeAll(out, outBuffer)) {
- Logger::error(outSource) << strerror(errno) << std::endl;
+ if (outApk->add(data.get(), outBuffer.size(), "AndroidManifest.xml",
+ ZipEntry::kCompressStored, nullptr) != android::NO_ERROR) {
+ Logger::error(options.output) << "failed to write 'AndroidManifest.xml' to apk."
+ << std::endl;
return false;
}
return true;
@@ -562,10 +514,20 @@
return parser.parse(source, pullParser, outInfo);
}
+static void printCommandsAndDie() {
+ std::cerr << "The following commands are supported:" << std::endl << std::endl;
+ std::cerr << "compile compiles a subset of resources" << std::endl;
+ std::cerr << "link links together compiled resources and libraries" << std::endl;
+ std::cerr << std::endl;
+ std::cerr << "run aapt2 with one of the commands and the -h flag for extra details."
+ << std::endl;
+ exit(1);
+}
+
static AaptOptions prepareArgs(int argc, char** argv) {
if (argc < 2) {
- std::cerr << "no command specified." << std::endl;
- exit(1);
+ std::cerr << "no command specified." << std::endl << std::endl;
+ printCommandsAndDie();
}
const StringPiece command(argv[1]);
@@ -574,32 +536,32 @@
AaptOptions options;
- StringPiece outputDescription = "place output in file";
- if (command == "package") {
- options.phase = AaptOptions::Phase::Full;
- outputDescription = "place output in directory";
- } else if (command == "collect") {
- options.phase = AaptOptions::Phase::Collect;
+ if (command == "--version" || command == "version") {
+ std::cout << kAaptVersionStr << std::endl;
+ exit(0);
} else if (command == "link") {
options.phase = AaptOptions::Phase::Link;
} else if (command == "compile") {
options.phase = AaptOptions::Phase::Compile;
- outputDescription = "place output in directory";
- } else if (command == "manifest") {
- options.phase = AaptOptions::Phase::Manifest;
- outputDescription = "place AndroidManifest.xml in directory";
} else {
- std::cerr << "invalid command '" << command << "'." << std::endl;
- exit(1);
+ std::cerr << "invalid command '" << command << "'." << std::endl << std::endl;
+ printCommandsAndDie();
}
- if (options.phase == AaptOptions::Phase::Full) {
- flag::requiredFlag("-S", "add a directory in which to find resources",
+ if (options.phase == AaptOptions::Phase::Compile) {
+ flag::requiredFlag("--package", "Android package name",
[&options](const StringPiece& arg) {
- options.sourceDirs.push_back(Source{ arg.toString() });
+ options.appInfo.package = util::utf8ToUtf16(arg);
});
+ flag::optionalFlag("--binding", "Output directory for binding XML files",
+ [&options](const StringPiece& arg) {
+ options.bindingOutput = Source{ arg.toString() };
+ });
+ flag::optionalSwitch("--no-version", "Disables automatic style and layout versioning",
+ false, &options.versionStylesAndLayouts);
- flag::requiredFlag("-M", "path to AndroidManifest.xml",
+ } else if (options.phase == AaptOptions::Phase::Link) {
+ flag::requiredFlag("--manifest", "AndroidManifest.xml of your app",
[&options](const StringPiece& arg) {
options.manifest = Source{ arg.toString() };
});
@@ -613,35 +575,16 @@
[&options](const StringPiece& arg) {
options.generateJavaClass = Source{ arg.toString() };
});
-
- } else {
- if (options.phase != AaptOptions::Phase::Manifest) {
- flag::requiredFlag("--package", "Android package name",
- [&options](const StringPiece& arg) {
- options.appInfo.package = util::utf8ToUtf16(arg);
- });
- }
-
- if (options.phase != AaptOptions::Phase::Collect) {
- flag::optionalFlag("-I", "add an Android APK to link against",
- [&options](const StringPiece& arg) {
- options.libraries.push_back(Source{ arg.toString() });
- });
- }
-
- if (options.phase == AaptOptions::Phase::Link) {
- flag::optionalFlag("--java", "directory in which to generate R.java",
- [&options](const StringPiece& arg) {
- options.generateJavaClass = Source{ arg.toString() };
- });
- }
}
// Common flags for all steps.
- flag::requiredFlag("-o", outputDescription, [&options](const StringPiece& arg) {
+ flag::requiredFlag("-o", "Output path", [&options](const StringPiece& arg) {
options.output = Source{ arg.toString() };
});
- flag::optionalSwitch("-v", "enables verbose logging", &options.verbose);
+
+ bool help = false;
+ flag::optionalSwitch("-v", "enables verbose logging", true, &options.verbose);
+ flag::optionalSwitch("-h", "displays this help menu", true, &help);
// Build the command string for output (eg. "aapt2 compile").
std::string fullCommand = "aapt2";
@@ -651,28 +594,18 @@
// Actually read the command line flags.
flag::parse(argc, argv, fullCommand);
+ if (help) {
+ flag::usageAndDie(fullCommand);
+ }
+
// Copy all the remaining arguments.
- if (options.phase == AaptOptions::Phase::Collect) {
- for (const std::string& arg : flag::getArgs()) {
- options.collectFiles.push_back(Source{ arg });
- }
- } else if (options.phase == AaptOptions::Phase::Compile) {
- for (const std::string& arg : flag::getArgs()) {
- options.compileFiles.push_back(Source{ arg });
- }
- } else if (options.phase == AaptOptions::Phase::Link) {
- for (const std::string& arg : flag::getArgs()) {
- options.linkFiles.push_back(Source{ arg });
- }
- } else if (options.phase == AaptOptions::Phase::Manifest) {
- if (!flag::getArgs().empty()) {
- options.manifest = Source{ flag::getArgs()[0] };
- }
+ for (const std::string& arg : flag::getArgs()) {
+ options.input.push_back(Source{ arg });
}
return options;
}
-static bool collectValues(const std::shared_ptr<ResourceTable>& table, const Source& source,
+static bool compileValues(const std::shared_ptr<ResourceTable>& table, const Source& source,
const ConfigDescription& config) {
std::ifstream in(source.path, std::ifstream::binary);
if (!in) {
@@ -738,115 +671,91 @@
};
}
-bool doAll(AaptOptions* options, const std::shared_ptr<ResourceTable>& table,
- const std::shared_ptr<Resolver>& resolver) {
- const bool versionStyles = (options->phase == AaptOptions::Phase::Full ||
- options->phase == AaptOptions::Phase::Link);
- const bool verifyNoMissingSymbols = (options->phase == AaptOptions::Phase::Full ||
- options->phase == AaptOptions::Phase::Link);
- const bool compileFiles = (options->phase == AaptOptions::Phase::Full ||
- options->phase == AaptOptions::Phase::Compile);
- const bool flattenTable = (options->phase == AaptOptions::Phase::Full ||
- options->phase == AaptOptions::Phase::Collect ||
- options->phase == AaptOptions::Phase::Link);
- const bool useExtendedChunks = options->phase == AaptOptions::Phase::Collect;
-
- // Build the output table path.
- Source outputTable = options->output;
- if (options->phase == AaptOptions::Phase::Full) {
- appendPath(&outputTable.path, "resources.arsc");
- }
-
- bool error = false;
- std::queue<CompileItem> compileQueue;
-
- // If source directories were specified, walk them looking for resource files.
- if (!options->sourceDirs.empty()) {
- const char* customIgnore = getenv("ANDROID_AAPT_IGNORE");
- FileFilter fileFilter;
- if (customIgnore && customIgnore[0]) {
- fileFilter.setPattern(customIgnore);
- } else {
- fileFilter.setPattern(
- "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~");
- }
-
- for (const Source& source : options->sourceDirs) {
- if (!walkTree(source, fileFilter, &options->collectFiles)) {
- return false;
- }
- }
- }
-
- // Load all binary resource tables.
- for (const Source& source : options->linkFiles) {
- error |= !loadBinaryResourceTable(table, source);
- }
-
- if (error) {
- return false;
- }
-
- // Collect all the resource files.
- // Need to parse the resource type/config/filename.
- for (const Source& source : options->collectFiles) {
- Maybe<ResourcePathData> maybePathData = extractResourcePathData(source);
- if (!maybePathData) {
+bool writeResourceTable(const AaptOptions& options, const std::shared_ptr<ResourceTable>& table,
+ const TableFlattener::Options& flattenerOptions, ZipFile* outApk) {
+ if (table->begin() != table->end()) {
+ BigBuffer buffer(1024);
+ TableFlattener flattener(flattenerOptions);
+ if (!flattener.flatten(&buffer, *table)) {
+ Logger::error() << "failed to flatten resource table." << std::endl;
return false;
}
- const ResourcePathData& pathData = maybePathData.value();
- if (pathData.resourceDir == u"values") {
- if (options->verbose) {
- Logger::note(source) << "collecting values..." << std::endl;
- }
-
- error |= !collectValues(table, source, pathData.config);
- continue;
+ if (options.verbose) {
+ Logger::note() << "Final resource table size=" << util::formatSize(buffer.size())
+ << std::endl;
}
- const ResourceType* type = parseResourceType(pathData.resourceDir);
- if (!type) {
- Logger::error(source) << "invalid resource type '" << pathData.resourceDir << "'."
- << std::endl;
+ if (outApk->add(buffer, "resources.arsc", ZipEntry::kCompressStored, nullptr) !=
+ android::NO_ERROR) {
+ Logger::note(options.output) << "failed to store resource table." << std::endl;
+ return false;
+ }
+ }
+ return true;
+}
+
+static constexpr int kOpenFlags = ZipFile::kOpenCreate | ZipFile::kOpenTruncate |
+ ZipFile::kOpenReadWrite;
+
+bool link(const AaptOptions& options, const std::shared_ptr<ResourceTable>& outTable,
+ const std::shared_ptr<Resolver>& resolver) {
+ std::map<std::shared_ptr<ResourceTable>, std::unique_ptr<ZipFile>> apkFiles;
+ std::unordered_set<std::u16string> linkedPackages;
+
+ // Populate the linkedPackages with our own.
+ linkedPackages.insert(options.appInfo.package);
+
+ // Load all APK files.
+ for (const Source& source : options.input) {
+ std::unique_ptr<ZipFile> zipFile = util::make_unique<ZipFile>();
+ if (zipFile->open(source.path.data(), ZipFile::kOpenReadOnly) != android::NO_ERROR) {
+ Logger::error(source) << "failed to open: " << strerror(errno) << std::endl;
return false;
}
- ResourceName resourceName = { table->getPackage(), *type, pathData.name };
+ std::shared_ptr<ResourceTable> table = std::make_shared<ResourceTable>();
- // Add the file name to the resource table.
- std::unique_ptr<FileReference> fileReference = makeFileReference(
- table->getValueStringPool(),
- util::utf16ToUtf8(pathData.name) + "." + pathData.extension,
- *type, pathData.config);
- error |= !table->addResource(resourceName, pathData.config, source.line(0),
- std::move(fileReference));
-
- if (pathData.extension == "xml") {
- error |= !collectXml(table, source, resourceName, pathData.config);
+ ZipEntry* entry = zipFile->getEntryByName("resources.arsc");
+ if (!entry) {
+ Logger::error(source) << "missing 'resources.arsc'." << std::endl;
+ return false;
}
- compileQueue.push(
- CompileItem{ source, resourceName, pathData.config, pathData.extension });
+ void* uncompressedData = zipFile->uncompress(entry);
+ assert(uncompressedData);
+
+ BinaryResourceParser parser(table, resolver, source, uncompressedData,
+ entry->getUncompressedLen());
+ if (!parser.parse()) {
+ free(uncompressedData);
+ return false;
+ }
+ free(uncompressedData);
+
+ // Keep track of where this table came from.
+ apkFiles[table] = std::move(zipFile);
+
+ // Add the package to the set of linked packages.
+ linkedPackages.insert(table->getPackage());
}
- if (error) {
- return false;
+ for (auto& p : apkFiles) {
+ const std::shared_ptr<ResourceTable>& inTable = p.first;
+
+ if (!outTable->merge(std::move(*inTable))) {
+ return false;
+ }
}
- // Version all styles referencing attributes outside of their specified SDK version.
- if (versionStyles) {
- versionStylesForCompat(table);
- }
+ {
+ // Now that everything is merged, let's link it.
+ Linker linker(outTable, resolver);
+ if (!linker.linkAndValidate()) {
+ return false;
+ }
- // Verify that all references are valid.
- Linker linker(table, resolver);
- if (!linker.linkAndValidate()) {
- return false;
- }
-
- // Verify that all symbols exist.
- if (verifyNoMissingSymbols) {
+ // Verify that all symbols exist.
const auto& unresolvedRefs = linker.getUnresolvedReferences();
if (!unresolvedRefs.empty()) {
for (const auto& entry : unresolvedRefs) {
@@ -859,143 +768,192 @@
}
}
- // Compile files.
- if (compileFiles) {
- // First process any input compile files.
- for (const Source& source : options->compileFiles) {
- Maybe<ResourcePathData> maybePathData = extractResourcePathData(source);
- if (!maybePathData) {
- return false;
- }
-
- const ResourcePathData& pathData = maybePathData.value();
- const ResourceType* type = parseResourceType(pathData.resourceDir);
- if (!type) {
- Logger::error(source) << "invalid resource type '" << pathData.resourceDir
- << "'." << std::endl;
- return false;
- }
-
- ResourceName resourceName = { table->getPackage(), *type, pathData.name };
- compileQueue.push(
- CompileItem{ source, resourceName, pathData.config, pathData.extension });
- }
-
- // Now process the actual compile queue.
- for (; !compileQueue.empty(); compileQueue.pop()) {
- const CompileItem& item = compileQueue.front();
-
- // Create the output directory path from the resource type and config.
- std::stringstream outputPath;
- outputPath << item.name.type;
- if (item.config != ConfigDescription{}) {
- outputPath << "-" << item.config.toString();
- }
-
- Source outSource = options->output;
- appendPath(&outSource.path, "res");
- appendPath(&outSource.path, outputPath.str());
-
- // Make the directory.
- if (!mkdirs(outSource.path)) {
- Logger::error(outSource) << strerror(errno) << std::endl;
- return false;
- }
-
- // Add the file name to the directory path.
- appendPath(&outSource.path, util::utf16ToUtf8(item.name.entry) + "." + item.extension);
-
- if (item.extension == "xml") {
- if (options->verbose) {
- Logger::note(outSource) << "compiling XML file." << std::endl;
- }
-
- error |= !compileXml(resolver, item, outSource, &compileQueue);
- } else if (item.extension == "png" || item.extension == "9.png") {
- if (options->verbose) {
- Logger::note(outSource) << "compiling png file." << std::endl;
- }
-
- error |= !compilePng(item.source, outSource);
- } else {
- error |= !copyFile(item.source, outSource);
- }
- }
-
- if (error) {
- return false;
- }
+ // Open the output APK file for writing.
+ ZipFile outApk;
+ if (outApk.open(options.output.path.data(), kOpenFlags) != android::NO_ERROR) {
+ Logger::error(options.output) << "failed to open: " << strerror(errno) << std::endl;
+ return false;
}
- // Compile and validate the AndroidManifest.xml.
- if (!options->manifest.path.empty()) {
- if (!compileAndroidManifest(resolver, *options)) {
- return false;
+ if (!compileManifest(options, resolver, &outApk)) {
+ return false;
+ }
+
+ for (auto& p : apkFiles) {
+ std::unique_ptr<ZipFile>& zipFile = p.second;
+
+ // TODO(adamlesinski): Get list of files to read when processing config filter.
+
+ const int numEntries = zipFile->getNumEntries();
+ for (int i = 0; i < numEntries; i++) {
+ ZipEntry* entry = zipFile->getEntryByIndex(i);
+ assert(entry);
+
+ StringPiece filename = entry->getFileName();
+ if (!util::stringStartsWith<char>(filename, "res/")) {
+ continue;
+ }
+
+ if (util::stringEndsWith<char>(filename, ".xml")) {
+ void* uncompressedData = zipFile->uncompress(entry);
+ assert(uncompressedData);
+
+ LinkItem item = { Source{ filename.toString() }, filename.toString() };
+
+ if (!linkXml(options, resolver, item, uncompressedData,
+ entry->getUncompressedLen(), &outApk)) {
+ Logger::error(options.output) << "failed to link '" << filename << "'."
+ << std::endl;
+ return false;
+ }
+ } else {
+ if (outApk.add(zipFile.get(), entry, 0, nullptr) != android::NO_ERROR) {
+ Logger::error(options.output) << "failed to copy '" << filename << "'."
+ << std::endl;
+ return false;
+ }
+ }
}
}
// Generate the Java class file.
- if (options->generateJavaClass) {
- Source outPath = options->generateJavaClass.value();
- if (options->verbose) {
- Logger::note() << "writing symbols to " << outPath << "." << std::endl;
- }
+ if (options.generateJavaClass) {
+ JavaClassGenerator generator(outTable, {});
- // Build the output directory from the package name.
- // Eg. com.android.app -> com/android/app
- const std::string packageUtf8 = util::utf16ToUtf8(table->getPackage());
- for (StringPiece part : util::tokenize<char>(packageUtf8, '.')) {
- appendPath(&outPath.path, part);
- }
+ for (const std::u16string& package : linkedPackages) {
+ Source outPath = options.generateJavaClass.value();
- if (!mkdirs(outPath.path)) {
- Logger::error(outPath) << strerror(errno) << std::endl;
- return false;
- }
+ // Build the output directory from the package name.
+ // Eg. com.android.app -> com/android/app
+ const std::string packageUtf8 = util::utf16ToUtf8(package);
+ for (StringPiece part : util::tokenize<char>(packageUtf8, '.')) {
+ appendPath(&outPath.path, part);
+ }
- appendPath(&outPath.path, "R.java");
+ if (!mkdirs(outPath.path)) {
+ Logger::error(outPath) << strerror(errno) << std::endl;
+ return false;
+ }
- std::ofstream fout(outPath.path);
- if (!fout) {
- Logger::error(outPath) << strerror(errno) << std::endl;
- return false;
- }
+ appendPath(&outPath.path, "R.java");
- JavaClassGenerator generator(table, {});
- if (!generator.generate(fout)) {
- Logger::error(outPath) << generator.getError() << "." << std::endl;
- return false;
+ if (options.verbose) {
+ Logger::note(outPath) << "writing Java symbols." << std::endl;
+ }
+
+ std::ofstream fout(outPath.path);
+ if (!fout) {
+ Logger::error(outPath) << strerror(errno) << std::endl;
+ return false;
+ }
+
+ if (!generator.generate(package, fout)) {
+ Logger::error(outPath) << generator.getError() << "." << std::endl;
+ return false;
+ }
}
}
// Flatten the resource table.
- if (flattenTable && table->begin() != table->end()) {
- BigBuffer buffer(1024);
- TableFlattener::Options tableOptions;
- tableOptions.useExtendedChunks = useExtendedChunks;
- TableFlattener flattener(tableOptions);
- if (!flattener.flatten(&buffer, *table)) {
- Logger::error() << "failed to flatten resource table." << std::endl;
- return false;
- }
-
- if (options->verbose) {
- Logger::note() << "Final resource table size=" << util::formatSize(buffer.size())
- << std::endl;
- }
-
- std::ofstream fout(outputTable.path, std::ofstream::binary);
- if (!fout) {
- Logger::error(outputTable) << strerror(errno) << "." << std::endl;
- return false;
- }
-
- if (!util::writeAll(fout, buffer)) {
- Logger::error(outputTable) << strerror(errno) << "." << std::endl;
- return false;
- }
- fout.flush();
+ TableFlattener::Options flattenerOptions;
+ flattenerOptions.useExtendedChunks = false;
+ if (!writeResourceTable(options, outTable, flattenerOptions, &outApk)) {
+ return false;
}
+
+ outApk.flush();
+ return true;
+}
+
+bool compile(const AaptOptions& options, const std::shared_ptr<ResourceTable>& table,
+ const std::shared_ptr<Resolver>& resolver) {
+ std::queue<CompileItem> compileQueue;
+ bool error = false;
+
+ // Compile all the resource files passed in on the command line.
+ for (const Source& source : options.input) {
+ // Need to parse the resource type/config/filename.
+ Maybe<ResourcePathData> maybePathData = extractResourcePathData(source);
+ if (!maybePathData) {
+ return false;
+ }
+
+ const ResourcePathData& pathData = maybePathData.value();
+ if (pathData.resourceDir == u"values") {
+ // The file is in the values directory, which means its contents will
+ // go into the resource table.
+ if (options.verbose) {
+ Logger::note(source) << "compiling values." << std::endl;
+ }
+
+ error |= !compileValues(table, source, pathData.config);
+ } else {
+ // The file is in a directory like 'layout' or 'drawable'. Find out
+ // the type.
+ const ResourceType* type = parseResourceType(pathData.resourceDir);
+ if (!type) {
+ Logger::error(source) << "invalid resource type '" << pathData.resourceDir << "'."
+ << std::endl;
+ return false;
+ }
+
+ compileQueue.push(CompileItem{
+ source,
+ ResourceName{ table->getPackage(), *type, pathData.name },
+ pathData.config,
+ pathData.extension
+ });
+ }
+ }
+
+ if (error) {
+ return false;
+ }
+
+ // Version all styles referencing attributes outside of their specified SDK version.
+ if (options.versionStylesAndLayouts) {
+ versionStylesForCompat(table);
+ }
+
+ // Open the output APK file for writing.
+ ZipFile outApk;
+ if (outApk.open(options.output.path.data(), kOpenFlags) != android::NO_ERROR) {
+ Logger::error(options.output) << "failed to open: " << strerror(errno) << std::endl;
+ return false;
+ }
+
+ // Compile each file.
+ for (; !compileQueue.empty(); compileQueue.pop()) {
+ const CompileItem& item = compileQueue.front();
+
+ // Add the file name to the resource table.
+ error |= !addFileReference(table, item);
+
+ if (item.extension == "xml") {
+ error |= !compileXml(options, table, item, &compileQueue, &outApk);
+ } else if (item.extension == "png" || item.extension == "9.png") {
+ error |= !compilePng(options, item, &outApk);
+ } else {
+ error |= !copyFile(options, item, &outApk);
+ }
+ }
+
+ if (error) {
+ return false;
+ }
+
+ // Link and assign resource IDs.
+ Linker linker(table, resolver);
+ if (!linker.linkAndValidate()) {
+ return false;
+ }
+
+ // Flatten the resource table.
+ if (!writeResourceTable(options, table, {}, &outApk)) {
+ return false;
+ }
+
+ outApk.flush();
return true;
}
@@ -1057,10 +1015,16 @@
// Make the resolver that will cache IDs for us.
std::shared_ptr<Resolver> resolver = std::make_shared<Resolver>(table, libraries);
- // Do the work.
- if (!doAll(&options, table, resolver)) {
- Logger::error() << "aapt exiting with failures." << std::endl;
- return 1;
+ if (options.phase == AaptOptions::Phase::Compile) {
+ if (!compile(options, table, resolver)) {
+ Logger::error() << "aapt exiting with failures." << std::endl;
+ return 1;
+ }
+ } else if (options.phase == AaptOptions::Phase::Link) {
+ if (!link(options, table, resolver)) {
+ Logger::error() << "aapt exiting with failures." << std::endl;
+ return 1;
+ }
}
return 0;
}
diff --git a/tools/aapt2/NameMangler.h b/tools/aapt2/NameMangler.h
new file mode 100644
index 0000000..1e15e20
--- /dev/null
+++ b/tools/aapt2/NameMangler.h
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+#ifndef AAPT_NAME_MANGLER_H
+#define AAPT_NAME_MANGLER_H
+
+#include <string>
+
+namespace aapt {
+
+struct NameMangler {
+ /**
+ * Mangles the name in `outName` with the `package` and stores the mangled
+ * result in `outName`. The mangled name should contain symbols that are
+ * illegal to define in XML, so that there will never be name mangling
+ * collisions.
+ */
+ static void mangle(const std::u16string& package, std::u16string* outName) {
+ *outName = package + u"$" + *outName;
+ }
+
+ /**
+ * Unmangles the name in `outName`, storing the correct name back in `outName`
+ * and the package in `outPackage`. Returns true if the name was unmangled or
+ * false if the name was never mangled to begin with.
+ */
+ static bool unmangle(std::u16string* outName, std::u16string* outPackage) {
+ size_t pivot = outName->find(u'$');
+ if (pivot == std::string::npos) {
+ return false;
+ }
+
+ outPackage->assign(outName->data(), pivot);
+ outName->assign(outName->data() + pivot + 1, outName->size() - (pivot + 1));
+ return true;
+ }
+};
+
+} // namespace aapt
+
+#endif // AAPT_NAME_MANGLER_H
diff --git a/tools/aapt2/NameMangler_test.cpp b/tools/aapt2/NameMangler_test.cpp
new file mode 100644
index 0000000..6103655
--- /dev/null
+++ b/tools/aapt2/NameMangler_test.cpp
@@ -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.
+ */
+
+#include "NameMangler.h"
+
+#include <gtest/gtest.h>
+#include <string>
+
+namespace aapt {
+
+TEST(NameManglerTest, MangleName) {
+ std::u16string package = u"android.appcompat";
+ std::u16string name = u"Platform.AppCompat";
+
+ NameMangler::mangle(package, &name);
+ EXPECT_EQ(name, u"android.appcompat$Platform.AppCompat");
+
+ std::u16string newPackage;
+ ASSERT_TRUE(NameMangler::unmangle(&name, &newPackage));
+ EXPECT_EQ(name, u"Platform.AppCompat");
+ EXPECT_EQ(newPackage, u"android.appcompat");
+}
+
+TEST(NameManglerTest, IgnoreUnmangledName) {
+ std::u16string package;
+ std::u16string name = u"foo_bar";
+
+ EXPECT_FALSE(NameMangler::unmangle(&name, &package));
+ EXPECT_EQ(name, u"foo_bar");
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/Png.cpp b/tools/aapt2/Png.cpp
index 76120ac..4e9b68e 100644
--- a/tools/aapt2/Png.cpp
+++ b/tools/aapt2/Png.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include "BigBuffer.h"
#include "Logger.h"
#include "Png.h"
#include "Source.h"
@@ -85,17 +86,12 @@
}
static void writeDataToStream(png_structp writePtr, png_bytep data, png_size_t length) {
- std::ostream* output = reinterpret_cast<std::ostream*>(png_get_io_ptr(writePtr));
- if (!output->write(reinterpret_cast<const char*>(data), length)) {
- png_error(writePtr, strerror(errno));
- }
+ BigBuffer* outBuffer = reinterpret_cast<BigBuffer*>(png_get_io_ptr(writePtr));
+ png_bytep buf = outBuffer->nextBlock<png_byte>(length);
+ memcpy(buf, data, length);
}
-static void flushDataToStream(png_structp writePtr) {
- std::ostream* output = reinterpret_cast<std::ostream*>(png_get_io_ptr(writePtr));
- if (!output->flush()) {
- png_error(writePtr, strerror(errno));
- }
+static void flushDataToStream(png_structp /*writePtr*/) {
}
static void logWarning(png_structp readPtr, png_const_charp warningMessage) {
@@ -1196,7 +1192,7 @@
}
-bool Png::process(const Source& source, std::istream& input, std::ostream& output,
+bool Png::process(const Source& source, std::istream& input, BigBuffer* outBuffer,
const Options& options, std::string* outError) {
png_byte signature[kPngSignatureSize];
@@ -1262,7 +1258,7 @@
png_set_error_fn(writePtr, nullptr, nullptr, logWarning);
// Set the write function to write to std::ostream.
- png_set_write_fn(writePtr, (png_voidp)&output, writeDataToStream, flushDataToStream);
+ png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream, flushDataToStream);
if (!writePng(writePtr, writeInfoPtr, &pngInfo, options.grayScaleTolerance, &logger,
outError)) {
diff --git a/tools/aapt2/Png.h b/tools/aapt2/Png.h
index bc80754..4577ab8 100644
--- a/tools/aapt2/Png.h
+++ b/tools/aapt2/Png.h
@@ -17,6 +17,7 @@
#ifndef AAPT_PNG_H
#define AAPT_PNG_H
+#include "BigBuffer.h"
#include "Source.h"
#include <iostream>
@@ -29,7 +30,7 @@
int grayScaleTolerance = 0;
};
- bool process(const Source& source, std::istream& input, std::ostream& output,
+ bool process(const Source& source, std::istream& input, BigBuffer* outBuffer,
const Options& options, std::string* outError);
};
diff --git a/tools/aapt2/ResChunkPullParser.h b/tools/aapt2/ResChunkPullParser.h
index 7366c89..1426ed2 100644
--- a/tools/aapt2/ResChunkPullParser.h
+++ b/tools/aapt2/ResChunkPullParser.h
@@ -74,6 +74,22 @@
std::string mLastError;
};
+template <typename T>
+inline static const T* convertTo(const android::ResChunk_header* chunk) {
+ if (chunk->headerSize < sizeof(T)) {
+ return nullptr;
+ }
+ return reinterpret_cast<const T*>(chunk);
+}
+
+inline static const uint8_t* getChunkData(const android::ResChunk_header& chunk) {
+ return reinterpret_cast<const uint8_t*>(&chunk) + chunk.headerSize;
+}
+
+inline static size_t getChunkDataLen(const android::ResChunk_header& chunk) {
+ return chunk.size - chunk.headerSize;
+}
+
//
// Implementation
//
diff --git a/tools/aapt2/Resolver.cpp b/tools/aapt2/Resolver.cpp
index 93b5e98..ae006ab 100644
--- a/tools/aapt2/Resolver.cpp
+++ b/tools/aapt2/Resolver.cpp
@@ -15,6 +15,7 @@
*/
#include "Maybe.h"
+#include "NameMangler.h"
#include "Resolver.h"
#include "Resource.h"
#include "ResourceTable.h"
@@ -31,6 +32,12 @@
Resolver::Resolver(std::shared_ptr<const ResourceTable> table,
std::shared_ptr<const android::AssetManager> sources) :
mTable(table), mSources(sources) {
+ const android::ResTable& resTable = mSources->getResources(false);
+ const size_t packageCount = resTable.getBasePackageCount();
+ for (size_t i = 0; i < packageCount; i++) {
+ std::u16string packageName = resTable.getBasePackageName(i).string();
+ mIncludedPackages.insert(std::move(packageName));
+ }
}
Maybe<ResourceId> Resolver::findId(const ResourceName& name) {
@@ -47,9 +54,31 @@
return Entry{ cacheIter->second.id, cacheIter->second.attr.get() };
}
+ ResourceName mangledName;
+ const ResourceName* nameToSearch = &name;
+ if (name.package != mTable->getPackage()) {
+ // This may be a reference to an included resource or
+ // to a mangled resource.
+ if (mIncludedPackages.find(name.package) == mIncludedPackages.end()) {
+ // This is not in our included set, so mangle the name and
+ // check for that.
+ mangledName.entry = name.entry;
+ NameMangler::mangle(name.package, &mangledName.entry);
+ mangledName.package = mTable->getPackage();
+ mangledName.type = name.type;
+ nameToSearch = &mangledName;
+ } else {
+ const CacheEntry* cacheEntry = buildCacheEntry(name);
+ if (cacheEntry) {
+ return Entry{ cacheEntry->id, cacheEntry->attr.get() };
+ }
+ return {};
+ }
+ }
+
const ResourceTableType* type;
const ResourceEntry* entry;
- std::tie(type, entry) = mTable->findResource(name);
+ std::tie(type, entry) = mTable->findResource(*nameToSearch);
if (type && entry) {
Entry result = {};
if (mTable->getPackageId() != ResourceTable::kUnsetPackageId &&
@@ -65,11 +94,6 @@
}
return result;
}
-
- const CacheEntry* cacheEntry = buildCacheEntry(name);
- if (cacheEntry) {
- return Entry{ cacheEntry->id, cacheEntry->attr.get() };
- }
return {};
}
diff --git a/tools/aapt2/Resolver.h b/tools/aapt2/Resolver.h
index 90a8cd9..cb2234d 100644
--- a/tools/aapt2/Resolver.h
+++ b/tools/aapt2/Resolver.h
@@ -26,6 +26,7 @@
#include <androidfw/ResourceTypes.h>
#include <memory>
#include <vector>
+#include <unordered_set>
namespace aapt {
@@ -94,6 +95,7 @@
std::shared_ptr<const ResourceTable> mTable;
std::shared_ptr<const android::AssetManager> mSources;
std::map<ResourceName, CacheEntry> mCache;
+ std::unordered_set<std::u16string> mIncludedPackages;
};
inline const std::u16string& Resolver::getDefaultPackage() const {
diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h
index 4d2c64c..f928acd 100644
--- a/tools/aapt2/Resource.h
+++ b/tools/aapt2/Resource.h
@@ -193,8 +193,7 @@
// ResourceType implementation.
//
-inline ::std::ostream& operator<<(::std::ostream& out,
- const ResourceType& val) {
+inline ::std::ostream& operator<<(::std::ostream& out, const ResourceType& val) {
return out << toString(val);
}
@@ -221,6 +220,14 @@
!= std::tie(rhs.package, rhs.type, rhs.entry);
}
+inline ::std::ostream& operator<<(::std::ostream& out, const ResourceName& name) {
+ if (!name.package.empty()) {
+ out << name.package << ":";
+ }
+ return out << name.type << "/" << name.entry;
+}
+
+
//
// ResourceNameRef implementation.
//
@@ -264,8 +271,7 @@
!= std::tie(rhs.package, rhs.type, rhs.entry);
}
-inline ::std::ostream& operator<<(::std::ostream& out,
- const ResourceNameRef& name) {
+inline ::std::ostream& operator<<(::std::ostream& out, const ResourceNameRef& name) {
if (!name.package.empty()) {
out << name.package << ":";
}
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 4c96187..943892d 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -22,6 +22,8 @@
#include "Util.h"
#include "XliffXmlPullParser.h"
+#include <sstream>
+
namespace aapt {
void ResourceParser::extractResourceName(const StringPiece16& str, StringPiece16* outPackage,
@@ -107,6 +109,71 @@
return false;
}
+/*
+ * Style parent's are a bit different. We accept the following formats:
+ *
+ * @[package:]style/<entry>
+ * ?[package:]style/<entry>
+ * <package>:[style/]<entry>
+ * [package:style/]<entry>
+ */
+bool ResourceParser::parseStyleParentReference(const StringPiece16& str, Reference* outReference,
+ std::string* outError) {
+ if (str.empty()) {
+ return true;
+ }
+
+ StringPiece16 name = str;
+
+ bool hasLeadingIdentifiers = false;
+ bool privateRef = false;
+
+ // Skip over these identifiers. A style's parent is a normal reference.
+ if (name.data()[0] == u'@' || name.data()[0] == u'?') {
+ hasLeadingIdentifiers = true;
+ name = name.substr(1, name.size() - 1);
+ if (name.data()[0] == u'*') {
+ privateRef = true;
+ name = name.substr(1, name.size() - 1);
+ }
+ }
+
+ ResourceNameRef ref;
+ ref.type = ResourceType::kStyle;
+
+ StringPiece16 typeStr;
+ extractResourceName(name, &ref.package, &typeStr, &ref.entry);
+ if (!typeStr.empty()) {
+ // If we have a type, make sure it is a Style.
+ const ResourceType* parsedType = parseResourceType(typeStr);
+ if (!parsedType || *parsedType != ResourceType::kStyle) {
+ std::stringstream err;
+ err << "invalid resource type '" << typeStr << "' for parent of style";
+ *outError = err.str();
+ return false;
+ }
+ } else {
+ // No type was defined, this should not have a leading identifier.
+ if (hasLeadingIdentifiers) {
+ std::stringstream err;
+ err << "invalid parent reference '" << str << "'";
+ *outError = err.str();
+ return false;
+ }
+ }
+
+ if (!hasLeadingIdentifiers && ref.package.empty() && !typeStr.empty()) {
+ std::stringstream err;
+ err << "invalid parent reference '" << str << "'";
+ *outError = err.str();
+ return false;
+ }
+
+ outReference->name = ref.toResourceName();
+ outReference->privateReference = privateRef;
+ return true;
+}
+
std::unique_ptr<Reference> ResourceParser::tryParseReference(const StringPiece16& str,
const StringPiece16& defaultPackage,
bool* outCreate) {
@@ -885,15 +952,16 @@
bool ResourceParser::parseAttr(XmlPullParser* parser, const ResourceNameRef& resourceName) {
const SourceLine source = mSource.line(parser->getLineNumber());
- std::unique_ptr<Attribute> attr = parseAttrImpl(parser, resourceName, false);
+ ResourceName actualName = resourceName.toResourceName();
+ std::unique_ptr<Attribute> attr = parseAttrImpl(parser, &actualName, false);
if (!attr) {
return false;
}
- return mTable->addResource(resourceName, mConfig, source, std::move(attr));
+ return mTable->addResource(actualName, mConfig, source, std::move(attr));
}
std::unique_ptr<Attribute> ResourceParser::parseAttrImpl(XmlPullParser* parser,
- const ResourceNameRef& resourceName,
+ ResourceName* resourceName,
bool weak) {
uint32_t typeMask = 0;
@@ -911,6 +979,18 @@
}
}
+ // If this is a declaration, the package name may be in the name. Separate these out.
+ // Eg. <attr name="android:text" />
+ // No format attribute is allowed.
+ if (weak && formatAttrIter == endAttrIter) {
+ StringPiece16 package, type, name;
+ extractResourceName(resourceName->entry, &package, &type, &name);
+ if (type.empty() && !package.empty()) {
+ resourceName->package = package.toString();
+ resourceName->entry = name.toString();
+ }
+ }
+
std::vector<Attribute::Symbol> items;
bool error = false;
@@ -1079,31 +1159,15 @@
bool ResourceParser::parseStyle(XmlPullParser* parser, const ResourceNameRef& resourceName) {
const SourceLine source = mSource.line(parser->getLineNumber());
- std::unique_ptr<Style> style = util::make_unique<Style>();
+ std::unique_ptr<Style> style = util::make_unique<Style>(false);
const auto endAttrIter = parser->endAttributes();
const auto parentAttrIter = parser->findAttribute(u"", u"parent");
if (parentAttrIter != endAttrIter) {
- ResourceNameRef ref;
- bool create = false;
- bool privateRef = false;
- if (tryParseReference(parentAttrIter->value, &ref, &create, &privateRef)) {
- if (create) {
- mLogger.error(source.line)
- << "parent of style can not be an ID."
- << std::endl;
- return false;
- }
- style->parent.name = ref.toResourceName();
- style->parent.privateReference = privateRef;
- } else if (tryParseAttributeReference(parentAttrIter->value, &ref)) {
- style->parent.name = ref.toResourceName();
- } else {
- // TODO(adamlesinski): Try parsing without the '@' or '?'.
- // Also, make sure to check the entry name for weird symbols.
- style->parent.name = ResourceName {
- {}, ResourceType::kStyle, parentAttrIter->value
- };
+ std::string errStr;
+ if (!parseStyleParentReference(parentAttrIter->value, &style->parent, &errStr)) {
+ mLogger.error(source.line) << errStr << "." << std::endl;
+ return false;
}
if (style->parent.name.package.empty()) {
@@ -1277,15 +1341,13 @@
}
// Copy because our iterator will be invalidated.
- std::u16string attrName = attrIter->value;
-
- ResourceNameRef attrResourceName = {
+ ResourceName attrResourceName = {
mTable->getPackage(),
ResourceType::kAttr,
- attrName
+ attrIter->value
};
- std::unique_ptr<Attribute> attr = parseAttrImpl(&childParser, attrResourceName, true);
+ std::unique_ptr<Attribute> attr = parseAttrImpl(&childParser, &attrResourceName, true);
if (!attr) {
success = false;
continue;
@@ -1293,9 +1355,13 @@
styleable->entries.emplace_back(attrResourceName);
- success &= mTable->addResource(attrResourceName, mConfig,
- mSource.line(childParser.getLineNumber()),
- std::move(attr));
+ // The package may have been corrected to another package. If that is so,
+ // we don't add the declaration.
+ if (attrResourceName.package == mTable->getPackage()) {
+ success &= mTable->addResource(attrResourceName, mConfig,
+ mSource.line(childParser.getLineNumber()),
+ std::move(attr));
+ }
} else if (elementName != u"eat-comment" && elementName != u"skip") {
mLogger.error(childParser.getLineNumber())
diff --git a/tools/aapt2/ResourceParser.h b/tools/aapt2/ResourceParser.h
index 96bba4f..52194bd 100644
--- a/tools/aapt2/ResourceParser.h
+++ b/tools/aapt2/ResourceParser.h
@@ -64,6 +64,17 @@
ResourceNameRef* outReference);
/*
+ * Returns true if the string `str` was parsed as a valid reference to a style.
+ * The format for a style parent is slightly more flexible than a normal reference:
+ *
+ * @[package:]style/<entry> or
+ * ?[package:]style/<entry> or
+ * <package>:[style/]<entry>
+ */
+ static bool parseStyleParentReference(const StringPiece16& str, Reference* outReference,
+ std::string* outError);
+
+ /*
* Returns a Reference object if the string was parsed as a resource or attribute reference,
* ( @[+][package:]type/name | ?[package:]type/name )
* assigning defaultPackage if the package was not present in the string, and setting
@@ -166,7 +177,7 @@
bool parsePublic(XmlPullParser* parser, const StringPiece16& name);
bool parseAttr(XmlPullParser* parser, const ResourceNameRef& resourceName);
std::unique_ptr<Attribute> parseAttrImpl(XmlPullParser* parser,
- const ResourceNameRef& resourceName,
+ ResourceName* resourceName,
bool weak);
bool parseEnumOrFlagItem(XmlPullParser* parser, const StringPiece16& tag,
Attribute::Symbol* outSymbol);
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index 5afbaf4..63352de 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -94,6 +94,31 @@
&privateRef));
}
+TEST(ResourceParserReferenceTest, ParseStyleParentReference) {
+ Reference ref;
+ std::string errStr;
+ EXPECT_TRUE(ResourceParser::parseStyleParentReference(u"@android:style/foo", &ref, &errStr));
+ EXPECT_EQ(ref.name, (ResourceName{ u"android", ResourceType::kStyle, u"foo" }));
+
+ EXPECT_TRUE(ResourceParser::parseStyleParentReference(u"@style/foo", &ref, &errStr));
+ EXPECT_EQ(ref.name, (ResourceName{ {}, ResourceType::kStyle, u"foo" }));
+
+ EXPECT_TRUE(ResourceParser::parseStyleParentReference(u"?android:style/foo", &ref, &errStr));
+ EXPECT_EQ(ref.name, (ResourceName{ u"android", ResourceType::kStyle, u"foo" }));
+
+ EXPECT_TRUE(ResourceParser::parseStyleParentReference(u"?style/foo", &ref, &errStr));
+ EXPECT_EQ(ref.name, (ResourceName{ {}, ResourceType::kStyle, u"foo" }));
+
+ EXPECT_TRUE(ResourceParser::parseStyleParentReference(u"android:style/foo", &ref, &errStr));
+ EXPECT_EQ(ref.name, (ResourceName{ u"android", ResourceType::kStyle, u"foo" }));
+
+ EXPECT_TRUE(ResourceParser::parseStyleParentReference(u"android:foo", &ref, &errStr));
+ EXPECT_EQ(ref.name, (ResourceName{ u"android", ResourceType::kStyle, u"foo" }));
+
+ EXPECT_TRUE(ResourceParser::parseStyleParentReference(u"foo", &ref, &errStr));
+ EXPECT_EQ(ref.name, (ResourceName{ {}, ResourceType::kStyle, u"foo" }));
+}
+
struct ResourceParserTest : public ::testing::Test {
virtual void SetUp() override {
mTable = std::make_shared<ResourceTable>();
@@ -283,7 +308,7 @@
TEST_F(ResourceParserTest, ParseStyle) {
std::stringstream input;
- input << "<style name=\"foo\" parent=\"fu\">" << std::endl
+ input << "<style name=\"foo\" parent=\"@style/fu\">" << std::endl
<< " <item name=\"bar\">#ffffffff</item>" << std::endl
<< " <item name=\"bat\">@string/hey</item>" << std::endl
<< " <item name=\"baz\"><b>hey</b></item>" << std::endl
@@ -304,6 +329,17 @@
(ResourceName{ u"android", ResourceType::kAttr, u"baz" }));
}
+TEST_F(ResourceParserTest, ParseStyleWithShorthandParent) {
+ std::stringstream input;
+ input << "<style name=\"foo\" parent=\"com.app:Theme\"/>" << std::endl;
+ ASSERT_TRUE(testParse(input));
+
+ const Style* style = findResource<Style>(
+ ResourceName{ u"android", ResourceType::kStyle, u"foo" });
+ ASSERT_NE(style, nullptr);
+ EXPECT_EQ(ResourceNameRef(u"com.app", ResourceType::kStyle, u"Theme"), style->parent.name);
+}
+
TEST_F(ResourceParserTest, ParseAutoGeneratedIdReference) {
std::stringstream input;
input << "<string name=\"foo\">@+id/bar</string>" << std::endl;
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index 794090d0..02be651 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -16,6 +16,7 @@
#include "ConfigDescription.h"
#include "Logger.h"
+#include "NameMangler.h"
#include "ResourceTable.h"
#include "ResourceValues.h"
#include "Util.h"
@@ -311,6 +312,71 @@
return true;
}
+bool ResourceTable::merge(ResourceTable&& other) {
+ const bool mangleNames = mPackage != other.getPackage();
+ std::u16string mangledName;
+
+ for (auto& otherType : other) {
+ std::unique_ptr<ResourceTableType>& type = findOrCreateType(otherType->type);
+ if (type->publicStatus.isPublic && otherType->publicStatus.isPublic &&
+ type->typeId != otherType->typeId) {
+ Logger::error() << "can not merge type '" << type->type << "': conflicting public IDs "
+ << "(" << type->typeId << " vs " << otherType->typeId << ")."
+ << std::endl;
+ return false;
+ }
+
+ for (auto& otherEntry : otherType->entries) {
+ const std::u16string* nameToAdd = &otherEntry->name;
+ if (mangleNames) {
+ mangledName = otherEntry->name;
+ NameMangler::mangle(other.getPackage(), &mangledName);
+ nameToAdd = &mangledName;
+ }
+
+ std::unique_ptr<ResourceEntry>& entry = findOrCreateEntry(type, *nameToAdd);
+ if (entry->publicStatus.isPublic && otherEntry->publicStatus.isPublic &&
+ entry->entryId != otherEntry->entryId) {
+ Logger::error() << "can not merge entry '" << type->type << "/" << entry->name
+ << "': conflicting public IDs "
+ << "(" << entry->entryId << " vs " << entry->entryId << ")."
+ << std::endl;
+ return false;
+ }
+
+ for (ResourceConfigValue& otherValue : otherEntry->values) {
+ auto iter = std::lower_bound(entry->values.begin(), entry->values.end(),
+ otherValue.config, compareConfigs);
+ if (iter != entry->values.end() && iter->config == otherValue.config) {
+ int collisionResult = defaultCollisionHandler(*iter->value, *otherValue.value);
+ if (collisionResult > 0) {
+ // Take the incoming value.
+ iter->source = std::move(otherValue.source);
+ iter->comment = std::move(otherValue.comment);
+ iter->value = std::unique_ptr<Value>(otherValue.value->clone(&mValuePool));
+ } else if (collisionResult == 0) {
+ ResourceNameRef resourceName = { mPackage, type->type, entry->name };
+ Logger::error(otherValue.source)
+ << "resource '" << resourceName << "' has a conflicting value for "
+ << "configuration (" << otherValue.config << ")."
+ << std::endl;
+ Logger::note(iter->source) << "originally defined here." << std::endl;
+ return false;
+ }
+ } else {
+ entry->values.insert(iter, ResourceConfigValue{
+ otherValue.config,
+ std::move(otherValue.source),
+ std::move(otherValue.comment),
+ std::unique_ptr<Value>(otherValue.value->clone(&mValuePool)),
+ });
+ }
+ }
+ }
+ }
+ return true;
+}
+
std::tuple<const ResourceTableType*, const ResourceEntry*>
ResourceTable::findResource(const ResourceNameRef& name) const {
if (name.package != mPackage) {
diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h
index 57b5213..3591d11 100644
--- a/tools/aapt2/ResourceTable.h
+++ b/tools/aapt2/ResourceTable.h
@@ -148,6 +148,12 @@
bool markPublic(const ResourceNameRef& name, const ResourceId resId, const SourceLine& source);
+ /*
+ * Merges the resources from `other` into this table, mangling the names of the resources
+ * if `other` has a different package name.
+ */
+ bool merge(ResourceTable&& other);
+
/**
* Returns the string pool used by this ResourceTable.
* Values that reference strings should use this pool to create
diff --git a/tools/aapt2/ResourceTable_test.cpp b/tools/aapt2/ResourceTable_test.cpp
index 785ea15..06d8699 100644
--- a/tools/aapt2/ResourceTable_test.cpp
+++ b/tools/aapt2/ResourceTable_test.cpp
@@ -31,7 +31,7 @@
TestValue(StringPiece16 str) : value(str.toString()) {
}
- TestValue* clone() const override {
+ TestValue* clone(StringPool* /*newPool*/) const override {
return new TestValue(value);
}
@@ -48,7 +48,7 @@
return true;
}
- TestWeakValue* clone() const override {
+ TestWeakValue* clone(StringPool* /*newPool*/) const override {
return new TestWeakValue();
}
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index 60ef1a8..3a6d65d 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -39,8 +39,8 @@
RawString::RawString(const StringPool::Ref& ref) : value(ref) {
}
-RawString* RawString::clone() const {
- return new RawString(value);
+RawString* RawString::clone(StringPool* newPool) const {
+ return new RawString(newPool->makeRef(*value));
}
bool RawString::flatten(android::Res_value& outValue) const {
@@ -71,7 +71,7 @@
return true;
}
-Reference* Reference::clone() const {
+Reference* Reference::clone(StringPool* /*newPool*/) const {
Reference* ref = new Reference();
ref->referenceType = referenceType;
ref->name = name;
@@ -106,7 +106,7 @@
return true;
}
-Id* Id::clone() const {
+Id* Id::clone(StringPool* /*newPool*/) const {
return new Id();
}
@@ -128,8 +128,8 @@
return true;
}
-String* String::clone() const {
- return new String(value);
+String* String::clone(StringPool* newPool) const {
+ return new String(newPool->makeRef(*value));
}
void String::print(std::ostream& out) const {
@@ -149,8 +149,8 @@
return true;
}
-StyledString* StyledString::clone() const {
- return new StyledString(value);
+StyledString* StyledString::clone(StringPool* newPool) const {
+ return new StyledString(newPool->makeRef(value));
}
void StyledString::print(std::ostream& out) const {
@@ -170,8 +170,8 @@
return true;
}
-FileReference* FileReference::clone() const {
- return new FileReference(path);
+FileReference* FileReference::clone(StringPool* newPool) const {
+ return new FileReference(newPool->makeRef(*path));
}
void FileReference::print(std::ostream& out) const {
@@ -186,7 +186,7 @@
return true;
}
-BinaryPrimitive* BinaryPrimitive::clone() const {
+BinaryPrimitive* BinaryPrimitive::clone(StringPool* /*newPool*/) const {
return new BinaryPrimitive(value);
}
@@ -227,7 +227,7 @@
return true;
}
-Sentinel* Sentinel::clone() const {
+Sentinel* Sentinel::clone(StringPool* /*newPool*/) const {
return new Sentinel();
}
@@ -243,7 +243,7 @@
return weak;
}
-Attribute* Attribute::clone() const {
+Attribute* Attribute::clone(StringPool* /*newPool*/) const {
Attribute* attr = new Attribute(weak);
attr->typeMask = typeMask;
std::copy(symbols.begin(), symbols.end(), std::back_inserter(attr->symbols));
@@ -371,13 +371,20 @@
return out << s.symbol.name.entry << "=" << s.value;
}
-Style* Style::clone() const {
- Style* style = new Style();
+Style::Style(bool weak) : weak(weak) {
+}
+
+bool Style::isWeak() const {
+ return weak;
+}
+
+Style* Style::clone(StringPool* newPool) const {
+ Style* style = new Style(weak);
style->parent = parent;
for (auto& entry : entries) {
style->entries.push_back(Entry{
entry.key,
- std::unique_ptr<Item>(entry.value->clone())
+ std::unique_ptr<Item>(entry.value->clone(newPool))
});
}
return style;
@@ -399,10 +406,10 @@
return out;
}
-Array* Array::clone() const {
+Array* Array::clone(StringPool* newPool) const {
Array* array = new Array();
for (auto& item : items) {
- array->items.emplace_back(std::unique_ptr<Item>(item->clone()));
+ array->items.emplace_back(std::unique_ptr<Item>(item->clone(newPool)));
}
return array;
}
@@ -413,12 +420,12 @@
<< "]";
}
-Plural* Plural::clone() const {
+Plural* Plural::clone(StringPool* newPool) const {
Plural* p = new Plural();
const size_t count = values.size();
for (size_t i = 0; i < count; i++) {
if (values[i]) {
- p->values[i] = std::unique_ptr<Item>(values[i]->clone());
+ p->values[i] = std::unique_ptr<Item>(values[i]->clone(newPool));
}
}
return p;
@@ -432,7 +439,7 @@
return out << *item;
}
-Styleable* Styleable::clone() const {
+Styleable* Styleable::clone(StringPool* /*newPool*/) const {
Styleable* styleable = new Styleable();
std::copy(entries.begin(), entries.end(), std::back_inserter(styleable->entries));
return styleable;
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index f25bcf0..e3352f3 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -63,7 +63,7 @@
/**
* Clone the value.
*/
- virtual Value* clone() const = 0;
+ virtual Value* clone(StringPool* newPool) const = 0;
/**
* Human readable printout of this value.
@@ -92,7 +92,7 @@
/**
* Clone the Item.
*/
- virtual Item* clone() const override = 0;
+ virtual Item* clone(StringPool* newPool) const override = 0;
/**
* Fills in an android::Res_value structure with this Item's binary representation.
@@ -132,7 +132,7 @@
Reference(const ResourceId& i, Type type = Type::kResource);
bool flatten(android::Res_value& outValue) const override;
- Reference* clone() const override;
+ Reference* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
@@ -142,7 +142,7 @@
struct Id : public BaseItem<Id> {
bool isWeak() const override;
bool flatten(android::Res_value& out) const override;
- Id* clone() const override;
+ Id* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
@@ -157,7 +157,7 @@
RawString(const StringPool::Ref& ref);
bool flatten(android::Res_value& outValue) const override;
- RawString* clone() const override;
+ RawString* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
@@ -167,7 +167,7 @@
String(const StringPool::Ref& ref);
bool flatten(android::Res_value& outValue) const override;
- String* clone() const override;
+ String* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
@@ -177,7 +177,7 @@
StyledString(const StringPool::StyleRef& ref);
bool flatten(android::Res_value& outValue) const override;
- StyledString* clone() const override;
+ StyledString* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
@@ -188,7 +188,7 @@
FileReference(const StringPool::Ref& path);
bool flatten(android::Res_value& outValue) const override;
- FileReference* clone() const override;
+ FileReference* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
@@ -202,8 +202,8 @@
BinaryPrimitive(const android::Res_value& val);
bool flatten(android::Res_value& outValue) const override;
- BinaryPrimitive* clone() const override;
- void print(::std::ostream& out) const override;
+ BinaryPrimitive* clone(StringPool* newPool) const override;
+ void print(std::ostream& out) const override;
};
/**
@@ -214,8 +214,8 @@
struct Sentinel : public BaseItem<Sentinel> {
bool isWeak() const override;
bool flatten(android::Res_value& outValue) const override;
- Sentinel* clone() const override;
- void print(::std::ostream& out) const override;
+ Sentinel* clone(StringPool* newPool) const override;
+ void print(std::ostream& out) const override;
};
struct Attribute : public BaseValue<Attribute> {
@@ -233,7 +233,7 @@
Attribute(bool w, uint32_t t = 0u);
bool isWeak() const override;
- virtual Attribute* clone() const override;
+ virtual Attribute* clone(StringPool* newPool) const override;
virtual void print(std::ostream& out) const override;
};
@@ -243,17 +243,20 @@
std::unique_ptr<Item> value;
};
+ bool weak;
Reference parent;
std::vector<Entry> entries;
- Style* clone() const override;
+ Style(bool weak);
+ bool isWeak() const override;
+ Style* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
struct Array : public BaseValue<Array> {
std::vector<std::unique_ptr<Item>> items;
- Array* clone() const override;
+ Array* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
@@ -270,14 +273,14 @@
std::array<std::unique_ptr<Item>, Count> values;
- Plural* clone() const override;
+ Plural* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
struct Styleable : public BaseValue<Styleable> {
std::vector<Reference> entries;
- Styleable* clone() const override;
+ Styleable* clone(StringPool* newPool) const override;
void print(std::ostream& out) const override;
};
diff --git a/tools/aapt2/StringPool.cpp b/tools/aapt2/StringPool.cpp
index b159a00..b983a53 100644
--- a/tools/aapt2/StringPool.cpp
+++ b/tools/aapt2/StringPool.cpp
@@ -175,6 +175,25 @@
return StyleRef(styleEntry);
}
+StringPool::StyleRef StringPool::makeRef(const StyleRef& ref) {
+ Entry* entry = new Entry();
+ entry->value = *ref.mEntry->str;
+ entry->context = ref.mEntry->str.mEntry->context;
+ entry->index = mStrings.size();
+ entry->ref = 0;
+ mStrings.emplace_back(entry);
+ mIndexedStrings.insert(std::make_pair(StringPiece16(entry->value), entry));
+
+ StyleEntry* styleEntry = new StyleEntry();
+ styleEntry->str = Ref(entry);
+ for (const Span& span : ref.mEntry->spans) {
+ styleEntry->spans.emplace_back(Span{ makeRef(*span.name), span.firstChar, span.lastChar });
+ }
+ styleEntry->ref = 0;
+ mStyles.emplace_back(styleEntry);
+ return StyleRef(styleEntry);
+}
+
void StringPool::merge(StringPool&& pool) {
mIndexedStrings.insert(pool.mIndexedStrings.begin(), pool.mIndexedStrings.end());
pool.mIndexedStrings.clear();
@@ -266,7 +285,7 @@
header->stringCount = pool.size();
header->flags |= android::ResStringPool_header::UTF8_FLAG;
- uint32_t* indices = out->nextBlock<uint32_t>(pool.size());
+ uint32_t* indices = pool.size() != 0 ? out->nextBlock<uint32_t>(pool.size()) : nullptr;
uint32_t* styleIndices = nullptr;
if (!pool.mStyles.empty()) {
diff --git a/tools/aapt2/StringPool.h b/tools/aapt2/StringPool.h
index 2aa5b65..64772a4 100644
--- a/tools/aapt2/StringPool.h
+++ b/tools/aapt2/StringPool.h
@@ -158,6 +158,12 @@
StyleRef makeRef(const StyleString& str, const Context& context);
/**
+ * Adds a style from another string pool. Returns a reference to the
+ * style in the string pool.
+ */
+ StyleRef makeRef(const StyleRef& ref);
+
+ /**
* Moves pool into this one without coalescing strings. When this
* function returns, pool will be empty.
*/
diff --git a/tools/aapt2/StringPool_test.cpp b/tools/aapt2/StringPool_test.cpp
index 85d101a..9552937 100644
--- a/tools/aapt2/StringPool_test.cpp
+++ b/tools/aapt2/StringPool_test.cpp
@@ -162,6 +162,16 @@
EXPECT_NE(ref.getIndex(), styleRef.getIndex());
}
+TEST(StringPoolTest, FlattenEmptyStringPoolUtf8) {
+ StringPool pool;
+ BigBuffer buffer(1024);
+ StringPool::flattenUtf8(&buffer, pool);
+
+ std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+ android::ResStringPool test;
+ ASSERT_EQ(test.setTo(data.get(), buffer.size()), android::NO_ERROR);
+}
+
constexpr const char16_t* sLongString = u"バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、大半のバックグラウンドデータを制限します。メール、SMSや、同期を使 用するその他のアプリは、起動しても更新されないことがあります。バッテリーセーバーは端末の充電中は自動的にOFFになります。";
TEST(StringPoolTest, FlattenUtf8) {
@@ -183,16 +193,10 @@
BigBuffer buffer(1024);
StringPool::flattenUtf8(&buffer, pool);
- uint8_t* data = new uint8_t[buffer.size()];
- uint8_t* p = data;
- for (const auto& b : buffer) {
- memcpy(p, b.buffer.get(), b.size);
- p += b.size;
- }
-
+ std::unique_ptr<uint8_t[]> data = util::copy(buffer);
{
- ResStringPool test;
- ASSERT_TRUE(test.setTo(data, buffer.size()) == NO_ERROR);
+ android::ResStringPool test;
+ ASSERT_EQ(test.setTo(data.get(), buffer.size()), android::NO_ERROR);
EXPECT_EQ(util::getString(test, 0), u"hello");
EXPECT_EQ(util::getString(test, 1), u"goodbye");
@@ -214,7 +218,6 @@
EXPECT_EQ(ResStringPool_span::END, span->name.index);
}
- delete[] data;
}
} // namespace aapt
diff --git a/tools/aapt2/XmlFlattener.cpp b/tools/aapt2/XmlFlattener.cpp
index b6ca6d5..dd6f63a 100644
--- a/tools/aapt2/XmlFlattener.cpp
+++ b/tools/aapt2/XmlFlattener.cpp
@@ -35,6 +35,10 @@
namespace aapt {
+constexpr const char16_t* kSchemaAndroid = u"http://schemas.android.com/apk/res/android";
+constexpr const char16_t* kSchemaAuto = u"http://schemas.android.com/apk/res-auto";
+constexpr const char16_t* kSchemaPrefix = u"http://schemas.android.com/apk/res/";
+
struct AttributeValueFlattener : ValueVisitor {
struct Args : ValueVisitorArgs {
Args(std::shared_ptr<Resolver> r, SourceLogger& s, android::Res_value& oV,
@@ -95,7 +99,9 @@
return a.resourceId < id;
}
-XmlFlattener::XmlFlattener(const std::shared_ptr<Resolver>& resolver) : mResolver(resolver) {
+XmlFlattener::XmlFlattener(const std::shared_ptr<ResourceTable>& table,
+ const std::shared_ptr<Resolver>& resolver) :
+ mTable(table), mResolver(resolver) {
}
/**
@@ -190,28 +196,50 @@
uint32_t nextAttributeId = 0;
const auto endAttrIter = parser->endAttributes();
for (auto attrIter = parser->beginAttributes();
- attrIter != endAttrIter;
- ++attrIter) {
+ attrIter != endAttrIter;
+ ++attrIter) {
uint32_t id;
StringPool::Ref nameRef;
const Attribute* attr = nullptr;
- if (attrIter->namespaceUri.empty()) {
+
+ if (options.maxSdkAttribute && attrIter->namespaceUri == kSchemaAndroid) {
+ size_t sdkVersion = findAttributeSdkLevel(attrIter->name);
+ if (sdkVersion > options.maxSdkAttribute.value()) {
+ // We will silently omit this attribute
+ smallestStrippedAttributeSdk =
+ std::min(smallestStrippedAttributeSdk, sdkVersion);
+ continue;
+ }
+ }
+
+ ResourceNameRef genIdName;
+ bool create = false;
+ bool privateRef = false;
+ if (mTable && ResourceParser::tryParseReference(attrIter->value, &genIdName,
+ &create, &privateRef) && create) {
+ mTable->addResource(genIdName, {}, source.line(parser->getLineNumber()),
+ util::make_unique<Id>());
+ }
+
+
+ StringPiece16 package;
+ if (util::stringStartsWith<char16_t>(attrIter->namespaceUri, kSchemaPrefix)) {
+ StringPiece16 schemaPrefix = kSchemaPrefix;
+ package = attrIter->namespaceUri;
+ package = package.substr(schemaPrefix.size(),
+ package.size() - schemaPrefix.size());
+ } else if (attrIter->namespaceUri == kSchemaAuto && mResolver) {
+ package = mResolver->getDefaultPackage();
+ }
+
+ if (package.empty() || !mResolver) {
// Attributes that have no resource ID (because they don't belong to a
// package) should appear after those that do have resource IDs. Assign
// them some/ integer value that will appear after.
id = 0x80000000u | nextAttributeId++;
nameRef = pool.makeRef(attrIter->name, StringPool::Context{ id });
- } else {
- StringPiece16 package;
- if (attrIter->namespaceUri == u"http://schemas.android.com/apk/res-auto") {
- package = mResolver->getDefaultPackage();
- } else {
- // TODO(adamlesinski): Extract package from namespace.
- // The package name appears like so:
- // http://schemas.android.com/apk/res/<package name>
- package = u"android";
- }
+ } else {
// Find the Attribute object via our Resolver.
ResourceName attrName = {
package.toString(), ResourceType::kAttr, attrIter->name };
@@ -236,16 +264,6 @@
continue;
}
- if (options.maxSdkAttribute && package == u"android") {
- size_t sdkVersion = findAttributeSdkLevel(attrIter->name);
- if (sdkVersion > options.maxSdkAttribute.value()) {
- // We will silently omit this attribute
- smallestStrippedAttributeSdk =
- std::min(smallestStrippedAttributeSdk, sdkVersion);
- continue;
- }
- }
-
id = result.value().id.id;
attr = result.value().attr;
diff --git a/tools/aapt2/XmlFlattener.h b/tools/aapt2/XmlFlattener.h
index abf64ab..540a5ef 100644
--- a/tools/aapt2/XmlFlattener.h
+++ b/tools/aapt2/XmlFlattener.h
@@ -45,7 +45,8 @@
* Creates a flattener with a Resolver to resolve references
* and attributes.
*/
- XmlFlattener(const std::shared_ptr<Resolver>& resolver);
+ XmlFlattener(const std::shared_ptr<ResourceTable>& table,
+ const std::shared_ptr<Resolver>& resolver);
XmlFlattener(const XmlFlattener&) = delete; // Not copyable.
@@ -60,6 +61,7 @@
BigBuffer* outBuffer, Options options);
private:
+ std::shared_ptr<ResourceTable> mTable;
std::shared_ptr<Resolver> mResolver;
};
diff --git a/tools/aapt2/XmlFlattener_test.cpp b/tools/aapt2/XmlFlattener_test.cpp
index 6e24847..a7d7ac6 100644
--- a/tools/aapt2/XmlFlattener_test.cpp
+++ b/tools/aapt2/XmlFlattener_test.cpp
@@ -47,7 +47,7 @@
table->addResource(ResourceName{ {}, ResourceType::kId, u"test" },
ResourceId{ 0x01020000 }, {}, {}, util::make_unique<Id>());
- mFlattener = std::make_shared<XmlFlattener>(
+ mFlattener = std::make_shared<XmlFlattener>(nullptr,
std::make_shared<Resolver>(table, std::make_shared<AssetManager>()));
}
diff --git a/tools/aapt2/ZipEntry.cpp b/tools/aapt2/ZipEntry.cpp
new file mode 100644
index 0000000..ad5d84a
--- /dev/null
+++ b/tools/aapt2/ZipEntry.cpp
@@ -0,0 +1,739 @@
+/*
+ * Copyright (C) 2006 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.
+ */
+
+//
+// Access to entries in a Zip archive.
+//
+
+#define LOG_TAG "zip"
+
+#include "ZipEntry.h"
+#include <utils/Log.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+namespace aapt {
+
+using namespace android;
+
+/*
+ * Initialize a new ZipEntry structure from a FILE* positioned at a
+ * CentralDirectoryEntry.
+ *
+ * On exit, the file pointer will be at the start of the next CDE or
+ * at the EOCD.
+ */
+status_t ZipEntry::initFromCDE(FILE* fp)
+{
+ status_t result;
+ long posn;
+ bool hasDD;
+
+ //ALOGV("initFromCDE ---\n");
+
+ /* read the CDE */
+ result = mCDE.read(fp);
+ if (result != NO_ERROR) {
+ ALOGD("mCDE.read failed\n");
+ return result;
+ }
+
+ //mCDE.dump();
+
+ /* using the info in the CDE, go load up the LFH */
+ posn = ftell(fp);
+ if (fseek(fp, mCDE.mLocalHeaderRelOffset, SEEK_SET) != 0) {
+ ALOGD("local header seek failed (%ld)\n",
+ mCDE.mLocalHeaderRelOffset);
+ return UNKNOWN_ERROR;
+ }
+
+ result = mLFH.read(fp);
+ if (result != NO_ERROR) {
+ ALOGD("mLFH.read failed\n");
+ return result;
+ }
+
+ if (fseek(fp, posn, SEEK_SET) != 0)
+ return UNKNOWN_ERROR;
+
+ //mLFH.dump();
+
+ /*
+ * We *might* need to read the Data Descriptor at this point and
+ * integrate it into the LFH. If this bit is set, the CRC-32,
+ * compressed size, and uncompressed size will be zero. In practice
+ * these seem to be rare.
+ */
+ hasDD = (mLFH.mGPBitFlag & kUsesDataDescr) != 0;
+ if (hasDD) {
+ // do something clever
+ //ALOGD("+++ has data descriptor\n");
+ }
+
+ /*
+ * Sanity-check the LFH. Note that this will fail if the "kUsesDataDescr"
+ * flag is set, because the LFH is incomplete. (Not a problem, since we
+ * prefer the CDE values.)
+ */
+ if (!hasDD && !compareHeaders()) {
+ ALOGW("warning: header mismatch\n");
+ // keep going?
+ }
+
+ /*
+ * If the mVersionToExtract is greater than 20, we may have an
+ * issue unpacking the record -- could be encrypted, compressed
+ * with something we don't support, or use Zip64 extensions. We
+ * can defer worrying about that to when we're extracting data.
+ */
+
+ return NO_ERROR;
+}
+
+/*
+ * Initialize a new entry. Pass in the file name and an optional comment.
+ *
+ * Initializes the CDE and the LFH.
+ */
+void ZipEntry::initNew(const char* fileName, const char* comment)
+{
+ assert(fileName != NULL && *fileName != '\0'); // name required
+
+ /* most fields are properly initialized by constructor */
+ mCDE.mVersionMadeBy = kDefaultMadeBy;
+ mCDE.mVersionToExtract = kDefaultVersion;
+ mCDE.mCompressionMethod = kCompressStored;
+ mCDE.mFileNameLength = strlen(fileName);
+ if (comment != NULL)
+ mCDE.mFileCommentLength = strlen(comment);
+ mCDE.mExternalAttrs = 0x81b60020; // matches what WinZip does
+
+ if (mCDE.mFileNameLength > 0) {
+ mCDE.mFileName = new unsigned char[mCDE.mFileNameLength+1];
+ strcpy((char*) mCDE.mFileName, fileName);
+ }
+ if (mCDE.mFileCommentLength > 0) {
+ /* TODO: stop assuming null-terminated ASCII here? */
+ mCDE.mFileComment = new unsigned char[mCDE.mFileCommentLength+1];
+ strcpy((char*) mCDE.mFileComment, comment);
+ }
+
+ copyCDEtoLFH();
+}
+
+/*
+ * Initialize a new entry, starting with the ZipEntry from a different
+ * archive.
+ *
+ * Initializes the CDE and the LFH.
+ */
+status_t ZipEntry::initFromExternal(const ZipFile* /* pZipFile */,
+ const ZipEntry* pEntry)
+{
+ mCDE = pEntry->mCDE;
+ // Check whether we got all the memory needed.
+ if ((mCDE.mFileNameLength > 0 && mCDE.mFileName == NULL) ||
+ (mCDE.mFileCommentLength > 0 && mCDE.mFileComment == NULL) ||
+ (mCDE.mExtraFieldLength > 0 && mCDE.mExtraField == NULL)) {
+ return NO_MEMORY;
+ }
+
+ /* construct the LFH from the CDE */
+ copyCDEtoLFH();
+
+ /*
+ * The LFH "extra" field is independent of the CDE "extra", so we
+ * handle it here.
+ */
+ assert(mLFH.mExtraField == NULL);
+ mLFH.mExtraFieldLength = pEntry->mLFH.mExtraFieldLength;
+ if (mLFH.mExtraFieldLength > 0) {
+ mLFH.mExtraField = new unsigned char[mLFH.mExtraFieldLength+1];
+ if (mLFH.mExtraField == NULL)
+ return NO_MEMORY;
+ memcpy(mLFH.mExtraField, pEntry->mLFH.mExtraField,
+ mLFH.mExtraFieldLength+1);
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Insert pad bytes in the LFH by tweaking the "extra" field. This will
+ * potentially confuse something that put "extra" data in here earlier,
+ * but I can't find an actual problem.
+ */
+status_t ZipEntry::addPadding(int padding)
+{
+ if (padding <= 0)
+ return INVALID_OPERATION;
+
+ //ALOGI("HEY: adding %d pad bytes to existing %d in %s\n",
+ // padding, mLFH.mExtraFieldLength, mCDE.mFileName);
+
+ if (mLFH.mExtraFieldLength > 0) {
+ /* extend existing field */
+ unsigned char* newExtra;
+
+ newExtra = new unsigned char[mLFH.mExtraFieldLength + padding];
+ if (newExtra == NULL)
+ return NO_MEMORY;
+ memset(newExtra + mLFH.mExtraFieldLength, 0, padding);
+ memcpy(newExtra, mLFH.mExtraField, mLFH.mExtraFieldLength);
+
+ delete[] mLFH.mExtraField;
+ mLFH.mExtraField = newExtra;
+ mLFH.mExtraFieldLength += padding;
+ } else {
+ /* create new field */
+ mLFH.mExtraField = new unsigned char[padding];
+ memset(mLFH.mExtraField, 0, padding);
+ mLFH.mExtraFieldLength = padding;
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Set the fields in the LFH equal to the corresponding fields in the CDE.
+ *
+ * This does not touch the LFH "extra" field.
+ */
+void ZipEntry::copyCDEtoLFH(void)
+{
+ mLFH.mVersionToExtract = mCDE.mVersionToExtract;
+ mLFH.mGPBitFlag = mCDE.mGPBitFlag;
+ mLFH.mCompressionMethod = mCDE.mCompressionMethod;
+ mLFH.mLastModFileTime = mCDE.mLastModFileTime;
+ mLFH.mLastModFileDate = mCDE.mLastModFileDate;
+ mLFH.mCRC32 = mCDE.mCRC32;
+ mLFH.mCompressedSize = mCDE.mCompressedSize;
+ mLFH.mUncompressedSize = mCDE.mUncompressedSize;
+ mLFH.mFileNameLength = mCDE.mFileNameLength;
+ // the "extra field" is independent
+
+ delete[] mLFH.mFileName;
+ if (mLFH.mFileNameLength > 0) {
+ mLFH.mFileName = new unsigned char[mLFH.mFileNameLength+1];
+ strcpy((char*) mLFH.mFileName, (const char*) mCDE.mFileName);
+ } else {
+ mLFH.mFileName = NULL;
+ }
+}
+
+/*
+ * Set some information about a file after we add it.
+ */
+void ZipEntry::setDataInfo(long uncompLen, long compLen, unsigned long crc32,
+ int compressionMethod)
+{
+ mCDE.mCompressionMethod = compressionMethod;
+ mCDE.mCRC32 = crc32;
+ mCDE.mCompressedSize = compLen;
+ mCDE.mUncompressedSize = uncompLen;
+ mCDE.mCompressionMethod = compressionMethod;
+ if (compressionMethod == kCompressDeflated) {
+ mCDE.mGPBitFlag |= 0x0002; // indicates maximum compression used
+ }
+ copyCDEtoLFH();
+}
+
+/*
+ * See if the data in mCDE and mLFH match up. This is mostly useful for
+ * debugging these classes, but it can be used to identify damaged
+ * archives.
+ *
+ * Returns "false" if they differ.
+ */
+bool ZipEntry::compareHeaders(void) const
+{
+ if (mCDE.mVersionToExtract != mLFH.mVersionToExtract) {
+ ALOGV("cmp: VersionToExtract\n");
+ return false;
+ }
+ if (mCDE.mGPBitFlag != mLFH.mGPBitFlag) {
+ ALOGV("cmp: GPBitFlag\n");
+ return false;
+ }
+ if (mCDE.mCompressionMethod != mLFH.mCompressionMethod) {
+ ALOGV("cmp: CompressionMethod\n");
+ return false;
+ }
+ if (mCDE.mLastModFileTime != mLFH.mLastModFileTime) {
+ ALOGV("cmp: LastModFileTime\n");
+ return false;
+ }
+ if (mCDE.mLastModFileDate != mLFH.mLastModFileDate) {
+ ALOGV("cmp: LastModFileDate\n");
+ return false;
+ }
+ if (mCDE.mCRC32 != mLFH.mCRC32) {
+ ALOGV("cmp: CRC32\n");
+ return false;
+ }
+ if (mCDE.mCompressedSize != mLFH.mCompressedSize) {
+ ALOGV("cmp: CompressedSize\n");
+ return false;
+ }
+ if (mCDE.mUncompressedSize != mLFH.mUncompressedSize) {
+ ALOGV("cmp: UncompressedSize\n");
+ return false;
+ }
+ if (mCDE.mFileNameLength != mLFH.mFileNameLength) {
+ ALOGV("cmp: FileNameLength\n");
+ return false;
+ }
+#if 0 // this seems to be used for padding, not real data
+ if (mCDE.mExtraFieldLength != mLFH.mExtraFieldLength) {
+ ALOGV("cmp: ExtraFieldLength\n");
+ return false;
+ }
+#endif
+ if (mCDE.mFileName != NULL) {
+ if (strcmp((char*) mCDE.mFileName, (char*) mLFH.mFileName) != 0) {
+ ALOGV("cmp: FileName\n");
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+/*
+ * Convert the DOS date/time stamp into a UNIX time stamp.
+ */
+time_t ZipEntry::getModWhen(void) const
+{
+ struct tm parts;
+
+ parts.tm_sec = (mCDE.mLastModFileTime & 0x001f) << 1;
+ parts.tm_min = (mCDE.mLastModFileTime & 0x07e0) >> 5;
+ parts.tm_hour = (mCDE.mLastModFileTime & 0xf800) >> 11;
+ parts.tm_mday = (mCDE.mLastModFileDate & 0x001f);
+ parts.tm_mon = ((mCDE.mLastModFileDate & 0x01e0) >> 5) -1;
+ parts.tm_year = ((mCDE.mLastModFileDate & 0xfe00) >> 9) + 80;
+ parts.tm_wday = parts.tm_yday = 0;
+ parts.tm_isdst = -1; // DST info "not available"
+
+ return mktime(&parts);
+}
+
+/*
+ * Set the CDE/LFH timestamp from UNIX time.
+ */
+void ZipEntry::setModWhen(time_t when)
+{
+#if !defined(_WIN32)
+ struct tm tmResult;
+#endif
+ time_t even;
+ unsigned short zdate, ztime;
+
+ struct tm* ptm;
+
+ /* round up to an even number of seconds */
+ even = (time_t)(((unsigned long)(when) + 1) & (~1));
+
+ /* expand */
+#if !defined(_WIN32)
+ ptm = localtime_r(&even, &tmResult);
+#else
+ ptm = localtime(&even);
+#endif
+
+ int year;
+ year = ptm->tm_year;
+ if (year < 80)
+ year = 80;
+
+ zdate = (year - 80) << 9 | (ptm->tm_mon+1) << 5 | ptm->tm_mday;
+ ztime = ptm->tm_hour << 11 | ptm->tm_min << 5 | ptm->tm_sec >> 1;
+
+ mCDE.mLastModFileTime = mLFH.mLastModFileTime = ztime;
+ mCDE.mLastModFileDate = mLFH.mLastModFileDate = zdate;
+}
+
+
+/*
+ * ===========================================================================
+ * ZipEntry::LocalFileHeader
+ * ===========================================================================
+ */
+
+/*
+ * Read a local file header.
+ *
+ * On entry, "fp" points to the signature at the start of the header.
+ * On exit, "fp" points to the start of data.
+ */
+status_t ZipEntry::LocalFileHeader::read(FILE* fp)
+{
+ status_t result = NO_ERROR;
+ unsigned char buf[kLFHLen];
+
+ assert(mFileName == NULL);
+ assert(mExtraField == NULL);
+
+ if (fread(buf, 1, kLFHLen, fp) != kLFHLen) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ if (ZipEntry::getLongLE(&buf[0x00]) != kSignature) {
+ ALOGD("whoops: didn't find expected signature\n");
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ mVersionToExtract = ZipEntry::getShortLE(&buf[0x04]);
+ mGPBitFlag = ZipEntry::getShortLE(&buf[0x06]);
+ mCompressionMethod = ZipEntry::getShortLE(&buf[0x08]);
+ mLastModFileTime = ZipEntry::getShortLE(&buf[0x0a]);
+ mLastModFileDate = ZipEntry::getShortLE(&buf[0x0c]);
+ mCRC32 = ZipEntry::getLongLE(&buf[0x0e]);
+ mCompressedSize = ZipEntry::getLongLE(&buf[0x12]);
+ mUncompressedSize = ZipEntry::getLongLE(&buf[0x16]);
+ mFileNameLength = ZipEntry::getShortLE(&buf[0x1a]);
+ mExtraFieldLength = ZipEntry::getShortLE(&buf[0x1c]);
+
+ // TODO: validate sizes
+
+ /* grab filename */
+ if (mFileNameLength != 0) {
+ mFileName = new unsigned char[mFileNameLength+1];
+ if (mFileName == NULL) {
+ result = NO_MEMORY;
+ goto bail;
+ }
+ if (fread(mFileName, 1, mFileNameLength, fp) != mFileNameLength) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+ mFileName[mFileNameLength] = '\0';
+ }
+
+ /* grab extra field */
+ if (mExtraFieldLength != 0) {
+ mExtraField = new unsigned char[mExtraFieldLength+1];
+ if (mExtraField == NULL) {
+ result = NO_MEMORY;
+ goto bail;
+ }
+ if (fread(mExtraField, 1, mExtraFieldLength, fp) != mExtraFieldLength) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+ mExtraField[mExtraFieldLength] = '\0';
+ }
+
+bail:
+ return result;
+}
+
+/*
+ * Write a local file header.
+ */
+status_t ZipEntry::LocalFileHeader::write(FILE* fp)
+{
+ unsigned char buf[kLFHLen];
+
+ ZipEntry::putLongLE(&buf[0x00], kSignature);
+ ZipEntry::putShortLE(&buf[0x04], mVersionToExtract);
+ ZipEntry::putShortLE(&buf[0x06], mGPBitFlag);
+ ZipEntry::putShortLE(&buf[0x08], mCompressionMethod);
+ ZipEntry::putShortLE(&buf[0x0a], mLastModFileTime);
+ ZipEntry::putShortLE(&buf[0x0c], mLastModFileDate);
+ ZipEntry::putLongLE(&buf[0x0e], mCRC32);
+ ZipEntry::putLongLE(&buf[0x12], mCompressedSize);
+ ZipEntry::putLongLE(&buf[0x16], mUncompressedSize);
+ ZipEntry::putShortLE(&buf[0x1a], mFileNameLength);
+ ZipEntry::putShortLE(&buf[0x1c], mExtraFieldLength);
+
+ if (fwrite(buf, 1, kLFHLen, fp) != kLFHLen)
+ return UNKNOWN_ERROR;
+
+ /* write filename */
+ if (mFileNameLength != 0) {
+ if (fwrite(mFileName, 1, mFileNameLength, fp) != mFileNameLength)
+ return UNKNOWN_ERROR;
+ }
+
+ /* write "extra field" */
+ if (mExtraFieldLength != 0) {
+ if (fwrite(mExtraField, 1, mExtraFieldLength, fp) != mExtraFieldLength)
+ return UNKNOWN_ERROR;
+ }
+
+ return NO_ERROR;
+}
+
+
+/*
+ * Dump the contents of a LocalFileHeader object.
+ */
+void ZipEntry::LocalFileHeader::dump(void) const
+{
+ ALOGD(" LocalFileHeader contents:\n");
+ ALOGD(" versToExt=%u gpBits=0x%04x compression=%u\n",
+ mVersionToExtract, mGPBitFlag, mCompressionMethod);
+ ALOGD(" modTime=0x%04x modDate=0x%04x crc32=0x%08lx\n",
+ mLastModFileTime, mLastModFileDate, mCRC32);
+ ALOGD(" compressedSize=%lu uncompressedSize=%lu\n",
+ mCompressedSize, mUncompressedSize);
+ ALOGD(" filenameLen=%u extraLen=%u\n",
+ mFileNameLength, mExtraFieldLength);
+ if (mFileName != NULL)
+ ALOGD(" filename: '%s'\n", mFileName);
+}
+
+
+/*
+ * ===========================================================================
+ * ZipEntry::CentralDirEntry
+ * ===========================================================================
+ */
+
+/*
+ * Read the central dir entry that appears next in the file.
+ *
+ * On entry, "fp" should be positioned on the signature bytes for the
+ * entry. On exit, "fp" will point at the signature word for the next
+ * entry or for the EOCD.
+ */
+status_t ZipEntry::CentralDirEntry::read(FILE* fp)
+{
+ status_t result = NO_ERROR;
+ unsigned char buf[kCDELen];
+
+ /* no re-use */
+ assert(mFileName == NULL);
+ assert(mExtraField == NULL);
+ assert(mFileComment == NULL);
+
+ if (fread(buf, 1, kCDELen, fp) != kCDELen) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ if (ZipEntry::getLongLE(&buf[0x00]) != kSignature) {
+ ALOGD("Whoops: didn't find expected signature\n");
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ mVersionMadeBy = ZipEntry::getShortLE(&buf[0x04]);
+ mVersionToExtract = ZipEntry::getShortLE(&buf[0x06]);
+ mGPBitFlag = ZipEntry::getShortLE(&buf[0x08]);
+ mCompressionMethod = ZipEntry::getShortLE(&buf[0x0a]);
+ mLastModFileTime = ZipEntry::getShortLE(&buf[0x0c]);
+ mLastModFileDate = ZipEntry::getShortLE(&buf[0x0e]);
+ mCRC32 = ZipEntry::getLongLE(&buf[0x10]);
+ mCompressedSize = ZipEntry::getLongLE(&buf[0x14]);
+ mUncompressedSize = ZipEntry::getLongLE(&buf[0x18]);
+ mFileNameLength = ZipEntry::getShortLE(&buf[0x1c]);
+ mExtraFieldLength = ZipEntry::getShortLE(&buf[0x1e]);
+ mFileCommentLength = ZipEntry::getShortLE(&buf[0x20]);
+ mDiskNumberStart = ZipEntry::getShortLE(&buf[0x22]);
+ mInternalAttrs = ZipEntry::getShortLE(&buf[0x24]);
+ mExternalAttrs = ZipEntry::getLongLE(&buf[0x26]);
+ mLocalHeaderRelOffset = ZipEntry::getLongLE(&buf[0x2a]);
+
+ // TODO: validate sizes and offsets
+
+ /* grab filename */
+ if (mFileNameLength != 0) {
+ mFileName = new unsigned char[mFileNameLength+1];
+ if (mFileName == NULL) {
+ result = NO_MEMORY;
+ goto bail;
+ }
+ if (fread(mFileName, 1, mFileNameLength, fp) != mFileNameLength) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+ mFileName[mFileNameLength] = '\0';
+ }
+
+ /* read "extra field" */
+ if (mExtraFieldLength != 0) {
+ mExtraField = new unsigned char[mExtraFieldLength+1];
+ if (mExtraField == NULL) {
+ result = NO_MEMORY;
+ goto bail;
+ }
+ if (fread(mExtraField, 1, mExtraFieldLength, fp) != mExtraFieldLength) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+ mExtraField[mExtraFieldLength] = '\0';
+ }
+
+
+ /* grab comment, if any */
+ if (mFileCommentLength != 0) {
+ mFileComment = new unsigned char[mFileCommentLength+1];
+ if (mFileComment == NULL) {
+ result = NO_MEMORY;
+ goto bail;
+ }
+ if (fread(mFileComment, 1, mFileCommentLength, fp) != mFileCommentLength)
+ {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+ mFileComment[mFileCommentLength] = '\0';
+ }
+
+bail:
+ return result;
+}
+
+/*
+ * Write a central dir entry.
+ */
+status_t ZipEntry::CentralDirEntry::write(FILE* fp)
+{
+ unsigned char buf[kCDELen];
+
+ ZipEntry::putLongLE(&buf[0x00], kSignature);
+ ZipEntry::putShortLE(&buf[0x04], mVersionMadeBy);
+ ZipEntry::putShortLE(&buf[0x06], mVersionToExtract);
+ ZipEntry::putShortLE(&buf[0x08], mGPBitFlag);
+ ZipEntry::putShortLE(&buf[0x0a], mCompressionMethod);
+ ZipEntry::putShortLE(&buf[0x0c], mLastModFileTime);
+ ZipEntry::putShortLE(&buf[0x0e], mLastModFileDate);
+ ZipEntry::putLongLE(&buf[0x10], mCRC32);
+ ZipEntry::putLongLE(&buf[0x14], mCompressedSize);
+ ZipEntry::putLongLE(&buf[0x18], mUncompressedSize);
+ ZipEntry::putShortLE(&buf[0x1c], mFileNameLength);
+ ZipEntry::putShortLE(&buf[0x1e], mExtraFieldLength);
+ ZipEntry::putShortLE(&buf[0x20], mFileCommentLength);
+ ZipEntry::putShortLE(&buf[0x22], mDiskNumberStart);
+ ZipEntry::putShortLE(&buf[0x24], mInternalAttrs);
+ ZipEntry::putLongLE(&buf[0x26], mExternalAttrs);
+ ZipEntry::putLongLE(&buf[0x2a], mLocalHeaderRelOffset);
+
+ if (fwrite(buf, 1, kCDELen, fp) != kCDELen)
+ return UNKNOWN_ERROR;
+
+ /* write filename */
+ if (mFileNameLength != 0) {
+ if (fwrite(mFileName, 1, mFileNameLength, fp) != mFileNameLength)
+ return UNKNOWN_ERROR;
+ }
+
+ /* write "extra field" */
+ if (mExtraFieldLength != 0) {
+ if (fwrite(mExtraField, 1, mExtraFieldLength, fp) != mExtraFieldLength)
+ return UNKNOWN_ERROR;
+ }
+
+ /* write comment */
+ if (mFileCommentLength != 0) {
+ if (fwrite(mFileComment, 1, mFileCommentLength, fp) != mFileCommentLength)
+ return UNKNOWN_ERROR;
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Dump the contents of a CentralDirEntry object.
+ */
+void ZipEntry::CentralDirEntry::dump(void) const
+{
+ ALOGD(" CentralDirEntry contents:\n");
+ ALOGD(" versMadeBy=%u versToExt=%u gpBits=0x%04x compression=%u\n",
+ mVersionMadeBy, mVersionToExtract, mGPBitFlag, mCompressionMethod);
+ ALOGD(" modTime=0x%04x modDate=0x%04x crc32=0x%08lx\n",
+ mLastModFileTime, mLastModFileDate, mCRC32);
+ ALOGD(" compressedSize=%lu uncompressedSize=%lu\n",
+ mCompressedSize, mUncompressedSize);
+ ALOGD(" filenameLen=%u extraLen=%u commentLen=%u\n",
+ mFileNameLength, mExtraFieldLength, mFileCommentLength);
+ ALOGD(" diskNumStart=%u intAttr=0x%04x extAttr=0x%08lx relOffset=%lu\n",
+ mDiskNumberStart, mInternalAttrs, mExternalAttrs,
+ mLocalHeaderRelOffset);
+
+ if (mFileName != NULL)
+ ALOGD(" filename: '%s'\n", mFileName);
+ if (mFileComment != NULL)
+ ALOGD(" comment: '%s'\n", mFileComment);
+}
+
+/*
+ * Copy-assignment operator for CentralDirEntry.
+ */
+ZipEntry::CentralDirEntry& ZipEntry::CentralDirEntry::operator=(const ZipEntry::CentralDirEntry& src) {
+ if (this == &src) {
+ return *this;
+ }
+
+ // Free up old data.
+ delete[] mFileName;
+ delete[] mExtraField;
+ delete[] mFileComment;
+
+ // Copy scalars.
+ mVersionMadeBy = src.mVersionMadeBy;
+ mVersionToExtract = src.mVersionToExtract;
+ mGPBitFlag = src.mGPBitFlag;
+ mCompressionMethod = src.mCompressionMethod;
+ mLastModFileTime = src.mLastModFileTime;
+ mLastModFileDate = src.mLastModFileDate;
+ mCRC32 = src.mCRC32;
+ mCompressedSize = src.mCompressedSize;
+ mUncompressedSize = src.mUncompressedSize;
+ mFileNameLength = src.mFileNameLength;
+ mExtraFieldLength = src.mExtraFieldLength;
+ mFileCommentLength = src.mFileCommentLength;
+ mDiskNumberStart = src.mDiskNumberStart;
+ mInternalAttrs = src.mInternalAttrs;
+ mExternalAttrs = src.mExternalAttrs;
+ mLocalHeaderRelOffset = src.mLocalHeaderRelOffset;
+
+ // Copy strings, if necessary.
+ if (mFileNameLength > 0) {
+ mFileName = new unsigned char[mFileNameLength + 1];
+ if (mFileName != NULL)
+ strcpy((char*)mFileName, (char*)src.mFileName);
+ } else {
+ mFileName = NULL;
+ }
+ if (mFileCommentLength > 0) {
+ mFileComment = new unsigned char[mFileCommentLength + 1];
+ if (mFileComment != NULL)
+ strcpy((char*)mFileComment, (char*)src.mFileComment);
+ } else {
+ mFileComment = NULL;
+ }
+ if (mExtraFieldLength > 0) {
+ /* we null-terminate this, though it may not be a string */
+ mExtraField = new unsigned char[mExtraFieldLength + 1];
+ if (mExtraField != NULL)
+ memcpy(mExtraField, src.mExtraField, mExtraFieldLength + 1);
+ } else {
+ mExtraField = NULL;
+ }
+
+ return *this;
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/ZipEntry.h b/tools/aapt2/ZipEntry.h
new file mode 100644
index 0000000..d048a3e
--- /dev/null
+++ b/tools/aapt2/ZipEntry.h
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2006 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.
+ */
+
+//
+// Zip archive entries.
+//
+// The ZipEntry class is tightly meshed with the ZipFile class.
+//
+#ifndef __LIBS_ZIPENTRY_H
+#define __LIBS_ZIPENTRY_H
+
+#include <utils/Errors.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+namespace aapt {
+
+using android::status_t;
+
+class ZipFile;
+
+/*
+ * ZipEntry objects represent a single entry in a Zip archive.
+ *
+ * You can use one of these to get or set information about an entry, but
+ * there are no functions here for accessing the data itself. (We could
+ * tuck a pointer to the ZipFile in here for convenience, but that raises
+ * the likelihood of using ZipEntry objects after discarding the ZipFile.)
+ *
+ * File information is stored in two places: next to the file data (the Local
+ * File Header, and possibly a Data Descriptor), and at the end of the file
+ * (the Central Directory Entry). The two must be kept in sync.
+ */
+class ZipEntry {
+public:
+ friend class ZipFile;
+
+ ZipEntry(void)
+ : mDeleted(false), mMarked(false)
+ {}
+ ~ZipEntry(void) {}
+
+ /*
+ * Returns "true" if the data is compressed.
+ */
+ bool isCompressed(void) const {
+ return mCDE.mCompressionMethod != kCompressStored;
+ }
+ int getCompressionMethod(void) const { return mCDE.mCompressionMethod; }
+
+ /*
+ * Return the uncompressed length.
+ */
+ off_t getUncompressedLen(void) const { return mCDE.mUncompressedSize; }
+
+ /*
+ * Return the compressed length. For uncompressed data, this returns
+ * the same thing as getUncompresesdLen().
+ */
+ off_t getCompressedLen(void) const { return mCDE.mCompressedSize; }
+
+ /*
+ * Return the offset of the local file header.
+ */
+ off_t getLFHOffset(void) const { return mCDE.mLocalHeaderRelOffset; }
+
+ /*
+ * Return the absolute file offset of the start of the compressed or
+ * uncompressed data.
+ */
+ off_t getFileOffset(void) const {
+ return mCDE.mLocalHeaderRelOffset +
+ LocalFileHeader::kLFHLen +
+ mLFH.mFileNameLength +
+ mLFH.mExtraFieldLength;
+ }
+
+ /*
+ * Return the data CRC.
+ */
+ unsigned long getCRC32(void) const { return mCDE.mCRC32; }
+
+ /*
+ * Return file modification time in UNIX seconds-since-epoch.
+ */
+ time_t getModWhen(void) const;
+
+ /*
+ * Return the archived file name.
+ */
+ const char* getFileName(void) const { return (const char*) mCDE.mFileName; }
+
+ /*
+ * Application-defined "mark". Can be useful when synchronizing the
+ * contents of an archive with contents on disk.
+ */
+ bool getMarked(void) const { return mMarked; }
+ void setMarked(bool val) { mMarked = val; }
+
+ /*
+ * Some basic functions for raw data manipulation. "LE" means
+ * Little Endian.
+ */
+ static inline unsigned short getShortLE(const unsigned char* buf) {
+ return buf[0] | (buf[1] << 8);
+ }
+ static inline unsigned long getLongLE(const unsigned char* buf) {
+ return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
+ }
+ static inline void putShortLE(unsigned char* buf, short val) {
+ buf[0] = (unsigned char) val;
+ buf[1] = (unsigned char) (val >> 8);
+ }
+ static inline void putLongLE(unsigned char* buf, long val) {
+ buf[0] = (unsigned char) val;
+ buf[1] = (unsigned char) (val >> 8);
+ buf[2] = (unsigned char) (val >> 16);
+ buf[3] = (unsigned char) (val >> 24);
+ }
+
+ /* defined for Zip archives */
+ enum {
+ kCompressStored = 0, // no compression
+ // shrunk = 1,
+ // reduced 1 = 2,
+ // reduced 2 = 3,
+ // reduced 3 = 4,
+ // reduced 4 = 5,
+ // imploded = 6,
+ // tokenized = 7,
+ kCompressDeflated = 8, // standard deflate
+ // Deflate64 = 9,
+ // lib imploded = 10,
+ // reserved = 11,
+ // bzip2 = 12,
+ };
+
+ /*
+ * Deletion flag. If set, the entry will be removed on the next
+ * call to "flush".
+ */
+ bool getDeleted(void) const { return mDeleted; }
+
+protected:
+ /*
+ * Initialize the structure from the file, which is pointing at
+ * our Central Directory entry.
+ */
+ status_t initFromCDE(FILE* fp);
+
+ /*
+ * Initialize the structure for a new file. We need the filename
+ * and comment so that we can properly size the LFH area. The
+ * filename is mandatory, the comment is optional.
+ */
+ void initNew(const char* fileName, const char* comment);
+
+ /*
+ * Initialize the structure with the contents of a ZipEntry from
+ * another file.
+ */
+ status_t initFromExternal(const ZipFile* pZipFile, const ZipEntry* pEntry);
+
+ /*
+ * Add some pad bytes to the LFH. We do this by adding or resizing
+ * the "extra" field.
+ */
+ status_t addPadding(int padding);
+
+ /*
+ * Set information about the data for this entry.
+ */
+ void setDataInfo(long uncompLen, long compLen, unsigned long crc32,
+ int compressionMethod);
+
+ /*
+ * Set the modification date.
+ */
+ void setModWhen(time_t when);
+
+ /*
+ * Set the offset of the local file header, relative to the start of
+ * the current file.
+ */
+ void setLFHOffset(off_t offset) {
+ mCDE.mLocalHeaderRelOffset = (long) offset;
+ }
+
+ /* mark for deletion; used by ZipFile::remove() */
+ void setDeleted(void) { mDeleted = true; }
+
+private:
+ /* these are private and not defined */
+ ZipEntry(const ZipEntry& src);
+ ZipEntry& operator=(const ZipEntry& src);
+
+ /* returns "true" if the CDE and the LFH agree */
+ bool compareHeaders(void) const;
+ void copyCDEtoLFH(void);
+
+ bool mDeleted; // set if entry is pending deletion
+ bool mMarked; // app-defined marker
+
+ /*
+ * Every entry in the Zip archive starts off with one of these.
+ */
+ class LocalFileHeader {
+ public:
+ LocalFileHeader(void) :
+ mVersionToExtract(0),
+ mGPBitFlag(0),
+ mCompressionMethod(0),
+ mLastModFileTime(0),
+ mLastModFileDate(0),
+ mCRC32(0),
+ mCompressedSize(0),
+ mUncompressedSize(0),
+ mFileNameLength(0),
+ mExtraFieldLength(0),
+ mFileName(NULL),
+ mExtraField(NULL)
+ {}
+ virtual ~LocalFileHeader(void) {
+ delete[] mFileName;
+ delete[] mExtraField;
+ }
+
+ status_t read(FILE* fp);
+ status_t write(FILE* fp);
+
+ // unsigned long mSignature;
+ unsigned short mVersionToExtract;
+ unsigned short mGPBitFlag;
+ unsigned short mCompressionMethod;
+ unsigned short mLastModFileTime;
+ unsigned short mLastModFileDate;
+ unsigned long mCRC32;
+ unsigned long mCompressedSize;
+ unsigned long mUncompressedSize;
+ unsigned short mFileNameLength;
+ unsigned short mExtraFieldLength;
+ unsigned char* mFileName;
+ unsigned char* mExtraField;
+
+ enum {
+ kSignature = 0x04034b50,
+ kLFHLen = 30, // LocalFileHdr len, excl. var fields
+ };
+
+ void dump(void) const;
+ };
+
+ /*
+ * Every entry in the Zip archive has one of these in the "central
+ * directory" at the end of the file.
+ */
+ class CentralDirEntry {
+ public:
+ CentralDirEntry(void) :
+ mVersionMadeBy(0),
+ mVersionToExtract(0),
+ mGPBitFlag(0),
+ mCompressionMethod(0),
+ mLastModFileTime(0),
+ mLastModFileDate(0),
+ mCRC32(0),
+ mCompressedSize(0),
+ mUncompressedSize(0),
+ mFileNameLength(0),
+ mExtraFieldLength(0),
+ mFileCommentLength(0),
+ mDiskNumberStart(0),
+ mInternalAttrs(0),
+ mExternalAttrs(0),
+ mLocalHeaderRelOffset(0),
+ mFileName(NULL),
+ mExtraField(NULL),
+ mFileComment(NULL)
+ {}
+ virtual ~CentralDirEntry(void) {
+ delete[] mFileName;
+ delete[] mExtraField;
+ delete[] mFileComment;
+ }
+
+ status_t read(FILE* fp);
+ status_t write(FILE* fp);
+
+ CentralDirEntry& operator=(const CentralDirEntry& src);
+
+ // unsigned long mSignature;
+ unsigned short mVersionMadeBy;
+ unsigned short mVersionToExtract;
+ unsigned short mGPBitFlag;
+ unsigned short mCompressionMethod;
+ unsigned short mLastModFileTime;
+ unsigned short mLastModFileDate;
+ unsigned long mCRC32;
+ unsigned long mCompressedSize;
+ unsigned long mUncompressedSize;
+ unsigned short mFileNameLength;
+ unsigned short mExtraFieldLength;
+ unsigned short mFileCommentLength;
+ unsigned short mDiskNumberStart;
+ unsigned short mInternalAttrs;
+ unsigned long mExternalAttrs;
+ unsigned long mLocalHeaderRelOffset;
+ unsigned char* mFileName;
+ unsigned char* mExtraField;
+ unsigned char* mFileComment;
+
+ void dump(void) const;
+
+ enum {
+ kSignature = 0x02014b50,
+ kCDELen = 46, // CentralDirEnt len, excl. var fields
+ };
+ };
+
+ enum {
+ //kDataDescriptorSignature = 0x08074b50, // currently unused
+ kDataDescriptorLen = 16, // four 32-bit fields
+
+ kDefaultVersion = 20, // need deflate, nothing much else
+ kDefaultMadeBy = 0x0317, // 03=UNIX, 17=spec v2.3
+ kUsesDataDescr = 0x0008, // GPBitFlag bit 3
+ };
+
+ LocalFileHeader mLFH;
+ CentralDirEntry mCDE;
+};
+
+}; // namespace aapt
+
+#endif // __LIBS_ZIPENTRY_H
diff --git a/tools/aapt2/ZipFile.cpp b/tools/aapt2/ZipFile.cpp
new file mode 100644
index 0000000..41e59cf
--- /dev/null
+++ b/tools/aapt2/ZipFile.cpp
@@ -0,0 +1,1305 @@
+/*
+ * Copyright (C) 2006 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.
+ */
+
+//
+// Access to Zip archives.
+//
+
+#define LOG_TAG "zip"
+
+#include <androidfw/ZipUtils.h>
+#include <utils/Log.h>
+
+#include "ZipFile.h"
+#include "Util.h"
+
+#include <zlib.h>
+#define DEF_MEM_LEVEL 8 // normally in zutil.h?
+
+#include <memory.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <assert.h>
+
+namespace aapt {
+
+using namespace android;
+
+/*
+ * Some environments require the "b", some choke on it.
+ */
+#define FILE_OPEN_RO "rb"
+#define FILE_OPEN_RW "r+b"
+#define FILE_OPEN_RW_CREATE "w+b"
+
+/* should live somewhere else? */
+static status_t errnoToStatus(int err)
+{
+ if (err == ENOENT)
+ return NAME_NOT_FOUND;
+ else if (err == EACCES)
+ return PERMISSION_DENIED;
+ else
+ return UNKNOWN_ERROR;
+}
+
+/*
+ * Open a file and parse its guts.
+ */
+status_t ZipFile::open(const char* zipFileName, int flags)
+{
+ bool newArchive = false;
+
+ assert(mZipFp == NULL); // no reopen
+
+ if ((flags & kOpenTruncate))
+ flags |= kOpenCreate; // trunc implies create
+
+ if ((flags & kOpenReadOnly) && (flags & kOpenReadWrite))
+ return INVALID_OPERATION; // not both
+ if (!((flags & kOpenReadOnly) || (flags & kOpenReadWrite)))
+ return INVALID_OPERATION; // not neither
+ if ((flags & kOpenCreate) && !(flags & kOpenReadWrite))
+ return INVALID_OPERATION; // create requires write
+
+ if (flags & kOpenTruncate) {
+ newArchive = true;
+ } else {
+ newArchive = (access(zipFileName, F_OK) != 0);
+ if (!(flags & kOpenCreate) && newArchive) {
+ /* not creating, must already exist */
+ ALOGD("File %s does not exist", zipFileName);
+ return NAME_NOT_FOUND;
+ }
+ }
+
+ /* open the file */
+ const char* openflags;
+ if (flags & kOpenReadWrite) {
+ if (newArchive)
+ openflags = FILE_OPEN_RW_CREATE;
+ else
+ openflags = FILE_OPEN_RW;
+ } else {
+ openflags = FILE_OPEN_RO;
+ }
+ mZipFp = fopen(zipFileName, openflags);
+ if (mZipFp == NULL) {
+ int err = errno;
+ ALOGD("fopen failed: %d\n", err);
+ return errnoToStatus(err);
+ }
+
+ status_t result;
+ if (!newArchive) {
+ /*
+ * Load the central directory. If that fails, then this probably
+ * isn't a Zip archive.
+ */
+ result = readCentralDir();
+ } else {
+ /*
+ * Newly-created. The EndOfCentralDir constructor actually
+ * sets everything to be the way we want it (all zeroes). We
+ * set mNeedCDRewrite so that we create *something* if the
+ * caller doesn't add any files. (We could also just unlink
+ * the file if it's brand new and nothing was added, but that's
+ * probably doing more than we really should -- the user might
+ * have a need for empty zip files.)
+ */
+ mNeedCDRewrite = true;
+ result = NO_ERROR;
+ }
+
+ if (flags & kOpenReadOnly)
+ mReadOnly = true;
+ else
+ assert(!mReadOnly);
+
+ return result;
+}
+
+/*
+ * Return the Nth entry in the archive.
+ */
+ZipEntry* ZipFile::getEntryByIndex(int idx) const
+{
+ if (idx < 0 || idx >= (int) mEntries.size())
+ return NULL;
+
+ return mEntries[idx];
+}
+
+/*
+ * Find an entry by name.
+ */
+ZipEntry* ZipFile::getEntryByName(const char* fileName) const
+{
+ /*
+ * Do a stupid linear string-compare search.
+ *
+ * There are various ways to speed this up, especially since it's rare
+ * to intermingle changes to the archive with "get by name" calls. We
+ * don't want to sort the mEntries vector itself, however, because
+ * it's used to recreate the Central Directory.
+ *
+ * (Hash table works, parallel list of pointers in sorted order is good.)
+ */
+ int idx;
+
+ for (idx = mEntries.size()-1; idx >= 0; idx--) {
+ ZipEntry* pEntry = mEntries[idx];
+ if (!pEntry->getDeleted() &&
+ strcmp(fileName, pEntry->getFileName()) == 0)
+ {
+ return pEntry;
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * Empty the mEntries vector.
+ */
+void ZipFile::discardEntries(void)
+{
+ int count = mEntries.size();
+
+ while (--count >= 0)
+ delete mEntries[count];
+
+ mEntries.clear();
+}
+
+
+/*
+ * Find the central directory and read the contents.
+ *
+ * The fun thing about ZIP archives is that they may or may not be
+ * readable from start to end. In some cases, notably for archives
+ * that were written to stdout, the only length information is in the
+ * central directory at the end of the file.
+ *
+ * Of course, the central directory can be followed by a variable-length
+ * comment field, so we have to scan through it backwards. The comment
+ * is at most 64K, plus we have 18 bytes for the end-of-central-dir stuff
+ * itself, plus apparently sometimes people throw random junk on the end
+ * just for the fun of it.
+ *
+ * This is all a little wobbly. If the wrong value ends up in the EOCD
+ * area, we're hosed. This appears to be the way that everbody handles
+ * it though, so we're in pretty good company if this fails.
+ */
+status_t ZipFile::readCentralDir(void)
+{
+ status_t result = NO_ERROR;
+ unsigned char* buf = NULL;
+ off_t fileLength, seekStart;
+ long readAmount;
+ int i;
+
+ fseek(mZipFp, 0, SEEK_END);
+ fileLength = ftell(mZipFp);
+ rewind(mZipFp);
+
+ /* too small to be a ZIP archive? */
+ if (fileLength < EndOfCentralDir::kEOCDLen) {
+ ALOGD("Length is %ld -- too small\n", (long)fileLength);
+ result = INVALID_OPERATION;
+ goto bail;
+ }
+
+ buf = new unsigned char[EndOfCentralDir::kMaxEOCDSearch];
+ if (buf == NULL) {
+ ALOGD("Failure allocating %d bytes for EOCD search",
+ EndOfCentralDir::kMaxEOCDSearch);
+ result = NO_MEMORY;
+ goto bail;
+ }
+
+ if (fileLength > EndOfCentralDir::kMaxEOCDSearch) {
+ seekStart = fileLength - EndOfCentralDir::kMaxEOCDSearch;
+ readAmount = EndOfCentralDir::kMaxEOCDSearch;
+ } else {
+ seekStart = 0;
+ readAmount = (long) fileLength;
+ }
+ if (fseek(mZipFp, seekStart, SEEK_SET) != 0) {
+ ALOGD("Failure seeking to end of zip at %ld", (long) seekStart);
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ /* read the last part of the file into the buffer */
+ if (fread(buf, 1, readAmount, mZipFp) != (size_t) readAmount) {
+ ALOGD("short file? wanted %ld\n", readAmount);
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ /* find the end-of-central-dir magic */
+ for (i = readAmount - 4; i >= 0; i--) {
+ if (buf[i] == 0x50 &&
+ ZipEntry::getLongLE(&buf[i]) == EndOfCentralDir::kSignature)
+ {
+ ALOGV("+++ Found EOCD at buf+%d\n", i);
+ break;
+ }
+ }
+ if (i < 0) {
+ ALOGD("EOCD not found, not Zip\n");
+ result = INVALID_OPERATION;
+ goto bail;
+ }
+
+ /* extract eocd values */
+ result = mEOCD.readBuf(buf + i, readAmount - i);
+ if (result != NO_ERROR) {
+ ALOGD("Failure reading %ld bytes of EOCD values", readAmount - i);
+ goto bail;
+ }
+ //mEOCD.dump();
+
+ if (mEOCD.mDiskNumber != 0 || mEOCD.mDiskWithCentralDir != 0 ||
+ mEOCD.mNumEntries != mEOCD.mTotalNumEntries)
+ {
+ ALOGD("Archive spanning not supported\n");
+ result = INVALID_OPERATION;
+ goto bail;
+ }
+
+ /*
+ * So far so good. "mCentralDirSize" is the size in bytes of the
+ * central directory, so we can just seek back that far to find it.
+ * We can also seek forward mCentralDirOffset bytes from the
+ * start of the file.
+ *
+ * We're not guaranteed to have the rest of the central dir in the
+ * buffer, nor are we guaranteed that the central dir will have any
+ * sort of convenient size. We need to skip to the start of it and
+ * read the header, then the other goodies.
+ *
+ * The only thing we really need right now is the file comment, which
+ * we're hoping to preserve.
+ */
+ if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0) {
+ ALOGD("Failure seeking to central dir offset %ld\n",
+ mEOCD.mCentralDirOffset);
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ /*
+ * Loop through and read the central dir entries.
+ */
+ ALOGV("Scanning %d entries...\n", mEOCD.mTotalNumEntries);
+ int entry;
+ for (entry = 0; entry < mEOCD.mTotalNumEntries; entry++) {
+ ZipEntry* pEntry = new ZipEntry;
+
+ result = pEntry->initFromCDE(mZipFp);
+ if (result != NO_ERROR) {
+ ALOGD("initFromCDE failed\n");
+ delete pEntry;
+ goto bail;
+ }
+
+ mEntries.push_back(pEntry);
+ }
+
+
+ /*
+ * If all went well, we should now be back at the EOCD.
+ */
+ {
+ unsigned char checkBuf[4];
+ if (fread(checkBuf, 1, 4, mZipFp) != 4) {
+ ALOGD("EOCD check read failed\n");
+ result = INVALID_OPERATION;
+ goto bail;
+ }
+ if (ZipEntry::getLongLE(checkBuf) != EndOfCentralDir::kSignature) {
+ ALOGD("EOCD read check failed\n");
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+ ALOGV("+++ EOCD read check passed\n");
+ }
+
+bail:
+ delete[] buf;
+ return result;
+}
+
+status_t ZipFile::add(const BigBuffer& buffer, const char* storageName, int compressionMethod,
+ ZipEntry** ppEntry) {
+ std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+ return add(data.get(), buffer.size(), storageName, compressionMethod, ppEntry);
+}
+
+
+/*
+ * Add a new file to the archive.
+ *
+ * This requires creating and populating a ZipEntry structure, and copying
+ * the data into the file at the appropriate position. The "appropriate
+ * position" is the current location of the central directory, which we
+ * casually overwrite (we can put it back later).
+ *
+ * If we were concerned about safety, we would want to make all changes
+ * in a temp file and then overwrite the original after everything was
+ * safely written. Not really a concern for us.
+ */
+status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size,
+ const char* storageName, int sourceType, int compressionMethod,
+ ZipEntry** ppEntry)
+{
+ ZipEntry* pEntry = NULL;
+ status_t result = NO_ERROR;
+ long lfhPosn, startPosn, endPosn, uncompressedLen;
+ FILE* inputFp = NULL;
+ unsigned long crc;
+ time_t modWhen;
+
+ if (mReadOnly)
+ return INVALID_OPERATION;
+
+ assert(compressionMethod == ZipEntry::kCompressDeflated ||
+ compressionMethod == ZipEntry::kCompressStored);
+
+ /* make sure we're in a reasonable state */
+ assert(mZipFp != NULL);
+ assert(mEntries.size() == mEOCD.mTotalNumEntries);
+
+ /* make sure it doesn't already exist */
+ if (getEntryByName(storageName) != NULL)
+ return ALREADY_EXISTS;
+
+ if (!data) {
+ inputFp = fopen(fileName, FILE_OPEN_RO);
+ if (inputFp == NULL)
+ return errnoToStatus(errno);
+ }
+
+ if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ pEntry = new ZipEntry;
+ pEntry->initNew(storageName, NULL);
+
+ /*
+ * From here on out, failures are more interesting.
+ */
+ mNeedCDRewrite = true;
+
+ /*
+ * Write the LFH, even though it's still mostly blank. We need it
+ * as a place-holder. In theory the LFH isn't necessary, but in
+ * practice some utilities demand it.
+ */
+ lfhPosn = ftell(mZipFp);
+ pEntry->mLFH.write(mZipFp);
+ startPosn = ftell(mZipFp);
+
+ /*
+ * Copy the data in, possibly compressing it as we go.
+ */
+ if (sourceType == ZipEntry::kCompressStored) {
+ if (compressionMethod == ZipEntry::kCompressDeflated) {
+ bool failed = false;
+ result = compressFpToFp(mZipFp, inputFp, data, size, &crc);
+ if (result != NO_ERROR) {
+ ALOGD("compression failed, storing\n");
+ failed = true;
+ } else {
+ /*
+ * Make sure it has compressed "enough". This probably ought
+ * to be set through an API call, but I don't expect our
+ * criteria to change over time.
+ */
+ long src = inputFp ? ftell(inputFp) : size;
+ long dst = ftell(mZipFp) - startPosn;
+ if (dst + (dst / 10) > src) {
+ ALOGD("insufficient compression (src=%ld dst=%ld), storing\n",
+ src, dst);
+ failed = true;
+ }
+ }
+
+ if (failed) {
+ compressionMethod = ZipEntry::kCompressStored;
+ if (inputFp) rewind(inputFp);
+ fseek(mZipFp, startPosn, SEEK_SET);
+ /* fall through to kCompressStored case */
+ }
+ }
+ /* handle "no compression" request, or failed compression from above */
+ if (compressionMethod == ZipEntry::kCompressStored) {
+ if (inputFp) {
+ result = copyFpToFp(mZipFp, inputFp, &crc);
+ } else {
+ result = copyDataToFp(mZipFp, data, size, &crc);
+ }
+ if (result != NO_ERROR) {
+ // don't need to truncate; happens in CDE rewrite
+ ALOGD("failed copying data in\n");
+ goto bail;
+ }
+ }
+
+ // currently seeked to end of file
+ uncompressedLen = inputFp ? ftell(inputFp) : size;
+ } else if (sourceType == ZipEntry::kCompressDeflated) {
+ /* we should support uncompressed-from-compressed, but it's not
+ * important right now */
+ assert(compressionMethod == ZipEntry::kCompressDeflated);
+
+ bool scanResult;
+ int method;
+ long compressedLen;
+
+ scanResult = ZipUtils::examineGzip(inputFp, &method, &uncompressedLen,
+ &compressedLen, &crc);
+ if (!scanResult || method != ZipEntry::kCompressDeflated) {
+ ALOGD("this isn't a deflated gzip file?");
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ result = copyPartialFpToFp(mZipFp, inputFp, compressedLen, NULL);
+ if (result != NO_ERROR) {
+ ALOGD("failed copying gzip data in\n");
+ goto bail;
+ }
+ } else {
+ assert(false);
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ /*
+ * We could write the "Data Descriptor", but there doesn't seem to
+ * be any point since we're going to go back and write the LFH.
+ *
+ * Update file offsets.
+ */
+ endPosn = ftell(mZipFp); // seeked to end of compressed data
+
+ /*
+ * Success! Fill out new values.
+ */
+ pEntry->setDataInfo(uncompressedLen, endPosn - startPosn, crc,
+ compressionMethod);
+ modWhen = getModTime(inputFp ? fileno(inputFp) : fileno(mZipFp));
+ pEntry->setModWhen(modWhen);
+ pEntry->setLFHOffset(lfhPosn);
+ mEOCD.mNumEntries++;
+ mEOCD.mTotalNumEntries++;
+ mEOCD.mCentralDirSize = 0; // mark invalid; set by flush()
+ mEOCD.mCentralDirOffset = endPosn;
+
+ /*
+ * Go back and write the LFH.
+ */
+ if (fseek(mZipFp, lfhPosn, SEEK_SET) != 0) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+ pEntry->mLFH.write(mZipFp);
+
+ /*
+ * Add pEntry to the list.
+ */
+ mEntries.push_back(pEntry);
+ if (ppEntry != NULL)
+ *ppEntry = pEntry;
+ pEntry = NULL;
+
+bail:
+ if (inputFp != NULL)
+ fclose(inputFp);
+ delete pEntry;
+ return result;
+}
+
+/*
+ * Add an entry by copying it from another zip file. If "padding" is
+ * nonzero, the specified number of bytes will be added to the "extra"
+ * field in the header.
+ *
+ * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
+ */
+status_t ZipFile::add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry,
+ int padding, ZipEntry** ppEntry)
+{
+ ZipEntry* pEntry = NULL;
+ status_t result;
+ long lfhPosn, endPosn;
+
+ if (mReadOnly)
+ return INVALID_OPERATION;
+
+ /* make sure we're in a reasonable state */
+ assert(mZipFp != NULL);
+ assert(mEntries.size() == mEOCD.mTotalNumEntries);
+
+ if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0) {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ pEntry = new ZipEntry;
+ if (pEntry == NULL) {
+ result = NO_MEMORY;
+ goto bail;
+ }
+
+ result = pEntry->initFromExternal(pSourceZip, pSourceEntry);
+ if (result != NO_ERROR)
+ goto bail;
+ if (padding != 0) {
+ result = pEntry->addPadding(padding);
+ if (result != NO_ERROR)
+ goto bail;
+ }
+
+ /*
+ * From here on out, failures are more interesting.
+ */
+ mNeedCDRewrite = true;
+
+ /*
+ * Write the LFH. Since we're not recompressing the data, we already
+ * have all of the fields filled out.
+ */
+ lfhPosn = ftell(mZipFp);
+ pEntry->mLFH.write(mZipFp);
+
+ /*
+ * Copy the data over.
+ *
+ * If the "has data descriptor" flag is set, we want to copy the DD
+ * fields as well. This is a fixed-size area immediately following
+ * the data.
+ */
+ if (fseek(pSourceZip->mZipFp, pSourceEntry->getFileOffset(), SEEK_SET) != 0)
+ {
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ off_t copyLen;
+ copyLen = pSourceEntry->getCompressedLen();
+ if ((pSourceEntry->mLFH.mGPBitFlag & ZipEntry::kUsesDataDescr) != 0)
+ copyLen += ZipEntry::kDataDescriptorLen;
+
+ if (copyPartialFpToFp(mZipFp, pSourceZip->mZipFp, copyLen, NULL)
+ != NO_ERROR)
+ {
+ ALOGW("copy of '%s' failed\n", pEntry->mCDE.mFileName);
+ result = UNKNOWN_ERROR;
+ goto bail;
+ }
+
+ /*
+ * Update file offsets.
+ */
+ endPosn = ftell(mZipFp);
+
+ /*
+ * Success! Fill out new values.
+ */
+ pEntry->setLFHOffset(lfhPosn); // sets mCDE.mLocalHeaderRelOffset
+ mEOCD.mNumEntries++;
+ mEOCD.mTotalNumEntries++;
+ mEOCD.mCentralDirSize = 0; // mark invalid; set by flush()
+ mEOCD.mCentralDirOffset = endPosn;
+
+ /*
+ * Add pEntry to the list.
+ */
+ mEntries.push_back(pEntry);
+ if (ppEntry != NULL)
+ *ppEntry = pEntry;
+ pEntry = NULL;
+
+ result = NO_ERROR;
+
+bail:
+ delete pEntry;
+ return result;
+}
+
+/*
+ * Copy all of the bytes in "src" to "dst".
+ *
+ * On exit, "srcFp" will be seeked to the end of the file, and "dstFp"
+ * will be seeked immediately past the data.
+ */
+status_t ZipFile::copyFpToFp(FILE* dstFp, FILE* srcFp, unsigned long* pCRC32)
+{
+ unsigned char tmpBuf[32768];
+ size_t count;
+
+ *pCRC32 = crc32(0L, Z_NULL, 0);
+
+ while (1) {
+ count = fread(tmpBuf, 1, sizeof(tmpBuf), srcFp);
+ if (ferror(srcFp) || ferror(dstFp))
+ return errnoToStatus(errno);
+ if (count == 0)
+ break;
+
+ *pCRC32 = crc32(*pCRC32, tmpBuf, count);
+
+ if (fwrite(tmpBuf, 1, count, dstFp) != count) {
+ ALOGD("fwrite %d bytes failed\n", (int) count);
+ return UNKNOWN_ERROR;
+ }
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Copy all of the bytes in "src" to "dst".
+ *
+ * On exit, "dstFp" will be seeked immediately past the data.
+ */
+status_t ZipFile::copyDataToFp(FILE* dstFp,
+ const void* data, size_t size, unsigned long* pCRC32)
+{
+ *pCRC32 = crc32(0L, Z_NULL, 0);
+ if (size > 0) {
+ *pCRC32 = crc32(*pCRC32, (const unsigned char*)data, size);
+ if (fwrite(data, 1, size, dstFp) != size) {
+ ALOGD("fwrite %d bytes failed\n", (int) size);
+ return UNKNOWN_ERROR;
+ }
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Copy some of the bytes in "src" to "dst".
+ *
+ * If "pCRC32" is NULL, the CRC will not be computed.
+ *
+ * On exit, "srcFp" will be seeked to the end of the file, and "dstFp"
+ * will be seeked immediately past the data just written.
+ */
+status_t ZipFile::copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length,
+ unsigned long* pCRC32)
+{
+ unsigned char tmpBuf[32768];
+ size_t count;
+
+ if (pCRC32 != NULL)
+ *pCRC32 = crc32(0L, Z_NULL, 0);
+
+ while (length) {
+ long readSize;
+
+ readSize = sizeof(tmpBuf);
+ if (readSize > length)
+ readSize = length;
+
+ count = fread(tmpBuf, 1, readSize, srcFp);
+ if ((long) count != readSize) { // error or unexpected EOF
+ ALOGD("fread %d bytes failed\n", (int) readSize);
+ return UNKNOWN_ERROR;
+ }
+
+ if (pCRC32 != NULL)
+ *pCRC32 = crc32(*pCRC32, tmpBuf, count);
+
+ if (fwrite(tmpBuf, 1, count, dstFp) != count) {
+ ALOGD("fwrite %d bytes failed\n", (int) count);
+ return UNKNOWN_ERROR;
+ }
+
+ length -= readSize;
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Compress all of the data in "srcFp" and write it to "dstFp".
+ *
+ * On exit, "srcFp" will be seeked to the end of the file, and "dstFp"
+ * will be seeked immediately past the compressed data.
+ */
+status_t ZipFile::compressFpToFp(FILE* dstFp, FILE* srcFp,
+ const void* data, size_t size, unsigned long* pCRC32)
+{
+ status_t result = NO_ERROR;
+ const size_t kBufSize = 32768;
+ unsigned char* inBuf = NULL;
+ unsigned char* outBuf = NULL;
+ z_stream zstream;
+ bool atEof = false; // no feof() aviailable yet
+ unsigned long crc;
+ int zerr;
+
+ /*
+ * Create an input buffer and an output buffer.
+ */
+ inBuf = new unsigned char[kBufSize];
+ outBuf = new unsigned char[kBufSize];
+ if (inBuf == NULL || outBuf == NULL) {
+ result = NO_MEMORY;
+ goto bail;
+ }
+
+ /*
+ * Initialize the zlib stream.
+ */
+ memset(&zstream, 0, sizeof(zstream));
+ zstream.zalloc = Z_NULL;
+ zstream.zfree = Z_NULL;
+ zstream.opaque = Z_NULL;
+ zstream.next_in = NULL;
+ zstream.avail_in = 0;
+ zstream.next_out = outBuf;
+ zstream.avail_out = kBufSize;
+ zstream.data_type = Z_UNKNOWN;
+
+ zerr = deflateInit2(&zstream, Z_BEST_COMPRESSION,
+ Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
+ if (zerr != Z_OK) {
+ result = UNKNOWN_ERROR;
+ if (zerr == Z_VERSION_ERROR) {
+ ALOGE("Installed zlib is not compatible with linked version (%s)\n",
+ ZLIB_VERSION);
+ } else {
+ ALOGD("Call to deflateInit2 failed (zerr=%d)\n", zerr);
+ }
+ goto bail;
+ }
+
+ crc = crc32(0L, Z_NULL, 0);
+
+ /*
+ * Loop while we have data.
+ */
+ do {
+ size_t getSize;
+ int flush;
+
+ /* only read if the input buffer is empty */
+ if (zstream.avail_in == 0 && !atEof) {
+ ALOGV("+++ reading %d bytes\n", (int)kBufSize);
+ if (data) {
+ getSize = size > kBufSize ? kBufSize : size;
+ memcpy(inBuf, data, getSize);
+ data = ((const char*)data) + getSize;
+ size -= getSize;
+ } else {
+ getSize = fread(inBuf, 1, kBufSize, srcFp);
+ if (ferror(srcFp)) {
+ ALOGD("deflate read failed (errno=%d)\n", errno);
+ goto z_bail;
+ }
+ }
+ if (getSize < kBufSize) {
+ ALOGV("+++ got %d bytes, EOF reached\n",
+ (int)getSize);
+ atEof = true;
+ }
+
+ crc = crc32(crc, inBuf, getSize);
+
+ zstream.next_in = inBuf;
+ zstream.avail_in = getSize;
+ }
+
+ if (atEof)
+ flush = Z_FINISH; /* tell zlib that we're done */
+ else
+ flush = Z_NO_FLUSH; /* more to come! */
+
+ zerr = deflate(&zstream, flush);
+ if (zerr != Z_OK && zerr != Z_STREAM_END) {
+ ALOGD("zlib deflate call failed (zerr=%d)\n", zerr);
+ result = UNKNOWN_ERROR;
+ goto z_bail;
+ }
+
+ /* write when we're full or when we're done */
+ if (zstream.avail_out == 0 ||
+ (zerr == Z_STREAM_END && zstream.avail_out != (uInt) kBufSize))
+ {
+ ALOGV("+++ writing %d bytes\n", (int) (zstream.next_out - outBuf));
+ if (fwrite(outBuf, 1, zstream.next_out - outBuf, dstFp) !=
+ (size_t)(zstream.next_out - outBuf))
+ {
+ ALOGD("write %d failed in deflate\n",
+ (int) (zstream.next_out - outBuf));
+ goto z_bail;
+ }
+
+ zstream.next_out = outBuf;
+ zstream.avail_out = kBufSize;
+ }
+ } while (zerr == Z_OK);
+
+ assert(zerr == Z_STREAM_END); /* other errors should've been caught */
+
+ *pCRC32 = crc;
+
+z_bail:
+ deflateEnd(&zstream); /* free up any allocated structures */
+
+bail:
+ delete[] inBuf;
+ delete[] outBuf;
+
+ return result;
+}
+
+/*
+ * Mark an entry as deleted.
+ *
+ * We will eventually need to crunch the file down, but if several files
+ * are being removed (perhaps as part of an "update" process) we can make
+ * things considerably faster by deferring the removal to "flush" time.
+ */
+status_t ZipFile::remove(ZipEntry* pEntry)
+{
+ /*
+ * Should verify that pEntry is actually part of this archive, and
+ * not some stray ZipEntry from a different file.
+ */
+
+ /* mark entry as deleted, and mark archive as dirty */
+ pEntry->setDeleted();
+ mNeedCDRewrite = true;
+ return NO_ERROR;
+}
+
+/*
+ * Flush any pending writes.
+ *
+ * In particular, this will crunch out deleted entries, and write the
+ * Central Directory and EOCD if we have stomped on them.
+ */
+status_t ZipFile::flush(void)
+{
+ status_t result = NO_ERROR;
+ long eocdPosn;
+ int i, count;
+
+ if (mReadOnly)
+ return INVALID_OPERATION;
+ if (!mNeedCDRewrite)
+ return NO_ERROR;
+
+ assert(mZipFp != NULL);
+
+ result = crunchArchive();
+ if (result != NO_ERROR)
+ return result;
+
+ if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0)
+ return UNKNOWN_ERROR;
+
+ count = mEntries.size();
+ for (i = 0; i < count; i++) {
+ ZipEntry* pEntry = mEntries[i];
+ pEntry->mCDE.write(mZipFp);
+ }
+
+ eocdPosn = ftell(mZipFp);
+ mEOCD.mCentralDirSize = eocdPosn - mEOCD.mCentralDirOffset;
+
+ mEOCD.write(mZipFp);
+
+ /*
+ * If we had some stuff bloat up during compression and get replaced
+ * with plain files, or if we deleted some entries, there's a lot
+ * of wasted space at the end of the file. Remove it now.
+ */
+ if (ftruncate(fileno(mZipFp), ftell(mZipFp)) != 0) {
+ ALOGW("ftruncate failed %ld: %s\n", ftell(mZipFp), strerror(errno));
+ // not fatal
+ }
+
+ /* should we clear the "newly added" flag in all entries now? */
+
+ mNeedCDRewrite = false;
+ return NO_ERROR;
+}
+
+/*
+ * Crunch deleted files out of an archive by shifting the later files down.
+ *
+ * Because we're not using a temp file, we do the operation inside the
+ * current file.
+ */
+status_t ZipFile::crunchArchive(void)
+{
+ status_t result = NO_ERROR;
+ int i, count;
+ long delCount, adjust;
+
+#if 0
+ printf("CONTENTS:\n");
+ for (i = 0; i < (int) mEntries.size(); i++) {
+ printf(" %d: lfhOff=%ld del=%d\n",
+ i, mEntries[i]->getLFHOffset(), mEntries[i]->getDeleted());
+ }
+ printf(" END is %ld\n", (long) mEOCD.mCentralDirOffset);
+#endif
+
+ /*
+ * Roll through the set of files, shifting them as appropriate. We
+ * could probably get a slight performance improvement by sliding
+ * multiple files down at once (because we could use larger reads
+ * when operating on batches of small files), but it's not that useful.
+ */
+ count = mEntries.size();
+ delCount = adjust = 0;
+ for (i = 0; i < count; i++) {
+ ZipEntry* pEntry = mEntries[i];
+ long span;
+
+ if (pEntry->getLFHOffset() != 0) {
+ long nextOffset;
+
+ /* Get the length of this entry by finding the offset
+ * of the next entry. Directory entries don't have
+ * file offsets, so we need to find the next non-directory
+ * entry.
+ */
+ nextOffset = 0;
+ for (int ii = i+1; nextOffset == 0 && ii < count; ii++)
+ nextOffset = mEntries[ii]->getLFHOffset();
+ if (nextOffset == 0)
+ nextOffset = mEOCD.mCentralDirOffset;
+ span = nextOffset - pEntry->getLFHOffset();
+
+ assert(span >= ZipEntry::LocalFileHeader::kLFHLen);
+ } else {
+ /* This is a directory entry. It doesn't have
+ * any actual file contents, so there's no need to
+ * move anything.
+ */
+ span = 0;
+ }
+
+ //printf("+++ %d: off=%ld span=%ld del=%d [count=%d]\n",
+ // i, pEntry->getLFHOffset(), span, pEntry->getDeleted(), count);
+
+ if (pEntry->getDeleted()) {
+ adjust += span;
+ delCount++;
+
+ delete pEntry;
+ mEntries.erase(mEntries.begin() + i);
+
+ /* adjust loop control */
+ count--;
+ i--;
+ } else if (span != 0 && adjust > 0) {
+ /* shuffle this entry back */
+ //printf("+++ Shuffling '%s' back %ld\n",
+ // pEntry->getFileName(), adjust);
+ result = filemove(mZipFp, pEntry->getLFHOffset() - adjust,
+ pEntry->getLFHOffset(), span);
+ if (result != NO_ERROR) {
+ /* this is why you use a temp file */
+ ALOGE("error during crunch - archive is toast\n");
+ return result;
+ }
+
+ pEntry->setLFHOffset(pEntry->getLFHOffset() - adjust);
+ }
+ }
+
+ /*
+ * Fix EOCD info. We have to wait until the end to do some of this
+ * because we use mCentralDirOffset to determine "span" for the
+ * last entry.
+ */
+ mEOCD.mCentralDirOffset -= adjust;
+ mEOCD.mNumEntries -= delCount;
+ mEOCD.mTotalNumEntries -= delCount;
+ mEOCD.mCentralDirSize = 0; // mark invalid; set by flush()
+
+ assert(mEOCD.mNumEntries == mEOCD.mTotalNumEntries);
+ assert(mEOCD.mNumEntries == count);
+
+ return result;
+}
+
+/*
+ * Works like memmove(), but on pieces of a file.
+ */
+status_t ZipFile::filemove(FILE* fp, off_t dst, off_t src, size_t n)
+{
+ if (dst == src || n <= 0)
+ return NO_ERROR;
+
+ unsigned char readBuf[32768];
+
+ if (dst < src) {
+ /* shift stuff toward start of file; must read from start */
+ while (n != 0) {
+ size_t getSize = sizeof(readBuf);
+ if (getSize > n)
+ getSize = n;
+
+ if (fseek(fp, (long) src, SEEK_SET) != 0) {
+ ALOGD("filemove src seek %ld failed\n", (long) src);
+ return UNKNOWN_ERROR;
+ }
+
+ if (fread(readBuf, 1, getSize, fp) != getSize) {
+ ALOGD("filemove read %ld off=%ld failed\n",
+ (long) getSize, (long) src);
+ return UNKNOWN_ERROR;
+ }
+
+ if (fseek(fp, (long) dst, SEEK_SET) != 0) {
+ ALOGD("filemove dst seek %ld failed\n", (long) dst);
+ return UNKNOWN_ERROR;
+ }
+
+ if (fwrite(readBuf, 1, getSize, fp) != getSize) {
+ ALOGD("filemove write %ld off=%ld failed\n",
+ (long) getSize, (long) dst);
+ return UNKNOWN_ERROR;
+ }
+
+ src += getSize;
+ dst += getSize;
+ n -= getSize;
+ }
+ } else {
+ /* shift stuff toward end of file; must read from end */
+ assert(false); // write this someday, maybe
+ return UNKNOWN_ERROR;
+ }
+
+ return NO_ERROR;
+}
+
+
+/*
+ * Get the modification time from a file descriptor.
+ */
+time_t ZipFile::getModTime(int fd)
+{
+ struct stat sb;
+
+ if (fstat(fd, &sb) < 0) {
+ ALOGD("HEY: fstat on fd %d failed\n", fd);
+ return (time_t) -1;
+ }
+
+ return sb.st_mtime;
+}
+
+
+#if 0 /* this is a bad idea */
+/*
+ * Get a copy of the Zip file descriptor.
+ *
+ * We don't allow this if the file was opened read-write because we tend
+ * to leave the file contents in an uncertain state between calls to
+ * flush(). The duplicated file descriptor should only be valid for reads.
+ */
+int ZipFile::getZipFd(void) const
+{
+ if (!mReadOnly)
+ return INVALID_OPERATION;
+ assert(mZipFp != NULL);
+
+ int fd;
+ fd = dup(fileno(mZipFp));
+ if (fd < 0) {
+ ALOGD("didn't work, errno=%d\n", errno);
+ }
+
+ return fd;
+}
+#endif
+
+
+#if 0
+/*
+ * Expand data.
+ */
+bool ZipFile::uncompress(const ZipEntry* pEntry, void* buf) const
+{
+ return false;
+}
+#endif
+
+// free the memory when you're done
+void* ZipFile::uncompress(const ZipEntry* entry)
+{
+ size_t unlen = entry->getUncompressedLen();
+ size_t clen = entry->getCompressedLen();
+
+ void* buf = malloc(unlen);
+ if (buf == NULL) {
+ return NULL;
+ }
+
+ fseek(mZipFp, 0, SEEK_SET);
+
+ off_t offset = entry->getFileOffset();
+ if (fseek(mZipFp, offset, SEEK_SET) != 0) {
+ goto bail;
+ }
+
+ switch (entry->getCompressionMethod())
+ {
+ case ZipEntry::kCompressStored: {
+ ssize_t amt = fread(buf, 1, unlen, mZipFp);
+ if (amt != (ssize_t)unlen) {
+ goto bail;
+ }
+#if 0
+ printf("data...\n");
+ const unsigned char* p = (unsigned char*)buf;
+ const unsigned char* end = p+unlen;
+ for (int i=0; i<32 && p < end; i++) {
+ printf("0x%08x ", (int)(offset+(i*0x10)));
+ for (int j=0; j<0x10 && p < end; j++) {
+ printf(" %02x", *p);
+ p++;
+ }
+ printf("\n");
+ }
+#endif
+
+ }
+ break;
+ case ZipEntry::kCompressDeflated: {
+ if (!ZipUtils::inflateToBuffer(mZipFp, buf, unlen, clen)) {
+ goto bail;
+ }
+ }
+ break;
+ default:
+ goto bail;
+ }
+ return buf;
+
+bail:
+ free(buf);
+ return NULL;
+}
+
+
+/*
+ * ===========================================================================
+ * ZipFile::EndOfCentralDir
+ * ===========================================================================
+ */
+
+/*
+ * Read the end-of-central-dir fields.
+ *
+ * "buf" should be positioned at the EOCD signature, and should contain
+ * the entire EOCD area including the comment.
+ */
+status_t ZipFile::EndOfCentralDir::readBuf(const unsigned char* buf, int len)
+{
+ /* don't allow re-use */
+ assert(mComment == NULL);
+
+ if (len < kEOCDLen) {
+ /* looks like ZIP file got truncated */
+ ALOGD(" Zip EOCD: expected >= %d bytes, found %d\n",
+ kEOCDLen, len);
+ return INVALID_OPERATION;
+ }
+
+ /* this should probably be an assert() */
+ if (ZipEntry::getLongLE(&buf[0x00]) != kSignature)
+ return UNKNOWN_ERROR;
+
+ mDiskNumber = ZipEntry::getShortLE(&buf[0x04]);
+ mDiskWithCentralDir = ZipEntry::getShortLE(&buf[0x06]);
+ mNumEntries = ZipEntry::getShortLE(&buf[0x08]);
+ mTotalNumEntries = ZipEntry::getShortLE(&buf[0x0a]);
+ mCentralDirSize = ZipEntry::getLongLE(&buf[0x0c]);
+ mCentralDirOffset = ZipEntry::getLongLE(&buf[0x10]);
+ mCommentLen = ZipEntry::getShortLE(&buf[0x14]);
+
+ // TODO: validate mCentralDirOffset
+
+ if (mCommentLen > 0) {
+ if (kEOCDLen + mCommentLen > len) {
+ ALOGD("EOCD(%d) + comment(%d) exceeds len (%d)\n",
+ kEOCDLen, mCommentLen, len);
+ return UNKNOWN_ERROR;
+ }
+ mComment = new unsigned char[mCommentLen];
+ memcpy(mComment, buf + kEOCDLen, mCommentLen);
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Write an end-of-central-directory section.
+ */
+status_t ZipFile::EndOfCentralDir::write(FILE* fp)
+{
+ unsigned char buf[kEOCDLen];
+
+ ZipEntry::putLongLE(&buf[0x00], kSignature);
+ ZipEntry::putShortLE(&buf[0x04], mDiskNumber);
+ ZipEntry::putShortLE(&buf[0x06], mDiskWithCentralDir);
+ ZipEntry::putShortLE(&buf[0x08], mNumEntries);
+ ZipEntry::putShortLE(&buf[0x0a], mTotalNumEntries);
+ ZipEntry::putLongLE(&buf[0x0c], mCentralDirSize);
+ ZipEntry::putLongLE(&buf[0x10], mCentralDirOffset);
+ ZipEntry::putShortLE(&buf[0x14], mCommentLen);
+
+ if (fwrite(buf, 1, kEOCDLen, fp) != kEOCDLen)
+ return UNKNOWN_ERROR;
+ if (mCommentLen > 0) {
+ assert(mComment != NULL);
+ if (fwrite(mComment, mCommentLen, 1, fp) != mCommentLen)
+ return UNKNOWN_ERROR;
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Dump the contents of an EndOfCentralDir object.
+ */
+void ZipFile::EndOfCentralDir::dump(void) const
+{
+ ALOGD(" EndOfCentralDir contents:\n");
+ ALOGD(" diskNum=%u diskWCD=%u numEnt=%u totalNumEnt=%u\n",
+ mDiskNumber, mDiskWithCentralDir, mNumEntries, mTotalNumEntries);
+ ALOGD(" centDirSize=%lu centDirOff=%lu commentLen=%u\n",
+ mCentralDirSize, mCentralDirOffset, mCommentLen);
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/ZipFile.h b/tools/aapt2/ZipFile.h
new file mode 100644
index 0000000..9cbd1fa
--- /dev/null
+++ b/tools/aapt2/ZipFile.h
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2006 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.
+ */
+
+//
+// General-purpose Zip archive access. This class allows both reading and
+// writing to Zip archives, including deletion of existing entries.
+//
+#ifndef __LIBS_ZIPFILE_H
+#define __LIBS_ZIPFILE_H
+
+#include "BigBuffer.h"
+#include "ZipEntry.h"
+
+#include <stdio.h>
+#include <utils/Errors.h>
+#include <vector>
+
+namespace aapt {
+
+using android::status_t;
+
+/*
+ * Manipulate a Zip archive.
+ *
+ * Some changes will not be visible in the until until "flush" is called.
+ *
+ * The correct way to update a file archive is to make all changes to a
+ * copy of the archive in a temporary file, and then unlink/rename over
+ * the original after everything completes. Because we're only interested
+ * in using this for packaging, we don't worry about such things. Crashing
+ * after making changes and before flush() completes could leave us with
+ * an unusable Zip archive.
+ */
+class ZipFile {
+public:
+ ZipFile(void)
+ : mZipFp(NULL), mReadOnly(false), mNeedCDRewrite(false)
+ {}
+ ~ZipFile(void) {
+ if (!mReadOnly)
+ flush();
+ if (mZipFp != NULL)
+ fclose(mZipFp);
+ discardEntries();
+ }
+
+ /*
+ * Open a new or existing archive.
+ */
+ enum {
+ kOpenReadOnly = 0x01,
+ kOpenReadWrite = 0x02,
+ kOpenCreate = 0x04, // create if it doesn't exist
+ kOpenTruncate = 0x08, // if it exists, empty it
+ };
+ status_t open(const char* zipFileName, int flags);
+
+ /*
+ * Add a file to the end of the archive. Specify whether you want the
+ * library to try to store it compressed.
+ *
+ * If "storageName" is specified, the archive will use that instead
+ * of "fileName".
+ *
+ * If there is already an entry with the same name, the call fails.
+ * Existing entries with the same name must be removed first.
+ *
+ * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
+ */
+ status_t add(const char* fileName, int compressionMethod,
+ ZipEntry** ppEntry)
+ {
+ return add(fileName, fileName, compressionMethod, ppEntry);
+ }
+ status_t add(const char* fileName, const char* storageName,
+ int compressionMethod, ZipEntry** ppEntry)
+ {
+ return addCommon(fileName, NULL, 0, storageName,
+ ZipEntry::kCompressStored,
+ compressionMethod, ppEntry);
+ }
+
+ /*
+ * Add a file that is already compressed with gzip.
+ *
+ * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
+ */
+ status_t addGzip(const char* fileName, const char* storageName,
+ ZipEntry** ppEntry)
+ {
+ return addCommon(fileName, NULL, 0, storageName,
+ ZipEntry::kCompressDeflated,
+ ZipEntry::kCompressDeflated, ppEntry);
+ }
+
+ /*
+ * Add a file from an in-memory data buffer.
+ *
+ * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
+ */
+ status_t add(const void* data, size_t size, const char* storageName,
+ int compressionMethod, ZipEntry** ppEntry)
+ {
+ return addCommon(NULL, data, size, storageName,
+ ZipEntry::kCompressStored,
+ compressionMethod, ppEntry);
+ }
+
+ status_t add(const BigBuffer& data, const char* storageName,
+ int compressionMethod, ZipEntry** ppEntry);
+
+ /*
+ * Add an entry by copying it from another zip file. If "padding" is
+ * nonzero, the specified number of bytes will be added to the "extra"
+ * field in the header.
+ *
+ * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
+ */
+ status_t add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry,
+ int padding, ZipEntry** ppEntry);
+
+ /*
+ * Mark an entry as having been removed. It is not actually deleted
+ * from the archive or our internal data structures until flush() is
+ * called.
+ */
+ status_t remove(ZipEntry* pEntry);
+
+ /*
+ * Flush changes. If mNeedCDRewrite is set, this writes the central dir.
+ */
+ status_t flush(void);
+
+ /*
+ * Expand the data into the buffer provided. The buffer must hold
+ * at least <uncompressed len> bytes. Variation expands directly
+ * to a file.
+ *
+ * Returns "false" if an error was encountered in the compressed data.
+ */
+ //bool uncompress(const ZipEntry* pEntry, void* buf) const;
+ //bool uncompress(const ZipEntry* pEntry, FILE* fp) const;
+ void* uncompress(const ZipEntry* pEntry);
+
+ /*
+ * Get an entry, by name. Returns NULL if not found.
+ *
+ * Does not return entries pending deletion.
+ */
+ ZipEntry* getEntryByName(const char* fileName) const;
+
+ /*
+ * Get the Nth entry in the archive.
+ *
+ * This will return an entry that is pending deletion.
+ */
+ int getNumEntries(void) const { return mEntries.size(); }
+ ZipEntry* getEntryByIndex(int idx) const;
+
+private:
+ /* these are private and not defined */
+ ZipFile(const ZipFile& src);
+ ZipFile& operator=(const ZipFile& src);
+
+ class EndOfCentralDir {
+ public:
+ EndOfCentralDir(void) :
+ mDiskNumber(0),
+ mDiskWithCentralDir(0),
+ mNumEntries(0),
+ mTotalNumEntries(0),
+ mCentralDirSize(0),
+ mCentralDirOffset(0),
+ mCommentLen(0),
+ mComment(NULL)
+ {}
+ virtual ~EndOfCentralDir(void) {
+ delete[] mComment;
+ }
+
+ status_t readBuf(const unsigned char* buf, int len);
+ status_t write(FILE* fp);
+
+ //unsigned long mSignature;
+ unsigned short mDiskNumber;
+ unsigned short mDiskWithCentralDir;
+ unsigned short mNumEntries;
+ unsigned short mTotalNumEntries;
+ unsigned long mCentralDirSize;
+ unsigned long mCentralDirOffset; // offset from first disk
+ unsigned short mCommentLen;
+ unsigned char* mComment;
+
+ enum {
+ kSignature = 0x06054b50,
+ kEOCDLen = 22, // EndOfCentralDir len, excl. comment
+
+ kMaxCommentLen = 65535, // longest possible in ushort
+ kMaxEOCDSearch = kMaxCommentLen + EndOfCentralDir::kEOCDLen,
+
+ };
+
+ void dump(void) const;
+ };
+
+
+ /* read all entries in the central dir */
+ status_t readCentralDir(void);
+
+ /* crunch deleted entries out */
+ status_t crunchArchive(void);
+
+ /* clean up mEntries */
+ void discardEntries(void);
+
+ /* common handler for all "add" functions */
+ status_t addCommon(const char* fileName, const void* data, size_t size,
+ const char* storageName, int sourceType, int compressionMethod,
+ ZipEntry** ppEntry);
+
+ /* copy all of "srcFp" into "dstFp" */
+ status_t copyFpToFp(FILE* dstFp, FILE* srcFp, unsigned long* pCRC32);
+ /* copy all of "data" into "dstFp" */
+ status_t copyDataToFp(FILE* dstFp,
+ const void* data, size_t size, unsigned long* pCRC32);
+ /* copy some of "srcFp" into "dstFp" */
+ status_t copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length,
+ unsigned long* pCRC32);
+ /* like memmove(), but on parts of a single file */
+ status_t filemove(FILE* fp, off_t dest, off_t src, size_t n);
+ /* compress all of "srcFp" into "dstFp", using Deflate */
+ status_t compressFpToFp(FILE* dstFp, FILE* srcFp,
+ const void* data, size_t size, unsigned long* pCRC32);
+
+ /* get modification date from a file descriptor */
+ time_t getModTime(int fd);
+
+ /*
+ * We use stdio FILE*, which gives us buffering but makes dealing
+ * with files >2GB awkward. Until we support Zip64, we're fine.
+ */
+ FILE* mZipFp; // Zip file pointer
+
+ /* one of these per file */
+ EndOfCentralDir mEOCD;
+
+ /* did we open this read-only? */
+ bool mReadOnly;
+
+ /* set this when we trash the central dir */
+ bool mNeedCDRewrite;
+
+ /*
+ * One ZipEntry per entry in the zip file. I'm using pointers instead
+ * of objects because it's easier than making operator= work for the
+ * classes and sub-classes.
+ */
+ std::vector<ZipEntry*> mEntries;
+};
+
+}; // namespace aapt
+
+#endif // __LIBS_ZIPFILE_H
diff --git a/tools/aapt2/data/Makefile b/tools/aapt2/data/Makefile
index f296dc1..5a2a1d1 100644
--- a/tools/aapt2/data/Makefile
+++ b/tools/aapt2/data/Makefile
@@ -14,6 +14,7 @@
LOCAL_PACKAGE := com.android.app
LOCAL_RESOURCE_DIR := res
+LOCAL_LIBS := lib/out/package.apk
LOCAL_OUT := out
LOCAL_GEN := out/gen
@@ -21,13 +22,12 @@
# AAPT2 custom rules.
##
-PRIVATE_ARSC := $(LOCAL_OUT)/resources.arsc
PRIVATE_APK_UNALIGNED := $(LOCAL_OUT)/package-unaligned.apk
PRIVATE_APK_ALIGNED := $(LOCAL_OUT)/package.apk
# Eg: framework.apk, etc.
-PRIVATE_LIBS := $(FRAMEWORK)
-$(info PRIVATE_LIBS = $(PRIVATE_LIBS))
+PRIVATE_INCLUDES := $(FRAMEWORK)
+$(info PRIVATE_INCLUDES = $(PRIVATE_INCLUDES))
# Eg: gen/com/android/app/R.java
PRIVATE_R_JAVA := $(LOCAL_GEN)/$(subst .,/,$(LOCAL_PACKAGE))/R.java
@@ -42,56 +42,32 @@
$(patsubst $(LOCAL_RESOURCE_DIR)/%/,%,$(sort $(dir $(PRIVATE_RESOURCES))))
$(info PRIVATE_RESOURCE_TYPES = $(PRIVATE_RESOURCE_TYPES))
-# Eg: drawable, drawable-xhdpi, layout
-PRIVATE_NON_VALUE_RESOURCE_TYPES := $(filter-out values%,$(PRIVATE_RESOURCE_TYPES))
-$(info PRIVATE_NON_VALUE_RESOURCE_TYPES = $(PRIVATE_NON_VALUE_RESOURCE_TYPES))
-
-# Eg: out/values-v4.table, out/drawable-xhdpi.table
-PRIVATE_INTERMEDIATE_TABLES := $(patsubst %,$(LOCAL_OUT)/%.table,$(PRIVATE_RESOURCE_TYPES))
+# Eg: out/values-v4.apk, out/drawable-xhdpi.apk
+PRIVATE_INTERMEDIATE_TABLES := $(patsubst %,$(LOCAL_OUT)/%.apk,$(PRIVATE_RESOURCE_TYPES))
$(info PRIVATE_INTERMEDIATE_TABLES = $(PRIVATE_INTERMEDIATE_TABLES))
-# Eg: out/res/layout/main.xml, out/res/drawable/icon.png
-PRIVATE_INTERMEDIATE_FILES := $(patsubst $(LOCAL_RESOURCE_DIR)/%,$(LOCAL_OUT)/res/%,$(filter-out $(LOCAL_RESOURCE_DIR)/values%,$(PRIVATE_RESOURCES)))
-$(info PRIVATE_INTERMEDIATE_FILES = $(PRIVATE_INTERMEDIATE_FILES))
-
# Generates rules for collect phase.
# $1: Resource type (values-v4)
-# returns: out/values-v4.table: res/values-v4/styles.xml res/values-v4/colors.xml
+# returns: out/values-v4.apk: res/values-v4/styles.xml res/values-v4/colors.xml
define make-collect-rule
-$(LOCAL_OUT)/$1.table: $(filter $(LOCAL_RESOURCE_DIR)/$1/%,$(PRIVATE_RESOURCES))
- $(AAPT) collect --package $(LOCAL_PACKAGE) -o $$@ $$^
+$(LOCAL_OUT)/$1.apk: $(filter $(LOCAL_RESOURCE_DIR)/$1/%,$(PRIVATE_RESOURCES))
+ $(AAPT) compile --package $(LOCAL_PACKAGE) --binding $(LOCAL_GEN) -o $$@ $$^
endef
-# Collect: out/values-v4.table <- res/values-v4/styles.xml res/values-v4/colors.xml
+# Collect: out/values-v4.apk <- res/values-v4/styles.xml res/values-v4/colors.xml
$(foreach d,$(PRIVATE_RESOURCE_TYPES),$(eval $(call make-collect-rule,$d)))
-# Link: out/resources.arsc <- out/values-v4.table out/drawable-v4.table
-$(PRIVATE_ARSC): $(PRIVATE_INTERMEDIATE_TABLES) $(PRIVATE_LIBS)
- $(AAPT) link --package $(LOCAL_PACKAGE) $(addprefix -I ,$(PRIVATE_LIBS)) --java $(LOCAL_GEN) -o $@ $(PRIVATE_INTERMEDIATE_TABLES)
-
-# Compile Manifest: out/AndroidManifest.xml <- AndroidManifest.xml out/resources.arsc
-$(LOCAL_OUT)/AndroidManifest.xml: AndroidManifest.xml $(PRIVATE_ARSC) $(PRIVATE_LIBS)
- $(AAPT) manifest -I $(PRIVATE_ARSC) $(addprefix -I ,$(PRIVATE_LIBS)) -o $(LOCAL_OUT) AndroidManifest.xml
-
-# Generates rules for compile phase.
-# $1: resource file (res/drawable/icon.png)
-# returns: out/res/drawable/icon.png: res/drawable/icon.png out/resources.arsc
-define make-compile-rule
-$1: $(patsubst $(LOCAL_OUT)/res/%,$(LOCAL_RESOURCE_DIR)/%,$1) $(PRIVATE_ARSC) $(PRIVATE_LIBS)
- $(AAPT) compile --package $(LOCAL_PACKAGE) -I $(PRIVATE_ARSC) $(addprefix -I ,$(PRIVATE_LIBS)) -o $(LOCAL_OUT) $$<
-endef
-
-# Compile: out/res/drawable-xhdpi/icon.png <- res/drawable-xhdpi/icon.png
-$(foreach f,$(PRIVATE_INTERMEDIATE_FILES),$(eval $(call make-compile-rule,$f)))
+# Link: out/package-unaligned.apk <- out/values-v4.apk out/drawable-v4.apk
+$(PRIVATE_APK_UNALIGNED): $(PRIVATE_INTERMEDIATE_TABLES) $(PRIVATE_INCLUDES) $(LOCAL_LIBS) AndroidManifest.xml
+ $(AAPT) link --manifest AndroidManifest.xml $(addprefix -I ,$(PRIVATE_INCLUDES)) --java $(LOCAL_GEN) -o $@ $(PRIVATE_INTERMEDIATE_TABLES) $(LOCAL_LIBS)
# R.java: gen/com/android/app/R.java <- out/resources.arsc
# No action since R.java is generated when out/resources.arsc is.
-$(PRIVATE_R_JAVA): $(PRIVATE_ARSC)
+$(PRIVATE_R_JAVA): $(PRIVATE_APK_UNALIGNED)
# Assemble: zip out/resources.arsc AndroidManifest.xml and res/**/*
-$(PRIVATE_APK_ALIGNED): $(PRIVATE_ARSC) $(PRIVATE_INTERMEDIATE_FILES) $(LOCAL_OUT)/AndroidManifest.xml
- cd $(LOCAL_OUT); $(ZIP) $(patsubst $(LOCAL_OUT)/%,%,$(PRIVATE_APK_UNALIGNED)) $(patsubst $(LOCAL_OUT)/%,%,$^)
- $(ZIPALIGN) $(PRIVATE_APK_UNALIGNED) $@
+$(PRIVATE_APK_ALIGNED): $(PRIVATE_APK_UNALIGNED)
+ $(ZIPALIGN) $< $@
# Create the out directory if needed.
dummy := $(shell test -d $(LOCAL_OUT) || mkdir -p $(LOCAL_OUT))
@@ -100,7 +76,7 @@
java: $(PRIVATE_R_JAVA)
.PHONY: assemble
-assemble: $(LOCAL_OUT)/package.apk
+assemble: $(PRIVATE_APK_ALIGNED)
.PHONY: all
all: assemble java
diff --git a/tools/aapt2/data/lib/AndroidManifest.xml b/tools/aapt2/data/lib/AndroidManifest.xml
new file mode 100644
index 0000000..c1612e5
--- /dev/null
+++ b/tools/aapt2/data/lib/AndroidManifest.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.appcompat"/>
diff --git a/tools/aapt2/data/lib/Makefile b/tools/aapt2/data/lib/Makefile
new file mode 100644
index 0000000..2897ff1
--- /dev/null
+++ b/tools/aapt2/data/lib/Makefile
@@ -0,0 +1,81 @@
+##
+# Environment dependent variables
+##
+
+AAPT := aapt2
+ZIPALIGN := zipalign 4
+FRAMEWORK := ../../../../../../out/target/common/obj/APPS/framework-res_intermediates/package-export.apk
+
+##
+# Project depenedent variables
+##
+
+LOCAL_PACKAGE := android.appcompat
+LOCAL_RESOURCE_DIR := res
+LOCAL_OUT := out
+LOCAL_GEN := out/gen
+
+##
+# AAPT2 custom rules.
+##
+
+PRIVATE_APK_UNALIGNED := $(LOCAL_OUT)/package-unaligned.apk
+PRIVATE_APK_ALIGNED := $(LOCAL_OUT)/package.apk
+
+# Eg: framework.apk, etc.
+PRIVATE_LIBS := $(FRAMEWORK)
+$(info PRIVATE_LIBS = $(PRIVATE_LIBS))
+
+# Eg: gen/com/android/app/R.java
+PRIVATE_R_JAVA := $(LOCAL_GEN)/$(subst .,/,$(LOCAL_PACKAGE))/R.java
+$(info PRIVATE_R_JAVA = $(PRIVATE_R_JAVA))
+
+# Eg: res/drawable/icon.png, res/values/styles.xml
+PRIVATE_RESOURCES := $(shell find $(LOCAL_RESOURCE_DIR) -mindepth 1 -maxdepth 2 -type f)
+$(info PRIVATE_RESOURCES = $(PRIVATE_RESOURCES))
+
+# Eg: drawable, values, layouts
+PRIVATE_RESOURCE_TYPES := \
+ $(patsubst $(LOCAL_RESOURCE_DIR)/%/,%,$(sort $(dir $(PRIVATE_RESOURCES))))
+$(info PRIVATE_RESOURCE_TYPES = $(PRIVATE_RESOURCE_TYPES))
+
+# Eg: out/values-v4.apk, out/drawable-xhdpi.apk
+PRIVATE_INTERMEDIATE_TABLES := $(patsubst %,$(LOCAL_OUT)/%.apk,$(PRIVATE_RESOURCE_TYPES))
+$(info PRIVATE_INTERMEDIATE_TABLES = $(PRIVATE_INTERMEDIATE_TABLES))
+
+# Generates rules for collect phase.
+# $1: Resource type (values-v4)
+# returns: out/values-v4.apk: res/values-v4/styles.xml res/values-v4/colors.xml
+define make-collect-rule
+$(LOCAL_OUT)/$1.apk: $(filter $(LOCAL_RESOURCE_DIR)/$1/%,$(PRIVATE_RESOURCES))
+ $(AAPT) compile --package $(LOCAL_PACKAGE) -o $$@ $$^
+endef
+
+# Collect: out/values-v4.apk <- res/values-v4/styles.xml res/values-v4/colors.xml
+$(foreach d,$(PRIVATE_RESOURCE_TYPES),$(eval $(call make-collect-rule,$d)))
+
+# Link: out/package-unaligned.apk <- out/values-v4.apk out/drawable-v4.apk
+$(PRIVATE_APK_UNALIGNED): $(PRIVATE_INTERMEDIATE_TABLES) $(PRIVATE_LIBS) AndroidManifest.xml
+ $(AAPT) link --manifest AndroidManifest.xml $(addprefix -I ,$(PRIVATE_LIBS)) --java $(LOCAL_GEN) -o $@ $(PRIVATE_INTERMEDIATE_TABLES)
+
+# R.java: gen/com/android/app/R.java <- out/resources.arsc
+# No action since R.java is generated when out/resources.arsc is.
+$(PRIVATE_R_JAVA): $(PRIVATE_APK_UNALIGNED)
+
+# Assemble: zip out/resources.arsc AndroidManifest.xml and res/**/*
+$(PRIVATE_APK_ALIGNED): $(PRIVATE_APK_UNALIGNED)
+ $(ZIPALIGN) $< $@
+
+# Create the out directory if needed.
+dummy := $(shell test -d $(LOCAL_OUT) || mkdir -p $(LOCAL_OUT))
+
+.PHONY: java
+java: $(PRIVATE_R_JAVA)
+
+.PHONY: assemble
+assemble: $(PRIVATE_APK_ALIGNED)
+
+.PHONY: all
+all: assemble java
+
+.DEFAULT_GOAL := all
diff --git a/tools/aapt2/data/lib/res/values/styles.xml b/tools/aapt2/data/lib/res/values/styles.xml
new file mode 100644
index 0000000..adb5c4f
--- /dev/null
+++ b/tools/aapt2/data/lib/res/values/styles.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <style name="Platform.AppCompat" parent="@android:style/Theme">
+ <item name="android:windowNoTitle">true</item>
+ </style>
+</resources>
diff --git a/tools/aapt2/data/res/values/styles.xml b/tools/aapt2/data/res/values/styles.xml
index 71ce388..c5dd276 100644
--- a/tools/aapt2/data/res/values/styles.xml
+++ b/tools/aapt2/data/res/values/styles.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <style name="App" parent="android:Theme.Material">
+ <style name="App" parent="android.appcompat:Platform.AppCompat">
<item name="android:background">@color/primary</item>
<item name="android:colorPrimary">@color/primary</item>
<item name="android:colorPrimaryDark">@color/primary_dark</item>
diff --git a/tools/aapt2/process.dot b/tools/aapt2/process.dot
index a92405d..4741952 100644
--- a/tools/aapt2/process.dot
+++ b/tools/aapt2/process.dot
@@ -19,6 +19,13 @@
res_layout_fr_main_xml [label="res/layout-fr/main.xml"];
res_values_fr_strings_xml [label="res/values-fr/strings.xml"];
+ lib_apk_resources_arsc [label="lib.apk:resources.arsc",color=green];
+ lib_apk_res_layout_main_xml [label="lib.apk:res/layout/main.xml",color=green];
+ lib_apk_res_drawable_icon_png [label="lib.apk:res/drawable/icon.png",color=green];
+ lib_apk_fr_res_layout_main_xml [label="lib.apk:res/layout-fr/main.xml",color=green];
+ lib_apk_fr_res_drawable_icon_png [label="lib.apk:res/drawable-fr/icon.png",color=green];
+ out_res_layout_lib_main_xml [label="out/res/layout/lib-main.xml"];
+
out_package -> package_default;
out_fr_package -> package_fr;
@@ -26,6 +33,7 @@
package_default -> out_table_aligned;
package_default -> out_res_layout_main_xml;
package_default -> out_res_layout_v21_main_xml [color=red];
+ package_default -> out_res_layout_lib_main_xml;
package_fr [shape=box,label="Assemble",color=blue];
package_fr -> out_table_fr_aligned;
@@ -44,6 +52,7 @@
link_tables [shape=box,label="Link",color=blue];
link_tables -> out_values_table;
link_tables -> out_layout_table;
+ link_tables -> lib_apk_resources_arsc;
out_values_table -> compile_values;
@@ -61,10 +70,11 @@
link_fr_tables [shape=box,label="Link",color=blue];
link_fr_tables -> out_values_fr_table;
link_fr_tables -> out_layout_fr_table;
+ link_fr_tables -> lib_apk_resources_arsc;
out_values_fr_table -> compile_values_fr;
- compile_values_fr [shape=box,label="Compile",color=blue];
+ compile_values_fr [shape=box,label="Collect",color=blue];
compile_values_fr -> res_values_fr_strings_xml;
out_layout_fr_table -> collect_xml_fr;
@@ -89,4 +99,10 @@
compile_res_layout_fr_main_xml -> res_layout_fr_main_xml;
compile_res_layout_fr_main_xml -> out_table_fr_aligned;
+
+ out_res_layout_lib_main_xml -> compile_res_layout_lib_main_xml;
+
+ compile_res_layout_lib_main_xml [shape=box,label="Compile",color=blue];
+ compile_res_layout_lib_main_xml -> out_table_aligned;
+ compile_res_layout_lib_main_xml -> lib_apk_res_layout_main_xml;
}
diff --git a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java b/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java
index aabd3f1..f7654ce 100644
--- a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java
@@ -16,7 +16,7 @@
package android.app;
-import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.content.Context;
@@ -30,19 +30,19 @@
*
* The methods being re-implemented are the ones responsible for instantiating Fragment objects.
* Because the classes of these objects are found in the project, these methods need access to
- * {@link IProjectCallback} object. They are however static methods, so the callback is set
- * before the inflation through {@link #setProjectCallback(IProjectCallback)}.
+ * {@link LayoutlibCallback} object. They are however static methods, so the callback is set
+ * before the inflation through {@link #setLayoutlibCallback(LayoutlibCallback)}.
*/
public class Fragment_Delegate {
- private static IProjectCallback sProjectCallback;
+ private static LayoutlibCallback sLayoutlibCallback;
/**
- * Sets the current {@link IProjectCallback} to be used to instantiate classes coming
+ * Sets the current {@link LayoutlibCallback} to be used to instantiate classes coming
* from the project being rendered.
*/
- public static void setProjectCallback(IProjectCallback projectCallback) {
- sProjectCallback = projectCallback;
+ public static void setLayoutlibCallback(LayoutlibCallback layoutlibCallback) {
+ sLayoutlibCallback = layoutlibCallback;
}
/**
@@ -62,17 +62,17 @@
* This is currently just used to get its ClassLoader.
* @param fname The class name of the fragment to instantiate.
* @param args Bundle of arguments to supply to the fragment, which it
- * can retrieve with {@link #getArguments()}. May be null.
+ * can retrieve with {@link Fragment#getArguments()}. May be null.
* @return Returns a new fragment instance.
- * @throws InstantiationException If there is a failure in instantiating
+ * @throws Fragment.InstantiationException If there is a failure in instantiating
* the given fragment class. This is a runtime exception; it is not
* normally expected to happen.
*/
@LayoutlibDelegate
/*package*/ static Fragment instantiate(Context context, String fname, Bundle args) {
try {
- if (sProjectCallback != null) {
- Fragment f = (Fragment) sProjectCallback.loadView(fname,
+ if (sLayoutlibCallback != null) {
+ Fragment f = (Fragment) sLayoutlibCallback.loadView(fname,
new Class[0], new Object[0]);
if (args != null) {
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java b/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java
index 96ca250..2c2c672 100644
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java
+++ b/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java
@@ -16,8 +16,8 @@
package android.content.res;
-import com.android.ide.common.rendering.api.IProjectCallback;
import com.android.ide.common.rendering.api.LayoutLog;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.ResourceValue;
import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.BridgeConstants;
@@ -49,7 +49,7 @@
public final class BridgeResources extends Resources {
private BridgeContext mContext;
- private IProjectCallback mProjectCallback;
+ private LayoutlibCallback mLayoutlibCallback;
private boolean[] mPlatformResourceFlag = new boolean[1];
private TypedValue mTmpValue = new TypedValue();
@@ -94,12 +94,12 @@
AssetManager assets,
DisplayMetrics metrics,
Configuration config,
- IProjectCallback projectCallback) {
+ LayoutlibCallback layoutlibCallback) {
return Resources.mSystem = new BridgeResources(context,
assets,
metrics,
config,
- projectCallback);
+ layoutlibCallback);
}
/**
@@ -109,16 +109,16 @@
public static void disposeSystem() {
if (Resources.mSystem instanceof BridgeResources) {
((BridgeResources)(Resources.mSystem)).mContext = null;
- ((BridgeResources)(Resources.mSystem)).mProjectCallback = null;
+ ((BridgeResources)(Resources.mSystem)).mLayoutlibCallback = null;
}
Resources.mSystem = null;
}
private BridgeResources(BridgeContext context, AssetManager assets, DisplayMetrics metrics,
- Configuration config, IProjectCallback projectCallback) {
+ Configuration config, LayoutlibCallback layoutlibCallback) {
super(assets, metrics, config);
mContext = context;
- mProjectCallback = projectCallback;
+ mLayoutlibCallback = layoutlibCallback;
}
public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile) {
@@ -138,8 +138,8 @@
}
// didn't find a match in the framework? look in the project.
- if (mProjectCallback != null) {
- resourceInfo = mProjectCallback.resolveResourceId(id);
+ if (mLayoutlibCallback != null) {
+ resourceInfo = mLayoutlibCallback.resolveResourceId(id);
if (resourceInfo != null) {
platformResFlag_out[0] = false;
@@ -154,11 +154,6 @@
}
@Override
- public Drawable getDrawable(int id) throws NotFoundException {
- return getDrawable(id, null);
- }
-
- @Override
public Drawable getDrawable(int id, Theme theme) {
Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
@@ -257,7 +252,7 @@
try {
// check if the current parser can provide us with a custom parser.
if (mPlatformResourceFlag[0] == false) {
- parser = mProjectCallback.getParser(value);
+ parser = mLayoutlibCallback.getParser(value);
}
// create a new one manually if needed.
@@ -692,8 +687,8 @@
Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
// if the name is unknown in the framework, get it from the custom view loader.
- if (resourceInfo == null && mProjectCallback != null) {
- resourceInfo = mProjectCallback.resolveResourceId(id);
+ if (resourceInfo == null && mLayoutlibCallback != null) {
+ resourceInfo = mLayoutlibCallback.resolveResourceId(id);
}
String message = null;
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
index 18036927..7d4271b 100644
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
+++ b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
@@ -16,6 +16,7 @@
package android.content.res;
+import com.android.annotations.Nullable;
import com.android.ide.common.rendering.api.AttrResourceValue;
import com.android.ide.common.rendering.api.LayoutLog;
import com.android.ide.common.rendering.api.RenderResources;
@@ -40,9 +41,12 @@
import android.view.ViewGroup.LayoutParams;
import java.io.File;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
+import static com.android.ide.common.rendering.api.RenderResources.*;
+
/**
* Custom implementation of TypedArray to handle non compiled resources.
*/
@@ -56,6 +60,11 @@
private final String[] mNames;
private final boolean[] mIsFramework;
+ // Contains ids that are @empty. We still store null in mResourceData for that index, since we
+ // want to save on the check against empty, each time a resource value is requested.
+ @Nullable
+ private int[] mEmptyIds;
+
public BridgeTypedArray(BridgeResources resources, BridgeContext context, int len,
boolean platformFile) {
super(resources, null, null, 0);
@@ -90,19 +99,32 @@
// fills TypedArray.mIndices which is used to implement getIndexCount/getIndexAt
// first count the array size
int count = 0;
+ ArrayList<Integer> emptyIds = null;
for (int i = 0; i < mResourceData.length; i++) {
ResourceValue data = mResourceData[i];
if (data != null) {
- if (RenderResources.REFERENCE_NULL.equals(data.getValue())) {
- // No need to store this resource value. This saves needless checking for
- // "@null" every time an attribute is requested.
+ String dataValue = data.getValue();
+ if (REFERENCE_NULL.equals(dataValue) || REFERENCE_UNDEFINED.equals(dataValue)) {
mResourceData[i] = null;
+ } else if (REFERENCE_EMPTY.equals(dataValue)) {
+ mResourceData[i] = null;
+ if (emptyIds == null) {
+ emptyIds = new ArrayList<Integer>(4);
+ }
+ emptyIds.add(i);
} else {
count++;
}
}
}
+ if (emptyIds != null) {
+ mEmptyIds = new int[emptyIds.size()];
+ for (int i = 0; i < emptyIds.size(); i++) {
+ mEmptyIds[i] = emptyIds.get(i);
+ }
+ }
+
// allocate the table with an extra to store the size
mIndices = new int[count+1];
mIndices[0] = count;
@@ -624,7 +646,7 @@
if (isFrameworkId) {
idValue = Bridge.getResourceId(ResourceType.ID, idName);
} else {
- idValue = mContext.getProjectCallback().getResourceId(ResourceType.ID, idName);
+ idValue = mContext.getLayoutlibCallback().getResourceId(ResourceType.ID, idName);
}
return idValue == null ? defValue : idValue;
}
@@ -644,7 +666,7 @@
idValue = Bridge.getResourceId(resValue.getResourceType(),
resValue.getName());
} else {
- idValue = mContext.getProjectCallback().getResourceId(
+ idValue = mContext.getLayoutlibCallback().getResourceId(
resValue.getResourceType(), resValue.getName());
}
@@ -748,6 +770,12 @@
return index >= 0 && index < mResourceData.length && mResourceData[index] != null;
}
+ @Override
+ public boolean hasValueOrEmpty(int index) {
+ return hasValue(index) || index >= 0 && index < mResourceData.length &&
+ mEmptyIds != null && Arrays.binarySearch(mEmptyIds, index) >= 0;
+ }
+
/**
* Retrieve the raw TypedValue for the attribute at <var>index</var>
* and return a temporary object holding its data. This object is only
diff --git a/tools/layoutlib/bridge/src/android/util/BridgeXmlPullAttributes.java b/tools/layoutlib/bridge/src/android/util/BridgeXmlPullAttributes.java
index 691339e..138b2d5 100644
--- a/tools/layoutlib/bridge/src/android/util/BridgeXmlPullAttributes.java
+++ b/tools/layoutlib/bridge/src/android/util/BridgeXmlPullAttributes.java
@@ -69,8 +69,8 @@
// this is not an attribute in the android namespace, we query the customviewloader, if
// the namespaces match.
- if (mContext.getProjectCallback().getNamespace().equals(ns)) {
- Integer v = mContext.getProjectCallback().getResourceId(ResourceType.ATTR, name);
+ if (mContext.getLayoutlibCallback().getNamespace().equals(ns)) {
+ Integer v = mContext.getLayoutlibCallback().getResourceId(ResourceType.ATTR, name);
if (v != null) {
return v.intValue();
}
@@ -273,7 +273,7 @@
if (mPlatformFile || resource.isFramework()) {
id = Bridge.getResourceId(resource.getResourceType(), resource.getName());
} else {
- id = mContext.getProjectCallback().getResourceId(
+ id = mContext.getLayoutlibCallback().getResourceId(
resource.getResourceType(), resource.getName());
}
diff --git a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java
index 80036e5..9eea663 100644
--- a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java
+++ b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java
@@ -16,7 +16,7 @@
package android.view;
-import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.LayoutLog;
import com.android.ide.common.rendering.api.MergeCookie;
import com.android.ide.common.rendering.api.ResourceReference;
@@ -46,7 +46,7 @@
*/
public final class BridgeInflater extends LayoutInflater {
- private final IProjectCallback mProjectCallback;
+ private final LayoutlibCallback mLayoutlibCallback;
private boolean mIsInMerge = false;
private ResourceReference mResourceReference;
@@ -64,21 +64,21 @@
super(original, newContext);
newContext = getBaseContext(newContext);
if (newContext instanceof BridgeContext) {
- mProjectCallback = ((BridgeContext) newContext).getProjectCallback();
+ mLayoutlibCallback = ((BridgeContext) newContext).getLayoutlibCallback();
} else {
- mProjectCallback = null;
+ mLayoutlibCallback = null;
}
}
/**
- * Instantiate a new BridgeInflater with an {@link IProjectCallback} object.
+ * Instantiate a new BridgeInflater with an {@link LayoutlibCallback} object.
*
* @param context The Android application context.
- * @param projectCallback the {@link IProjectCallback} object.
+ * @param layoutlibCallback the {@link LayoutlibCallback} object.
*/
- public BridgeInflater(Context context, IProjectCallback projectCallback) {
+ public BridgeInflater(Context context, LayoutlibCallback layoutlibCallback) {
super(context);
- mProjectCallback = projectCallback;
+ mLayoutlibCallback = layoutlibCallback;
mConstructorArgs[0] = context;
}
@@ -167,12 +167,13 @@
ResourceValue value = null;
+ @SuppressWarnings("deprecation")
Pair<ResourceType, String> layoutInfo = Bridge.resolveResourceId(resource);
if (layoutInfo != null) {
value = bridgeContext.getRenderResources().getFrameworkResource(
ResourceType.LAYOUT, layoutInfo.getSecond());
} else {
- layoutInfo = mProjectCallback.resolveResourceId(resource);
+ layoutInfo = mLayoutlibCallback.resolveResourceId(resource);
if (layoutInfo != null) {
value = bridgeContext.getRenderResources().getProjectResource(
@@ -203,7 +204,7 @@
}
private View loadCustomView(String name, AttributeSet attrs) throws Exception {
- if (mProjectCallback != null) {
+ if (mLayoutlibCallback != null) {
// first get the classname in case it's not the node name
if (name.equals("view")) {
name = attrs.getAttributeValue(null, "class");
@@ -211,7 +212,7 @@
mConstructorArgs[1] = attrs;
- Object customView = mProjectCallback.loadView(name, mConstructorSignature,
+ Object customView = mLayoutlibCallback.loadView(name, mConstructorSignature,
mConstructorArgs);
if (customView instanceof View) {
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 818940d..82012c1 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -376,6 +376,10 @@
}
@Override
+ public void setForcedDisplayScalingMode(int displayId, int mode) {
+ }
+
+ @Override
public void setInTouchMode(boolean arg0) throws RemoteException {
// TODO Auto-generated method stub
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index 8e74ce1..094778d 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -19,8 +19,8 @@
import com.android.annotations.Nullable;
import com.android.ide.common.rendering.api.AssetRepository;
import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.IProjectCallback;
import com.android.ide.common.rendering.api.LayoutLog;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.RenderResources;
import com.android.ide.common.rendering.api.ResourceReference;
import com.android.ide.common.rendering.api.ResourceValue;
@@ -114,7 +114,7 @@
private final RenderResources mRenderResources;
private final Configuration mConfig;
private final ApplicationInfo mApplicationInfo;
- private final IProjectCallback mProjectCallback;
+ private final LayoutlibCallback mLayoutlibCallback;
private final WindowManager mWindowManager;
private final DisplayManager mDisplayManager;
@@ -148,13 +148,13 @@
public BridgeContext(Object projectKey, DisplayMetrics metrics,
RenderResources renderResources,
AssetRepository assets,
- IProjectCallback projectCallback,
+ LayoutlibCallback layoutlibCallback,
Configuration config,
int targetSdkVersion,
boolean hasRtlSupport) {
mProjectKey = projectKey;
mMetrics = metrics;
- mProjectCallback = projectCallback;
+ mLayoutlibCallback = layoutlibCallback;
mRenderResources = renderResources;
mConfig = config;
@@ -173,7 +173,7 @@
/**
* Initializes the {@link Resources} singleton to be linked to this {@link Context}, its
- * {@link DisplayMetrics}, {@link Configuration}, and {@link IProjectCallback}.
+ * {@link DisplayMetrics}, {@link Configuration}, and {@link LayoutlibCallback}.
*
* @see #disposeResources()
*/
@@ -185,7 +185,7 @@
assetManager,
mMetrics,
mConfig,
- mProjectCallback);
+ mLayoutlibCallback);
mTheme = mSystemResources.newTheme();
}
@@ -224,8 +224,8 @@
return mMetrics;
}
- public IProjectCallback getProjectCallback() {
- return mProjectCallback;
+ public LayoutlibCallback getLayoutlibCallback() {
+ return mLayoutlibCallback;
}
public RenderResources getRenderResources() {
@@ -284,7 +284,7 @@
Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(resid);
boolean isFrameworkRes = true;
if (resourceInfo == null) {
- resourceInfo = mProjectCallback.resolveResourceId(resid);
+ resourceInfo = mLayoutlibCallback.resolveResourceId(resid);
isFrameworkRes = false;
}
@@ -340,8 +340,8 @@
}
// didn't find a match in the framework? look in the project.
- if (mProjectCallback != null) {
- resourceInfo = mProjectCallback.resolveResourceId(id);
+ if (mLayoutlibCallback != null) {
+ resourceInfo = mLayoutlibCallback.resolveResourceId(id);
if (resourceInfo != null) {
return new ResourceReference(resourceInfo.getSecond(), false);
@@ -439,9 +439,9 @@
private ILayoutPullParser getParser(ResourceReference resource) {
ILayoutPullParser parser;
if (resource instanceof ResourceValue) {
- parser = mProjectCallback.getParser((ResourceValue) resource);
+ parser = mLayoutlibCallback.getParser((ResourceValue) resource);
} else {
- parser = mProjectCallback.getParser(resource.getName());
+ parser = mLayoutlibCallback.getParser(resource.getName());
}
return parser;
}
@@ -694,7 +694,7 @@
boolean isFrameworkRes = true;
Pair<ResourceType, String> value = Bridge.resolveResourceId(defStyleRes);
if (value == null) {
- value = mProjectCallback.resolveResourceId(defStyleRes);
+ value = mLayoutlibCallback.resolveResourceId(defStyleRes);
isFrameworkRes = false;
}
@@ -732,7 +732,7 @@
}
}
- String appNamespace = mProjectCallback.getNamespace();
+ String appNamespace = mLayoutlibCallback.getNamespace();
if (attributeList != null) {
for (int index = 0 ; index < attributeList.size() ; index++) {
@@ -875,7 +875,7 @@
if (resolvedResource != null) {
isFramework = true;
} else {
- resolvedResource = mProjectCallback.resolveResourceId(attr);
+ resolvedResource = mLayoutlibCallback.resolveResourceId(attr);
}
if (resolvedResource != null) {
@@ -901,7 +901,7 @@
return Pair.of(info.getSecond(), Boolean.TRUE);
}
- info = mProjectCallback.resolveResourceId(attr);
+ info = mLayoutlibCallback.resolveResourceId(attr);
if (info != null) {
return Pair.of(info.getSecond(), Boolean.FALSE);
}
@@ -953,8 +953,8 @@
// getResourceId creates a new resource id if an existing resource id isn't found. So, we
// check for the existence of the resource before calling it.
if (getRenderResources().getProjectResource(resType, resName) != null) {
- if (mProjectCallback != null) {
- Integer value = mProjectCallback.getResourceId(resType, resName);
+ if (mLayoutlibCallback != null) {
+ Integer value = mLayoutlibCallback.getResourceId(resType, resName);
if (value != null) {
return value;
}
@@ -1401,6 +1401,11 @@
// pass
}
+ public void sendBroadcastAsUser(Intent intent, UserHandle user,
+ String receiverPermission, int appOp) {
+ // pass
+ }
+
@Override
public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java
index b72329a..9273ac2 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java
@@ -18,8 +18,8 @@
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.IProjectCallback;
import com.android.ide.common.rendering.api.LayoutLog;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.SessionParams;
import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.android.BridgeContext;
@@ -30,7 +30,6 @@
import android.widget.LinearLayout;
import java.lang.reflect.Method;
-import java.util.HashMap;
import static com.android.layoutlib.bridge.util.ReflectionUtils.*;
@@ -61,7 +60,7 @@
public static void setAdapter(@NonNull View recyclerView, @NonNull BridgeContext context,
@NonNull SessionParams params) {
try {
- setLayoutManager(recyclerView, context, params.getProjectCallback());
+ setLayoutManager(recyclerView, context, params.getLayoutlibCallback());
Object adapter = createAdapter(params);
setProperty(recyclerView, CN_ADAPTER, adapter, "setAdapter");
} catch (ReflectionException e) {
@@ -71,7 +70,7 @@
}
private static void setLayoutManager(@NonNull View recyclerView, @NonNull BridgeContext context,
- @NonNull IProjectCallback callback) throws ReflectionException {
+ @NonNull LayoutlibCallback callback) throws ReflectionException {
Object cookie = context.getCookie(recyclerView);
assert cookie == null || cookie instanceof LayoutManagerType || cookie instanceof String;
if (!(cookie instanceof LayoutManagerType)) {
@@ -90,7 +89,7 @@
@Nullable
private static Object createLayoutManager(@Nullable LayoutManagerType type,
- @NonNull Context context, @NonNull IProjectCallback callback)
+ @NonNull Context context, @NonNull LayoutlibCallback callback)
throws ReflectionException {
if (type == null) {
type = LayoutManagerType.getDefault();
@@ -109,7 +108,7 @@
return null;
}
try {
- return params.getProjectCallback().loadView(CN_ADAPTER, new Class[0], new Object[0]);
+ return params.getLayoutlibCallback().loadView(CN_ADAPTER, new Class[0], new Object[0]);
} catch (Exception e) {
throw new ReflectionException(e);
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java
index ee57067..dd1f661 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java
@@ -70,7 +70,7 @@
try {
Class[] constructorParams = {View.class};
Object[] constructorArgs = {getDecorContent()};
- mWindowDecorActionBar = params.getProjectCallback().loadView(WINDOW_ACTION_BAR_CLASS,
+ mWindowDecorActionBar = params.getLayoutlibCallback().loadView(WINDOW_ACTION_BAR_CLASS,
constructorParams, constructorArgs);
mWindowActionBarClass = mWindowDecorActionBar == null ? null :
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/BridgeActionBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/BridgeActionBar.java
index 2a83ea1..3d1a9b9 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/BridgeActionBar.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/BridgeActionBar.java
@@ -51,7 +51,7 @@
@NonNull ViewGroup parentView) {
mBridgeContext = context;
mParams = params;
- mCallback = params.getProjectCallback().getActionBarCallback();
+ mCallback = params.getLayoutlibCallback().getActionBarCallback();
ResourceValue layoutName = getLayoutResource(context);
if (layoutName == null) {
throw new RuntimeException("Unable to find the layout for Action Bar.");
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
index 127cb72..c708316 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
@@ -16,10 +16,6 @@
package com.android.layoutlib.bridge.impl;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_LOCK_INTERRUPTED;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_TIMEOUT;
-import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
-
import com.android.ide.common.rendering.api.HardwareConfig;
import com.android.ide.common.rendering.api.LayoutLog;
import com.android.ide.common.rendering.api.RenderParams;
@@ -43,6 +39,10 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_LOCK_INTERRUPTED;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_TIMEOUT;
+import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
+
/**
* Base class for rendering action.
*
@@ -120,7 +120,7 @@
// build the context
mContext = new BridgeContext(mParams.getProjectKey(), metrics, resources,
- mParams.getAssets(), mParams.getProjectCallback(), getConfiguration(),
+ mParams.getAssets(), mParams.getLayoutlibCallback(), getConfiguration(),
mParams.getTargetSdkVersion(), mParams.isRtlSupported());
setUp();
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
index 7c11284d..d9572591 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
@@ -16,20 +16,13 @@
package com.android.layoutlib.bridge.impl;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_ANIM_NOT_FOUND;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_INFLATION;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_NOT_INFLATED;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
-import static com.android.ide.common.rendering.api.Result.Status.ERROR_VIEWGROUP_NO_CHILDREN;
-import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
-
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.common.rendering.api.AdapterBinding;
import com.android.ide.common.rendering.api.HardwareConfig;
import com.android.ide.common.rendering.api.IAnimationListener;
import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.RenderResources;
import com.android.ide.common.rendering.api.RenderSession;
import com.android.ide.common.rendering.api.ResourceReference;
@@ -54,13 +47,13 @@
import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
import com.android.layoutlib.bridge.android.RenderParamsFlags;
import com.android.layoutlib.bridge.android.support.RecyclerViewUtil;
-import com.android.layoutlib.bridge.bars.BridgeActionBar;
import com.android.layoutlib.bridge.bars.AppCompatActionBar;
+import com.android.layoutlib.bridge.bars.BridgeActionBar;
import com.android.layoutlib.bridge.bars.Config;
+import com.android.layoutlib.bridge.bars.FrameworkActionBar;
import com.android.layoutlib.bridge.bars.NavigationBar;
import com.android.layoutlib.bridge.bars.StatusBar;
import com.android.layoutlib.bridge.bars.TitleBar;
-import com.android.layoutlib.bridge.bars.FrameworkActionBar;
import com.android.layoutlib.bridge.impl.binding.FakeAdapter;
import com.android.layoutlib.bridge.impl.binding.FakeExpandableAdapter;
import com.android.resources.Density;
@@ -116,6 +109,13 @@
import java.util.List;
import java.util.Map;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_ANIM_NOT_FOUND;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_INFLATION;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_NOT_INFLATED;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_VIEWGROUP_NO_CHILDREN;
+import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
+
/**
* Class implementing the render session.
* <p/>
@@ -219,7 +219,7 @@
WindowManagerGlobal_Delegate.setWindowManagerService(iwm);
// build the inflater and parser.
- mInflater = new BridgeInflater(context, params.getProjectCallback());
+ mInflater = new BridgeInflater(context, params.getLayoutlibCallback());
context.setBridgeInflater(mInflater);
mBlockParser = new BridgeXmlBlockParser(
@@ -401,7 +401,7 @@
// Sets the project callback (custom view loader) to the fragment delegate so that
// it can instantiate the custom Fragment.
- Fragment_Delegate.setProjectCallback(params.getProjectCallback());
+ Fragment_Delegate.setLayoutlibCallback(params.getLayoutlibCallback());
String rootTag = params.getFlag(RenderParamsFlags.FLAG_KEY_ROOT_TAG);
boolean isPreference = "PreferenceScreen".equals(rootTag);
@@ -416,13 +416,13 @@
// done with the parser, pop it.
context.popParser();
- Fragment_Delegate.setProjectCallback(null);
+ Fragment_Delegate.setLayoutlibCallback(null);
// set the AttachInfo on the root view.
AttachInfo_Accessor.setAttachInfo(mViewRoot);
// post-inflate process. For now this supports TabHost/TabWidget
- postInflateProcess(view, params.getProjectCallback(), isPreference ? view : null);
+ postInflateProcess(view, params.getLayoutlibCallback(), isPreference ? view : null);
// get the background drawable
if (mWindowBackground != null) {
@@ -686,7 +686,7 @@
animationResource = context.getRenderResources().getProjectResource(
ResourceType.ANIMATOR, animationName);
if (animationResource != null) {
- animationId = context.getProjectCallback().getResourceId(
+ animationId = context.getLayoutlibCallback().getResourceId(
ResourceType.ANIMATOR, animationName);
}
}
@@ -1257,17 +1257,17 @@
* {@link TabWidget}, and the corresponding {@link FrameLayout} and make new tabs automatically
* based on the content of the {@link FrameLayout}.
* @param view the root view to process.
- * @param projectCallback callback to the project.
+ * @param layoutlibCallback callback to the project.
* @param skip the view and it's children are not processed.
*/
@SuppressWarnings("deprecation") // For the use of Pair
- private void postInflateProcess(View view, IProjectCallback projectCallback, View skip)
+ private void postInflateProcess(View view, LayoutlibCallback layoutlibCallback, View skip)
throws PostInflateException {
if (view == skip) {
return;
}
if (view instanceof TabHost) {
- setupTabHost((TabHost) view, projectCallback);
+ setupTabHost((TabHost) view, layoutlibCallback);
} else if (view instanceof QuickContactBadge) {
QuickContactBadge badge = (QuickContactBadge) view;
badge.setImageToDefault();
@@ -1286,8 +1286,8 @@
// if there was no adapter binding, trying to get it from the call back.
if (binding == null) {
- binding = params.getProjectCallback().getAdapterBinding(listRef,
- context.getViewKey(view), view);
+ binding = layoutlibCallback.getAdapterBinding(
+ listRef, context.getViewKey(view), view);
}
if (binding != null) {
@@ -1303,7 +1303,7 @@
for (int i = 0; i < count; i++) {
Pair<View, Boolean> pair = context.inflateView(
binding.getHeaderAt(i),
- list, false /*attachToRoot*/, skipCallbackParser);
+ list, false, skipCallbackParser);
if (pair.getFirst() != null) {
list.addHeaderView(pair.getFirst());
}
@@ -1315,7 +1315,7 @@
for (int i = 0; i < count; i++) {
Pair<View, Boolean> pair = context.inflateView(
binding.getFooterAt(i),
- list, false /*attachToRoot*/, skipCallbackParser);
+ list, false, skipCallbackParser);
if (pair.getFirst() != null) {
list.addFooterView(pair.getFirst());
}
@@ -1326,17 +1326,14 @@
if (view instanceof ExpandableListView) {
((ExpandableListView) view).setAdapter(
- new FakeExpandableAdapter(
- listRef, binding, params.getProjectCallback()));
+ new FakeExpandableAdapter(listRef, binding, layoutlibCallback));
} else {
((AbsListView) view).setAdapter(
- new FakeAdapter(
- listRef, binding, params.getProjectCallback()));
+ new FakeAdapter(listRef, binding, layoutlibCallback));
}
} else if (view instanceof AbsSpinner) {
((AbsSpinner) view).setAdapter(
- new FakeAdapter(
- listRef, binding, params.getProjectCallback()));
+ new FakeAdapter(listRef, binding, layoutlibCallback));
}
}
}
@@ -1347,7 +1344,7 @@
final int count = group.getChildCount();
for (int c = 0; c < count; c++) {
View child = group.getChildAt(c);
- postInflateProcess(child, projectCallback, skip);
+ postInflateProcess(child, layoutlibCallback, skip);
}
}
}
@@ -1371,10 +1368,10 @@
/**
* Sets up a {@link TabHost} object.
* @param tabHost the TabHost to setup.
- * @param projectCallback The project callback object to access the project R class.
+ * @param layoutlibCallback The project callback object to access the project R class.
* @throws PostInflateException
*/
- private void setupTabHost(TabHost tabHost, IProjectCallback projectCallback)
+ private void setupTabHost(TabHost tabHost, LayoutlibCallback layoutlibCallback)
throws PostInflateException {
// look for the TabWidget, and the FrameLayout. They have their own specific names
View v = tabHost.findViewById(android.R.id.tabs);
@@ -1417,8 +1414,9 @@
if (count == 0) {
// Create a dummy child to get a single tab
- TabSpec spec = tabHost.newTabSpec("tag").setIndicator("Tab Label",
- tabHost.getResources().getDrawable(android.R.drawable.ic_menu_info_details))
+ TabSpec spec = tabHost.newTabSpec("tag")
+ .setIndicator("Tab Label", tabHost.getResources()
+ .getDrawable(android.R.drawable.ic_menu_info_details, null))
.setContent(new TabHost.TabContentFactory() {
@Override
public View createTabContent(String tag) {
@@ -1434,7 +1432,7 @@
@SuppressWarnings("ConstantConditions") // child cannot be null.
int id = child.getId();
@SuppressWarnings("deprecation")
- Pair<ResourceType, String> resource = projectCallback.resolveResourceId(id);
+ Pair<ResourceType, String> resource = layoutlibCallback.resolveResourceId(id);
String name;
if (resource != null) {
name = resource.getSecond();
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterHelper.java
index 6c998af..9aab340 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterHelper.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/AdapterHelper.java
@@ -17,7 +17,7 @@
package com.android.layoutlib.bridge.impl.binding;
import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.LayoutLog;
import com.android.ide.common.rendering.api.ResourceReference;
import com.android.ide.common.rendering.api.IProjectCallback.ViewAttribute;
@@ -40,7 +40,7 @@
public class AdapterHelper {
static Pair<View, Boolean> getView(AdapterItem item, AdapterItem parentItem, ViewGroup parent,
- IProjectCallback callback, ResourceReference adapterRef, boolean skipCallbackParser) {
+ LayoutlibCallback callback, ResourceReference adapterRef, boolean skipCallbackParser) {
// we don't care about recycling here because we never scroll.
DataBindingItem dataBindingItem = item.getDataBindingItem();
@@ -65,7 +65,7 @@
}
private static void fillView(BridgeContext context, View view, AdapterItem item,
- AdapterItem parentItem, IProjectCallback callback, ResourceReference adapterRef) {
+ AdapterItem parentItem, LayoutlibCallback callback, ResourceReference adapterRef) {
if (view instanceof ViewGroup) {
ViewGroup group = (ViewGroup) view;
final int count = group.getChildCount();
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeAdapter.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeAdapter.java
index 9a13f5a..142eac1 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeAdapter.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeAdapter.java
@@ -18,7 +18,7 @@
import com.android.ide.common.rendering.api.AdapterBinding;
import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.ResourceReference;
import com.android.util.Pair;
@@ -37,18 +37,17 @@
* and {@link SpinnerAdapter}.
*
*/
-@SuppressWarnings("deprecation")
public class FakeAdapter extends BaseAdapter {
// don't use a set because the order is important.
private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>();
- private final IProjectCallback mCallback;
+ private final LayoutlibCallback mCallback;
private final ResourceReference mAdapterRef;
private final List<AdapterItem> mItems = new ArrayList<AdapterItem>();
private boolean mSkipCallbackParser = false;
public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding,
- IProjectCallback callback) {
+ LayoutlibCallback callback) {
mAdapterRef = adapterRef;
mCallback = callback;
@@ -111,11 +110,11 @@
public View getView(int position, View convertView, ViewGroup parent) {
// we don't care about recycling here because we never scroll.
AdapterItem item = mItems.get(position);
- Pair<View, Boolean> pair = AdapterHelper.getView(item, null /*parentGroup*/, parent,
- mCallback, mAdapterRef, mSkipCallbackParser);
+ @SuppressWarnings("deprecation")
+ Pair<View, Boolean> pair = AdapterHelper.getView(item, null, parent, mCallback,
+ mAdapterRef, mSkipCallbackParser);
mSkipCallbackParser = pair.getSecond();
return pair.getFirst();
-
}
@Override
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeExpandableAdapter.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeExpandableAdapter.java
index e539579..344b17e 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeExpandableAdapter.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/binding/FakeExpandableAdapter.java
@@ -18,7 +18,7 @@
import com.android.ide.common.rendering.api.AdapterBinding;
import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.ResourceReference;
import com.android.util.Pair;
@@ -34,7 +34,7 @@
@SuppressWarnings("deprecation")
public class FakeExpandableAdapter implements ExpandableListAdapter, HeterogeneousExpandableList {
- private final IProjectCallback mCallback;
+ private final LayoutlibCallback mCallback;
private final ResourceReference mAdapterRef;
private boolean mSkipCallbackParser = false;
@@ -45,7 +45,7 @@
private final List<ResourceReference> mChildrenTypes = new ArrayList<ResourceReference>();
public FakeExpandableAdapter(ResourceReference adapterRef, AdapterBinding binding,
- IProjectCallback callback) {
+ LayoutlibCallback callback) {
mAdapterRef = adapterRef;
mCallback = callback;
diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/activity.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/activity.png
index e38f437..9bf302a 100644
--- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/activity.png
+++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/activity.png
Binary files differ
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java
index 565e881..0a5e798 100644
--- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java
+++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java
@@ -20,7 +20,7 @@
import com.android.ide.common.rendering.api.ActionBarCallback;
import com.android.ide.common.rendering.api.AdapterBinding;
import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.LayoutlibCallback;
import com.android.ide.common.rendering.api.ResourceReference;
import com.android.ide.common.rendering.api.ResourceValue;
import com.android.resources.ResourceType;
@@ -28,10 +28,7 @@
import com.android.util.Pair;
import com.android.utils.ILogger;
-import java.io.ByteArrayOutputStream;
import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
@@ -40,7 +37,7 @@
import com.google.android.collect.Maps;
@SuppressWarnings("deprecation") // For Pair
-public class LayoutLibTestCallback extends ClassLoader implements IProjectCallback {
+public class LayoutLibTestCallback extends LayoutlibCallback {
private static final String PROJECT_CLASSES_LOCATION = "/testApp/MyApplication/build/intermediates/classes/debug/";
private static final String PACKAGE_NAME = "com.android.layoutlib.test.myapplication";
@@ -48,16 +45,16 @@
private final Map<Integer, Pair<ResourceType, String>> mProjectResources = Maps.newHashMap();
private final Map<IntArrayWrapper, String> mStyleableValueToNameMap = Maps.newHashMap();
private final Map<ResourceType, Map<String, Integer>> mResources = Maps.newHashMap();
- private final Map<String, Class<?>> mClasses = Maps.newHashMap();
private final ILogger mLog;
private final ActionBarCallback mActionBarCallback = new ActionBarCallback();
+ private final ClassLoader mModuleClassLoader = new ModuleClassLoader(PROJECT_CLASSES_LOCATION);
public LayoutLibTestCallback(ILogger logger) {
mLog = logger;
}
public void initResources() throws ClassNotFoundException {
- Class<?> rClass = loadClass(PACKAGE_NAME + ".R");
+ Class<?> rClass = mModuleClassLoader.loadClass(PACKAGE_NAME + ".R");
Class<?>[] nestedClasses = rClass.getDeclaredClasses();
for (Class<?> resClass : nestedClasses) {
final ResourceType resType = ResourceType.getEnum(resClass.getSimpleName());
@@ -91,40 +88,11 @@
}
}
- @Override
- protected Class<?> findClass(String name) throws ClassNotFoundException {
- Class<?> aClass = mClasses.get(name);
- if (aClass != null) {
- return aClass;
- }
- String pathName = PROJECT_CLASSES_LOCATION.concat(name.replace('.', '/')).concat(".class");
- InputStream classInputStream = getClass().getResourceAsStream(pathName);
- if (classInputStream == null) {
- throw new ClassNotFoundException("Unable to find class " + name + " at " + pathName);
- }
- byte[] data;
- try {
- ByteArrayOutputStream buffer = new ByteArrayOutputStream();
- int nRead;
- data = new byte[16384];
- while ((nRead = classInputStream.read(data, 0, data.length)) != -1) {
- buffer.write(data, 0, nRead);
- }
- buffer.flush();
- data = buffer.toByteArray();
- } catch (IOException e) {
- // Wrap the exception with ClassNotFoundException so that caller can deal with it.
- throw new ClassNotFoundException("Unable to load class " + name, e);
- }
- aClass = defineClass(name, data, 0, data.length);
- mClasses.put(name, aClass);
- return aClass;
- }
@Override
public Object loadView(String name, Class[] constructorSignature, Object[] constructorArgs)
throws Exception {
- Class<?> viewClass = findClass(name);
+ Class<?> viewClass = mModuleClassLoader.loadClass(name);
Constructor<?> viewConstructor = viewClass.getConstructor(constructorSignature);
viewConstructor.setAccessible(true);
return viewConstructor.newInstance(constructorArgs);
@@ -180,4 +148,9 @@
public ActionBarCallback getActionBarCallback() {
return mActionBarCallback;
}
+
+ @Override
+ public boolean supports(int ideFeature) {
+ return false;
+ }
}
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ModuleClassLoader.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ModuleClassLoader.java
new file mode 100644
index 0000000..110f4c8
--- /dev/null
+++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ModuleClassLoader.java
@@ -0,0 +1,67 @@
+/*
+ * 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.layoutlib.bridge.intensive.setup;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import com.google.android.collect.Maps;
+
+/**
+ * The ClassLoader to load the project's classes.
+ */
+public class ModuleClassLoader extends ClassLoader {
+
+ private final Map<String, Class<?>> mClasses = Maps.newHashMap();
+ private final String mClassLocation;
+
+ public ModuleClassLoader(String classLocation) {
+ mClassLocation = classLocation;
+ }
+
+ @Override
+ protected Class<?> findClass(String name) throws ClassNotFoundException {
+ Class<?> aClass = mClasses.get(name);
+ if (aClass != null) {
+ return aClass;
+ }
+ String pathName = mClassLocation.concat(name.replace('.', '/')).concat(".class");
+ InputStream classInputStream = getClass().getResourceAsStream(pathName);
+ if (classInputStream == null) {
+ throw new ClassNotFoundException("Unable to find class " + name + " at " + pathName);
+ }
+ byte[] data;
+ try {
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ int nRead;
+ data = new byte[16384]; // 16k
+ while ((nRead = classInputStream.read(data, 0, data.length)) != -1) {
+ buffer.write(data, 0, nRead);
+ }
+ buffer.flush();
+ data = buffer.toByteArray();
+ } catch (IOException e) {
+ // Wrap the exception with ClassNotFoundException so that caller can deal with it.
+ throw new ClassNotFoundException("Unable to load class " + name, e);
+ }
+ aClass = defineClass(name, data, 0, data.length);
+ mClasses.put(name, aClass);
+ return aClass;
+ }
+}
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 6e6d6f67..0e888e8 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -166,5 +166,7 @@
WifiConnectionStatistics getConnectionStatistics();
void disableEphemeralNetwork(String SSID);
+
+ void factoryReset();
}
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index e8a51e3..5dc70bd 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -261,6 +261,12 @@
return freq > 4900 && freq < 5900;
}
+ /**
+ * @hide
+ * storing the raw bytes of full result IEs
+ **/
+ public byte[] bytes;
+
/** information element from beacon
* @hide
*/
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 4e4f9b2..0f7dd61 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -20,10 +20,16 @@
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
import android.net.DhcpInfo;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
import android.net.wifi.ScanSettings;
import android.net.wifi.WifiChannel;
import android.os.Binder;
+import android.os.Build;
import android.os.IBinder;
import android.os.Handler;
import android.os.HandlerThread;
@@ -38,6 +44,7 @@
import java.net.InetAddress;
import java.util.concurrent.CountDownLatch;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
@@ -568,6 +575,7 @@
private Context mContext;
IWifiManager mService;
+ private final int mTargetSdkVersion;
private static final int INVALID_KEY = 0;
private static int sListenerKey = 1;
@@ -576,11 +584,17 @@
private static AsyncChannel sAsyncChannel;
private static CountDownLatch sConnected;
+ private static ConnectivityManager sCM;
private static final Object sThreadRefLock = new Object();
private static int sThreadRefCount;
private static HandlerThread sHandlerThread;
+ @GuardedBy("sCM")
+ // TODO: Introduce refcounting and make this a per-process static callback, instead of a
+ // per-WifiManager callback.
+ private PinningNetworkCallback mNetworkCallback;
+
/**
* Create a new WifiManager instance.
* Applications will almost always want to use
@@ -594,6 +608,7 @@
public WifiManager(Context context, IWifiManager service) {
mContext = context;
mService = service;
+ mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
init();
}
@@ -740,6 +755,20 @@
* networks are disabled, and an attempt to connect to the selected
* network is initiated. This may result in the asynchronous delivery
* of state change events.
+ * <p>
+ * <b>Note:</b> If an application's target SDK version is
+ * {@link android.os.Build.VERSION_CODES#MNC} or newer, network
+ * communication may not use Wi-Fi even if Wi-Fi is connected; traffic may
+ * instead be sent through another network, such as cellular data,
+ * Bluetooth tethering, or Ethernet. For example, traffic will never use a
+ * Wi-Fi network that does not provide Internet access (e.g. a wireless
+ * printer), if another network that does offer Internet access (e.g.
+ * cellular data) is available. Applications that need to ensure that their
+ * network traffic uses Wi-Fi should use APIs such as
+ * {@link Network#bindSocket(java.net.Socket)},
+ * {@link Network#openConnection(java.net.URL)}, or
+ * {@link ConnectivityManager#bindProcessToNetwork} to do so.
+ *
* @param netId the ID of the network in the list of configured networks
* @param disableOthers if true, disable all other networks. The way to
* select a particular network to connect to is specify {@code true}
@@ -747,11 +776,23 @@
* @return {@code true} if the operation succeeded
*/
public boolean enableNetwork(int netId, boolean disableOthers) {
- try {
- return mService.enableNetwork(netId, disableOthers);
- } catch (RemoteException e) {
- return false;
+ final boolean pin = disableOthers && mTargetSdkVersion < Build.VERSION_CODES.MNC;
+ if (pin) {
+ registerPinningNetworkCallback();
}
+
+ boolean success;
+ try {
+ success = mService.enableNetwork(netId, disableOthers);
+ } catch (RemoteException e) {
+ success = false;
+ }
+
+ if (pin && !success) {
+ unregisterPinningNetworkCallback();
+ }
+
+ return success;
}
/**
@@ -1951,6 +1992,92 @@
"No permission to access and change wifi or a bad initialization");
}
+ private void initConnectivityManager() {
+ // TODO: what happens if an app calls a WifiManager API before ConnectivityManager is
+ // registered? Can we fix this by starting ConnectivityService before WifiService?
+ if (sCM == null) {
+ sCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (sCM == null) {
+ throw new IllegalStateException("Bad luck, ConnectivityService not started.");
+ }
+ }
+ }
+
+ /**
+ * A NetworkCallback that pins the process to the first wifi network to connect.
+ *
+ * We use this to maintain compatibility with pre-M apps that call WifiManager.enableNetwork()
+ * to connect to a Wi-Fi network that has no Internet access, and then assume that they will be
+ * able to use that network because it's the system default.
+ *
+ * In order to maintain compatibility with apps that call setProcessDefaultNetwork themselves,
+ * we try not to set the default network unless they have already done so, and we try not to
+ * clear the default network unless we set it ourselves.
+ *
+ * This should maintain behaviour that's compatible with L, which would pin the whole system to
+ * any wifi network that was created via enableNetwork(..., true) until that network
+ * disconnected.
+ *
+ * Note that while this hack allows network traffic to flow, it is quite limited. For example:
+ *
+ * 1. setProcessDefaultNetwork only affects this process, so:
+ * - Any subprocesses spawned by this process will not be pinned to Wi-Fi.
+ * - If this app relies on any other apps on the device also being on Wi-Fi, that won't work
+ * either, because other apps on the device will not be pinned.
+ * 2. The behaviour of other APIs is not modified. For example:
+ * - getActiveNetworkInfo will return the system default network, not Wi-Fi.
+ * - There will be no CONNECTIVITY_ACTION broadcasts about TYPE_WIFI.
+ * - getProcessDefaultNetwork will not return null, so if any apps are relying on that, they
+ * will be surprised as well.
+ */
+ private class PinningNetworkCallback extends NetworkCallback {
+ private Network mPinnedNetwork;
+
+ @Override
+ public void onPreCheck(Network network) {
+ if (sCM.getProcessDefaultNetwork() == null && mPinnedNetwork == null) {
+ sCM.setProcessDefaultNetwork(network);
+ mPinnedNetwork = network;
+ Log.d(TAG, "Wifi alternate reality enabled on network " + network);
+ }
+ }
+
+ @Override
+ public void onLost(Network network) {
+ if (network.equals(mPinnedNetwork) && network.equals(sCM.getProcessDefaultNetwork())) {
+ sCM.setProcessDefaultNetwork(null);
+ Log.d(TAG, "Wifi alternate reality disabled on network " + network);
+ mPinnedNetwork = null;
+ unregisterPinningNetworkCallback();
+ }
+ }
+ }
+
+ private void registerPinningNetworkCallback() {
+ initConnectivityManager();
+ synchronized (sCM) {
+ if (mNetworkCallback == null) {
+ // TODO: clear all capabilities.
+ NetworkRequest request = new NetworkRequest.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .build();
+ mNetworkCallback = new PinningNetworkCallback();
+ sCM.registerNetworkCallback(request, mNetworkCallback);
+ }
+ }
+ }
+
+ private void unregisterPinningNetworkCallback() {
+ initConnectivityManager();
+ synchronized (sCM) {
+ if (mNetworkCallback != null) {
+ sCM.unregisterNetworkCallback(mNetworkCallback);
+ mNetworkCallback = null;
+ }
+ }
+ }
+
/**
* Connect to a network with the given configuration. The network also
* gets added to the supplicant configuration.
@@ -2664,18 +2791,9 @@
* @hide
*/
public void factoryReset() {
- // Enable wifi
- setWifiEnabled(true);
- // Delete all Wifi SSIDs
- List<WifiConfiguration> networks = getConfiguredNetworks();
- if (networks != null) {
- for (WifiConfiguration config : networks) {
- removeNetwork(config.networkId);
- }
- saveConfiguration();
+ try {
+ mService.factoryReset();
+ } catch (RemoteException e) {
}
-
- // Turn mobile hotspot off
- setWifiApEnabled(null, false);
}
}