diff options
543 files changed, 9387 insertions, 6380 deletions
diff --git a/api/current.txt b/api/current.txt index f7a316d063e5..aeaae5583304 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2668,6 +2668,8 @@ package android.accessibilityservice { field public static final int GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN = 7; // 0x7 field public static final java.lang.String SERVICE_INTERFACE = "android.accessibilityservice.AccessibilityService"; field public static final java.lang.String SERVICE_META_DATA = "android.accessibilityservice"; + field public static final int SHOW_MODE_AUTO = 0; // 0x0 + field public static final int SHOW_MODE_HIDDEN = 1; // 0x1 } public static abstract class AccessibilityService.GestureResultCallback { @@ -4126,13 +4128,12 @@ package android.app { field public java.lang.String serviceDetails; } - public class AutomaticZenRule implements android.os.Parcelable { + public final class AutomaticZenRule implements android.os.Parcelable { ctor public AutomaticZenRule(java.lang.String, android.content.ComponentName, android.net.Uri, int, boolean); ctor public AutomaticZenRule(android.os.Parcel); method public int describeContents(); method public android.net.Uri getConditionId(); method public long getCreationTime(); - method public java.lang.String getId(); method public int getInterruptionFilter(); method public java.lang.String getName(); method public android.content.ComponentName getOwner(); @@ -5228,14 +5229,14 @@ package android.app { } public class NotificationManager { - method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public java.lang.String addAutomaticZenRule(android.app.AutomaticZenRule); method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); method public android.service.notification.StatusBarNotification[] getActiveNotifications(); method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); - method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); + method public java.util.Map<java.lang.String, android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); method public int getImportance(); method public android.app.NotificationManager.Policy getNotificationPolicy(); @@ -5245,7 +5246,7 @@ package android.app { method public boolean removeAutomaticZenRule(java.lang.String); method public final void setInterruptionFilter(int); method public void setNotificationPolicy(android.app.NotificationManager.Policy); - method public boolean updateAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean updateAutomaticZenRule(java.lang.String, android.app.AutomaticZenRule); field public static final java.lang.String ACTION_INTERRUPTION_FILTER_CHANGED = "android.app.action.INTERRUPTION_FILTER_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED = "android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED"; @@ -5609,8 +5610,6 @@ package android.app { method public void enableCarMode(int); method public int getCurrentModeType(); method public int getNightMode(); - method public boolean isNightModeLocked(); - method public boolean isUiModeLocked(); method public void setNightMode(int); field public static java.lang.String ACTION_ENTER_CAR_MODE; field public static java.lang.String ACTION_ENTER_DESK_MODE; @@ -6591,7 +6590,7 @@ package android.auditing { field public static final int TAG_SYNC_SEND_FILE = 210004; // 0x33454 } - public static class SecurityLog.SecurityEvent implements android.os.Parcelable { + public static final class SecurityLog.SecurityEvent implements android.os.Parcelable { method public int describeContents(); method public java.lang.Object getData(); method public int getTag(); @@ -7335,15 +7334,6 @@ package android.bluetooth { field public static final int TYPE_SCO = 2; // 0x2 } - public class OobData implements android.os.Parcelable { - ctor public OobData(); - method public int describeContents(); - method public byte[] getSecurityManagerTk(); - method public void setSecurityManagerTk(byte[]); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.bluetooth.OobData> CREATOR; - } - } package android.bluetooth.le { @@ -19708,7 +19698,7 @@ package android.media { field public static final int TYPE_WIRED_HEADSET = 3; // 0x3 } - public class AudioFormat implements android.os.Parcelable { + public final class AudioFormat implements android.os.Parcelable { method public int describeContents(); method public int getChannelCount(); method public int getChannelIndexMask(); @@ -20008,7 +19998,7 @@ package android.media { method public abstract void onRoutingChanged(android.media.AudioRecord); } - public class AudioRecordConfiguration implements android.os.Parcelable { + public final class AudioRecordConfiguration implements android.os.Parcelable { method public int describeContents(); method public android.media.AudioDeviceInfo getAudioDevice(); method public int getClientAudioSessionId(); @@ -20660,6 +20650,7 @@ package android.media { field public static final int HEVCMainTierLevel62 = 16777216; // 0x1000000 field public static final int HEVCProfileMain = 1; // 0x1 field public static final int HEVCProfileMain10 = 2; // 0x2 + field public static final int HEVCProfileMain10HDR10 = 4096; // 0x1000 field public static final int MPEG2LevelH14 = 2; // 0x2 field public static final int MPEG2LevelHL = 3; // 0x3 field public static final int MPEG2LevelLL = 0; // 0x0 @@ -22976,7 +22967,7 @@ package android.media.tv { } public static final class TvInputInfo.Builder { - ctor public TvInputInfo.Builder(android.content.Context, java.lang.Class<?>); + ctor public TvInputInfo.Builder(android.content.Context, android.content.ComponentName); method public android.media.tv.TvInputInfo build() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean); method public android.media.tv.TvInputInfo.Builder setTunerCount(int); @@ -23044,7 +23035,7 @@ package android.media.tv { ctor public TvInputService.RecordingSession(android.content.Context); method public void notifyError(int); method public void notifyRecordingStopped(android.net.Uri); - method public void notifyTuned(); + method public void notifyTuned(android.net.Uri); method public abstract void onRelease(); method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); @@ -23103,7 +23094,7 @@ package android.media.tv { method public void onDisconnected(java.lang.String); method public void onError(int); method public void onRecordingStopped(android.net.Uri); - method public void onTuned(); + method public void onTuned(android.net.Uri); } public final class TvTrackInfo implements android.os.Parcelable { @@ -23523,17 +23514,6 @@ package android.net { method public abstract void onNetworkActive(); } - public class ConnectivityMetricsEvent implements android.os.Parcelable { - ctor public ConnectivityMetricsEvent(long, int, int, android.os.Parcelable); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.net.ConnectivityMetricsEvent> CREATOR; - field public final int componentTag; - field public final android.os.Parcelable data; - field public final int eventTag; - field public final long timestamp; - } - public class Credentials { ctor public Credentials(int, int, int); method public int getGid(); @@ -23541,7 +23521,7 @@ package android.net { method public int getUid(); } - public class DataUsageRequest implements android.os.Parcelable { + public final class DataUsageRequest 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.net.DataUsageRequest> CREATOR; @@ -26859,7 +26839,8 @@ package android.opengl { method public static void glGetSynciv(long, int, int, int[], int, int[], int); method public static void glGetSynciv(long, int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static void glGetTransformFeedbackVarying(int, int, int, int[], int, int[], int, int[], int, byte[], int); - method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static deprecated void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer); method public static java.lang.String glGetTransformFeedbackVarying(int, int, int[], int, int[], int); method public static java.lang.String glGetTransformFeedbackVarying(int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static int glGetUniformBlockIndex(int, java.lang.String); @@ -29428,7 +29409,7 @@ package android.os.storage { method public boolean unmountObb(java.lang.String, boolean, android.os.storage.OnObbStateChangeListener); } - public class StorageVolume implements android.os.Parcelable { + public final class StorageVolume implements android.os.Parcelable { method public android.content.Intent createAccessIntent(java.lang.String); method public int describeContents(); method public java.lang.String getDescription(android.content.Context); @@ -30261,7 +30242,7 @@ package android.provider { field public static final java.lang.String COLUMN_ID = "_id"; field public static final java.lang.String COLUMN_ORIGINAL_NUMBER = "original_number"; field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/blocked_number"; - field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_numbers"; + field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_number"; field public static final android.net.Uri CONTENT_URI; } @@ -34552,7 +34533,7 @@ package android.service.notification { method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap); method public final void requestInterruptionFilter(int); method public final void requestListenerHints(int); - method public static final void requestRebind(android.content.ComponentName) throws android.os.RemoteException; + method public static void requestRebind(android.content.ComponentName) throws android.os.RemoteException; method public final void requestUnbind() throws android.os.RemoteException; method public final void setNotificationsShown(java.lang.String[]); field public static final java.lang.String CATEGORY_VR_NOTIFICATIONS = "android.intent.category.vr.notifications"; @@ -36419,6 +36400,7 @@ package android.telecom { public class TelecomManager { method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle); method public void cancelMissedCallsNotification(); + method public android.content.Intent createManageBlockedNumbersIntent(); method public android.net.Uri getAdnUriForPhoneAccount(android.telecom.PhoneAccountHandle); method public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts(); method public java.lang.String getDefaultDialerPackage(); @@ -36431,7 +36413,7 @@ package android.telecom { method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle); method public boolean isInCall(); method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String); - method public void launchManageBlockedNumbersActivity(); + method public deprecated void launchManageBlockedNumbersActivity(); method public void placeCall(android.net.Uri, android.os.Bundle); method public void registerPhoneAccount(android.telecom.PhoneAccount); method public void showInCallScreen(boolean); @@ -50469,6 +50451,7 @@ package java.lang { method public static long doubleToRawLongBits(double); method public double doubleValue(); method public float floatValue(); + method public static int hashCode(double); method public int intValue(); method public static boolean isInfinite(double); method public boolean isInfinite(); @@ -50476,11 +50459,15 @@ package java.lang { method public boolean isNaN(); method public static double longBitsToDouble(long); method public long longValue(); + method public static double max(double, double); + method public static double min(double, double); method public static double parseDouble(java.lang.String) throws java.lang.NumberFormatException; + method public static double sum(double, double); method public static java.lang.String toHexString(double); method public static java.lang.String toString(double); method public static java.lang.Double valueOf(java.lang.String) throws java.lang.NumberFormatException; method public static java.lang.Double valueOf(double); + field public static final int BYTES = 8; // 0x8 field public static final int MAX_EXPONENT = 1023; // 0x3ff field public static final double MAX_VALUE = 1.7976931348623157E308; field public static final int MIN_EXPONENT = -1022; // 0xfffffc02 @@ -50643,10 +50630,13 @@ package java.lang { method public static java.lang.Integer getInteger(java.lang.String); method public static java.lang.Integer getInteger(java.lang.String, int); method public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer); + method public static int hashCode(int); method public static int highestOneBit(int); method public int intValue(); method public long longValue(); method public static int lowestOneBit(int); + method public static int max(int, int); + method public static int min(int, int); method public static int numberOfLeadingZeros(int); method public static int numberOfTrailingZeros(int); method public static int parseInt(java.lang.String, int) throws java.lang.NumberFormatException; @@ -50656,6 +50646,7 @@ package java.lang { method public static int rotateLeft(int, int); method public static int rotateRight(int, int); method public static int signum(int); + method public static int sum(int, int); method public static java.lang.String toBinaryString(int); method public static java.lang.String toHexString(int); method public static java.lang.String toOctalString(int); @@ -50664,6 +50655,7 @@ package java.lang { method public static java.lang.Integer valueOf(java.lang.String, int) throws java.lang.NumberFormatException; method public static java.lang.Integer valueOf(java.lang.String) throws java.lang.NumberFormatException; method public static java.lang.Integer valueOf(int); + field public static final int BYTES = 4; // 0x4 field public static final int MAX_VALUE = 2147483647; // 0x7fffffff field public static final int MIN_VALUE = -2147483648; // 0x80000000 field public static final int SIZE = 32; // 0x20 @@ -50683,6 +50675,7 @@ package java.lang { } public abstract interface Iterable { + method public default void forEach(java.util.function.Consumer<? super T>); method public abstract java.util.Iterator<T> iterator(); } @@ -50704,10 +50697,13 @@ package java.lang { method public static java.lang.Long getLong(java.lang.String); method public static java.lang.Long getLong(java.lang.String, long); method public static java.lang.Long getLong(java.lang.String, java.lang.Long); + method public static int hashCode(long); method public static long highestOneBit(long); method public int intValue(); method public long longValue(); method public static long lowestOneBit(long); + method public static long max(long, long); + method public static long min(long, long); method public static int numberOfLeadingZeros(long); method public static int numberOfTrailingZeros(long); method public static long parseLong(java.lang.String, int) throws java.lang.NumberFormatException; @@ -50717,6 +50713,7 @@ package java.lang { method public static long rotateLeft(long, int); method public static long rotateRight(long, int); method public static int signum(long); + method public static long sum(long, long); method public static java.lang.String toBinaryString(long); method public static java.lang.String toHexString(long); method public static java.lang.String toOctalString(long); @@ -54158,6 +54155,7 @@ package java.security { public abstract class Provider extends java.util.Properties { ctor protected Provider(java.lang.String, double, java.lang.String); + method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>); method public java.lang.String getInfo(); method public java.lang.String getName(); method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String); @@ -57107,6 +57105,7 @@ package java.util { ctor public ArrayList(java.util.Collection<? extends E>); method public java.lang.Object clone(); method public void ensureCapacity(int); + method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); method public int size(); method public void trimToSize(); @@ -57670,6 +57669,7 @@ package java.util { ctor public HashMap(java.util.Map<? extends K, ? extends V>); method public java.lang.Object clone(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { @@ -57694,6 +57694,7 @@ package java.util { method public boolean containsValue(java.lang.Object); method public synchronized java.util.Enumeration<V> elements(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public synchronized V get(java.lang.Object); method public synchronized boolean isEmpty(); method public java.util.Set<K> keySet(); @@ -57712,6 +57713,7 @@ package java.util { ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>); method public java.lang.Object clone(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } public class IllegalFormatCodePointException extends java.util.IllegalFormatException { @@ -57951,6 +57953,7 @@ package java.util { method public abstract boolean containsValue(java.lang.Object); method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public abstract boolean equals(java.lang.Object); + method public default void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public abstract V get(java.lang.Object); method public abstract int hashCode(); method public abstract boolean isEmpty(); @@ -58412,6 +58415,7 @@ package java.util { method public K firstKey(); method public java.util.Map.Entry<K, V> floorEntry(K); method public K floorKey(K); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public java.util.NavigableMap<K, V> headMap(K, boolean); method public java.util.SortedMap<K, V> headMap(K); method public java.util.Map.Entry<K, V> higherEntry(K); @@ -58494,6 +58498,7 @@ package java.util { method public java.util.Enumeration<E> elements(); method public synchronized void ensureCapacity(int); method public synchronized E firstElement(); + method public synchronized void forEach(java.util.function.Consumer<? super E>); method public synchronized E get(int); method public synchronized int indexOf(java.lang.Object, int); method public synchronized void insertElementAt(E, int); @@ -58517,6 +58522,7 @@ package java.util { ctor public WeakHashMap(); ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } } diff --git a/api/removed.txt b/api/removed.txt index 50a24f6dfd93..115224ce49a6 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -37,7 +37,7 @@ package android.database { package android.media { - public class AudioFormat implements android.os.Parcelable { + public final class AudioFormat implements android.os.Parcelable { ctor public AudioFormat(); } diff --git a/api/system-current.txt b/api/system-current.txt index b2b59826f3bc..1a2c8547fa8c 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -2770,6 +2770,8 @@ package android.accessibilityservice { field public static final int GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN = 7; // 0x7 field public static final java.lang.String SERVICE_INTERFACE = "android.accessibilityservice.AccessibilityService"; field public static final java.lang.String SERVICE_META_DATA = "android.accessibilityservice"; + field public static final int SHOW_MODE_AUTO = 0; // 0x0 + field public static final int SHOW_MODE_HIDDEN = 1; // 0x1 } public static abstract class AccessibilityService.GestureResultCallback { @@ -4252,13 +4254,12 @@ package android.app { field public java.lang.String serviceDetails; } - public class AutomaticZenRule implements android.os.Parcelable { + public final class AutomaticZenRule implements android.os.Parcelable { ctor public AutomaticZenRule(java.lang.String, android.content.ComponentName, android.net.Uri, int, boolean); ctor public AutomaticZenRule(android.os.Parcel); method public int describeContents(); method public android.net.Uri getConditionId(); method public long getCreationTime(); - method public java.lang.String getId(); method public int getInterruptionFilter(); method public java.lang.String getName(); method public android.content.ComponentName getOwner(); @@ -5360,14 +5361,14 @@ package android.app { } public class NotificationManager { - method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public java.lang.String addAutomaticZenRule(android.app.AutomaticZenRule); method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); method public android.service.notification.StatusBarNotification[] getActiveNotifications(); method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); - method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); + method public java.util.Map<java.lang.String, android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); method public int getImportance(); method public android.app.NotificationManager.Policy getNotificationPolicy(); @@ -5377,7 +5378,7 @@ package android.app { method public boolean removeAutomaticZenRule(java.lang.String); method public final void setInterruptionFilter(int); method public void setNotificationPolicy(android.app.NotificationManager.Policy); - method public boolean updateAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean updateAutomaticZenRule(java.lang.String, android.app.AutomaticZenRule); field public static final java.lang.String ACTION_INTERRUPTION_FILTER_CHANGED = "android.app.action.INTERRUPTION_FILTER_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED = "android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED"; @@ -5741,8 +5742,6 @@ package android.app { method public void enableCarMode(int); method public int getCurrentModeType(); method public int getNightMode(); - method public boolean isNightModeLocked(); - method public boolean isUiModeLocked(); method public void setNightMode(int); field public static java.lang.String ACTION_ENTER_CAR_MODE; field public static java.lang.String ACTION_ENTER_DESK_MODE; @@ -6858,7 +6857,7 @@ package android.auditing { field public static final int TAG_SYNC_SEND_FILE = 210004; // 0x33454 } - public static class SecurityLog.SecurityEvent implements android.os.Parcelable { + public static final class SecurityLog.SecurityEvent implements android.os.Parcelable { method public int describeContents(); method public java.lang.Object getData(); method public int getTag(); @@ -7610,15 +7609,6 @@ package android.bluetooth { field public static final int TYPE_SCO = 2; // 0x2 } - public class OobData implements android.os.Parcelable { - ctor public OobData(); - method public int describeContents(); - method public byte[] getSecurityManagerTk(); - method public void setSecurityManagerTk(byte[]); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.bluetooth.OobData> CREATOR; - } - } package android.bluetooth.le { @@ -9707,25 +9697,6 @@ package android.content.pm { field public int reqTouchScreen; } - public deprecated class ContainerEncryptionParams implements android.os.Parcelable { - ctor public ContainerEncryptionParams(java.lang.String, java.security.spec.AlgorithmParameterSpec, javax.crypto.SecretKey) throws java.security.InvalidAlgorithmParameterException; - ctor public ContainerEncryptionParams(java.lang.String, java.security.spec.AlgorithmParameterSpec, javax.crypto.SecretKey, java.lang.String, java.security.spec.AlgorithmParameterSpec, javax.crypto.SecretKey, byte[], long, long, long) throws java.security.InvalidAlgorithmParameterException; - method public int describeContents(); - method public long getAuthenticatedDataStart(); - method public long getDataEnd(); - method public long getEncryptedDataStart(); - method public java.lang.String getEncryptionAlgorithm(); - method public javax.crypto.SecretKey getEncryptionKey(); - method public java.security.spec.AlgorithmParameterSpec getEncryptionSpec(); - method public java.lang.String getMacAlgorithm(); - method public javax.crypto.SecretKey getMacKey(); - method public java.security.spec.AlgorithmParameterSpec getMacSpec(); - method public byte[] getMacTag(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.content.pm.ContainerEncryptionParams> CREATOR; - field protected static final java.lang.String TAG = "ContainerEncryptionParams"; - } - public final class EphemeralResolveInfo implements android.os.Parcelable { ctor public EphemeralResolveInfo(android.net.Uri, java.lang.String, java.util.List<android.content.IntentFilter>); method public int describeContents(); @@ -9955,6 +9926,7 @@ package android.content.pm { method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager); method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager); method public android.graphics.drawable.Drawable loadLogo(android.content.pm.PackageManager); + method public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager); method public android.graphics.drawable.Drawable loadUnbadgedIcon(android.content.pm.PackageManager); method public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, java.lang.String); method public void writeToParcel(android.os.Parcel, int); @@ -21204,7 +21176,7 @@ package android.media { field public static final android.os.Parcelable.Creator<android.media.AudioFocusInfo> CREATOR; } - public class AudioFormat implements android.os.Parcelable { + public final class AudioFormat implements android.os.Parcelable { method public int describeContents(); method public int getChannelCount(); method public int getChannelIndexMask(); @@ -21516,7 +21488,7 @@ package android.media { method public abstract void onRoutingChanged(android.media.AudioRecord); } - public class AudioRecordConfiguration implements android.os.Parcelable { + public final class AudioRecordConfiguration implements android.os.Parcelable { method public int describeContents(); method public android.media.AudioDeviceInfo getAudioDevice(); method public int getClientAudioSessionId(); @@ -22168,6 +22140,7 @@ package android.media { field public static final int HEVCMainTierLevel62 = 16777216; // 0x1000000 field public static final int HEVCProfileMain = 1; // 0x1 field public static final int HEVCProfileMain10 = 2; // 0x2 + field public static final int HEVCProfileMain10HDR10 = 4096; // 0x1000 field public static final int MPEG2LevelH14 = 2; // 0x2 field public static final int MPEG2LevelHL = 3; // 0x3 field public static final int MPEG2LevelLL = 0; // 0x0 @@ -24663,7 +24636,7 @@ package android.media.tv { } public static final class TvInputInfo.Builder { - ctor public TvInputInfo.Builder(android.content.Context, java.lang.Class<?>); + ctor public TvInputInfo.Builder(android.content.Context, android.content.ComponentName); method public android.media.tv.TvInputInfo build() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean); method public android.media.tv.TvInputInfo.Builder setHdmiDeviceInfo(android.hardware.hdmi.HdmiDeviceInfo); @@ -24808,7 +24781,7 @@ package android.media.tv { method public void notifyError(int); method public void notifyRecordingStopped(android.net.Uri); method public void notifySessionEvent(java.lang.String, android.os.Bundle); - method public void notifyTuned(); + method public void notifyTuned(android.net.Uri); method public void onAppPrivateCommand(java.lang.String, android.os.Bundle); method public abstract void onRelease(); method public abstract void onStartRecording(android.net.Uri); @@ -24876,7 +24849,7 @@ package android.media.tv { method public void onError(int); method public void onEvent(java.lang.String, java.lang.String, android.os.Bundle); method public void onRecordingStopped(android.net.Uri); - method public void onTuned(); + method public void onTuned(android.net.Uri); } public class TvStreamConfig implements android.os.Parcelable { @@ -25344,17 +25317,6 @@ package android.net { method public void onTetheringStarted(); } - public class ConnectivityMetricsEvent implements android.os.Parcelable { - ctor public ConnectivityMetricsEvent(long, int, int, android.os.Parcelable); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.net.ConnectivityMetricsEvent> CREATOR; - field public final int componentTag; - field public final android.os.Parcelable data; - field public final int eventTag; - field public final long timestamp; - } - public class Credentials { ctor public Credentials(int, int, int); method public int getGid(); @@ -25362,7 +25324,7 @@ package android.net { method public int getUid(); } - public class DataUsageRequest implements android.os.Parcelable { + public final class DataUsageRequest 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.net.DataUsageRequest> CREATOR; @@ -29161,7 +29123,8 @@ package android.opengl { method public static void glGetSynciv(long, int, int, int[], int, int[], int); method public static void glGetSynciv(long, int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static void glGetTransformFeedbackVarying(int, int, int, int[], int, int[], int, int[], int, byte[], int); - method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static deprecated void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer); method public static java.lang.String glGetTransformFeedbackVarying(int, int, int[], int, int[], int); method public static java.lang.String glGetTransformFeedbackVarying(int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static int glGetUniformBlockIndex(int, java.lang.String); @@ -31799,7 +31762,7 @@ package android.os.storage { method public boolean unmountObb(java.lang.String, boolean, android.os.storage.OnObbStateChangeListener); } - public class StorageVolume implements android.os.Parcelable { + public final class StorageVolume implements android.os.Parcelable { method public android.content.Intent createAccessIntent(java.lang.String); method public int describeContents(); method public java.lang.String getDescription(android.content.Context); @@ -32633,7 +32596,7 @@ package android.provider { field public static final java.lang.String COLUMN_ID = "_id"; field public static final java.lang.String COLUMN_ORIGINAL_NUMBER = "original_number"; field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/blocked_number"; - field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_numbers"; + field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_number"; field public static final android.net.Uri CONTENT_URI; } @@ -37041,6 +37004,7 @@ package android.service.notification { public abstract class NotificationAssistantService extends android.service.notification.NotificationListenerService { ctor public NotificationAssistantService(); method public final void adjustImportance(java.lang.String, android.service.notification.NotificationAssistantService.Adjustment); + method public final android.os.IBinder onBind(android.content.Intent); method public void onNotificationActionClick(java.lang.String, long, int); method public void onNotificationClick(java.lang.String, long); method public abstract android.service.notification.NotificationAssistantService.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification, int, boolean); @@ -37093,7 +37057,7 @@ package android.service.notification { method public void registerAsSystemService(android.content.Context, android.content.ComponentName, int) throws android.os.RemoteException; method public final void requestInterruptionFilter(int); method public final void requestListenerHints(int); - method public static final void requestRebind(android.content.ComponentName) throws android.os.RemoteException; + method public static void requestRebind(android.content.ComponentName) throws android.os.RemoteException; method public final void requestUnbind() throws android.os.RemoteException; method public final void setNotificationsShown(java.lang.String[]); method public final void setOnNotificationPostedTrim(int); @@ -39118,6 +39082,7 @@ package android.telecom { method public void cancelMissedCallsNotification(); method public deprecated void clearAccounts(); method public void clearPhoneAccounts(); + method public android.content.Intent createManageBlockedNumbersIntent(); method public java.util.List<android.telecom.ParcelableCallAnalytics> dumpAnalytics(); method public void enablePhoneAccount(android.telecom.PhoneAccountHandle, boolean); method public boolean endCall(); @@ -39143,7 +39108,7 @@ package android.telecom { method public boolean isRinging(); method public boolean isTtySupported(); method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String); - method public void launchManageBlockedNumbersActivity(); + method public deprecated void launchManageBlockedNumbersActivity(); method public void placeCall(android.net.Uri, android.os.Bundle); method public void registerPhoneAccount(android.telecom.PhoneAccount); method public void showInCallScreen(boolean); @@ -53589,6 +53554,7 @@ package java.lang { method public static long doubleToRawLongBits(double); method public double doubleValue(); method public float floatValue(); + method public static int hashCode(double); method public int intValue(); method public static boolean isInfinite(double); method public boolean isInfinite(); @@ -53596,11 +53562,15 @@ package java.lang { method public boolean isNaN(); method public static double longBitsToDouble(long); method public long longValue(); + method public static double max(double, double); + method public static double min(double, double); method public static double parseDouble(java.lang.String) throws java.lang.NumberFormatException; + method public static double sum(double, double); method public static java.lang.String toHexString(double); method public static java.lang.String toString(double); method public static java.lang.Double valueOf(java.lang.String) throws java.lang.NumberFormatException; method public static java.lang.Double valueOf(double); + field public static final int BYTES = 8; // 0x8 field public static final int MAX_EXPONENT = 1023; // 0x3ff field public static final double MAX_VALUE = 1.7976931348623157E308; field public static final int MIN_EXPONENT = -1022; // 0xfffffc02 @@ -53763,10 +53733,13 @@ package java.lang { method public static java.lang.Integer getInteger(java.lang.String); method public static java.lang.Integer getInteger(java.lang.String, int); method public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer); + method public static int hashCode(int); method public static int highestOneBit(int); method public int intValue(); method public long longValue(); method public static int lowestOneBit(int); + method public static int max(int, int); + method public static int min(int, int); method public static int numberOfLeadingZeros(int); method public static int numberOfTrailingZeros(int); method public static int parseInt(java.lang.String, int) throws java.lang.NumberFormatException; @@ -53776,6 +53749,7 @@ package java.lang { method public static int rotateLeft(int, int); method public static int rotateRight(int, int); method public static int signum(int); + method public static int sum(int, int); method public static java.lang.String toBinaryString(int); method public static java.lang.String toHexString(int); method public static java.lang.String toOctalString(int); @@ -53784,6 +53758,7 @@ package java.lang { method public static java.lang.Integer valueOf(java.lang.String, int) throws java.lang.NumberFormatException; method public static java.lang.Integer valueOf(java.lang.String) throws java.lang.NumberFormatException; method public static java.lang.Integer valueOf(int); + field public static final int BYTES = 4; // 0x4 field public static final int MAX_VALUE = 2147483647; // 0x7fffffff field public static final int MIN_VALUE = -2147483648; // 0x80000000 field public static final int SIZE = 32; // 0x20 @@ -53803,6 +53778,7 @@ package java.lang { } public abstract interface Iterable { + method public default void forEach(java.util.function.Consumer<? super T>); method public abstract java.util.Iterator<T> iterator(); } @@ -53824,10 +53800,13 @@ package java.lang { method public static java.lang.Long getLong(java.lang.String); method public static java.lang.Long getLong(java.lang.String, long); method public static java.lang.Long getLong(java.lang.String, java.lang.Long); + method public static int hashCode(long); method public static long highestOneBit(long); method public int intValue(); method public long longValue(); method public static long lowestOneBit(long); + method public static long max(long, long); + method public static long min(long, long); method public static int numberOfLeadingZeros(long); method public static int numberOfTrailingZeros(long); method public static long parseLong(java.lang.String, int) throws java.lang.NumberFormatException; @@ -53837,6 +53816,7 @@ package java.lang { method public static long rotateLeft(long, int); method public static long rotateRight(long, int); method public static int signum(long); + method public static long sum(long, long); method public static java.lang.String toBinaryString(long); method public static java.lang.String toHexString(long); method public static java.lang.String toOctalString(long); @@ -57278,6 +57258,7 @@ package java.security { public abstract class Provider extends java.util.Properties { ctor protected Provider(java.lang.String, double, java.lang.String); + method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>); method public java.lang.String getInfo(); method public java.lang.String getName(); method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String); @@ -60227,6 +60208,7 @@ package java.util { ctor public ArrayList(java.util.Collection<? extends E>); method public java.lang.Object clone(); method public void ensureCapacity(int); + method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); method public int size(); method public void trimToSize(); @@ -60790,6 +60772,7 @@ package java.util { ctor public HashMap(java.util.Map<? extends K, ? extends V>); method public java.lang.Object clone(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { @@ -60814,6 +60797,7 @@ package java.util { method public boolean containsValue(java.lang.Object); method public synchronized java.util.Enumeration<V> elements(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public synchronized V get(java.lang.Object); method public synchronized boolean isEmpty(); method public java.util.Set<K> keySet(); @@ -60832,6 +60816,7 @@ package java.util { ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>); method public java.lang.Object clone(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } public class IllegalFormatCodePointException extends java.util.IllegalFormatException { @@ -61071,6 +61056,7 @@ package java.util { method public abstract boolean containsValue(java.lang.Object); method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public abstract boolean equals(java.lang.Object); + method public default void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public abstract V get(java.lang.Object); method public abstract int hashCode(); method public abstract boolean isEmpty(); @@ -61532,6 +61518,7 @@ package java.util { method public K firstKey(); method public java.util.Map.Entry<K, V> floorEntry(K); method public K floorKey(K); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public java.util.NavigableMap<K, V> headMap(K, boolean); method public java.util.SortedMap<K, V> headMap(K); method public java.util.Map.Entry<K, V> higherEntry(K); @@ -61614,6 +61601,7 @@ package java.util { method public java.util.Enumeration<E> elements(); method public synchronized void ensureCapacity(int); method public synchronized E firstElement(); + method public synchronized void forEach(java.util.function.Consumer<? super E>); method public synchronized E get(int); method public synchronized int indexOf(java.lang.Object, int); method public synchronized void insertElementAt(E, int); @@ -61637,6 +61625,7 @@ package java.util { ctor public WeakHashMap(); ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } } diff --git a/api/system-removed.txt b/api/system-removed.txt index 7347aa3f2110..9ebc484e6dd7 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -35,7 +35,7 @@ package android.database { package android.media { - public class AudioFormat implements android.os.Parcelable { + public final class AudioFormat implements android.os.Parcelable { ctor public AudioFormat(); } diff --git a/api/test-current.txt b/api/test-current.txt index 472daf698b74..1039fed4ac4f 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2668,6 +2668,8 @@ package android.accessibilityservice { field public static final int GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN = 7; // 0x7 field public static final java.lang.String SERVICE_INTERFACE = "android.accessibilityservice.AccessibilityService"; field public static final java.lang.String SERVICE_META_DATA = "android.accessibilityservice"; + field public static final int SHOW_MODE_AUTO = 0; // 0x0 + field public static final int SHOW_MODE_HIDDEN = 1; // 0x1 } public static abstract class AccessibilityService.GestureResultCallback { @@ -4126,13 +4128,12 @@ package android.app { field public java.lang.String serviceDetails; } - public class AutomaticZenRule implements android.os.Parcelable { + public final class AutomaticZenRule implements android.os.Parcelable { ctor public AutomaticZenRule(java.lang.String, android.content.ComponentName, android.net.Uri, int, boolean); ctor public AutomaticZenRule(android.os.Parcel); method public int describeContents(); method public android.net.Uri getConditionId(); method public long getCreationTime(); - method public java.lang.String getId(); method public int getInterruptionFilter(); method public java.lang.String getName(); method public android.content.ComponentName getOwner(); @@ -5228,14 +5229,14 @@ package android.app { } public class NotificationManager { - method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public java.lang.String addAutomaticZenRule(android.app.AutomaticZenRule); method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); method public android.service.notification.StatusBarNotification[] getActiveNotifications(); method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); - method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); + method public java.util.Map<java.lang.String, android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); method public int getImportance(); method public android.app.NotificationManager.Policy getNotificationPolicy(); @@ -5245,7 +5246,7 @@ package android.app { method public boolean removeAutomaticZenRule(java.lang.String); method public final void setInterruptionFilter(int); method public void setNotificationPolicy(android.app.NotificationManager.Policy); - method public boolean updateAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean updateAutomaticZenRule(java.lang.String, android.app.AutomaticZenRule); field public static final java.lang.String ACTION_INTERRUPTION_FILTER_CHANGED = "android.app.action.INTERRUPTION_FILTER_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED = "android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED"; @@ -6593,7 +6594,7 @@ package android.auditing { field public static final int TAG_SYNC_SEND_FILE = 210004; // 0x33454 } - public static class SecurityLog.SecurityEvent implements android.os.Parcelable { + public static final class SecurityLog.SecurityEvent implements android.os.Parcelable { method public int describeContents(); method public java.lang.Object getData(); method public int getTag(); @@ -7337,15 +7338,6 @@ package android.bluetooth { field public static final int TYPE_SCO = 2; // 0x2 } - public class OobData implements android.os.Parcelable { - ctor public OobData(); - method public int describeContents(); - method public byte[] getSecurityManagerTk(); - method public void setSecurityManagerTk(byte[]); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.bluetooth.OobData> CREATOR; - } - } package android.bluetooth.le { @@ -19717,7 +19709,7 @@ package android.media { field public static final int TYPE_WIRED_HEADSET = 3; // 0x3 } - public class AudioFormat implements android.os.Parcelable { + public final class AudioFormat implements android.os.Parcelable { method public int describeContents(); method public int getChannelCount(); method public int getChannelIndexMask(); @@ -20017,7 +20009,7 @@ package android.media { method public abstract void onRoutingChanged(android.media.AudioRecord); } - public class AudioRecordConfiguration implements android.os.Parcelable { + public final class AudioRecordConfiguration implements android.os.Parcelable { method public int describeContents(); method public android.media.AudioDeviceInfo getAudioDevice(); method public int getClientAudioSessionId(); @@ -20669,6 +20661,7 @@ package android.media { field public static final int HEVCMainTierLevel62 = 16777216; // 0x1000000 field public static final int HEVCProfileMain = 1; // 0x1 field public static final int HEVCProfileMain10 = 2; // 0x2 + field public static final int HEVCProfileMain10HDR10 = 4096; // 0x1000 field public static final int MPEG2LevelH14 = 2; // 0x2 field public static final int MPEG2LevelHL = 3; // 0x3 field public static final int MPEG2LevelLL = 0; // 0x0 @@ -22985,7 +22978,7 @@ package android.media.tv { } public static final class TvInputInfo.Builder { - ctor public TvInputInfo.Builder(android.content.Context, java.lang.Class<?>); + ctor public TvInputInfo.Builder(android.content.Context, android.content.ComponentName); method public android.media.tv.TvInputInfo build() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public android.media.tv.TvInputInfo.Builder setCanRecord(boolean); method public android.media.tv.TvInputInfo.Builder setTunerCount(int); @@ -23053,7 +23046,7 @@ package android.media.tv { ctor public TvInputService.RecordingSession(android.content.Context); method public void notifyError(int); method public void notifyRecordingStopped(android.net.Uri); - method public void notifyTuned(); + method public void notifyTuned(android.net.Uri); method public abstract void onRelease(); method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); @@ -23112,7 +23105,7 @@ package android.media.tv { method public void onDisconnected(java.lang.String); method public void onError(int); method public void onRecordingStopped(android.net.Uri); - method public void onTuned(); + method public void onTuned(android.net.Uri); } public final class TvTrackInfo implements android.os.Parcelable { @@ -23532,17 +23525,6 @@ package android.net { method public abstract void onNetworkActive(); } - public class ConnectivityMetricsEvent implements android.os.Parcelable { - ctor public ConnectivityMetricsEvent(long, int, int, android.os.Parcelable); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.net.ConnectivityMetricsEvent> CREATOR; - field public final int componentTag; - field public final android.os.Parcelable data; - field public final int eventTag; - field public final long timestamp; - } - public class Credentials { ctor public Credentials(int, int, int); method public int getGid(); @@ -23550,7 +23532,7 @@ package android.net { method public int getUid(); } - public class DataUsageRequest implements android.os.Parcelable { + public final class DataUsageRequest 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.net.DataUsageRequest> CREATOR; @@ -26868,7 +26850,8 @@ package android.opengl { method public static void glGetSynciv(long, int, int, int[], int, int[], int); method public static void glGetSynciv(long, int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static void glGetTransformFeedbackVarying(int, int, int, int[], int, int[], int, int[], int, byte[], int); - method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static deprecated void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, byte); + method public static void glGetTransformFeedbackVarying(int, int, int, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.IntBuffer, java.nio.ByteBuffer); method public static java.lang.String glGetTransformFeedbackVarying(int, int, int[], int, int[], int); method public static java.lang.String glGetTransformFeedbackVarying(int, int, java.nio.IntBuffer, java.nio.IntBuffer); method public static int glGetUniformBlockIndex(int, java.lang.String); @@ -29438,7 +29421,7 @@ package android.os.storage { method public boolean unmountObb(java.lang.String, boolean, android.os.storage.OnObbStateChangeListener); } - public class StorageVolume implements android.os.Parcelable { + public final class StorageVolume implements android.os.Parcelable { method public android.content.Intent createAccessIntent(java.lang.String); method public int describeContents(); method public java.lang.String getDescription(android.content.Context); @@ -30274,7 +30257,7 @@ package android.provider { field public static final java.lang.String COLUMN_ID = "_id"; field public static final java.lang.String COLUMN_ORIGINAL_NUMBER = "original_number"; field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/blocked_number"; - field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_numbers"; + field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_number"; field public static final android.net.Uri CONTENT_URI; } @@ -34567,7 +34550,7 @@ package android.service.notification { method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap); method public final void requestInterruptionFilter(int); method public final void requestListenerHints(int); - method public static final void requestRebind(android.content.ComponentName) throws android.os.RemoteException; + method public static void requestRebind(android.content.ComponentName) throws android.os.RemoteException; method public final void requestUnbind() throws android.os.RemoteException; method public final void setNotificationsShown(java.lang.String[]); field public static final java.lang.String CATEGORY_VR_NOTIFICATIONS = "android.intent.category.vr.notifications"; @@ -36434,6 +36417,7 @@ package android.telecom { public class TelecomManager { method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle); method public void cancelMissedCallsNotification(); + method public android.content.Intent createManageBlockedNumbersIntent(); method public android.net.Uri getAdnUriForPhoneAccount(android.telecom.PhoneAccountHandle); method public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts(); method public java.lang.String getDefaultDialerPackage(); @@ -36446,7 +36430,7 @@ package android.telecom { method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle); method public boolean isInCall(); method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String); - method public void launchManageBlockedNumbersActivity(); + method public deprecated void launchManageBlockedNumbersActivity(); method public void placeCall(android.net.Uri, android.os.Bundle); method public void registerPhoneAccount(android.telecom.PhoneAccount); method public void showInCallScreen(boolean); @@ -50486,6 +50470,7 @@ package java.lang { method public static long doubleToRawLongBits(double); method public double doubleValue(); method public float floatValue(); + method public static int hashCode(double); method public int intValue(); method public static boolean isInfinite(double); method public boolean isInfinite(); @@ -50493,11 +50478,15 @@ package java.lang { method public boolean isNaN(); method public static double longBitsToDouble(long); method public long longValue(); + method public static double max(double, double); + method public static double min(double, double); method public static double parseDouble(java.lang.String) throws java.lang.NumberFormatException; + method public static double sum(double, double); method public static java.lang.String toHexString(double); method public static java.lang.String toString(double); method public static java.lang.Double valueOf(java.lang.String) throws java.lang.NumberFormatException; method public static java.lang.Double valueOf(double); + field public static final int BYTES = 8; // 0x8 field public static final int MAX_EXPONENT = 1023; // 0x3ff field public static final double MAX_VALUE = 1.7976931348623157E308; field public static final int MIN_EXPONENT = -1022; // 0xfffffc02 @@ -50660,10 +50649,13 @@ package java.lang { method public static java.lang.Integer getInteger(java.lang.String); method public static java.lang.Integer getInteger(java.lang.String, int); method public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer); + method public static int hashCode(int); method public static int highestOneBit(int); method public int intValue(); method public long longValue(); method public static int lowestOneBit(int); + method public static int max(int, int); + method public static int min(int, int); method public static int numberOfLeadingZeros(int); method public static int numberOfTrailingZeros(int); method public static int parseInt(java.lang.String, int) throws java.lang.NumberFormatException; @@ -50673,6 +50665,7 @@ package java.lang { method public static int rotateLeft(int, int); method public static int rotateRight(int, int); method public static int signum(int); + method public static int sum(int, int); method public static java.lang.String toBinaryString(int); method public static java.lang.String toHexString(int); method public static java.lang.String toOctalString(int); @@ -50681,6 +50674,7 @@ package java.lang { method public static java.lang.Integer valueOf(java.lang.String, int) throws java.lang.NumberFormatException; method public static java.lang.Integer valueOf(java.lang.String) throws java.lang.NumberFormatException; method public static java.lang.Integer valueOf(int); + field public static final int BYTES = 4; // 0x4 field public static final int MAX_VALUE = 2147483647; // 0x7fffffff field public static final int MIN_VALUE = -2147483648; // 0x80000000 field public static final int SIZE = 32; // 0x20 @@ -50700,6 +50694,7 @@ package java.lang { } public abstract interface Iterable { + method public default void forEach(java.util.function.Consumer<? super T>); method public abstract java.util.Iterator<T> iterator(); } @@ -50721,10 +50716,13 @@ package java.lang { method public static java.lang.Long getLong(java.lang.String); method public static java.lang.Long getLong(java.lang.String, long); method public static java.lang.Long getLong(java.lang.String, java.lang.Long); + method public static int hashCode(long); method public static long highestOneBit(long); method public int intValue(); method public long longValue(); method public static long lowestOneBit(long); + method public static long max(long, long); + method public static long min(long, long); method public static int numberOfLeadingZeros(long); method public static int numberOfTrailingZeros(long); method public static long parseLong(java.lang.String, int) throws java.lang.NumberFormatException; @@ -50734,6 +50732,7 @@ package java.lang { method public static long rotateLeft(long, int); method public static long rotateRight(long, int); method public static int signum(long); + method public static long sum(long, long); method public static java.lang.String toBinaryString(long); method public static java.lang.String toHexString(long); method public static java.lang.String toOctalString(long); @@ -54175,6 +54174,7 @@ package java.security { public abstract class Provider extends java.util.Properties { ctor protected Provider(java.lang.String, double, java.lang.String); + method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>); method public java.lang.String getInfo(); method public java.lang.String getName(); method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String); @@ -57124,6 +57124,7 @@ package java.util { ctor public ArrayList(java.util.Collection<? extends E>); method public java.lang.Object clone(); method public void ensureCapacity(int); + method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); method public int size(); method public void trimToSize(); @@ -57687,6 +57688,7 @@ package java.util { ctor public HashMap(java.util.Map<? extends K, ? extends V>); method public java.lang.Object clone(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { @@ -57711,6 +57713,7 @@ package java.util { method public boolean containsValue(java.lang.Object); method public synchronized java.util.Enumeration<V> elements(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public synchronized V get(java.lang.Object); method public synchronized boolean isEmpty(); method public java.util.Set<K> keySet(); @@ -57729,6 +57732,7 @@ package java.util { ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>); method public java.lang.Object clone(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } public class IllegalFormatCodePointException extends java.util.IllegalFormatException { @@ -57968,6 +57972,7 @@ package java.util { method public abstract boolean containsValue(java.lang.Object); method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet(); method public abstract boolean equals(java.lang.Object); + method public default void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public abstract V get(java.lang.Object); method public abstract int hashCode(); method public abstract boolean isEmpty(); @@ -58429,6 +58434,7 @@ package java.util { method public K firstKey(); method public java.util.Map.Entry<K, V> floorEntry(K); method public K floorKey(K); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); method public java.util.NavigableMap<K, V> headMap(K, boolean); method public java.util.SortedMap<K, V> headMap(K); method public java.util.Map.Entry<K, V> higherEntry(K); @@ -58511,6 +58517,7 @@ package java.util { method public java.util.Enumeration<E> elements(); method public synchronized void ensureCapacity(int); method public synchronized E firstElement(); + method public synchronized void forEach(java.util.function.Consumer<? super E>); method public synchronized E get(int); method public synchronized int indexOf(java.lang.Object, int); method public synchronized void insertElementAt(E, int); @@ -58534,6 +58541,7 @@ package java.util { ctor public WeakHashMap(); ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); } } diff --git a/api/test-removed.txt b/api/test-removed.txt index 50a24f6dfd93..115224ce49a6 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -37,7 +37,7 @@ package android.database { package android.media { - public class AudioFormat implements android.os.Parcelable { + public final class AudioFormat implements android.os.Parcelable { ctor public AudioFormat(); } diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index eedb82bd5d0a..df0e5fc6f1bb 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -1216,6 +1216,7 @@ public class Am extends BaseCommand { class MyActivityController extends IActivityController.Stub { final String mGdbPort; + final boolean mMonkey; static final int STATE_NORMAL = 0; static final int STATE_CRASHED = 1; @@ -1242,8 +1243,9 @@ public class Am extends BaseCommand { Thread mGdbThread; boolean mGotGdbPrint; - MyActivityController(String gdbPort) { + MyActivityController(String gdbPort, boolean monkey) { mGdbPort = gdbPort; + mMonkey = monkey; } @Override @@ -1443,7 +1445,7 @@ public class Am extends BaseCommand { try { printMessageForState(); - mAm.setActivityController(this); + mAm.setActivityController(this, mMonkey); mState = STATE_NORMAL; InputStreamReader converter = new InputStreamReader(System.in); @@ -1498,7 +1500,7 @@ public class Am extends BaseCommand { } catch (IOException e) { e.printStackTrace(); } finally { - mAm.setActivityController(null); + mAm.setActivityController(null, mMonkey); } } } @@ -1506,16 +1508,19 @@ public class Am extends BaseCommand { private void runMonitor() throws Exception { String opt; String gdbPort = null; + boolean monkey = false; while ((opt=nextOption()) != null) { if (opt.equals("--gdb")) { gdbPort = nextArgRequired(); + } else if (opt.equals("-m")) { + monkey = true; } else { System.err.println("Error: Unknown option: " + opt); return; } } - MyActivityController controller = new MyActivityController(gdbPort); + MyActivityController controller = new MyActivityController(gdbPort, monkey); controller.run(); } diff --git a/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java b/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java index 1fa9bacc10cb..ddeb8e786271 100644 --- a/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java +++ b/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java @@ -50,9 +50,9 @@ public class UiAutomationShellWrapper { } try { if (isSet) { - am.setActivityController(new DummyActivityController()); + am.setActivityController(new DummyActivityController(), true); } else { - am.setActivityController(null); + am.setActivityController(null, true); } } catch (RemoteException e) { throw new RuntimeException(e); diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index fb5f5b9e1efc..ac3b8e360b2e 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -383,13 +383,7 @@ public abstract class AccessibilityService extends Service { @Retention(RetentionPolicy.SOURCE) @IntDef({SHOW_MODE_AUTO, SHOW_MODE_HIDDEN}) public @interface SoftKeyboardShowMode {}; - /** - * @hide - */ public static final int SHOW_MODE_AUTO = 0; - /** - * @hide - */ public static final int SHOW_MODE_HIDDEN = 1; private int mConnectionId; @@ -1137,7 +1131,7 @@ public abstract class AccessibilityService extends Service { } /** - * Removes all instances of the specified change listener from teh list of magnification + * Removes all instances of the specified change listener from the list of magnification * change listeners. * * @param listener the listener to remove, must be non-null @@ -1216,14 +1210,11 @@ public abstract class AccessibilityService extends Service { /** * Returns the show mode of the soft keyboard. The default show mode is - * {@code Settings.Secure.SHOW_MODE_AUTO}, where the soft keyboard is shown when a text - * input field is focused. An AccessibilityService can also request the show mode - * {@code Settings.Secure.SHOW_MODE_HIDDEN}, where the soft keyboard is never shown. + * {@code SHOW_MODE_AUTO}, where the soft keyboard is shown when a text input field is + * focused. An AccessibilityService can also request the show mode + * {@code SHOW_MODE_HIDDEN}, where the soft keyboard is never shown. * * @return the current soft keyboard show mode - * - * @see Settings#Secure#SHOW_MODE_AUTO - * @see Settings#Secure#SHOW_MODE_HIDDEN */ @SoftKeyboardShowMode public int getShowMode() { @@ -1239,9 +1230,9 @@ public abstract class AccessibilityService extends Service { /** * Sets the soft keyboard show mode. The default show mode is - * {@code Settings.Secure.SHOW_MODE_AUTO}, where the soft keyboard is shown when a text - * input field is focused. An AccessibilityService can also request the show mode - * {@code Settings.Secure.SHOW_MODE_HIDDEN}, where the soft keyboard is never shown. The + * {@code SHOW_MODE_AUTO}, where the soft keyboard is shown when a text input field is + * focused. An AccessibilityService can also request the show mode + * {@code SHOW_MODE_HIDDEN}, where the soft keyboard is never shown. The * The lastto this method will be honored, regardless of any previous calls (including those * made by other AccessibilityServices). * <p> @@ -1251,9 +1242,6 @@ public abstract class AccessibilityService extends Service { * * @param showMode the new show mode for the soft keyboard * @return {@code true} on success - * - * @see Settings#Secure#SHOW_MODE_AUTO - * @see Settings#Secure#SHOW_MODE_HIDDEN */ public boolean setShowMode(@SoftKeyboardShowMode int showMode) { final IAccessibilityServiceConnection connection = @@ -1263,9 +1251,13 @@ public abstract class AccessibilityService extends Service { try { return connection.setSoftKeyboardShowMode(showMode); } catch (RemoteException re) { - Log.w(LOG_TAG, "Falied to set soft keyboard behavior", re); + Log.w(LOG_TAG, "Failed to set soft keyboard behavior", re); + re.rethrowFromSystemServer(); } + } else { + throw new RuntimeException("AccessibilityServiceConnection is null"); } + return false; } @@ -1275,9 +1267,9 @@ public abstract class AccessibilityService extends Service { public interface OnShowModeChangedListener { /** * Called when the soft keyboard behavior changes. The default show mode is - * {@code Settings.Secure.SHOW_MODE_AUTO}, where the soft keyboard is shown when a text - * input field is focused. An AccessibilityService can also request the show mode - * {@code Settings.Secure.SHOW_MODE_HIDDEN}, where the soft keyboard is never shown. + * {@code SHOW_MODE_AUTO}, where the soft keyboard is shown when a text input field is + * focused. An AccessibilityService can also request the show mode + * {@code SHOW_MODE_HIDDEN}, where the soft keyboard is never shown. * * @param controller the soft keyboard controller * @param showMode the current soft keyboard show mode diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 32751b2b47fe..be89b20c91c5 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -41,6 +41,7 @@ import android.content.Intent; import android.content.IntentSender; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; @@ -68,6 +69,7 @@ import android.os.Parcelable; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.StrictMode; +import android.os.SystemProperties; import android.os.UserHandle; import android.text.Selection; import android.text.SpannableStringBuilder; @@ -110,6 +112,7 @@ import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; import android.widget.AdapterView; +import android.widget.Toast; import android.widget.Toolbar; import com.android.internal.app.IVoiceInteractor; @@ -832,6 +835,8 @@ public class Activity extends ContextThemeWrapper private boolean mHasCurrentPermissionsRequest; private boolean mEatKeyUpEvent; + private static native String getDlWarning(); + /** Return the intent that started this activity. */ public Intent getIntent() { return mIntent; @@ -1119,34 +1124,6 @@ public class Activity extends ContextThemeWrapper } /** - * Attempts to extract the color from a given drawable. - * - * @return the extracted color or 0 if no color could be extracted. - */ - private int tryExtractColorFromDrawable(Drawable drawable) { - if (drawable instanceof ColorDrawable) { - return ((ColorDrawable) drawable).getColor(); - } else if (drawable instanceof InsetDrawable) { - return tryExtractColorFromDrawable(((InsetDrawable) drawable).getDrawable()); - } else if (drawable instanceof ShapeDrawable) { - Paint p = ((ShapeDrawable) drawable).getPaint(); - if (p != null) { - return p.getColor(); - } - } else if (drawable instanceof LayerDrawable) { - LayerDrawable ld = (LayerDrawable) drawable; - int numLayers = ld.getNumberOfLayers(); - for (int i = 0; i < numLayers; i++) { - int color = tryExtractColorFromDrawable(ld.getDrawable(i)); - if (color != 0) { - return color; - } - } - } - return 0; - } - - /** * Called when activity start-up is complete (after {@link #onStart} * and {@link #onRestoreInstanceState} have been called). Applications will * generally not implement this method; it is intended for system @@ -1168,35 +1145,6 @@ public class Activity extends ContextThemeWrapper onTitleChanged(getTitle(), getTitleColor()); } - Resources.Theme theme = getTheme(); - if (theme != null) { - // Get the primary color and update the TaskDescription for this activity - TypedArray a = theme.obtainStyledAttributes( - com.android.internal.R.styleable.ActivityTaskDescription); - if (mTaskDescription.getPrimaryColor() == 0) { - int colorPrimary = a.getColor( - com.android.internal.R.styleable.ActivityTaskDescription_colorPrimary, 0); - if (colorPrimary != 0 && Color.alpha(colorPrimary) == 0xFF) { - mTaskDescription.setPrimaryColor(colorPrimary); - } - } - if (mTaskDescription.getBackgroundColor() == 0) { - int windowBgResourceId = a.getResourceId( - com.android.internal.R.styleable.ActivityTaskDescription_windowBackground, - 0); - int windowBgFallbackResourceId = a.getResourceId( - com.android.internal.R.styleable.ActivityTaskDescription_windowBackgroundFallback, - 0); - int colorBg = tryExtractColorFromDrawable(DecorView.getResizingBackgroundDrawable( - this, windowBgResourceId, windowBgFallbackResourceId)); - if (colorBg != 0 && Color.alpha(colorBg) == 0xFF) { - mTaskDescription.setBackgroundColor(colorBg); - } - } - a.recycle(); - setTaskDescription(mTaskDescription); - } - mCalled = true; } @@ -4036,6 +3984,27 @@ public class Activity extends ContextThemeWrapper } theme.applyStyle(resid, false); } + + // Get the primary color and update the TaskDescription for this activity + TypedArray a = theme.obtainStyledAttributes( + com.android.internal.R.styleable.ActivityTaskDescription); + if (mTaskDescription.getPrimaryColor() == 0) { + int colorPrimary = a.getColor( + com.android.internal.R.styleable.ActivityTaskDescription_colorPrimary, 0); + if (colorPrimary != 0 && Color.alpha(colorPrimary) == 0xFF) { + mTaskDescription.setPrimaryColor(colorPrimary); + } + } + // For dev-preview only. + if (mTaskDescription.getBackgroundColor() == 0) { + int colorBackground = a.getColor( + com.android.internal.R.styleable.ActivityTaskDescription_colorBackground, 0); + if (colorBackground != 0 && Color.alpha(colorBackground) == 0xFF) { + mTaskDescription.setBackgroundColor(colorBackground); + } + } + a.recycle(); + setTaskDescription(mTaskDescription); } /** @@ -6621,6 +6590,31 @@ public class Activity extends ContextThemeWrapper } mFragments.dispatchStart(); mFragments.reportLoaderStart(); + + // This property is set for all builds except final release + boolean isDlwarningEnabled = SystemProperties.getInt("ro.bionic.ld.warning", 0) == 1; + boolean isAppDebuggable = + (mApplication.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + + if (isAppDebuggable || isDlwarningEnabled) { + String dlwarning = getDlWarning(); + if (dlwarning != null) { + String appName = getString(mApplication.getApplicationInfo().labelRes); + String warning = "Detected problems with app native libraries\n" + + "(please consult log for detail):\n" + dlwarning; + if (isAppDebuggable) { + new AlertDialog.Builder(this). + setTitle(appName). + setMessage(warning). + setPositiveButton(android.R.string.ok, null). + setCancelable(false). + show(); + } else { + Toast.makeText(this, appName + "\n" + warning, Toast.LENGTH_LONG).show(); + } + } + } + mActivityTransitionState.enterReady(this); } diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index a1f82dea9542..9d8dca608c43 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -792,8 +792,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM if (hasBounds) { bounds = Rect.CREATOR.createFromParcel(data); } - moveTaskToDockedStack(taskId, createMode, toTop, animate, bounds); + boolean res = moveTaskToDockedStack(taskId, createMode, toTop, animate, bounds); reply.writeNoException(); + reply.writeInt(res ? 1 : 0); return true; } @@ -1527,7 +1528,8 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM data.enforceInterface(IActivityManager.descriptor); IActivityController watcher = IActivityController.Stub.asInterface( data.readStrongBinder()); - setActivityController(watcher); + boolean imAMonkey = data.readInt() != 0; + setActivityController(watcher, imAMonkey); reply.writeNoException(); return true; } @@ -3808,7 +3810,7 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } @Override - public void moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate, + public boolean moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate, Rect initialBounds) throws RemoteException { Parcel data = Parcel.obtain(); @@ -3826,8 +3828,10 @@ class ActivityManagerProxy implements IActivityManager } mRemote.transact(MOVE_TASK_TO_DOCKED_STACK_TRANSACTION, data, reply, 0); reply.readException(); + boolean res = reply.readInt() > 0; data.recycle(); reply.recycle(); + return res; } @Override public boolean moveTopActivityToPinnedStack(int stackId, Rect r) @@ -4860,12 +4864,14 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); reply.recycle(); } - public void setActivityController(IActivityController watcher) throws RemoteException + public void setActivityController(IActivityController watcher, boolean imAMonkey) + throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(watcher != null ? watcher.asBinder() : null); + data.writeInt(imAMonkey ? 1 : 0); mRemote.transact(SET_ACTIVITY_CONTROLLER_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 0d852e52665b..1e95c983a84f 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -175,6 +175,7 @@ public final class ActivityThread { private static final int SQLITE_MEM_RELEASED_EVENT_LOG_TAG = 75003; private static final int LOG_AM_ON_PAUSE_CALLED = 30021; private static final int LOG_AM_ON_RESUME_CALLED = 30022; + private static final int LOG_AM_ON_STOP_CALLED = 30049; /** Type for IActivityManager.serviceDoneExecuting: anonymous operation */ public static final int SERVICE_DONE_EXECUTING_ANON = 0; @@ -978,18 +979,19 @@ public final class ActivityThread { @Override public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, - boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) { + boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, + boolean dumpUnreachable, String[] args) { FileOutputStream fout = new FileOutputStream(fd); PrintWriter pw = new FastPrintWriter(fout); try { - dumpMemInfo(pw, mem, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly); + dumpMemInfo(pw, mem, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly, dumpUnreachable); } finally { pw.flush(); } } private void dumpMemInfo(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin, - boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly) { + boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable) { long nativeMax = Debug.getNativeHeapSize() / 1024; long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024; long nativeFree = Debug.getNativeHeapFreeSize() / 1024; @@ -1103,6 +1105,16 @@ public final class ActivityThread { pw.println(" Asset Allocations"); pw.print(assetAlloc); } + + // Unreachable native memory + if (dumpUnreachable) { + boolean showContents = ((mBoundApplication != null) + && ((mBoundApplication.appInfo.flags&ApplicationInfo.FLAG_DEBUGGABLE) != 0)) + || android.os.Build.IS_DEBUGGABLE; + pw.println(" "); + pw.println(" Unreachable memory"); + pw.print(Debug.getUnreachableMemory(100, showContents)); + } } @Override @@ -1396,7 +1408,7 @@ public final class ActivityThread { r.packageInfo = getPackageInfoNoCheck( r.activityInfo.applicationInfo, r.compatInfo); - handleLaunchActivity(r, null); + handleLaunchActivity(r, null, "LAUNCH_ACTIVITY"); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } break; case RELAUNCH_ACTIVITY: { @@ -1447,7 +1459,7 @@ public final class ActivityThread { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityResume"); SomeArgs args = (SomeArgs) msg.obj; handleResumeActivity((IBinder) args.arg1, true, args.argi1 != 0, true, - args.argi3); + args.argi3, "RESUME_ACTIVITY"); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; case SEND_RESULT: @@ -2620,7 +2632,7 @@ public final class ActivityThread { return baseContext; } - private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) { + private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) { // If we are getting ready to gc after going to the background, well // we are back active so skip it. unscheduleGcIdler(); @@ -2647,7 +2659,7 @@ public final class ActivityThread { reportSizeConfigurations(r); Bundle oldState = r.state; handleResumeActivity(r.token, false, r.isForward, - !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq); + !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason); if (!r.activity.mFinished && r.startsNotResumed) { // The activity manager actually wants this one to start out @@ -2662,6 +2674,8 @@ public final class ActivityThread { try { r.activity.mCalled = false; mInstrumentation.callActivityOnPause(r.activity); + EventLog.writeEvent(LOG_AM_ON_PAUSE_CALLED, UserHandle.myUserId(), + r.activity.getComponentName().getClassName(), reason); // We need to keep around the original state, in case // we need to be created again. But we only do this // for pre-Honeycomb apps, which always save their state @@ -3309,7 +3323,7 @@ public final class ActivityThread { } public final ActivityClientRecord performResumeActivity(IBinder token, - boolean clearHide) { + boolean clearHide, String reason) { ActivityClientRecord r = mActivities.get(token); if (localLOGV) Slog.v(TAG, "Performing resume of " + r + " finished=" + r.activity.mFinished); @@ -3331,8 +3345,20 @@ public final class ActivityThread { } r.activity.performResume(); - EventLog.writeEvent(LOG_AM_ON_RESUME_CALLED, - UserHandle.myUserId(), r.activity.getComponentName().getClassName()); + // If there is a pending local relaunch that was requested when the activity was + // paused, it will put the activity into paused state when it finally happens. + // Since the activity resumed before being relaunched, we don't want that to happen, + // so we need to clear the request to relaunch paused. + for (int i = mRelaunchingActivities.size() - 1; i >= 0; i--) { + final ActivityClientRecord relaunching = mRelaunchingActivities.get(i); + if (relaunching.token == r.token + && relaunching.onlyLocalRequest && relaunching.startsNotResumed) { + relaunching.startsNotResumed = false; + } + } + + EventLog.writeEvent(LOG_AM_ON_RESUME_CALLED, UserHandle.myUserId(), + r.activity.getComponentName().getClassName(), reason); r.paused = false; r.stopped = false; @@ -3368,7 +3394,7 @@ public final class ActivityThread { } final void handleResumeActivity(IBinder token, - boolean clearHide, boolean isForward, boolean reallyResume, int seq) { + boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) { ActivityClientRecord r = mActivities.get(token); if (!checkAndUpdateLifecycleSeq(seq, r, "resumeActivity")) { return; @@ -3380,7 +3406,7 @@ public final class ActivityThread { mSomeActivitiesChanged = true; // TODO Push resumeArgs into the activity for consideration - r = performResumeActivity(token, clearHide); + r = performResumeActivity(token, clearHide, reason); if (r != null) { final Activity a = r.activity; @@ -3562,6 +3588,7 @@ public final class ActivityThread { private void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, int configChanges, boolean dontReport, int seq) { ActivityClientRecord r = mActivities.get(token); + if (DEBUG_ORDER) Slog.d(TAG, "handlePauseActivity " + r + ", seq: " + seq); if (!checkAndUpdateLifecycleSeq(seq, r, "pauseActivity")) { return; } @@ -3572,7 +3599,7 @@ public final class ActivityThread { } r.activity.mConfigChangeFlags |= configChanges; - performPauseActivity(token, finished, r.isPreHoneycomb()); + performPauseActivity(token, finished, r.isPreHoneycomb(), "handlePauseActivity"); // Make sure any pending writes are now committed. if (r.isPreHoneycomb()) { @@ -3596,13 +3623,13 @@ public final class ActivityThread { } final Bundle performPauseActivity(IBinder token, boolean finished, - boolean saveState) { + boolean saveState, String reason) { ActivityClientRecord r = mActivities.get(token); - return r != null ? performPauseActivity(r, finished, saveState) : null; + return r != null ? performPauseActivity(r, finished, saveState, reason) : null; } final Bundle performPauseActivity(ActivityClientRecord r, boolean finished, - boolean saveState) { + boolean saveState, String reason) { if (r.paused) { if (r.activity.mFinished) { // If we are finishing, we won't call onResume() in certain cases. @@ -3627,7 +3654,7 @@ public final class ActivityThread { r.activity.mCalled = false; mInstrumentation.callActivityOnPause(r.activity); EventLog.writeEvent(LOG_AM_ON_PAUSE_CALLED, UserHandle.myUserId(), - r.activity.getComponentName().getClassName()); + r.activity.getComponentName().getClassName(), reason); if (!r.activity.mCalled) { throw new SuperNotCalledException( "Activity " + r.intent.getComponent().toShortString() + @@ -3660,9 +3687,9 @@ public final class ActivityThread { return !r.activity.mFinished && saveState ? r.state : null; } - final void performStopActivity(IBinder token, boolean saveState) { + final void performStopActivity(IBinder token, boolean saveState, String reason) { ActivityClientRecord r = mActivities.get(token); - performStopActivityInner(r, null, false, saveState); + performStopActivityInner(r, null, false, saveState, reason); } private static class StopInfo implements Runnable { @@ -3679,8 +3706,8 @@ public final class ActivityThread { activity.token, state, persistentState, description); } catch (RemoteException ex) { if (ex instanceof TransactionTooLargeException - && "com.google.android.gms".equals(activity.packageInfo.getPackageName())) { - Log.d(TAG, "STAHP SENDING SO MUCH DATA KTHX: " + ex); + && activity.packageInfo.getTargetSdkVersion() < Build.VERSION_CODES.N) { + Log.e(TAG, "App tried sending too much data in instance state", ex); return; } @@ -3720,7 +3747,7 @@ public final class ActivityThread { * the activity's UI visibillity changes. */ private void performStopActivityInner(ActivityClientRecord r, - StopInfo info, boolean keepShown, boolean saveState) { + StopInfo info, boolean keepShown, boolean saveState, String reason) { if (localLOGV) Slog.v(TAG, "Performing stop of " + r); if (r != null) { if (!keepShown && r.stopped) { @@ -3772,6 +3799,8 @@ public final class ActivityThread { } } r.stopped = true; + EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(), + r.activity.getComponentName().getClassName(), reason); } r.paused = true; @@ -3818,7 +3847,7 @@ public final class ActivityThread { r.activity.mConfigChangeFlags |= configChanges; StopInfo info = new StopInfo(); - performStopActivityInner(r, info, show, true); + performStopActivityInner(r, info, show, true, "handleStopActivity"); if (localLOGV) Slog.v( TAG, "Finishing stop of " + r + ": show=" + show @@ -3874,7 +3903,7 @@ public final class ActivityThread { } if (!show && !r.stopped) { - performStopActivityInner(r, null, show, false); + performStopActivityInner(r, null, show, false, "handleWindowVisibility"); } else if (show && r.stopped) { // If we are getting ready to gc after going to the background, well // we are back active so skip it. @@ -3913,6 +3942,8 @@ public final class ActivityThread { } } r.stopped = true; + EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(), + r.activity.getComponentName().getClassName(), "sleeping"); } // Make sure any pending writes are now committed. @@ -4054,7 +4085,7 @@ public final class ActivityThread { r.activity.mCalled = false; mInstrumentation.callActivityOnPause(r.activity); EventLog.writeEvent(LOG_AM_ON_PAUSE_CALLED, UserHandle.myUserId(), - r.activity.getComponentName().getClassName()); + r.activity.getComponentName().getClassName(), "destroy"); if (!r.activity.mCalled) { throw new SuperNotCalledException( "Activity " + safeToComponentShortString(r.intent) @@ -4086,6 +4117,8 @@ public final class ActivityThread { } } r.stopped = true; + EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(), + r.activity.getComponentName().getClassName(), "destroy"); } if (getNonConfigInstance) { try { @@ -4210,6 +4243,7 @@ public final class ActivityThread { synchronized (mResourcesManager) { for (int i=0; i<mRelaunchingActivities.size(); i++) { ActivityClientRecord r = mRelaunchingActivities.get(i); + if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: " + this + ", trying: " + r); if (r.token == token) { target = r; if (pendingResults != null) { @@ -4240,14 +4274,19 @@ public final class ActivityThread { } if (target == null) { + if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: target is null, fromServer:" + + fromServer); target = new ActivityClientRecord(); target.token = token; target.pendingResults = pendingResults; target.pendingIntents = pendingNewIntents; target.mPreserveWindow = preserveWindow; if (!fromServer) { - ActivityClientRecord existing = mActivities.get(token); + final ActivityClientRecord existing = mActivities.get(token); + if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: " + existing); if (existing != null) { + if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: paused= " + + existing.paused);; target.startsNotResumed = existing.paused; target.overrideConfig = existing.overrideConfig; } @@ -4270,8 +4309,8 @@ public final class ActivityThread { target.pendingConfigChanges |= configChanges; target.relaunchSeq = getLifecycleSeq(); } - if (DEBUG_ORDER) Slog.d(TAG, "relaunchActivity " + ActivityThread.this - + " operation received seq: " + target.relaunchSeq); + if (DEBUG_ORDER) Slog.d(TAG, "relaunchActivity " + ActivityThread.this + ", target " + + target + " operation received seq: " + target.relaunchSeq); } private void handleRelaunchActivity(ActivityClientRecord tmp) { @@ -4385,7 +4424,7 @@ public final class ActivityThread { // Need to ensure state is saved. if (!r.paused) { - performPauseActivity(r.token, false, r.isPreHoneycomb()); + performPauseActivity(r.token, false, r.isPreHoneycomb(), "handleRelaunchActivity"); } if (r.state == null && !r.stopped && !r.isPreHoneycomb()) { callCallActivityOnSaveInstanceState(r); @@ -4415,7 +4454,7 @@ public final class ActivityThread { r.startsNotResumed = tmp.startsNotResumed; r.overrideConfig = tmp.overrideConfig; - handleLaunchActivity(r, currentIntent); + handleLaunchActivity(r, currentIntent, "handleRelaunchActivity"); if (!tmp.onlyLocalRequest) { try { @@ -4793,8 +4832,9 @@ public final class ActivityThread { // Keep in sync with installd (frameworks/native/cmds/installd/commands.cpp). private static File getPrimaryProfileFile(String packageName) { - return new File("/data/misc/profiles/cur/" + UserHandle.myUserId() + - "/" + packageName + "/primary.prof"); + File profileDir = Environment.getDataProfilesDePackageDirectory( + UserHandle.myUserId(), packageName); + return new File(profileDir, "primary.prof"); } private static void setupJitProfileSupport(LoadedApk loadedApk, File cacheDir) { @@ -4825,11 +4865,15 @@ public final class ActivityThread { Os.fchmod(fd, permissions); Os.fchown(fd, appInfo.uid, appInfo.uid); } catch (ErrnoException e) { - Log.v(TAG, "Unable to create jit profile file " + profileFile, e); + Log.v(TAG, "Unable to create jit profile file " + + profileFile + ": " + e.getMessage()); try { Os.unlink(profileFile.getAbsolutePath()); } catch (ErrnoException unlinkErr) { - Log.v(TAG, "Unable to unlink jit profile file " + profileFile, unlinkErr); + if (unlinkErr.errno != OsConstants.ENOENT) { + Log.v(TAG, "Unable to unlink jit profile file " + + profileFile + ": " + unlinkErr.getMessage()); + } } return; } finally { @@ -4837,8 +4881,17 @@ public final class ActivityThread { } } + final File foreignDexProfilesFile = + Environment.getDataProfilesDeForeignDexDirectory(UserHandle.myUserId()); + String foreignDexProfilesPath = null; + if (!foreignDexProfilesFile.exists()) { + Log.v(TAG, "ForeignDexProfilesPath does not exists:" + + foreignDexProfilesFile.getPath()); + } else { + foreignDexProfilesPath = foreignDexProfilesFile.getAbsolutePath(); + } VMRuntime.registerAppInfo(profileFile.getAbsolutePath(), appInfo.dataDir, - codePaths.toArray(new String[codePaths.size()])); + codePaths.toArray(new String[codePaths.size()]), foreignDexProfilesPath); } private void updateDefaultDensity() { diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index b569416cdacb..455f8694f1a6 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -201,6 +201,7 @@ public class AlarmManager { try { mService.remove(null, this); } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); } synchronized (AlarmManager.class) { @@ -656,6 +657,7 @@ public class AlarmManager { mService.set(mPackageName, type, triggerAtMillis, windowMillis, intervalMillis, flags, operation, recipientWrapper, listenerTag, workSource, alarmClock); } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); } } @@ -886,6 +888,7 @@ public class AlarmManager { try { mService.remove(operation, null); } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); } } @@ -926,6 +929,7 @@ public class AlarmManager { try { mService.setTime(millis); } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); } } @@ -965,6 +969,7 @@ public class AlarmManager { try { mService.setTimeZone(timeZone); } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); } } @@ -973,7 +978,7 @@ public class AlarmManager { try { return mService.getNextWakeFromIdleTime(); } catch (RemoteException ex) { - return Long.MAX_VALUE; + throw ex.rethrowFromSystemServer(); } } @@ -1005,7 +1010,7 @@ public class AlarmManager { try { return mService.getNextAlarmClock(userId); } catch (RemoteException ex) { - return null; + throw ex.rethrowFromSystemServer(); } } diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 9d1dfdd24a88..82c4c51b6a04 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -704,8 +704,8 @@ public class AppOpsManager { * (and system ui) to bypass the user restriction when active. */ private static boolean[] sOpAllowSystemRestrictionBypass = new boolean[] { - false, //COARSE_LOCATION - false, //FINE_LOCATION + true, //COARSE_LOCATION + true, //FINE_LOCATION false, //GPS false, //VIBRATE false, //READ_CONTACTS diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 4d466d34a79c..53cc9caf5a2f 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -30,7 +30,6 @@ import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; -import android.content.pm.ContainerEncryptionParams; import android.content.pm.EphemeralApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IOnPermissionsChangeListener; @@ -54,7 +53,6 @@ import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; -import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.res.Resources; import android.content.res.XmlResourceParser; @@ -1469,80 +1467,27 @@ public class ApplicationPackageManager extends PackageManager { @Override public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName) { - final VerificationParams verificationParams = new VerificationParams(null, null, - null, VerificationParams.NO_UID); installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags, - installerPackageName, verificationParams, null, mContext.getUserId()); - } - - @Override - public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, - int flags, String installerPackageName, Uri verificationURI, - ContainerEncryptionParams encryptionParams) { - final VerificationParams verificationParams = new VerificationParams(verificationURI, null, - null, VerificationParams.NO_UID); - installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags, - installerPackageName, verificationParams, encryptionParams, mContext.getUserId()); - } - - @Override - public void installPackageWithVerificationAndEncryption(Uri packageURI, - IPackageInstallObserver observer, int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) { - installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags, - installerPackageName, verificationParams, encryptionParams, mContext.getUserId()); + installerPackageName, mContext.getUserId()); } @Override public void installPackage(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName) { - installPackageAsUser(packageURI, observer, flags, installerPackageName, - mContext.getUserId()); - } - - @Override - public void installPackageAsUser(Uri packageURI, PackageInstallObserver observer, int flags, - String installerPackageName, int userId) { - final VerificationParams verificationParams = new VerificationParams(null, null, - null, VerificationParams.NO_UID); - installCommon(packageURI, observer, flags, installerPackageName, verificationParams, null, - userId); - } - - @Override - public void installPackageWithVerification(Uri packageURI, - PackageInstallObserver observer, int flags, String installerPackageName, - Uri verificationURI, - ContainerEncryptionParams encryptionParams) { - final VerificationParams verificationParams = new VerificationParams(verificationURI, null, - null, VerificationParams.NO_UID); - installCommon(packageURI, observer, flags, installerPackageName, verificationParams, - encryptionParams, mContext.getUserId()); - } - - @Override - public void installPackageWithVerificationAndEncryption(Uri packageURI, - PackageInstallObserver observer, int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) { - installCommon(packageURI, observer, flags, installerPackageName, verificationParams, - encryptionParams, mContext.getUserId()); + installCommon(packageURI, observer, flags, installerPackageName, mContext.getUserId()); } private void installCommon(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams, int userId) { if (!"file".equals(packageURI.getScheme())) { throw new UnsupportedOperationException("Only file:// URIs are supported"); } - if (encryptionParams != null) { - throw new UnsupportedOperationException("ContainerEncryptionParams not supported"); - } final String originPath = packageURI.getPath(); try { mPM.installPackageAsUser(originPath, observer.getBinder(), flags, installerPackageName, - verificationParams, null, userId); + userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index 59ecc03d1295..744ddf704161 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -548,11 +548,12 @@ public abstract class ApplicationThreadNative extends Binder boolean dumpInfo = data.readInt() != 0; boolean dumpDalvik = data.readInt() != 0; boolean dumpSummaryOnly = data.readInt() != 0; + boolean dumpUnreachable = data.readInt() != 0; String[] args = data.readStringArray(); if (fd != null) { try { dumpMemInfo(fd.getFileDescriptor(), mi, checkin, dumpInfo, - dumpDalvik, dumpSummaryOnly, args); + dumpDalvik, dumpSummaryOnly, dumpUnreachable, args); } finally { try { fd.close(); @@ -1328,7 +1329,8 @@ class ApplicationThreadProxy implements IApplicationThread { } public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, - boolean dumpInfo, boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) throws RemoteException { + boolean dumpInfo, boolean dumpDalvik, boolean dumpSummaryOnly, + boolean dumpUnreachable, String[] args) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); @@ -1338,6 +1340,7 @@ class ApplicationThreadProxy implements IApplicationThread { data.writeInt(dumpInfo ? 1 : 0); data.writeInt(dumpDalvik ? 1 : 0); data.writeInt(dumpSummaryOnly ? 1 : 0); + data.writeInt(dumpUnreachable ? 1 : 0); data.writeStringArray(args); mRemote.transact(DUMP_MEM_INFO_TRANSACTION, data, reply, 0); reply.readException(); diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index b7eaf3947a42..1f1f318be5c1 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -27,14 +27,13 @@ import java.util.Objects; /** * Rule instance information for zen mode. */ -public class AutomaticZenRule implements Parcelable { +public final class AutomaticZenRule implements Parcelable { private boolean enabled = false; private String name; private @InterruptionFilter int interruptionFilter; private Uri conditionId; private ComponentName owner; - private String id; private long creationTime; /** @@ -63,9 +62,8 @@ public class AutomaticZenRule implements Parcelable { * @hide */ public AutomaticZenRule(String name, ComponentName owner, Uri conditionId, - int interruptionFilter, boolean enabled, String id, long creationTime) { + int interruptionFilter, boolean enabled, long creationTime) { this(name, owner, conditionId, interruptionFilter, enabled); - this.id = id; this.creationTime = creationTime; } @@ -77,9 +75,6 @@ public class AutomaticZenRule implements Parcelable { interruptionFilter = source.readInt(); conditionId = source.readParcelable(null); owner = source.readParcelable(null); - if (source.readInt() == 1) { - id = source.readString(); - } creationTime = source.readLong(); } @@ -119,20 +114,13 @@ public class AutomaticZenRule implements Parcelable { } /** - * Returns the wall time in milliseconds when this rule was created, if known. + * Returns the time this rule was created, represented as milliseconds since the epoch. */ public long getCreationTime() { return creationTime; } /** - * Returns the unique identifier for this rule. - */ - public String getId() { - return id; - } - - /** * Sets the representation of the state that causes this rule to become active. */ public void setConditionId(Uri conditionId) { @@ -178,12 +166,6 @@ public class AutomaticZenRule implements Parcelable { dest.writeInt(interruptionFilter); dest.writeParcelable(conditionId, 0); dest.writeParcelable(owner, 0); - if (id != null) { - dest.writeInt(1); - dest.writeString(id); - } else { - dest.writeInt(0); - } dest.writeLong(creationTime); } @@ -195,7 +177,6 @@ public class AutomaticZenRule implements Parcelable { .append(",interruptionFilter=").append(interruptionFilter) .append(",conditionId=").append(conditionId) .append(",owner=").append(owner) - .append(",id=").append(id) .append(",creationTime=").append(creationTime) .append(']').toString(); } @@ -210,13 +191,12 @@ public class AutomaticZenRule implements Parcelable { && other.interruptionFilter == interruptionFilter && Objects.equals(other.conditionId, conditionId) && Objects.equals(other.owner, owner) - && Objects.equals(other.id, id) && other.creationTime == creationTime; } @Override public int hashCode() { - return Objects.hash(enabled, name, interruptionFilter, conditionId, owner, id, creationTime); + return Objects.hash(enabled, name, interruptionFilter, conditionId, owner, creationTime); } public static final Parcelable.Creator<AutomaticZenRule> CREATOR diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java index 4b0dfc7e0a8b..3a51aff37921 100644 --- a/core/java/android/app/BackStackRecord.java +++ b/core/java/android/app/BackStackRecord.java @@ -16,8 +16,6 @@ package android.app; -import com.android.internal.util.FastPrintWriter; - import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; @@ -33,6 +31,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import com.android.internal.util.FastPrintWriter; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; @@ -717,10 +717,12 @@ final class BackStackRecord extends FragmentTransaction implements bumpBackStackNesting(1); - SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>(); - SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>(); - calculateFragments(firstOutFragments, lastInFragments); - beginTransition(firstOutFragments, lastInFragments, false); + if (mManager.mCurState >= Fragment.CREATED) { + SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>(); + SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>(); + calculateFragments(firstOutFragments, lastInFragments); + beginTransition(firstOutFragments, lastInFragments, false); + } Op op = mHead; while (op != null) { @@ -842,6 +844,14 @@ final class BackStackRecord extends FragmentTransaction implements firstOutFragments.remove(containerId); } } + /** + * Ensure that fragments that are entering are at least at the CREATED state + * so that they may load Transitions using TransitionInflater. + */ + if (fragment.mState < Fragment.CREATED && mManager.mCurState >= Fragment.CREATED) { + mManager.makeActive(fragment); + mManager.moveToState(fragment, Fragment.CREATED, 0, 0, false); + } } } @@ -986,7 +996,6 @@ final class BackStackRecord extends FragmentTransaction implements */ private TransitionState beginTransition(SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments, boolean isBack) { - ensureFragmentsAreInitialized(lastInFragments); TransitionState state = new TransitionState(); // Adding a non-existent target view makes sure that the transitions don't target @@ -1012,21 +1021,6 @@ final class BackStackRecord extends FragmentTransaction implements return state; } - /** - * Ensure that fragments that are entering are at least at the CREATED state - * so that they may load Transitions using TransitionInflater. - */ - private void ensureFragmentsAreInitialized(SparseArray<Fragment> lastInFragments) { - final int count = lastInFragments.size(); - for (int i = 0; i < count; i++) { - final Fragment fragment = lastInFragments.valueAt(i); - if (fragment.mState < Fragment.CREATED) { - mManager.makeActive(fragment); - mManager.moveToState(fragment, Fragment.CREATED, 0, 0, false); - } - } - } - private static Transition cloneTransition(Transition transition) { if (transition != null) { transition = transition.clone(); @@ -1663,12 +1657,14 @@ final class BackStackRecord extends FragmentTransaction implements pw.flush(); } - if (state == null) { - if (firstOutFragments.size() != 0 || lastInFragments.size() != 0) { - state = beginTransition(firstOutFragments, lastInFragments, true); + if (mManager.mCurState >= Fragment.CREATED) { + if (state == null) { + if (firstOutFragments.size() != 0 || lastInFragments.size() != 0) { + state = beginTransition(firstOutFragments, lastInFragments, true); + } + } else if (!doStateMove) { + setNameOverrides(state, mSharedElementTargetNames, mSharedElementSourceNames); } - } else if (!doStateMove) { - setNameOverrides(state, mSharedElementTargetNames, mSharedElementSourceNames); } bumpBackStackNesting(-1); diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 47eec8bbfbfd..e76f9910e751 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -396,9 +396,11 @@ class ContextImpl extends Context { /** * Try our best to migrate all files from source to target that match - * requested prefix. Return false if we have any trouble migrating. + * requested prefix. + * + * @return the number of files moved, or -1 if there was trouble. */ - private static boolean migrateFiles(File sourceDir, File targetDir, final String prefix) { + private static int migrateFiles(File sourceDir, File targetDir, final String prefix) { final File[] sourceFiles = FileUtils.listFilesOrEmpty(sourceDir, new FilenameFilter() { @Override public boolean accept(File dir, String name) { @@ -406,7 +408,7 @@ class ContextImpl extends Context { } }); - boolean res = true; + int res = 0; for (File sourceFile : sourceFiles) { final File targetFile = new File(targetDir, sourceFile.getName()); Log.d(TAG, "Migrating " + sourceFile + " to " + targetFile); @@ -416,9 +418,12 @@ class ContextImpl extends Context { if (!sourceFile.delete()) { throw new IOException("Failed to clean up " + sourceFile); } + if (res != -1) { + res++; + } } catch (IOException e) { Log.w(TAG, "Failed to migrate " + sourceFile + ": " + e); - res = false; + res = -1; } } return res; @@ -430,12 +435,17 @@ class ContextImpl extends Context { final File source = sourceContext.getSharedPreferencesPath(name); final File target = getSharedPreferencesPath(name); - // Evict any in-memory caches for either location - final ArrayMap<File, SharedPreferencesImpl> cache = getSharedPreferencesCacheLocked(); - cache.remove(source); - cache.remove(target); - - return migrateFiles(source.getParentFile(), target.getParentFile(), source.getName()); + final int res = migrateFiles(source.getParentFile(), target.getParentFile(), + source.getName()); + if (res > 0) { + // We moved at least one file, so evict any in-memory caches for + // either location + final ArrayMap<File, SharedPreferencesImpl> cache = + getSharedPreferencesCacheLocked(); + cache.remove(source); + cache.remove(target); + } + return res != -1; } } @@ -675,7 +685,8 @@ class ContextImpl extends Context { synchronized (ContextImpl.class) { final File source = sourceContext.getDatabasePath(name); final File target = getDatabasePath(name); - return migrateFiles(source.getParentFile(), target.getParentFile(), source.getName()); + return migrateFiles(source.getParentFile(), target.getParentFile(), + source.getName()) != -1; } } diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index aafb3c638a65..6870bbff48c7 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -2509,6 +2509,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene throw new SuperNotCalledException("Fragment " + this + " did not call through to super.onDestroy()"); } + mChildFragmentManager = null; } private static Transition loadTransition(Context context, TypedArray typedArray, diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 78a054b3a717..063194310e77 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -1525,7 +1525,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate throw new IllegalStateException("Must be called from main thread of fragment host"); } - if (allowStateLoss) { + if (!allowStateLoss) { checkStateLoss(); } @@ -1625,7 +1625,9 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate final BackStackRecord bss = mBackStack.remove(last); SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>(); SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>(); - bss.calculateBackFragments(firstOutFragments, lastInFragments); + if (mCurState >= Fragment.CREATED) { + bss.calculateBackFragments(firstOutFragments, lastInFragments); + } bss.popFromBackStack(true, null, firstOutFragments, lastInFragments); reportBackStackChanged(); } else { @@ -1672,8 +1674,10 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate final int LAST = states.size()-1; SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>(); SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>(); - for (int i=0; i<=LAST; i++) { - states.get(i).calculateBackFragments(firstOutFragments, lastInFragments); + if (mCurState >= Fragment.CREATED) { + for (int i = 0; i <= LAST; i++) { + states.get(i).calculateBackFragments(firstOutFragments, lastInFragments); + } } BackStackRecord.TransitionState state = null; for (int i=0; i<=LAST; i++) { diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 2cb615103024..d78f59f06754 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -143,7 +143,7 @@ public interface IActivityManager extends IInterface { public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot) throws RemoteException; public void moveTaskBackwards(int task) throws RemoteException; public void moveTaskToStack(int taskId, int stackId, boolean toTop) throws RemoteException; - public void moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate, + public boolean moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate, Rect initialBounds) throws RemoteException; public boolean moveTopActivityToPinnedStack(int stackId, Rect bounds) throws RemoteException; public void resizeStack(int stackId, Rect bounds, boolean allowResizeInDockedMode, @@ -305,7 +305,7 @@ public interface IActivityManager extends IInterface { String packageName, boolean waitForDebugger, boolean persistent) throws RemoteException; public void setAlwaysFinish(boolean enabled) throws RemoteException; - public void setActivityController(IActivityController watcher) + public void setActivityController(IActivityController watcher, boolean imAMonkey) throws RemoteException; public void setLenientBackgroundCheck(boolean enabled) throws RemoteException; public int getMemoryTrimLevel() throws RemoteException; diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index b55da88c8a3e..a3c95916bb98 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -133,7 +133,8 @@ public interface IApplicationThread extends IInterface { void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) throws RemoteException; void scheduleTrimMemory(int level) throws RemoteException; void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, boolean dumpInfo, - boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) throws RemoteException; + boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable, + String[] args) throws RemoteException; void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException; void dumpDbInfo(FileDescriptor fd, String[] args) throws RemoteException; void unstableProviderDied(IBinder provider) throws RemoteException; diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 8be00aa50ca3..569792438f23 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -97,9 +97,9 @@ interface INotificationManager boolean isNotificationPolicyAccessGrantedForPackage(String pkg); void setNotificationPolicyAccessGranted(String pkg, boolean granted); AutomaticZenRule getAutomaticZenRule(String id); - List<AutomaticZenRule> getAutomaticZenRules(); - AutomaticZenRule addAutomaticZenRule(in AutomaticZenRule automaticZenRule); - boolean updateAutomaticZenRule(in AutomaticZenRule automaticZenRule); + List<ZenModeConfig.ZenRule> getZenRules(); + String addAutomaticZenRule(in AutomaticZenRule automaticZenRule); + boolean updateAutomaticZenRule(String id, in AutomaticZenRule automaticZenRule); boolean removeAutomaticZenRule(String id); boolean removeAutomaticZenRules(String packageName); int getRuleInstanceCount(in ComponentName owner); diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 06fe515c22db..b65faa98cdca 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -382,7 +382,7 @@ public final class LoadedApk { String libraryPermittedPath = mDataDir; boolean isBundledApp = false; - if (mApplicationInfo.isSystemApp()) { + if (mApplicationInfo.isSystemApp() && !mApplicationInfo.isUpdatedSystemApp()) { isBundledApp = true; // Add path to system libraries to libPaths; // Access to system libs should be limited diff --git a/core/java/android/app/LocalActivityManager.java b/core/java/android/app/LocalActivityManager.java index 873e3373d80d..2a1e3c250a00 100644 --- a/core/java/android/app/LocalActivityManager.java +++ b/core/java/android/app/LocalActivityManager.java @@ -144,7 +144,7 @@ public class LocalActivityManager { if (desiredState == RESUMED) { if (localLOGV) Log.v(TAG, r.id + ": resuming"); - mActivityThread.performResumeActivity(r, true); + mActivityThread.performResumeActivity(r, true, "moveToState-INITIALIZING"); r.curState = RESUMED; } @@ -167,7 +167,7 @@ public class LocalActivityManager { if (desiredState == RESUMED) { if (localLOGV) Log.v(TAG, r.id + ": restarting and resuming"); mActivityThread.performRestartActivity(r); - mActivityThread.performResumeActivity(r, true); + mActivityThread.performResumeActivity(r, true, "moveToState-CREATED"); r.curState = RESUMED; } return; @@ -176,13 +176,13 @@ public class LocalActivityManager { if (desiredState == RESUMED) { // Need to resume it... if (localLOGV) Log.v(TAG, r.id + ": resuming"); - mActivityThread.performResumeActivity(r, true); + mActivityThread.performResumeActivity(r, true, "moveToState-STARTED"); r.instanceState = null; r.curState = RESUMED; } if (desiredState == CREATED) { if (localLOGV) Log.v(TAG, r.id + ": stopping"); - mActivityThread.performStopActivity(r, false); + mActivityThread.performStopActivity(r, false, "moveToState-STARTED"); r.curState = CREATED; } return; @@ -197,7 +197,7 @@ public class LocalActivityManager { if (localLOGV) Log.v(TAG, r.id + ": pausing"); performPause(r, mFinishing); if (localLOGV) Log.v(TAG, r.id + ": stopping"); - mActivityThread.performStopActivity(r, false); + mActivityThread.performStopActivity(r, false, "moveToState-RESUMED"); r.curState = CREATED; } return; @@ -205,9 +205,9 @@ public class LocalActivityManager { } private void performPause(LocalActivityRecord r, boolean finishing) { - boolean needState = r.instanceState == null; - Bundle instanceState = mActivityThread.performPauseActivity(r, - finishing, needState); + final boolean needState = r.instanceState == null; + final Bundle instanceState = mActivityThread.performPauseActivity( + r, finishing, needState, "performPause"); if (needState) { r.instanceState = instanceState; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 344315d5266f..057a4e943971 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -48,8 +48,12 @@ import android.util.Log; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import java.util.List; +import java.util.Set; /** * Class to notify the user of events that happen. This is how you tell @@ -413,13 +417,20 @@ public class NotificationManager * Returns AutomaticZenRules owned by the caller. * * <p> - * Only available if policy access is granted to this package. + * Throws a SecurityException if policy access is granted to this package. * See {@link #isNotificationPolicyAccessGranted}. */ - public List<AutomaticZenRule> getAutomaticZenRules() { + public Map<String, AutomaticZenRule> getAutomaticZenRules() { INotificationManager service = getService(); try { - return service.getAutomaticZenRules(); + List<ZenModeConfig.ZenRule> rules = service.getZenRules(); + Map<String, AutomaticZenRule> ruleMap = new HashMap<>(); + for (ZenModeConfig.ZenRule rule : rules) { + ruleMap.put(rule.id, new AutomaticZenRule(rule.name, rule.component, + rule.conditionId, zenModeToInterruptionFilter(rule.zenMode), rule.enabled, + rule.creationTime)); + } + return ruleMap; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -429,7 +440,7 @@ public class NotificationManager * Returns the AutomaticZenRule with the given id, if it exists and the caller has access. * * <p> - * Only available if policy access is granted to this package. + * Throws a SecurityException if policy access is granted to this package. * See {@link #isNotificationPolicyAccessGranted}. * * <p> @@ -449,14 +460,13 @@ public class NotificationManager * Creates the given zen rule. * * <p> - * Only available if policy access is granted to this package. + * Throws a SecurityException if policy access is granted to this package. * See {@link #isNotificationPolicyAccessGranted}. * * @param automaticZenRule the rule to create. - * @return A fully populated {@link AutomaticZenRule} if the rule was persisted successfully, - * null otherwise. + * @return The id of the newly created rule; null if the rule could not be created. */ - public AutomaticZenRule addAutomaticZenRule(AutomaticZenRule automaticZenRule) { + public String addAutomaticZenRule(AutomaticZenRule automaticZenRule) { INotificationManager service = getService(); try { return service.addAutomaticZenRule(automaticZenRule); @@ -469,18 +479,19 @@ public class NotificationManager * Updates the given zen rule. * * <p> - * Only available if policy access is granted to this package. + * Throws a SecurityException if policy access is granted to this package. * See {@link #isNotificationPolicyAccessGranted}. * * <p> * Callers can only update rules that they own. See {@link AutomaticZenRule#getOwner}. + * @param id The id of the rule to update * @param automaticZenRule the rule to update. * @return Whether the rule was successfully updated. */ - public boolean updateAutomaticZenRule(AutomaticZenRule automaticZenRule) { + public boolean updateAutomaticZenRule(String id, AutomaticZenRule automaticZenRule) { INotificationManager service = getService(); try { - return service.updateAutomaticZenRule(automaticZenRule); + return service.updateAutomaticZenRule(id, automaticZenRule); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -490,7 +501,7 @@ public class NotificationManager * Deletes the automatic zen rule with the given id. * * <p> - * Only available if policy access is granted to this package. + * Throws a SecurityException if policy access is granted to this package. * See {@link #isNotificationPolicyAccessGranted}. * * <p> @@ -879,9 +890,8 @@ public class NotificationManager final List<StatusBarNotification> list = parceledList.getList(); return list.toArray(new StatusBarNotification[list.size()]); } catch (RemoteException e) { - Log.e(TAG, "Unable to talk to notification manager. Woe!", e); + throw e.rethrowFromSystemServer(); } - return new StatusBarNotification[0]; } /** @@ -902,9 +912,8 @@ public class NotificationManager try { return zenModeToInterruptionFilter(service.getZenMode()); } catch (RemoteException e) { - Log.e(TAG, "Unable to talk to notification manager. Woe!", e); + throw e.rethrowFromSystemServer(); } - return INTERRUPTION_FILTER_UNKNOWN; } /** @@ -925,7 +934,7 @@ public class NotificationManager try { service.setInterruptionFilter(mContext.getOpPackageName(), interruptionFilter); } catch (RemoteException e) { - Log.e(TAG, "Unable to talk to notification manager. Woe!", e); + throw e.rethrowFromSystemServer(); } } diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index 9e321644c902..ac4abf5c36a4 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -686,8 +686,7 @@ public class SearchManager try { return mService.getGlobalSearchActivities(); } catch (RemoteException ex) { - Log.e(TAG, "getGlobalSearchActivities() failed: " + ex); - return null; + throw ex.rethrowFromSystemServer(); } } @@ -698,8 +697,7 @@ public class SearchManager try { return mService.getGlobalSearchActivity(); } catch (RemoteException ex) { - Log.e(TAG, "getGlobalSearchActivity() failed: " + ex); - return null; + throw ex.rethrowFromSystemServer(); } } @@ -716,8 +714,7 @@ public class SearchManager try { return mService.getWebSearchActivity(); } catch (RemoteException ex) { - Log.e(TAG, "getWebSearchActivity() failed: " + ex); - return null; + throw ex.rethrowFromSystemServer(); } } @@ -850,8 +847,7 @@ public class SearchManager try { return mService.getSearchableInfo(componentName); } catch (RemoteException ex) { - Log.e(TAG, "getSearchableInfo() failed: " + ex); - return null; + throw ex.rethrowFromSystemServer(); } } @@ -935,8 +931,7 @@ public class SearchManager try { return mService.getSearchablesInGlobalSearch(); } catch (RemoteException e) { - Log.e(TAG, "getSearchablesInGlobalSearch() failed: " + e); - return null; + throw e.rethrowFromSystemServer(); } } @@ -958,8 +953,7 @@ public class SearchManager } return intent; } catch (RemoteException re) { - Log.e(TAG, "getAssistIntent() failed: " + re); - return null; + throw re.rethrowFromSystemServer(); } } @@ -977,7 +971,7 @@ public class SearchManager } mService.launchAssist(args); } catch (RemoteException re) { - Log.e(TAG, "launchAssist() failed: " + re); + throw re.rethrowFromSystemServer(); } } @@ -995,8 +989,7 @@ public class SearchManager } return mService.launchLegacyAssist(hint, userHandle, args); } catch (RemoteException re) { - Log.e(TAG, "launchAssist() failed: " + re); - return false; + throw re.rethrowFromSystemServer(); } } } diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index b899116142c8..e57a9b5231e3 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -123,8 +123,7 @@ public class StatusBarManager { svc.disable(what, mToken, mContext.getPackageName()); } } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); + throw ex.rethrowFromSystemServer(); } } @@ -141,8 +140,7 @@ public class StatusBarManager { svc.disable2(what, mToken, mContext.getPackageName()); } } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); + throw ex.rethrowFromSystemServer(); } } @@ -156,8 +154,7 @@ public class StatusBarManager { svc.expandNotificationsPanel(); } } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); + throw ex.rethrowFromSystemServer(); } } @@ -171,8 +168,7 @@ public class StatusBarManager { svc.collapsePanels(); } } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); + throw ex.rethrowFromSystemServer(); } } @@ -193,8 +189,7 @@ public class StatusBarManager { svc.expandSettingsPanel(subPanel); } } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); + throw ex.rethrowFromSystemServer(); } } @@ -206,8 +201,7 @@ public class StatusBarManager { contentDescription); } } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); + throw ex.rethrowFromSystemServer(); } } @@ -218,8 +212,7 @@ public class StatusBarManager { svc.removeIcon(slot); } } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); + throw ex.rethrowFromSystemServer(); } } @@ -230,8 +223,7 @@ public class StatusBarManager { svc.setIconVisibility(slot, visible); } } catch (RemoteException ex) { - // system process is dead anyway. - throw new RuntimeException(ex); + throw ex.rethrowFromSystemServer(); } } diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 307c3eb18362..b1c5fd8c6963 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -226,7 +226,7 @@ final class SystemServiceRegistry { SYSTEM_SERVICE_NAMES.put(android.text.ClipboardManager.class, Context.CLIPBOARD_SERVICE); registerService(Context.CONNECTIVITY_SERVICE, ConnectivityManager.class, - new StaticOuterContextServiceFetcher<ConnectivityManager>() { + new StaticApplicationContextServiceFetcher<ConnectivityManager>() { @Override public ConnectivityManager createService(Context context) { IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); @@ -840,22 +840,21 @@ final class SystemServiceRegistry { } /** - * Like StaticServiceFetcher, creates only one instance of the service per process, but when - * creating the service for the first time, passes it the outer context of the creating - * component. + * Like StaticServiceFetcher, creates only one instance of the service per application, but when + * creating the service for the first time, passes it the application context of the creating + * application. * - * TODO: Is this safe in the case where multiple applications share the same process? * TODO: Delete this once its only user (ConnectivityManager) is known to work well in the * case where multiple application components each have their own ConnectivityManager object. */ - static abstract class StaticOuterContextServiceFetcher<T> implements ServiceFetcher<T> { + static abstract class StaticApplicationContextServiceFetcher<T> implements ServiceFetcher<T> { private T mCachedInstance; @Override public final T getService(ContextImpl ctx) { - synchronized (StaticOuterContextServiceFetcher.this) { + synchronized (StaticApplicationContextServiceFetcher.this) { if (mCachedInstance == null) { - mCachedInstance = createService(ctx.getOuterContext()); + mCachedInstance = createService(ctx.getApplicationContext()); } return mCachedInstance; } diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java index 56b4249b619d..69e8df87384b 100644 --- a/core/java/android/app/UiModeManager.java +++ b/core/java/android/app/UiModeManager.java @@ -17,6 +17,7 @@ package android.app; import android.annotation.IntDef; +import android.annotation.TestApi; import android.content.Context; import android.content.res.Configuration; import android.os.RemoteException; @@ -158,7 +159,7 @@ public class UiModeManager { try { mService.enableCarMode(flags); } catch (RemoteException e) { - Log.e(TAG, "disableCarMode: RemoteException", e); + throw e.rethrowFromSystemServer(); } } } @@ -181,7 +182,7 @@ public class UiModeManager { try { mService.disableCarMode(flags); } catch (RemoteException e) { - Log.e(TAG, "disableCarMode: RemoteException", e); + throw e.rethrowFromSystemServer(); } } } @@ -200,7 +201,7 @@ public class UiModeManager { try { return mService.getCurrentModeType(); } catch (RemoteException e) { - Log.e(TAG, "getCurrentModeType: RemoteException", e); + throw e.rethrowFromSystemServer(); } } return Configuration.UI_MODE_TYPE_NORMAL; @@ -233,7 +234,7 @@ public class UiModeManager { try { mService.setNightMode(mode); } catch (RemoteException e) { - Log.e(TAG, "setNightMode: RemoteException", e); + throw e.rethrowFromSystemServer(); } } } @@ -257,7 +258,7 @@ public class UiModeManager { try { return mService.getNightMode(); } catch (RemoteException e) { - Log.e(TAG, "getNightMode: RemoteException", e); + throw e.rethrowFromSystemServer(); } } return -1; @@ -266,13 +267,15 @@ public class UiModeManager { /** * @return If UI mode is locked or not. When UI mode is locked, calls to change UI mode * like {@link #enableCarMode(int)} will silently fail. + * @hide */ + @TestApi public boolean isUiModeLocked() { if (mService != null) { try { return mService.isUiModeLocked(); } catch (RemoteException e) { - Log.e(TAG, "isUiModeLocked: RemoteException", e); + throw e.rethrowFromSystemServer(); } } return true; @@ -286,13 +289,15 @@ public class UiModeManager { * mode will fail silently. * * @return {@code true} if night mode is locked or {@code false} otherwise + * @hide */ + @TestApi public boolean isNightModeLocked() { if (mService != null) { try { return mService.isNightModeLocked(); } catch (RemoteException e) { - Log.e(TAG, "isNightModeLocked: RemoteException", e); + throw e.rethrowFromSystemServer(); } } return true; diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index b7e31ab752fa..4d8d96b0e16c 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -293,7 +293,7 @@ public class WallpaperManager { return null; } } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } } if (mWallpaper != null) { @@ -349,7 +349,7 @@ public class WallpaperManager { } } } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } return null; } @@ -691,7 +691,7 @@ public class WallpaperManager { Bundle outParams = new Bundle(); return sGlobals.mService.getWallpaper(null, which, outParams, userId); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } } @@ -720,7 +720,7 @@ public class WallpaperManager { return sGlobals.mService.getWallpaperInfo(); } } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -844,7 +844,7 @@ public class WallpaperManager { } } } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } return result.getInt(EXTRA_NEW_WALLPAPER_ID, 0); } @@ -950,7 +950,7 @@ public class WallpaperManager { } } } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } return result.getInt(EXTRA_NEW_WALLPAPER_ID, 0); } @@ -1067,7 +1067,7 @@ public class WallpaperManager { } } } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } return result.getInt(EXTRA_NEW_WALLPAPER_ID, 0); @@ -1088,7 +1088,7 @@ public class WallpaperManager { String name = "res:" + resources.getResourceName(resid); return sGlobals.mService.hasNamedWallpaper(name); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1114,8 +1114,7 @@ public class WallpaperManager { try { return sGlobals.mService.getWidthHint(); } catch (RemoteException e) { - // Shouldn't happen! - return 0; + throw e.rethrowFromSystemServer(); } } @@ -1141,8 +1140,7 @@ public class WallpaperManager { try { return sGlobals.mService.getHeightHint(); } catch (RemoteException e) { - // Shouldn't happen! - return 0; + throw e.rethrowFromSystemServer(); } } @@ -1203,7 +1201,7 @@ public class WallpaperManager { mContext.getOpPackageName()); } } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } } @@ -1224,7 +1222,7 @@ public class WallpaperManager { sGlobals.mService.setDisplayPadding(padding, mContext.getOpPackageName()); } } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } } @@ -1245,7 +1243,7 @@ public class WallpaperManager { windowToken, x, y); //Log.v(TAG, "...app returning after sending display offset!"); } catch (RemoteException e) { - // Ignore. + throw e.rethrowFromSystemServer(); } } @@ -1274,7 +1272,7 @@ public class WallpaperManager { try { sGlobals.mService.clearWallpaper(mContext.getOpPackageName(), which, userId); } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } } @@ -1296,9 +1294,8 @@ public class WallpaperManager { sGlobals.mService.setWallpaperComponentChecked(name, mContext.getOpPackageName()); return true; } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } - return false; } /** @@ -1321,7 +1318,7 @@ public class WallpaperManager { windowToken, xOffset, yOffset, mWallpaperXStep, mWallpaperYStep); //Log.v(TAG, "...app returning after sending offsets!"); } catch (RemoteException e) { - // Ignore. + throw e.rethrowFromSystemServer(); } } @@ -1359,7 +1356,7 @@ public class WallpaperManager { windowToken, action, x, y, z, extras, false); //Log.v(TAG, "...app returning after sending offsets!"); } catch (RemoteException e) { - // Ignore. + throw e.rethrowFromSystemServer(); } } @@ -1375,7 +1372,7 @@ public class WallpaperManager { try { return sGlobals.mService.isWallpaperSupported(mContext.getOpPackageName()); } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } } return false; @@ -1395,7 +1392,7 @@ public class WallpaperManager { try { return sGlobals.mService.isWallpaperSettingAllowed(mContext.getOpPackageName()); } catch (RemoteException e) { - // Ignore + throw e.rethrowFromSystemServer(); } } return false; @@ -1416,7 +1413,7 @@ public class WallpaperManager { WindowManagerGlobal.getWindowSession().setWallpaperPosition( windowToken, -1, -1, -1, -1); } catch (RemoteException e) { - // Ignore. + throw e.rethrowFromSystemServer(); } } @@ -1497,9 +1494,8 @@ public class WallpaperManager { try { return sGlobals.mService.setLockWallpaperCallback(callback); } catch (RemoteException e) { - Log.e(TAG, "Unable to contact wallpaper service"); + throw e.rethrowFromSystemServer(); } - return false; } // Private completion callback for setWallpaper() synchronization diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 74fe13ac1961..a1ad59085d8c 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -100,9 +100,6 @@ public class DevicePolicyManager { private final IDevicePolicyManager mService; private final boolean mParentInstance; - private static final String REMOTE_EXCEPTION_MESSAGE = - "Failed to talk with device policy manager service"; - private DevicePolicyManager(Context context, boolean parentInstance) { this(context, IDevicePolicyManager.Stub.asInterface( @@ -989,7 +986,7 @@ public class DevicePolicyManager { try { return mService.isAdminActive(admin, userId); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -1004,7 +1001,7 @@ public class DevicePolicyManager { try { return mService.isRemovingAdmin(admin, userId); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -1029,7 +1026,7 @@ public class DevicePolicyManager { try { return mService.getActiveAdmins(userId); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -1054,7 +1051,7 @@ public class DevicePolicyManager { try { return mService.packageHasActiveAdmins(packageName, userId); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -1074,7 +1071,7 @@ public class DevicePolicyManager { try { mService.removeActiveAdmin(admin, myUserId()); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1093,7 +1090,7 @@ public class DevicePolicyManager { try { return mService.hasGrantedPolicy(admin, usesPolicy, myUserId()); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -1109,7 +1106,7 @@ public class DevicePolicyManager { try { return mService.isSeparateProfileChallengeAllowed(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -1227,7 +1224,7 @@ public class DevicePolicyManager { try { mService.setPasswordQuality(admin, quality, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1254,7 +1251,7 @@ public class DevicePolicyManager { try { return mService.getPasswordQuality(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return PASSWORD_QUALITY_UNSPECIFIED; @@ -1291,7 +1288,7 @@ public class DevicePolicyManager { try { mService.setPasswordMinimumLength(admin, length, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1319,7 +1316,7 @@ public class DevicePolicyManager { try { return mService.getPasswordMinimumLength(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1357,7 +1354,7 @@ public class DevicePolicyManager { try { mService.setPasswordMinimumUpperCase(admin, length, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1391,7 +1388,7 @@ public class DevicePolicyManager { try { return mService.getPasswordMinimumUpperCase(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1429,7 +1426,7 @@ public class DevicePolicyManager { try { mService.setPasswordMinimumLowerCase(admin, length, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1463,7 +1460,7 @@ public class DevicePolicyManager { try { return mService.getPasswordMinimumLowerCase(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1500,7 +1497,7 @@ public class DevicePolicyManager { try { mService.setPasswordMinimumLetters(admin, length, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1533,7 +1530,7 @@ public class DevicePolicyManager { try { return mService.getPasswordMinimumLetters(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1570,7 +1567,7 @@ public class DevicePolicyManager { try { mService.setPasswordMinimumNumeric(admin, length, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1603,7 +1600,7 @@ public class DevicePolicyManager { try { return mService.getPasswordMinimumNumeric(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1640,7 +1637,7 @@ public class DevicePolicyManager { try { mService.setPasswordMinimumSymbols(admin, length, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1672,7 +1669,7 @@ public class DevicePolicyManager { try { return mService.getPasswordMinimumSymbols(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1709,7 +1706,7 @@ public class DevicePolicyManager { try { mService.setPasswordMinimumNonLetter(admin, length, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1742,7 +1739,7 @@ public class DevicePolicyManager { try { return mService.getPasswordMinimumNonLetter(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1780,7 +1777,7 @@ public class DevicePolicyManager { try { mService.setPasswordHistoryLength(admin, length, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1816,7 +1813,7 @@ public class DevicePolicyManager { try { mService.setPasswordExpirationTimeout(admin, timeout, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -1840,7 +1837,7 @@ public class DevicePolicyManager { try { return mService.getPasswordExpirationTimeout(admin, myUserId(), mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1864,7 +1861,7 @@ public class DevicePolicyManager { try { return mService.getPasswordExpiration(admin, myUserId(), mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1893,7 +1890,7 @@ public class DevicePolicyManager { try { return mService.getPasswordHistoryLength(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -1931,7 +1928,7 @@ public class DevicePolicyManager { try { return mService.isActivePasswordSufficient(myUserId(), mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -1951,7 +1948,7 @@ public class DevicePolicyManager { try { return mService.isProfileActivePasswordSufficientForParent(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -1988,7 +1985,7 @@ public class DevicePolicyManager { try { return mService.getCurrentFailedPasswordAttempts(userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return -1; @@ -2005,7 +2002,7 @@ public class DevicePolicyManager { try { return mService.getDoNotAskCredentialsOnBoot(); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -2039,7 +2036,7 @@ public class DevicePolicyManager { try { mService.setMaximumFailedPasswordsForWipe(admin, num, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2068,7 +2065,7 @@ public class DevicePolicyManager { return mService.getMaximumFailedPasswordsForWipe( admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -2087,7 +2084,7 @@ public class DevicePolicyManager { return mService.getProfileWithMinimumFailedPasswordsForWipe( userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return UserHandle.USER_NULL; @@ -2155,7 +2152,7 @@ public class DevicePolicyManager { try { return mService.resetPassword(password, flags); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -2183,7 +2180,7 @@ public class DevicePolicyManager { try { mService.setMaximumTimeToLock(admin, timeMs, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2212,7 +2209,7 @@ public class DevicePolicyManager { try { return mService.getMaximumTimeToLock(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -2235,7 +2232,7 @@ public class DevicePolicyManager { try { mService.lockNow(mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2272,7 +2269,7 @@ public class DevicePolicyManager { try { mService.wipeData(flags); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2342,7 +2339,7 @@ public class DevicePolicyManager { } return mService.setGlobalProxy(admin, hostSpec, exclSpec); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -2370,7 +2367,7 @@ public class DevicePolicyManager { try { mService.setRecommendedGlobalProxy(admin, proxyInfo); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2386,7 +2383,7 @@ public class DevicePolicyManager { try { return mService.getGlobalProxyAdmin(myUserId()); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -2515,7 +2512,7 @@ public class DevicePolicyManager { try { return mService.setStorageEncryption(admin, encrypt); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return ENCRYPTION_STATUS_UNSUPPORTED; @@ -2535,7 +2532,7 @@ public class DevicePolicyManager { try { return mService.getStorageEncryption(admin, myUserId()); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -2570,7 +2567,7 @@ public class DevicePolicyManager { try { return mService.getStorageEncryptionStatus(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return ENCRYPTION_STATUS_UNSUPPORTED; @@ -2591,7 +2588,7 @@ public class DevicePolicyManager { try { return mService.installCaCert(admin, certBuffer); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -2612,7 +2609,7 @@ public class DevicePolicyManager { } catch (CertificateException e) { Log.w(TAG, "Unable to parse certificate", e); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2640,7 +2637,7 @@ public class DevicePolicyManager { } } } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return certs; @@ -2659,7 +2656,7 @@ public class DevicePolicyManager { mService.uninstallCaCerts(admin, new TrustedCertificateStore().userAliases() .toArray(new String[0])); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } @@ -2677,7 +2674,7 @@ public class DevicePolicyManager { mService.enforceCanManageCaCerts(admin); return getCaCertAlias(certBuffer) != null; } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } catch (CertificateException ce) { Log.w(TAG, "Could not parse certificate", ce); } @@ -2737,7 +2734,7 @@ public class DevicePolicyManager { .getKeySpec(privKey, PKCS8EncodedKeySpec.class).getEncoded(); return mService.installKeyPair(admin, pkcs8Key, pemCert, alias, requestAccess); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { Log.w(TAG, "Failed to obtain private key material", e); } catch (CertificateException | IOException e) { @@ -2753,15 +2750,14 @@ public class DevicePolicyManager { * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or * {@code null} if calling from a delegated certificate installer. * @param alias The private key alias under which the certificate is installed. - * @return {@code true} if the keys were both removed, {@code false} otherwise. + * @return {@code true} if the certificate alias no longer exists, {@code false} otherwise. */ public boolean removeKeyPair(@Nullable ComponentName admin, @NonNull String alias) { try { return mService.removeKeyPair(admin, alias); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } - return false; } /** @@ -2800,7 +2796,7 @@ public class DevicePolicyManager { try { mService.setCertInstallerPackage(admin, installerPackage); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2818,7 +2814,7 @@ public class DevicePolicyManager { try { return mService.getCertInstallerPackage(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -2845,7 +2841,7 @@ public class DevicePolicyManager { try { return mService.setAlwaysOnVpnPackage(admin, vpnPackage); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -2865,7 +2861,7 @@ public class DevicePolicyManager { try { return mService.getAlwaysOnVpnPackage(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -2890,7 +2886,7 @@ public class DevicePolicyManager { try { mService.setCameraDisabled(admin, disabled); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2911,7 +2907,7 @@ public class DevicePolicyManager { try { return mService.getCameraDisabled(admin, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -2921,7 +2917,7 @@ public class DevicePolicyManager { * Called by a device owner to request a bugreport. * * <p>There must be only one user on the device, managed by the device owner. - * Otherwise a security exception will be thrown. + * Otherwise a {@link SecurityException} will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return {@code true} if the bugreport collection started successfully, or {@code false} @@ -2933,7 +2929,7 @@ public class DevicePolicyManager { try { return mService.requestBugreport(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -2970,7 +2966,7 @@ public class DevicePolicyManager { try { mService.setScreenCaptureDisabled(admin, disabled); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -2991,7 +2987,7 @@ public class DevicePolicyManager { try { return mService.getScreenCaptureDisabled(admin, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -3014,7 +3010,7 @@ public class DevicePolicyManager { try { mService.setAutoTimeRequired(admin, required); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3027,7 +3023,7 @@ public class DevicePolicyManager { try { return mService.getAutoTimeRequired(); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -3052,7 +3048,7 @@ public class DevicePolicyManager { try { mService.setForceEphemeralUsers(admin, forceEphemeralUsers); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3066,7 +3062,7 @@ public class DevicePolicyManager { try { return mService.getForceEphemeralUsers(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -3115,7 +3111,7 @@ public class DevicePolicyManager { try { mService.setKeyguardDisabledFeatures(admin, which, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3144,7 +3140,7 @@ public class DevicePolicyManager { try { return mService.getKeyguardDisabledFeatures(admin, userHandle, mParentInstance); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return KEYGUARD_DISABLE_FEATURES_NONE; @@ -3159,7 +3155,7 @@ public class DevicePolicyManager { try { mService.setActiveAdmin(policyReceiver, refreshing, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3179,7 +3175,7 @@ public class DevicePolicyManager { try { mService.getRemoveWarning(admin, result, myUserId()); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3194,7 +3190,7 @@ public class DevicePolicyManager { mService.setActivePasswordState(quality, length, letters, uppercase, lowercase, numbers, symbols, nonletter, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3207,7 +3203,7 @@ public class DevicePolicyManager { try { mService.reportFailedPasswordAttempt(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3220,7 +3216,7 @@ public class DevicePolicyManager { try { mService.reportSuccessfulPasswordAttempt(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3233,7 +3229,7 @@ public class DevicePolicyManager { try { mService.reportFailedFingerprintAttempt(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3246,7 +3242,7 @@ public class DevicePolicyManager { try { mService.reportSuccessfulFingerprintAttempt(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3260,7 +3256,7 @@ public class DevicePolicyManager { try { mService.reportKeyguardDismissed(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3274,7 +3270,7 @@ public class DevicePolicyManager { try { mService.reportKeyguardSecured(userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3327,7 +3323,7 @@ public class DevicePolicyManager { try { return mService.setDeviceOwner(who, ownerName, userId); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return false; @@ -3409,7 +3405,7 @@ public class DevicePolicyManager { try { return mService.getDeviceOwnerComponent(callingUserOnly); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return null; @@ -3428,7 +3424,7 @@ public class DevicePolicyManager { try { return mService.getDeviceOwnerUserId(); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return UserHandle.USER_NULL; @@ -3448,7 +3444,7 @@ public class DevicePolicyManager { try { mService.clearDeviceOwner(packageName); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } @@ -3491,7 +3487,7 @@ public class DevicePolicyManager { try { return mService.getDeviceOwnerName(); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return null; @@ -3544,7 +3540,7 @@ public class DevicePolicyManager { mService.setActiveAdmin(admin, false, myUserId); return mService.setProfileOwner(admin, ownerName, myUserId); } catch (RemoteException re) { - throw new IllegalArgumentException("Couldn't set profile owner.", re); + throw re.rethrowFromSystemServer(); } } return false; @@ -3564,7 +3560,7 @@ public class DevicePolicyManager { try { mService.clearProfileOwner(admin); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } @@ -3578,7 +3574,7 @@ public class DevicePolicyManager { try { return mService.hasUserSetupCompleted(); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return true; @@ -3609,8 +3605,7 @@ public class DevicePolicyManager { } return mService.setProfileOwner(admin, ownerName, userHandle); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - throw new IllegalArgumentException("Couldn't set profile owner.", re); + throw re.rethrowFromSystemServer(); } } return false; @@ -3638,7 +3633,7 @@ public class DevicePolicyManager { try { return mService.setDeviceOwnerLockScreenInfo(admin, info); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return false; @@ -3652,7 +3647,7 @@ public class DevicePolicyManager { try { return mService.getDeviceOwnerLockScreenInfo(); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return null; @@ -3680,7 +3675,7 @@ public class DevicePolicyManager { try { return mService.setPackagesSuspended(admin, packageNames, suspended); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return packageNames; @@ -3699,7 +3694,7 @@ public class DevicePolicyManager { try { return mService.getPackageSuspended(admin, packageName); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -3718,7 +3713,7 @@ public class DevicePolicyManager { try { mService.setProfileEnabled(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3739,7 +3734,7 @@ public class DevicePolicyManager { try { mService.setProfileName(admin, profileName); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3759,7 +3754,7 @@ public class DevicePolicyManager { return profileOwner != null && profileOwner.getPackageName().equals(packageName); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return false; @@ -3785,9 +3780,7 @@ public class DevicePolicyManager { try { return mService.getProfileOwner(userId); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - throw new IllegalArgumentException( - "Requested profile owner for invalid userId", re); + throw re.rethrowFromSystemServer(); } } return null; @@ -3804,9 +3797,7 @@ public class DevicePolicyManager { try { return mService.getProfileOwnerName(Process.myUserHandle().getIdentifier()); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - throw new IllegalArgumentException( - "Requested profile owner for invalid userId", re); + throw re.rethrowFromSystemServer(); } } return null; @@ -3825,9 +3816,7 @@ public class DevicePolicyManager { try { return mService.getProfileOwnerName(userId); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - throw new IllegalArgumentException( - "Requested profile owner for invalid userId", re); + throw re.rethrowFromSystemServer(); } } return null; @@ -3856,7 +3845,7 @@ public class DevicePolicyManager { try { mService.addPersistentPreferredActivity(admin, filter, activity); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3877,7 +3866,7 @@ public class DevicePolicyManager { try { mService.clearPackagePersistentPreferredActivities(admin, packageName); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3903,7 +3892,7 @@ public class DevicePolicyManager { try { mService.setApplicationRestrictionsManagingPackage(admin, packageName); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -3921,7 +3910,7 @@ public class DevicePolicyManager { try { return mService.getApplicationRestrictionsManagingPackage(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -3937,7 +3926,7 @@ public class DevicePolicyManager { try { return mService.isCallerApplicationRestrictionsManagingPackage(); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -3982,7 +3971,7 @@ public class DevicePolicyManager { try { mService.setApplicationRestrictions(admin, packageName, settings); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4012,7 +4001,7 @@ public class DevicePolicyManager { try { mService.setTrustAgentConfiguration(admin, target, configuration); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4043,7 +4032,7 @@ public class DevicePolicyManager { try { return mService.getTrustAgentConfiguration(admin, agent, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return new ArrayList<PersistableBundle>(); // empty list @@ -4064,7 +4053,7 @@ public class DevicePolicyManager { try { mService.setCrossProfileCallerIdDisabled(admin, disabled); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4083,7 +4072,7 @@ public class DevicePolicyManager { try { return mService.getCrossProfileCallerIdDisabled(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4100,7 +4089,7 @@ public class DevicePolicyManager { try { return mService.getCrossProfileCallerIdDisabledForUser(userHandle.getIdentifier()); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4122,7 +4111,7 @@ public class DevicePolicyManager { try { mService.setCrossProfileContactsSearchDisabled(admin, disabled); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4141,7 +4130,7 @@ public class DevicePolicyManager { try { return mService.getCrossProfileContactsSearchDisabled(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4160,7 +4149,7 @@ public class DevicePolicyManager { return mService .getCrossProfileContactsSearchDisabledForUser(userHandle.getIdentifier()); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4178,7 +4167,7 @@ public class DevicePolicyManager { mService.startManagedQuickContact(actualLookupKey, actualContactId, isContactIdIgnored, directoryId, originalIntent); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4212,7 +4201,7 @@ public class DevicePolicyManager { try { mService.setBluetoothContactSharingDisabled(admin, disabled); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4234,7 +4223,7 @@ public class DevicePolicyManager { try { return mService.getBluetoothContactSharingDisabled(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return true; @@ -4254,7 +4243,7 @@ public class DevicePolicyManager { return mService.getBluetoothContactSharingDisabledForUser(userHandle .getIdentifier()); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return true; @@ -4276,7 +4265,7 @@ public class DevicePolicyManager { try { mService.addCrossProfileIntentFilter(admin, filter, flags); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4292,7 +4281,7 @@ public class DevicePolicyManager { try { mService.clearCrossProfileIntentFilters(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4324,7 +4313,7 @@ public class DevicePolicyManager { try { return mService.setPermittedAccessibilityServices(admin, packageNames); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4344,7 +4333,7 @@ public class DevicePolicyManager { try { return mService.getPermittedAccessibilityServices(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -4367,7 +4356,7 @@ public class DevicePolicyManager { return mService.isAccessibilityServicePermittedByAdmin(admin, packageName, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4391,7 +4380,7 @@ public class DevicePolicyManager { try { return mService.getPermittedAccessibilityServicesForUser(userId); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -4425,7 +4414,7 @@ public class DevicePolicyManager { try { return mService.setPermittedInputMethods(admin, packageNames); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4446,7 +4435,7 @@ public class DevicePolicyManager { try { return mService.getPermittedInputMethods(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -4468,7 +4457,7 @@ public class DevicePolicyManager { try { return mService.isInputMethodPermittedByAdmin(admin, packageName, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4491,7 +4480,7 @@ public class DevicePolicyManager { try { return mService.getPermittedInputMethodsForCurrentUser(); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -4511,7 +4500,7 @@ public class DevicePolicyManager { try { return mService.getKeepUninstalledPackages(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -4534,7 +4523,7 @@ public class DevicePolicyManager { try { mService.setKeepUninstalledPackages(admin, packageNames); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4639,9 +4628,8 @@ public class DevicePolicyManager { try { return mService.createAndManageUser(admin, name, profileOwner, adminExtras, flags); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } - return null; } /** @@ -4656,8 +4644,7 @@ public class DevicePolicyManager { try { return mService.removeUser(admin, userHandle); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -4674,8 +4661,7 @@ public class DevicePolicyManager { try { return mService.switchUser(admin, userHandle); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -4701,7 +4687,7 @@ public class DevicePolicyManager { try { return mService.getApplicationRestrictions(admin, packageName); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -4723,7 +4709,7 @@ public class DevicePolicyManager { try { mService.setUserRestriction(admin, key, true); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4744,7 +4730,7 @@ public class DevicePolicyManager { try { mService.setUserRestriction(admin, key, false); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4771,7 +4757,7 @@ public class DevicePolicyManager { try { ret = mService.getUserRestrictions(admin, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return ret == null ? new Bundle() : ret; @@ -4793,7 +4779,7 @@ public class DevicePolicyManager { try { return mService.setApplicationHidden(admin, packageName, hidden); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4811,7 +4797,7 @@ public class DevicePolicyManager { try { return mService.isApplicationHidden(admin, packageName); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -4829,7 +4815,7 @@ public class DevicePolicyManager { try { mService.enableSystemApp(admin, packageName); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4848,7 +4834,7 @@ public class DevicePolicyManager { try { return mService.enableSystemAppWithIntent(admin, intent); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return 0; @@ -4879,7 +4865,7 @@ public class DevicePolicyManager { try { mService.setAccountManagementDisabled(admin, accountType, disabled); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4907,7 +4893,7 @@ public class DevicePolicyManager { try { return mService.getAccountTypesWithManagementDisabledAsUser(userId); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } @@ -4938,7 +4924,7 @@ public class DevicePolicyManager { try { mService.setLockTaskPackages(admin, packages); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -4954,7 +4940,7 @@ public class DevicePolicyManager { try { return mService.getLockTaskPackages(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -4970,7 +4956,7 @@ public class DevicePolicyManager { try { return mService.isLockTaskPermitted(pkg); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return false; @@ -5017,7 +5003,7 @@ public class DevicePolicyManager { try { mService.setGlobalSetting(admin, setting, value); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -5045,7 +5031,7 @@ public class DevicePolicyManager { try { mService.setSecureSetting(admin, setting, value); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -5066,7 +5052,7 @@ public class DevicePolicyManager { try { mService.setRestrictionsProvider(admin, provider); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } @@ -5082,7 +5068,7 @@ public class DevicePolicyManager { try { mService.setMasterVolumeMuted(admin, on); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } @@ -5098,7 +5084,7 @@ public class DevicePolicyManager { try { return mService.isMasterVolumeMuted(admin); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return false; @@ -5118,7 +5104,7 @@ public class DevicePolicyManager { try { mService.setUninstallBlocked(admin, packageName, uninstallBlocked); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } @@ -5142,7 +5128,7 @@ public class DevicePolicyManager { try { return mService.isUninstallBlocked(admin, packageName); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return false; @@ -5170,7 +5156,7 @@ public class DevicePolicyManager { try { return mService.addCrossProfileWidgetProvider(admin, packageName); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return false; @@ -5198,7 +5184,7 @@ public class DevicePolicyManager { try { return mService.removeCrossProfileWidgetProvider(admin, packageName); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return false; @@ -5222,7 +5208,7 @@ public class DevicePolicyManager { return providers; } } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return Collections.emptyList(); @@ -5238,7 +5224,7 @@ public class DevicePolicyManager { try { mService.setUserIcon(admin, icon); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } @@ -5258,7 +5244,7 @@ public class DevicePolicyManager { try { mService.setSystemUpdatePolicy(admin, policy); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } @@ -5273,7 +5259,7 @@ public class DevicePolicyManager { try { return mService.getSystemUpdatePolicy(); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } return null; @@ -5297,8 +5283,7 @@ public class DevicePolicyManager { try { return mService.setKeyguardDisabled(admin, disabled); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -5317,8 +5302,7 @@ public class DevicePolicyManager { try { return mService.setStatusBarDisabled(admin, disabled); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -5337,7 +5321,7 @@ public class DevicePolicyManager { try { mService.notifyPendingSystemUpdate(updateReceivedTime); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } @@ -5363,7 +5347,7 @@ public class DevicePolicyManager { try { mService.setPermissionPolicy(admin, policy); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } @@ -5377,7 +5361,7 @@ public class DevicePolicyManager { try { return mService.getPermissionPolicy(admin); } catch (RemoteException re) { - return PERMISSION_POLICY_PROMPT; + throw re.rethrowFromSystemServer(); } } @@ -5414,8 +5398,7 @@ public class DevicePolicyManager { try { return mService.setPermissionGrantState(admin, packageName, permission, grantState); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -5441,8 +5424,7 @@ public class DevicePolicyManager { try { return mService.getPermissionGrantState(admin, packageName, permission); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return PERMISSION_GRANT_STATE_DEFAULT; + throw re.rethrowFromSystemServer(); } } @@ -5460,8 +5442,7 @@ public class DevicePolicyManager { try { return mService.isProvisioningAllowed(action); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -5477,8 +5458,7 @@ public class DevicePolicyManager { try { return mService.isManagedProfile(admin); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -5493,8 +5473,7 @@ public class DevicePolicyManager { try { return mService.isSystemOnlyUser(admin); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -5510,8 +5489,7 @@ public class DevicePolicyManager { try { return mService.getWifiMacAddress(); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return null; + throw re.rethrowFromSystemServer(); } } @@ -5522,7 +5500,7 @@ public class DevicePolicyManager { try { mService.reboot(admin); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } @@ -5552,7 +5530,7 @@ public class DevicePolicyManager { try { mService.setShortSupportMessage(admin, message); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -5569,7 +5547,7 @@ public class DevicePolicyManager { try { return mService.getShortSupportMessage(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -5595,7 +5573,7 @@ public class DevicePolicyManager { try { mService.setLongSupportMessage(admin, message); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -5612,7 +5590,7 @@ public class DevicePolicyManager { try { return mService.getLongSupportMessage(admin); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -5632,7 +5610,7 @@ public class DevicePolicyManager { try { return mService.getShortSupportMessageForUser(admin, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -5653,7 +5631,7 @@ public class DevicePolicyManager { try { return mService.getLongSupportMessageForUser(admin, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return null; @@ -5674,8 +5652,7 @@ public class DevicePolicyManager { } return new DevicePolicyManager(mContext, true); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); - return null; + throw e.rethrowFromSystemServer(); } } @@ -5686,6 +5663,9 @@ public class DevicePolicyManager { * <p> Device logs contain various information intended for security auditing purposes. * See {@link SecurityEvent} for details. * + * <p>There must be only one user on the device, managed by the device owner. + * Otherwise a {@link SecurityException} will be thrown. + * * @param admin Which device owner this request is associated with. * @param enabled whether device logging should be enabled or not. * @see #retrieveDeviceLogs @@ -5694,13 +5674,16 @@ public class DevicePolicyManager { try { mService.setDeviceLoggingEnabled(admin, enabled); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } /** * Return whether device logging is enabled or not by the device owner. * + * <p>Can only be called by the device owner, otherwise a {@link SecurityException} will be + * thrown. + * * @param admin Which device owner this request is associated with. * @return {@code true} if device logging is enabled by device owner, {@code false} otherwise. */ @@ -5708,8 +5691,7 @@ public class DevicePolicyManager { try { return mService.getDeviceLoggingEnabled(admin); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -5720,6 +5702,9 @@ public class DevicePolicyManager { * <p> Access to the logs is rate limited and it will only return new logs after the device * owner has been notified via {@link DeviceAdminReceiver#onSecurityLogsAvailable}. * + * <p>There must be only one user on the device, managed by the device owner. + * Otherwise a {@link SecurityException} will be thrown. + * * @param admin Which device owner this request is associated with. * @return the new batch of device logs which is a list of {@link SecurityEvent}, * or {@code null} if rate limitation is exceeded or if logging is currently disabled. @@ -5734,8 +5719,7 @@ public class DevicePolicyManager { return null; } } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return null; + throw re.rethrowFromSystemServer(); } } @@ -5764,6 +5748,9 @@ public class DevicePolicyManager { * result, this API is provided as best-effort and the returned logs may contain corrupted data. * </strong> * + * <p>There must be only one user on the device, managed by the device owner. + * Otherwise a {@link SecurityException} will be thrown. + * * @param admin Which device owner this request is associated with. * @return Device logs from before the latest reboot of the system. */ @@ -5772,8 +5759,7 @@ public class DevicePolicyManager { ParceledListSlice<SecurityEvent> list = mService.retrievePreviousDeviceLogs(admin); return list.getList(); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return Collections.<SecurityEvent>emptyList(); + throw re.rethrowFromSystemServer(); } } @@ -5792,7 +5778,7 @@ public class DevicePolicyManager { try { mService.setOrganizationColor(admin, color); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } @@ -5811,7 +5797,7 @@ public class DevicePolicyManager { try { mService.setOrganizationColorForUser(color, userId); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } @@ -5826,8 +5812,7 @@ public class DevicePolicyManager { try { return mService.getOrganizationColor(admin); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return 0; + throw re.rethrowFromSystemServer(); } } @@ -5842,8 +5827,7 @@ public class DevicePolicyManager { try { return mService.getOrganizationColorForUser(userHandle); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return 0; + throw re.rethrowFromSystemServer(); } } @@ -5862,7 +5846,7 @@ public class DevicePolicyManager { try { mService.setOrganizationName(admin, title); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE); + throw re.rethrowFromSystemServer(); } } @@ -5877,8 +5861,7 @@ public class DevicePolicyManager { try { return mService.getOrganizationName(admin); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE); - return null; + throw re.rethrowFromSystemServer(); } } @@ -5894,8 +5877,7 @@ public class DevicePolicyManager { try { return mService.getOrganizationNameForUser(userHandle); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE); - return null; + throw re.rethrowFromSystemServer(); } } @@ -5911,7 +5893,7 @@ public class DevicePolicyManager { try { return mService.getUserProvisioningState(); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } return STATE_USER_UNMANAGED; @@ -5929,7 +5911,7 @@ public class DevicePolicyManager { try { mService.setUserProvisioningState(state, userHandle); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } } @@ -5956,7 +5938,7 @@ public class DevicePolicyManager { try { mService.setAffiliationIds(admin, new ArrayList<String>(ids)); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + throw e.rethrowFromSystemServer(); } } @@ -5971,8 +5953,7 @@ public class DevicePolicyManager { try { return mService != null && mService.isAffiliatedUser(); } catch (RemoteException e) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); - return false; + throw e.rethrowFromSystemServer(); } } @@ -5987,8 +5968,7 @@ public class DevicePolicyManager { try { return mService.isUninstallInQueue(packageName); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); - return false; + throw re.rethrowFromSystemServer(); } } @@ -6000,7 +5980,7 @@ public class DevicePolicyManager { try { mService.uninstallPackageWithActiveAdmins(packageName); } catch (RemoteException re) { - Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + throw re.rethrowFromSystemServer(); } } } diff --git a/core/java/android/auditing/SecurityLog.java b/core/java/android/auditing/SecurityLog.java index 829685b83b5b..13823a23f43b 100644 --- a/core/java/android/auditing/SecurityLog.java +++ b/core/java/android/auditing/SecurityLog.java @@ -116,7 +116,7 @@ public class SecurityLog { /** * A class representing a security event log entry. */ - public static class SecurityEvent implements Parcelable { + public static final class SecurityEvent implements Parcelable { private Event mEvent; /** @hide */ diff --git a/core/java/android/bluetooth/OobData.java b/core/java/android/bluetooth/OobData.java index 01f72efb22ac..70d47ee20b2e 100644 --- a/core/java/android/bluetooth/OobData.java +++ b/core/java/android/bluetooth/OobData.java @@ -23,6 +23,7 @@ import android.util.Log; /** * Out Of Band Data for Bluetooth device. + * @hide */ public class OobData implements Parcelable { private byte[] securityManagerTk; diff --git a/core/java/android/content/pm/ContainerEncryptionParams.java b/core/java/android/content/pm/ContainerEncryptionParams.java deleted file mode 100644 index ab3aa27cfeb6..000000000000 --- a/core/java/android/content/pm/ContainerEncryptionParams.java +++ /dev/null @@ -1,384 +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.content.pm; - -import android.annotation.SystemApi; -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; -import android.util.Slog; - -import java.security.InvalidAlgorithmParameterException; -import java.security.spec.AlgorithmParameterSpec; -import java.util.Arrays; - -import javax.crypto.SecretKey; -import javax.crypto.spec.IvParameterSpec; - -/** - * Represents encryption parameters used to read a container. - * - * @deprecated encrypted containers are legacy. - * @hide - */ -@SystemApi -@Deprecated -public class ContainerEncryptionParams implements Parcelable { - protected static final String TAG = "ContainerEncryptionParams"; - - /** What we print out first when toString() is called. */ - private static final String TO_STRING_PREFIX = "ContainerEncryptionParams{"; - - /** - * Parameter type for parceling that indicates the next parameters are - * IvParameters. - */ - private static final int ENC_PARAMS_IV_PARAMETERS = 1; - - /** Parameter type for paceling that indicates there are no MAC parameters. */ - private static final int MAC_PARAMS_NONE = 1; - - /** The encryption algorithm used. */ - private final String mEncryptionAlgorithm; - - /** The parameter spec to be used for encryption. */ - private final IvParameterSpec mEncryptionSpec; - - /** Secret key to be used for decryption. */ - private final SecretKey mEncryptionKey; - - /** Algorithm name for the MAC to be used. */ - private final String mMacAlgorithm; - - /** The parameter spec to be used for the MAC tag authentication. */ - private final AlgorithmParameterSpec mMacSpec; - - /** Secret key to be used for MAC tag authentication. */ - private final SecretKey mMacKey; - - /** MAC tag authenticating the data in the container. */ - private final byte[] mMacTag; - - /** Offset into file where authenticated (e.g., MAC protected) data begins. */ - private final long mAuthenticatedDataStart; - - /** Offset into file where encrypted data begins. */ - private final long mEncryptedDataStart; - - /** - * Offset into file for the end of encrypted data (and, by extension, - * authenticated data) in file. - */ - private final long mDataEnd; - - public ContainerEncryptionParams(String encryptionAlgorithm, - AlgorithmParameterSpec encryptionSpec, SecretKey encryptionKey) - throws InvalidAlgorithmParameterException { - this(encryptionAlgorithm, encryptionSpec, encryptionKey, null, null, null, null, -1, -1, - -1); - } - - /** - * Creates container encryption specifications for installing from encrypted - * containers. - * - * @param encryptionAlgorithm encryption algorithm to use; format matches - * JCE - * @param encryptionSpec algorithm parameter specification - * @param encryptionKey key used for decryption - * @param macAlgorithm MAC algorithm to use; format matches JCE - * @param macSpec algorithm parameters specification, may be {@code null} - * @param macKey key used for authentication (i.e., for the MAC tag) - * @param macTag message authentication code (MAC) tag for the authenticated - * data - * @param authenticatedDataStart offset of start of authenticated data in - * stream - * @param encryptedDataStart offset of start of encrypted data in stream - * @param dataEnd offset of the end of both the authenticated and encrypted - * data - * @throws InvalidAlgorithmParameterException - */ - public ContainerEncryptionParams(String encryptionAlgorithm, - AlgorithmParameterSpec encryptionSpec, SecretKey encryptionKey, String macAlgorithm, - AlgorithmParameterSpec macSpec, SecretKey macKey, byte[] macTag, - long authenticatedDataStart, long encryptedDataStart, long dataEnd) - throws InvalidAlgorithmParameterException { - if (TextUtils.isEmpty(encryptionAlgorithm)) { - throw new NullPointerException("algorithm == null"); - } else if (encryptionSpec == null) { - throw new NullPointerException("encryptionSpec == null"); - } else if (encryptionKey == null) { - throw new NullPointerException("encryptionKey == null"); - } - - if (!TextUtils.isEmpty(macAlgorithm)) { - if (macKey == null) { - throw new NullPointerException("macKey == null"); - } - } - - if (!(encryptionSpec instanceof IvParameterSpec)) { - throw new InvalidAlgorithmParameterException( - "Unknown parameter spec class; must be IvParameters"); - } - - mEncryptionAlgorithm = encryptionAlgorithm; - mEncryptionSpec = (IvParameterSpec) encryptionSpec; - mEncryptionKey = encryptionKey; - - mMacAlgorithm = macAlgorithm; - mMacSpec = macSpec; - mMacKey = macKey; - mMacTag = macTag; - - mAuthenticatedDataStart = authenticatedDataStart; - mEncryptedDataStart = encryptedDataStart; - mDataEnd = dataEnd; - } - - public String getEncryptionAlgorithm() { - return mEncryptionAlgorithm; - } - - public AlgorithmParameterSpec getEncryptionSpec() { - return mEncryptionSpec; - } - - public SecretKey getEncryptionKey() { - return mEncryptionKey; - } - - public String getMacAlgorithm() { - return mMacAlgorithm; - } - - public AlgorithmParameterSpec getMacSpec() { - return mMacSpec; - } - - public SecretKey getMacKey() { - return mMacKey; - } - - public byte[] getMacTag() { - return mMacTag; - } - - public long getAuthenticatedDataStart() { - return mAuthenticatedDataStart; - } - - public long getEncryptedDataStart() { - return mEncryptedDataStart; - } - - public long getDataEnd() { - return mDataEnd; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (!(o instanceof ContainerEncryptionParams)) { - return false; - } - - final ContainerEncryptionParams other = (ContainerEncryptionParams) o; - - // Primitive comparison - if ((mAuthenticatedDataStart != other.mAuthenticatedDataStart) - || (mEncryptedDataStart != other.mEncryptedDataStart) - || (mDataEnd != other.mDataEnd)) { - return false; - } - - // String comparison - if (!mEncryptionAlgorithm.equals(other.mEncryptionAlgorithm) - || !mMacAlgorithm.equals(other.mMacAlgorithm)) { - return false; - } - - // Object comparison - if (!isSecretKeyEqual(mEncryptionKey, other.mEncryptionKey) - || !isSecretKeyEqual(mMacKey, other.mMacKey)) { - return false; - } - - if (!Arrays.equals(mEncryptionSpec.getIV(), other.mEncryptionSpec.getIV()) - || !Arrays.equals(mMacTag, other.mMacTag) || (mMacSpec != other.mMacSpec)) { - return false; - } - - return true; - } - - private static final boolean isSecretKeyEqual(SecretKey key1, SecretKey key2) { - final String keyFormat = key1.getFormat(); - final String otherKeyFormat = key2.getFormat(); - - if (keyFormat == null) { - if (keyFormat != otherKeyFormat) { - return false; - } - - if (key1.getEncoded() != key2.getEncoded()) { - return false; - } - } else { - if (!keyFormat.equals(key2.getFormat())) { - return false; - } - - if (!Arrays.equals(key1.getEncoded(), key2.getEncoded())) { - return false; - } - } - - return true; - } - - @Override - public int hashCode() { - int hash = 3; - - hash += 5 * mEncryptionAlgorithm.hashCode(); - hash += 7 * Arrays.hashCode(mEncryptionSpec.getIV()); - hash += 11 * mEncryptionKey.hashCode(); - hash += 13 * mMacAlgorithm.hashCode(); - hash += 17 * mMacKey.hashCode(); - hash += 19 * Arrays.hashCode(mMacTag); - hash += 23 * mAuthenticatedDataStart; - hash += 29 * mEncryptedDataStart; - hash += 31 * mDataEnd; - - return hash; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(TO_STRING_PREFIX); - - sb.append("mEncryptionAlgorithm=\""); - sb.append(mEncryptionAlgorithm); - sb.append("\","); - sb.append("mEncryptionSpec="); - sb.append(mEncryptionSpec.toString()); - sb.append("mEncryptionKey="); - sb.append(mEncryptionKey.toString()); - - sb.append("mMacAlgorithm=\""); - sb.append(mMacAlgorithm); - sb.append("\","); - sb.append("mMacSpec="); - sb.append(mMacSpec.toString()); - sb.append("mMacKey="); - sb.append(mMacKey.toString()); - - sb.append(",mAuthenticatedDataStart="); - sb.append(mAuthenticatedDataStart); - sb.append(",mEncryptedDataStart="); - sb.append(mEncryptedDataStart); - sb.append(",mDataEnd="); - sb.append(mDataEnd); - sb.append('}'); - - return sb.toString(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mEncryptionAlgorithm); - dest.writeInt(ENC_PARAMS_IV_PARAMETERS); - dest.writeByteArray(mEncryptionSpec.getIV()); - dest.writeSerializable(mEncryptionKey); - - dest.writeString(mMacAlgorithm); - dest.writeInt(MAC_PARAMS_NONE); - dest.writeByteArray(new byte[0]); - dest.writeSerializable(mMacKey); - - dest.writeByteArray(mMacTag); - - dest.writeLong(mAuthenticatedDataStart); - dest.writeLong(mEncryptedDataStart); - dest.writeLong(mDataEnd); - } - - private ContainerEncryptionParams(Parcel source) throws InvalidAlgorithmParameterException { - mEncryptionAlgorithm = source.readString(); - final int encParamType = source.readInt(); - final byte[] encParamsEncoded = source.createByteArray(); - mEncryptionKey = (SecretKey) source.readSerializable(); - - mMacAlgorithm = source.readString(); - final int macParamType = source.readInt(); - source.createByteArray(); // byte[] macParamsEncoded - mMacKey = (SecretKey) source.readSerializable(); - - mMacTag = source.createByteArray(); - - mAuthenticatedDataStart = source.readLong(); - mEncryptedDataStart = source.readLong(); - mDataEnd = source.readLong(); - - switch (encParamType) { - case ENC_PARAMS_IV_PARAMETERS: - mEncryptionSpec = new IvParameterSpec(encParamsEncoded); - break; - default: - throw new InvalidAlgorithmParameterException("Unknown parameter type " - + encParamType); - } - - switch (macParamType) { - case MAC_PARAMS_NONE: - mMacSpec = null; - break; - default: - throw new InvalidAlgorithmParameterException("Unknown parameter type " - + macParamType); - } - - if (mEncryptionKey == null) { - throw new NullPointerException("encryptionKey == null"); - } - } - - public static final Parcelable.Creator<ContainerEncryptionParams> CREATOR = - new Parcelable.Creator<ContainerEncryptionParams>() { - public ContainerEncryptionParams createFromParcel(Parcel source) { - try { - return new ContainerEncryptionParams(source); - } catch (InvalidAlgorithmParameterException e) { - Slog.e(TAG, "Invalid algorithm parameters specified", e); - return null; - } - } - - public ContainerEncryptionParams[] newArray(int size) { - return new ContainerEncryptionParams[size]; - } - }; -}
\ No newline at end of file diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index d6b674c0edee..9959f2749609 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -46,7 +46,6 @@ import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; -import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.graphics.Bitmap; import android.net.Uri; @@ -214,19 +213,11 @@ interface IPackageManager { List<InstrumentationInfo> queryInstrumentation( String targetPackage, int flags); - void installPackage(in String originPath, - in IPackageInstallObserver2 observer, - int flags, - in String installerPackageName, - in VerificationParams verificationParams, - in String packageAbiOverride); - + /** @deprecated Use PackageInstaller instead */ void installPackageAsUser(in String originPath, in IPackageInstallObserver2 observer, int flags, in String installerPackageName, - in VerificationParams verificationParams, - in String packageAbiOverride, int userId); void finishPackageInstall(int token); diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 4df83036daaf..edd888b33b1e 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -16,12 +16,16 @@ package android.content.pm; +import android.annotation.NonNull; +import android.annotation.SystemApi; import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcel; import android.os.UserHandle; +import android.text.BidiFormatter; +import android.text.TextPaint; import android.text.TextUtils; import android.util.Printer; @@ -38,6 +42,8 @@ import java.util.Comparator; * in the implementation of Parcelable in subclasses. */ public class PackageItemInfo { + private static final float MAX_LABEL_SIZE_PX = 500f; + /** * Public name of this item. From the "android:name" attribute. */ @@ -140,6 +146,56 @@ public class PackageItemInfo { } /** + * Same as {@link #loadLabel(PackageManager)} with the addition that + * the returned label is safe for being presented in the UI since it + * will not contain new lines and the length will be limited to a + * reasonable amount. This prevents a malicious party to influence UI + * layout via the app label misleading the user into performing a + * detrimental for them action. If the label is too long it will be + * truncated and ellipsized at the end. + * + * @param pm A PackageManager from which the label can be loaded; usually + * the PackageManager from which you originally retrieved this item + * @return Returns a CharSequence containing the item's label. If the + * item does not have a label, its name is returned. + * + * @hide + */ + @SystemApi + public @NonNull CharSequence loadSafeLabel(@NonNull PackageManager pm) { + // loadLabel() always returns non-null + CharSequence label = loadLabel(pm); + + // If the label contains new line characters it may push the UI + // down to hide a part of it. Labels shouldn't have new line + // characters, so just truncate at the first time one is seen. + String labelStr = label.toString(); + final int labelLength = labelStr.length(); + int offset = 0; + while (offset < labelLength) { + final int codePoint = labelStr.codePointAt(offset); + final int type = Character.getType(codePoint); + if (type == Character.LINE_SEPARATOR + || type == Character.CONTROL + || type == Character.PARAGRAPH_SEPARATOR) { + labelStr = labelStr.substring(0, offset); + break; + } + offset += Character.charCount(codePoint); + } + + if (labelStr.isEmpty()) { + return labelStr; + } + + TextPaint paint = new TextPaint(); + paint.setTextSize(42); + + return TextUtils.ellipsize(labelStr, paint, MAX_LABEL_SIZE_PX, + TextUtils.TruncateAt.END); + } + + /** * Retrieve the current graphical icon associated with this item. This * will call back on the given PackageManager to load the icon from * the application. diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 4dd8155f1b10..c2d1bdda3d1f 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4598,60 +4598,20 @@ public abstract class PackageManager { */ @Deprecated public abstract void installPackage( - Uri packageURI, IPackageInstallObserver observer, @InstallFlags int flags, + Uri packageURI, + IPackageInstallObserver observer, + @InstallFlags int flags, String installerPackageName); - /** * @deprecated replaced by {@link PackageInstaller} * @hide */ @Deprecated - public abstract void installPackageWithVerification(Uri packageURI, - IPackageInstallObserver observer, @InstallFlags int flags, String installerPackageName, - Uri verificationURI, ContainerEncryptionParams encryptionParams); - - /** - * @deprecated replaced by {@link PackageInstaller} - * @hide - */ - @Deprecated - public abstract void installPackageWithVerificationAndEncryption(Uri packageURI, - IPackageInstallObserver observer, @InstallFlags int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams); - - /** - * @deprecated replaced by {@link PackageInstaller} - * @hide - */ - @Deprecated - public abstract void installPackage(Uri packageURI, PackageInstallObserver observer, - @InstallFlags int flags, String installerPackageName); - - /** - * @deprecated replaced by {@link PackageInstaller} - * @hide - */ - @Deprecated - public abstract void installPackageAsUser(Uri packageURI, PackageInstallObserver observer, - @InstallFlags int flags, String installerPackageName, @UserIdInt int userId); - - /** - * @deprecated replaced by {@link PackageInstaller} - * @hide - */ - @Deprecated - public abstract void installPackageWithVerification(Uri packageURI, - PackageInstallObserver observer, @InstallFlags int flags, String installerPackageName, - Uri verificationURI, ContainerEncryptionParams encryptionParams); - - /** - * @deprecated replaced by {@link PackageInstaller} - * @hide - */ - @Deprecated - public abstract void installPackageWithVerificationAndEncryption(Uri packageURI, - PackageInstallObserver observer, @InstallFlags int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams); + public abstract void installPackage( + Uri packageURI, + PackageInstallObserver observer, + @InstallFlags int flags, + String installerPackageName); /** * If there is already an application with the given package name installed diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index a9150e88701f..a54f40fc0814 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -68,6 +68,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; import java.util.Locale; /** @@ -119,6 +120,9 @@ public class Resources { private static final LongSparseArray<android.content.res.ConstantState<ComplexColor>> sPreloadedComplexColors = new LongSparseArray<>(); + /** Size of the cyclical cache used to map XML files to blocks. */ + private static final int XML_BLOCK_CACHE_SIZE = 4; + // Pool of TypedArrays targeted to this Resources object. final SynchronizedPool<TypedArray> mTypedArrayPool = new SynchronizedPool<>(5); @@ -154,8 +158,9 @@ public class Resources { // Cyclical cache used for recently-accessed XML files. private int mLastCachedXmlBlockIndex = -1; - private final String[] mCachedXmlBlockFiles = new String[4]; - private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[4]; + private final int[] mCachedXmlBlockCookies = new int[XML_BLOCK_CACHE_SIZE]; + private final String[] mCachedXmlBlockFiles = new String[XML_BLOCK_CACHE_SIZE]; + private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[XML_BLOCK_CACHE_SIZE]; final AssetManager mAssets; final ClassLoader mClassLoader; @@ -2339,18 +2344,18 @@ public class Resources { * tools. */ public final void flushLayoutCache() { - final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles; - final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks; - synchronized (cachedXmlBlockFiles) { - final int num = cachedXmlBlockFiles.length; - for (int i = 0; i < num; i++) { + synchronized (mCachedXmlBlocks) { + Arrays.fill(mCachedXmlBlockCookies, 0); + Arrays.fill(mCachedXmlBlockFiles, null); + + final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks; + for (int i = 0; i < XML_BLOCK_CACHE_SIZE; i++) { final XmlBlock oldBlock = cachedXmlBlocks[i]; if (oldBlock != null) { oldBlock.close(); } - cachedXmlBlockFiles[i] = null; - cachedXmlBlocks[i] = null; } + Arrays.fill(cachedXmlBlocks, null); } } @@ -2852,13 +2857,14 @@ public class Resources { int assetCookie, @NonNull String type) throws NotFoundException { if (id != 0) { try { - final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles; - final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks; - synchronized (cachedXmlBlockFiles) { + synchronized (mCachedXmlBlocks) { + final int[] cachedXmlBlockCookies = mCachedXmlBlockCookies; + final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles; + final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks; // First see if this block is in our cache. final int num = cachedXmlBlockFiles.length; for (int i = 0; i < num; i++) { - if (cachedXmlBlockFiles[i] != null + if (cachedXmlBlockCookies[i] == assetCookie && cachedXmlBlockFiles[i] != null && cachedXmlBlockFiles[i].equals(file)) { return cachedXmlBlocks[i].newParser(); } @@ -2874,6 +2880,7 @@ public class Resources { if (oldBlock != null) { oldBlock.close(); } + cachedXmlBlockCookies[pos] = assetCookie; cachedXmlBlockFiles[pos] = file; cachedXmlBlocks[pos] = block; return block.newParser(); diff --git a/core/java/android/hardware/ConsumerIrManager.java b/core/java/android/hardware/ConsumerIrManager.java index 6d29212f6ef0..9fa1c3f73823 100644 --- a/core/java/android/hardware/ConsumerIrManager.java +++ b/core/java/android/hardware/ConsumerIrManager.java @@ -60,8 +60,8 @@ public final class ConsumerIrManager { try { return mService.hasIrEmitter(); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - return false; } /** @@ -84,7 +84,7 @@ public final class ConsumerIrManager { try { mService.transmit(mPackageName, carrierFrequency, pattern); } catch (RemoteException e) { - Log.w(TAG, "failed to transmit.", e); + throw e.rethrowFromSystemServer(); } } @@ -149,8 +149,7 @@ public final class ConsumerIrManager { } return range; } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - return null; } - } diff --git a/core/java/android/hardware/SensorEventListener.java b/core/java/android/hardware/SensorEventListener.java index 0d859fb97634..0c059ba6bbc1 100644 --- a/core/java/android/hardware/SensorEventListener.java +++ b/core/java/android/hardware/SensorEventListener.java @@ -18,28 +18,33 @@ package android.hardware; /** * Used for receiving notifications from the SensorManager when - * sensor values have changed. + * there is new sensor data. */ public interface SensorEventListener { /** - * Called when sensor values have changed. + * Called when there is a new sensor event. Note that "on changed" + * is somewhat of a misnomer, as this will also be called if we have a + * new reading from a sensor with the exact same sensor values (but a + * newer timestamp). + * * <p>See {@link android.hardware.SensorManager SensorManager} * for details on possible sensor types. * <p>See also {@link android.hardware.SensorEvent SensorEvent}. - * + * * <p><b>NOTE:</b> The application doesn't own the * {@link android.hardware.SensorEvent event} * object passed as a parameter and therefore cannot hold on to it. * The object may be part of an internal pool and may be reused by * the framework. * - * @param event the {@link android.hardware.SensorEvent SensorEvent}. + * @param event the {@link android.hardware.SensorEvent SensorEvent}. */ public void onSensorChanged(SensorEvent event); /** - * Called when the accuracy of the registered sensor has changed. + * Called when the accuracy of the registered sensor has changed. Unlike + * onSensorChanged(), this is only called when this accuracy value changes. * * <p>See the SENSOR_STATUS_* constants in * {@link android.hardware.SensorManager SensorManager} for details. diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index f0b17c30d914..5684aa5cb6fc 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -46,7 +46,7 @@ import java.util.List; * is an example of a trigger sensor. * </p> * <pre class="prettyprint"> - * public class SensorActivity extends Activity, implements SensorEventListener { + * public class SensorActivity extends Activity implements SensorEventListener { * private final SensorManager mSensorManager; * private final Sensor mAccelerometer; * diff --git a/core/java/android/hardware/SerialManager.java b/core/java/android/hardware/SerialManager.java index e0680bf2293c..83f7649ff326 100644 --- a/core/java/android/hardware/SerialManager.java +++ b/core/java/android/hardware/SerialManager.java @@ -14,13 +14,11 @@ * limitations under the License. */ - package android.hardware; import android.content.Context; import android.os.ParcelFileDescriptor; import android.os.RemoteException; -import android.util.Log; import java.io.IOException; @@ -50,8 +48,7 @@ public class SerialManager { try { return mService.getSerialPorts(); } catch (RemoteException e) { - Log.e(TAG, "RemoteException in getSerialPorts", e); - return null; + throw e.rethrowFromSystemServer(); } } @@ -77,8 +74,7 @@ public class SerialManager { throw new IOException("Could not open serial port " + name); } } catch (RemoteException e) { - Log.e(TAG, "exception in UsbManager.openDevice", e); + throw e.rethrowFromSystemServer(); } - return null; } } diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index abd02f0ecc9b..b8088f32ecaf 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -540,7 +540,7 @@ public class FingerprintManager { if (mService != null) try { result = mService.preEnroll(mToken); } catch (RemoteException e) { - Log.w(TAG, "Remote exception in enroll: ", e); + throw e.rethrowFromSystemServer(); } return result; } @@ -555,7 +555,7 @@ public class FingerprintManager { if (mService != null) try { result = mService.postEnroll(mToken); } catch (RemoteException e) { - Log.w(TAG, "Remote exception in post enroll: ", e); + throw e.rethrowFromSystemServer(); } return result; } @@ -571,7 +571,7 @@ public class FingerprintManager { if (mService != null) try { mService.setActiveUser(userId); } catch (RemoteException e) { - Log.w(TAG, "Remote exception in setActiveUser: ", e); + throw e.rethrowFromSystemServer(); } } @@ -614,7 +614,7 @@ public class FingerprintManager { try { mService.rename(fpId, userId, newName); } catch (RemoteException e) { - Log.v(TAG, "Remote exception in rename(): ", e); + throw e.rethrowFromSystemServer(); } } else { Log.w(TAG, "rename(): Service not connected!"); @@ -632,7 +632,7 @@ public class FingerprintManager { if (mService != null) try { return mService.getEnrolledFingerprints(userId, mContext.getOpPackageName()); } catch (RemoteException e) { - Log.v(TAG, "Remote exception in getEnrolledFingerprints: ", e); + throw e.rethrowFromSystemServer(); } return null; } @@ -659,7 +659,7 @@ public class FingerprintManager { return mService.hasEnrolledFingerprints( UserHandle.myUserId(), mContext.getOpPackageName()); } catch (RemoteException e) { - Log.v(TAG, "Remote exception in getEnrolledFingerprints: ", e); + throw e.rethrowFromSystemServer(); } return false; } @@ -674,7 +674,7 @@ public class FingerprintManager { if (mService != null) try { return mService.hasEnrolledFingerprints(userId, mContext.getOpPackageName()); } catch (RemoteException e) { - Log.v(TAG, "Remote exception in getEnrolledFingerprints: ", e); + throw e.rethrowFromSystemServer(); } return false; } @@ -691,7 +691,7 @@ public class FingerprintManager { long deviceId = 0; /* TODO: plumb hardware id to FPMS */ return mService.isHardwareDetected(deviceId, mContext.getOpPackageName()); } catch (RemoteException e) { - Log.v(TAG, "Remote exception in isFingerprintHardwareDetected(): ", e); + throw e.rethrowFromSystemServer(); } } else { Log.w(TAG, "isFingerprintHardwareDetected(): Service not connected!"); @@ -710,7 +710,7 @@ public class FingerprintManager { try { return mService.getAuthenticatorId(mContext.getOpPackageName()); } catch (RemoteException e) { - Log.v(TAG, "Remote exception in getAuthenticatorId(): ", e); + throw e.rethrowFromSystemServer(); } } else { Log.w(TAG, "getAuthenticatorId(): Service not connected!"); @@ -730,7 +730,7 @@ public class FingerprintManager { try { mService.resetTimeout(token); } catch (RemoteException e) { - Log.v(TAG, "Remote exception in resetTimeout(): ", e); + throw e.rethrowFromSystemServer(); } } else { Log.w(TAG, "resetTimeout(): Service not connected!"); @@ -765,7 +765,7 @@ public class FingerprintManager { } }); } catch (RemoteException e) { - Log.v(TAG, "Remote exception in addLockoutResetCallback(): ", e); + throw e.rethrowFromSystemServer(); } } else { Log.w(TAG, "addLockoutResetCallback(): Service not connected!"); @@ -881,8 +881,7 @@ public class FingerprintManager { try { return ActivityManagerNative.getDefault().getCurrentUser().id; } catch (RemoteException e) { - Log.w(TAG, "Failed to get current user id\n"); - return UserHandle.USER_NULL; + throw e.rethrowFromSystemServer(); } } @@ -890,7 +889,7 @@ public class FingerprintManager { if (mService != null) try { mService.cancelEnrollment(mToken); } catch (RemoteException e) { - if (DEBUG) Log.w(TAG, "Remote exception while canceling enrollment"); + throw e.rethrowFromSystemServer(); } } @@ -898,7 +897,7 @@ public class FingerprintManager { if (mService != null) try { mService.cancelAuthentication(mToken, mContext.getOpPackageName()); } catch (RemoteException e) { - if (DEBUG) Log.w(TAG, "Remote exception while canceling enrollment"); + throw e.rethrowFromSystemServer(); } } diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 6effc0d7b07c..ff87b67b136f 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -267,7 +267,7 @@ public final class HdmiControlManager { try { types = mService.getSupportedTypes(); } catch (RemoteException e) { - // Do nothing. + throw e.rethrowFromSystemServer(); } } mHasTvDevice = hasDeviceType(types, HdmiDeviceInfo.DEVICE_TV); @@ -403,7 +403,7 @@ public final class HdmiControlManager { try { mService.addHotplugEventListener(wrappedListener); } catch (RemoteException e) { - Log.e(TAG, "failed to add hotplug event listener: ", e); + throw e.rethrowFromSystemServer(); } } @@ -425,7 +425,7 @@ public final class HdmiControlManager { try { mService.removeHotplugEventListener(wrappedListener); } catch (RemoteException e) { - Log.e(TAG, "failed to remove hotplug event listener: ", e); + throw e.rethrowFromSystemServer(); } } diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index cbe34121ad4d..fbac58c039c6 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -252,7 +252,7 @@ public final class InputManager { try { inputDevice = mIm.getInputDevice(id); } catch (RemoteException ex) { - throw new RuntimeException("Could not get input device information.", ex); + throw ex.rethrowFromSystemServer(); } if (inputDevice != null) { mInputDevices.setValueAt(index, inputDevice); @@ -284,7 +284,7 @@ public final class InputManager { try { inputDevice = mIm.getInputDevice(id); } catch (RemoteException ex) { - // Ignore the problem for the purposes of this method. + throw ex.rethrowFromSystemServer(); } if (inputDevice == null) { continue; @@ -384,8 +384,7 @@ public final class InputManager { try { return mIm.isInTabletMode(); } catch (RemoteException ex) { - Log.w(TAG, "Could not get tablet mode state", ex); - return SWITCH_STATE_UNKNOWN; + throw ex.rethrowFromSystemServer(); } } @@ -439,7 +438,7 @@ public final class InputManager { try { mIm.registerTabletModeChangedListener(listener); } catch (RemoteException ex) { - throw new RuntimeException("Could not register tablet mode changed listener", ex); + throw ex.rethrowFromSystemServer(); } mTabletModeChangedListener = listener; mOnTabletModeChangedListeners = new ArrayList<>(); @@ -471,8 +470,7 @@ public final class InputManager { try { return mIm.getKeyboardLayouts(); } catch (RemoteException ex) { - Log.w(TAG, "Could not get list of keyboard layout informations.", ex); - return new KeyboardLayout[0]; + throw ex.rethrowFromSystemServer(); } } @@ -494,8 +492,7 @@ public final class InputManager { try { return mIm.getKeyboardLayoutsForInputDevice(identifier); } catch (RemoteException ex) { - Log.w(TAG, "Could not get list of keyboard layouts for input device.", ex); - return new KeyboardLayout[0]; + throw ex.rethrowFromSystemServer(); } } @@ -516,8 +513,7 @@ public final class InputManager { try { return mIm.getKeyboardLayout(keyboardLayoutDescriptor); } catch (RemoteException ex) { - Log.w(TAG, "Could not get keyboard layout information.", ex); - return null; + throw ex.rethrowFromSystemServer(); } } @@ -534,8 +530,7 @@ public final class InputManager { try { return mIm.getCurrentKeyboardLayoutForInputDevice(identifier); } catch (RemoteException ex) { - Log.w(TAG, "Could not get current keyboard layout for input device.", ex); - return null; + throw ex.rethrowFromSystemServer(); } } @@ -565,7 +560,7 @@ public final class InputManager { mIm.setCurrentKeyboardLayoutForInputDevice(identifier, keyboardLayoutDescriptor); } catch (RemoteException ex) { - Log.w(TAG, "Could not set current keyboard layout for input device.", ex); + throw ex.rethrowFromSystemServer(); } } @@ -585,8 +580,7 @@ public final class InputManager { try { return mIm.getEnabledKeyboardLayoutsForInputDevice(identifier); } catch (RemoteException ex) { - Log.w(TAG, "Could not get keyboard layouts for input device.", ex); - return ArrayUtils.emptyArray(String.class); + throw ex.rethrowFromSystemServer(); } } @@ -614,7 +608,7 @@ public final class InputManager { try { mIm.addKeyboardLayoutForInputDevice(identifier, keyboardLayoutDescriptor); } catch (RemoteException ex) { - Log.w(TAG, "Could not add keyboard layout for input device.", ex); + throw ex.rethrowFromSystemServer(); } } @@ -642,7 +636,7 @@ public final class InputManager { try { mIm.removeKeyboardLayoutForInputDevice(identifier, keyboardLayoutDescriptor); } catch (RemoteException ex) { - Log.w(TAG, "Could not remove keyboard layout for input device.", ex); + throw ex.rethrowFromSystemServer(); } } @@ -664,8 +658,7 @@ public final class InputManager { return mIm.getKeyboardLayoutForInputDevice( identifier, inputMethodInfo, inputMethodSubtype); } catch (RemoteException ex) { - Log.w(TAG, "Could not set keyboard layout.", ex); - return null; + throw ex.rethrowFromSystemServer(); } } @@ -687,7 +680,7 @@ public final class InputManager { mIm.setKeyboardLayoutForInputDevice(identifier, inputMethodInfo, inputMethodSubtype, keyboardLayoutDescriptor); } catch (RemoteException ex) { - Log.w(TAG, "Could not set keyboard layout.", ex); + throw ex.rethrowFromSystemServer(); } } @@ -704,8 +697,7 @@ public final class InputManager { try { return mIm.getTouchCalibrationForInputDevice(inputDeviceDescriptor, surfaceRotation); } catch (RemoteException ex) { - Log.w(TAG, "Could not get calibration matrix for input device.", ex); - return TouchCalibration.IDENTITY; + throw ex.rethrowFromSystemServer(); } } @@ -726,7 +718,7 @@ public final class InputManager { try { mIm.setTouchCalibrationForInputDevice(inputDeviceDescriptor, surfaceRotation, calibration); } catch (RemoteException ex) { - Log.w(TAG, "Could not set calibration matrix for input device.", ex); + throw ex.rethrowFromSystemServer(); } } @@ -793,7 +785,7 @@ public final class InputManager { try { mIm.tryPointerSpeed(speed); } catch (RemoteException ex) { - Log.w(TAG, "Could not set temporary pointer speed.", ex); + throw ex.rethrowFromSystemServer(); } } @@ -831,7 +823,7 @@ public final class InputManager { try { mIm.hasKeys(id, InputDevice.SOURCE_ANY, keyCodes, ret); } catch (RemoteException e) { - // no fallback; just return the empty array + throw e.rethrowFromSystemServer(); } return ret; } @@ -871,7 +863,7 @@ public final class InputManager { try { return mIm.injectInputEvent(event, mode); } catch (RemoteException ex) { - return false; + throw ex.rethrowFromSystemServer(); } } @@ -887,7 +879,7 @@ public final class InputManager { try { mIm.setPointerIconShape(iconId); } catch (RemoteException ex) { - // Do nothing. + throw ex.rethrowFromSystemServer(); } } @@ -896,7 +888,7 @@ public final class InputManager { try { mIm.setCustomPointerIcon(icon); } catch (RemoteException ex) { - // Do nothing. + throw ex.rethrowFromSystemServer(); } } @@ -914,7 +906,7 @@ public final class InputManager { try { mIm.setPointerIconDetached(detached); } catch (RemoteException ex) { - // Do nothing. + throw ex.rethrowFromSystemServer(); } } @@ -924,8 +916,7 @@ public final class InputManager { try { mIm.registerInputDevicesChangedListener(listener); } catch (RemoteException ex) { - throw new RuntimeException( - "Could not get register input device changed listener", ex); + throw ex.rethrowFromSystemServer(); } mInputDevicesChangedListener = listener; } @@ -935,7 +926,7 @@ public final class InputManager { try { ids = mIm.getInputDeviceIds(); } catch (RemoteException ex) { - throw new RuntimeException("Could not get input device ids.", ex); + throw ex.rethrowFromSystemServer(); } mInputDevices = new SparseArray<InputDevice>(); @@ -1175,7 +1166,7 @@ public final class InputManager { try { mIm.vibrate(mDeviceId, pattern, repeat, mToken); } catch (RemoteException ex) { - Log.w(TAG, "Failed to vibrate.", ex); + throw ex.rethrowFromSystemServer(); } } @@ -1184,7 +1175,7 @@ public final class InputManager { try { mIm.cancelVibrate(mDeviceId, mToken); } catch (RemoteException ex) { - Log.w(TAG, "Failed to cancel vibration.", ex); + throw ex.rethrowFromSystemServer(); } } } diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 7004e9725bd2..5f1043ba8f1c 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -45,10 +45,12 @@ import android.provider.Settings; import android.telephony.SubscriptionManager; import android.util.ArrayMap; import android.util.Log; +import android.util.SparseArray; import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.PhoneConstants; import com.android.internal.util.Protocol; +import com.android.internal.util.MessageUtils; import libcore.net.event.NetworkEventDispatcher; @@ -79,6 +81,13 @@ import java.util.concurrent.atomic.AtomicInteger; public class ConnectivityManager { private static final String TAG = "ConnectivityManager"; + private static final SparseArray<String> sMagicDecoderRing = MessageUtils.findMessageNames( + new Class[]{ConnectivityManager.class}, new String[]{"CALLBACK_"}); + + private static final String whatToString(int what) { + return sMagicDecoderRing.get(what, Integer.toString(what)); + } + /** * A change in network connectivity has occurred. A default connection has either * been established or lost. The NetworkInfo for the affected network is @@ -733,7 +742,7 @@ public class ConnectivityManager { try { return mService.getActiveNetworkInfo(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -753,7 +762,7 @@ public class ConnectivityManager { try { return mService.getActiveNetwork(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -777,7 +786,7 @@ public class ConnectivityManager { try { return mService.setAlwaysOnVpnPackage(userId, vpnPackage); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -794,7 +803,7 @@ public class ConnectivityManager { try { return mService.getAlwaysOnVpnPackage(userId); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -815,7 +824,7 @@ public class ConnectivityManager { try { return mService.getActiveNetworkInfoForUid(uid); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -839,7 +848,7 @@ public class ConnectivityManager { try { return mService.getNetworkInfo(networkType); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -859,7 +868,7 @@ public class ConnectivityManager { try { return mService.getNetworkInfoForNetwork(network); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -880,7 +889,7 @@ public class ConnectivityManager { try { return mService.getAllNetworkInfo(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -900,7 +909,7 @@ public class ConnectivityManager { try { return mService.getNetworkForType(networkType); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -916,7 +925,7 @@ public class ConnectivityManager { try { return mService.getAllNetworks(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -929,7 +938,7 @@ public class ConnectivityManager { try { return mService.getDefaultNetworkCapabilitiesForUser(userId); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -948,7 +957,7 @@ public class ConnectivityManager { try { return mService.getActiveLinkProperties(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -972,7 +981,7 @@ public class ConnectivityManager { try { return mService.getLinkPropertiesForType(networkType); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -989,7 +998,7 @@ public class ConnectivityManager { try { return mService.getLinkProperties(network); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1006,7 +1015,7 @@ public class ConnectivityManager { try { return mService.getNetworkCapabilities(network); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1024,7 +1033,7 @@ public class ConnectivityManager { try { return mService.getCaptivePortalServerUrl(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1324,7 +1333,9 @@ public class ConnectivityManager { int type = legacyTypeForNetworkCapabilities(netCap); try { delay = mService.getRestoreDefaultNetworkDelay(type); - } catch (RemoteException e) {} + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } LegacyRequest l = new LegacyRequest(); l.networkCapabilities = netCap; l.delay = delay; @@ -1542,7 +1553,7 @@ public class ConnectivityManager { try { return mService.requestRouteToHostAddress(networkType, hostAddress.getAddress()); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1598,7 +1609,7 @@ public class ConnectivityManager { try { return mService.getActiveNetworkQuotaInfo(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1617,7 +1628,9 @@ public class ConnectivityManager { Log.d("ConnectivityManager", "getMobileDataEnabled()- subId=" + subId + " retVal=" + retVal); return retVal; - } catch (RemoteException e) { } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } Log.d("ConnectivityManager", "getMobileDataEnabled()- remote exception retVal=false"); return false; @@ -1678,6 +1691,7 @@ public class ConnectivityManager { getNetworkManagementService().registerNetworkActivityListener(rl); mNetworkActivityListeners.put(l, rl); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -1695,6 +1709,7 @@ public class ConnectivityManager { try { getNetworkManagementService().unregisterNetworkActivityListener(rl); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -1710,8 +1725,8 @@ public class ConnectivityManager { try { return getNetworkManagementService().isNetworkActive(); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - return false; } /** @@ -1785,7 +1800,7 @@ public class ConnectivityManager { try { return mService.getTetherableIfaces(); } catch (RemoteException e) { - return new String[0]; + throw e.rethrowFromSystemServer(); } } @@ -1802,7 +1817,7 @@ public class ConnectivityManager { try { return mService.getTetheredIfaces(); } catch (RemoteException e) { - return new String[0]; + throw e.rethrowFromSystemServer(); } } @@ -1825,7 +1840,7 @@ public class ConnectivityManager { try { return mService.getTetheringErroredIfaces(); } catch (RemoteException e) { - return new String[0]; + throw e.rethrowFromSystemServer(); } } @@ -1839,7 +1854,7 @@ public class ConnectivityManager { try { return mService.getTetheredDhcpRanges(); } catch (RemoteException e) { - return new String[0]; + throw e.rethrowFromSystemServer(); } } @@ -1871,7 +1886,7 @@ public class ConnectivityManager { try { return mService.tether(iface); } catch (RemoteException e) { - return TETHER_ERROR_SERVICE_UNAVAIL; + throw e.rethrowFromSystemServer(); } } @@ -1897,7 +1912,7 @@ public class ConnectivityManager { try { return mService.untether(iface); } catch (RemoteException e) { - return TETHER_ERROR_SERVICE_UNAVAIL; + throw e.rethrowFromSystemServer(); } } @@ -1917,7 +1932,7 @@ public class ConnectivityManager { try { return mService.isTetheringSupported(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -2005,7 +2020,7 @@ public class ConnectivityManager { try { mService.stopTethering(type); } catch (RemoteException e) { - Log.e(TAG, "Exception trying to stop tethering.", e); + throw e.rethrowFromSystemServer(); } } @@ -2025,7 +2040,7 @@ public class ConnectivityManager { try { return mService.getTetherableUsbRegexs(); } catch (RemoteException e) { - return new String[0]; + throw e.rethrowFromSystemServer(); } } @@ -2045,7 +2060,7 @@ public class ConnectivityManager { try { return mService.getTetherableWifiRegexs(); } catch (RemoteException e) { - return new String[0]; + throw e.rethrowFromSystemServer(); } } @@ -2065,7 +2080,7 @@ public class ConnectivityManager { try { return mService.getTetherableBluetoothRegexs(); } catch (RemoteException e) { - return new String[0]; + throw e.rethrowFromSystemServer(); } } @@ -2090,7 +2105,7 @@ public class ConnectivityManager { try { return mService.setUsbTethering(enable); } catch (RemoteException e) { - return TETHER_ERROR_SERVICE_UNAVAIL; + throw e.rethrowFromSystemServer(); } } @@ -2135,7 +2150,7 @@ public class ConnectivityManager { try { return mService.getLastTetherError(iface); } catch (RemoteException e) { - return TETHER_ERROR_SERVICE_UNAVAIL; + throw e.rethrowFromSystemServer(); } } @@ -2153,6 +2168,7 @@ public class ConnectivityManager { try { mService.reportInetCondition(networkType, percentage); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -2174,6 +2190,7 @@ public class ConnectivityManager { mService.reportNetworkConnectivity(network, true); mService.reportNetworkConnectivity(network, false); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -2192,6 +2209,7 @@ public class ConnectivityManager { try { mService.reportNetworkConnectivity(network, hasConnectivity); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -2211,6 +2229,7 @@ public class ConnectivityManager { try { mService.setGlobalProxy(p); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -2225,7 +2244,7 @@ public class ConnectivityManager { try { return mService.getGlobalProxy(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -2247,7 +2266,7 @@ public class ConnectivityManager { try { return mService.getProxyForNetwork(network); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -2282,8 +2301,9 @@ public class ConnectivityManager { public boolean isNetworkSupported(int networkType) { try { return mService.isNetworkSupported(networkType); - } catch (RemoteException e) {} - return false; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -2303,7 +2323,7 @@ public class ConnectivityManager { try { return mService.isActiveNetworkMetered(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -2320,7 +2340,7 @@ public class ConnectivityManager { try { return mService.updateLockdownVpn(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -2339,6 +2359,7 @@ public class ConnectivityManager { try { timeOutMs = mService.checkMobileProvisioning(suggestedTimeOutMs); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } return timeOutMs; } @@ -2351,8 +2372,8 @@ public class ConnectivityManager { try { return mService.getMobileProvisioningUrl(); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - return null; } /** @@ -2369,6 +2390,7 @@ public class ConnectivityManager { try { mService.setProvisioningNotificationVisible(visible, networkType, action); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -2385,6 +2407,7 @@ public class ConnectivityManager { try { mService.setAirplaneMode(enable); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -2392,14 +2415,18 @@ public class ConnectivityManager { public void registerNetworkFactory(Messenger messenger, String name) { try { mService.registerNetworkFactory(messenger, name); - } catch (RemoteException e) { } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** {@hide} */ public void unregisterNetworkFactory(Messenger messenger) { try { mService.unregisterNetworkFactory(messenger); - } catch (RemoteException e) { } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -2412,7 +2439,7 @@ public class ConnectivityManager { try { return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc); } catch (RemoteException e) { - return NETID_UNSET; + throw e.rethrowFromSystemServer(); } } @@ -2563,9 +2590,11 @@ public class ConnectivityManager { @Override public void handleMessage(Message message) { - if (DBG) Log.d(TAG, "CM callback handler got msg " + message.what); NetworkRequest request = (NetworkRequest) getObject(message, NetworkRequest.class); Network network = (Network) getObject(message, Network.class); + if (DBG) { + Log.d(TAG, whatToString(message.what) + " for network " + network); + } switch (message.what) { case CALLBACK_PRECHECK: { NetworkCallback callback = getCallback(request, "PRECHECK"); @@ -2730,7 +2759,9 @@ public class ConnectivityManager { sNetworkCallback.put(networkCallback.networkRequest, networkCallback); } } - } catch (RemoteException e) {} + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } if (networkCallback.networkRequest == null) decCallbackHandlerRefCount(); return networkCallback.networkRequest; } @@ -2893,7 +2924,9 @@ public class ConnectivityManager { checkPendingIntent(operation); try { mService.pendingRequestForNetwork(request.networkCapabilities, operation); - } catch (RemoteException e) {} + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -2911,7 +2944,9 @@ public class ConnectivityManager { checkPendingIntent(operation); try { mService.releasePendingNetworkRequest(operation); - } catch (RemoteException e) {} + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } private void checkPendingIntent(PendingIntent intent) { @@ -2970,7 +3005,9 @@ public class ConnectivityManager { checkPendingIntent(operation); try { mService.pendingListenForNetwork(request.networkCapabilities, operation); - } catch (RemoteException e) {} + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -2988,7 +3025,7 @@ public class ConnectivityManager { try { return mService.requestBandwidthUpdate(network); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -3008,7 +3045,9 @@ public class ConnectivityManager { } try { mService.releaseNetworkRequest(networkCallback.networkRequest); - } catch (RemoteException e) {} + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -3044,7 +3083,9 @@ public class ConnectivityManager { public void setAcceptUnvalidated(Network network, boolean accept, boolean always) { try { mService.setAcceptUnvalidated(network, accept, always); - } catch (RemoteException e) {} + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -3055,6 +3096,7 @@ public class ConnectivityManager { try { mService.factoryReset(); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -3262,7 +3304,7 @@ public class ConnectivityManager { try { return getNetworkPolicyManager().getRestrictBackgroundByCaller(); } catch (RemoteException e) { - return RESTRICT_BACKGROUND_STATUS_DISABLED; + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/net/ConnectivityMetricsEvent.java b/core/java/android/net/ConnectivityMetricsEvent.java index d040a8563440..098f1e6947a3 100644 --- a/core/java/android/net/ConnectivityMetricsEvent.java +++ b/core/java/android/net/ConnectivityMetricsEvent.java @@ -16,12 +16,11 @@ package android.net; -import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; -@SystemApi -public class ConnectivityMetricsEvent implements Parcelable { +/** {@hide} */ +public final class ConnectivityMetricsEvent implements Parcelable { /** The time when this event was collected, as returned by System.currentTimeMillis(). */ final public long timestamp; diff --git a/core/java/android/net/DataUsageRequest.java b/core/java/android/net/DataUsageRequest.java index 5e96cc1fe04a..8526584d640d 100644 --- a/core/java/android/net/DataUsageRequest.java +++ b/core/java/android/net/DataUsageRequest.java @@ -29,7 +29,7 @@ import java.util.Objects; * If no {@code uid}s are set, callbacks are restricted to device-owners, * carrier-privileged apps, or system apps. */ -public class DataUsageRequest implements Parcelable { +public final class DataUsageRequest implements Parcelable { /** * @hide diff --git a/core/java/android/net/EthernetManager.java b/core/java/android/net/EthernetManager.java index f45737a66e09..664b7b408975 100644 --- a/core/java/android/net/EthernetManager.java +++ b/core/java/android/net/EthernetManager.java @@ -87,8 +87,8 @@ public class EthernetManager { public IpConfiguration getConfiguration() { try { return mService.getConfiguration(); - } catch (NullPointerException | RemoteException e) { - return new IpConfiguration(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -98,7 +98,8 @@ public class EthernetManager { public void setConfiguration(IpConfiguration config) { try { mService.setConfiguration(config); - } catch (NullPointerException | RemoteException e) { + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -109,8 +110,8 @@ public class EthernetManager { public boolean isAvailable() { try { return mService.isAvailable(); - } catch (NullPointerException | RemoteException e) { - return false; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -127,7 +128,8 @@ public class EthernetManager { if (mListeners.size() == 1) { try { mService.addListener(mServiceListener); - } catch (NullPointerException | RemoteException e) { + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } } @@ -145,7 +147,8 @@ public class EthernetManager { if (mListeners.isEmpty()) { try { mService.removeListener(mServiceListener); - } catch (NullPointerException | RemoteException e) { + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java index b6fe68af51ac..01c160f1bc45 100644 --- a/core/java/android/net/NetworkScoreManager.java +++ b/core/java/android/net/NetworkScoreManager.java @@ -166,7 +166,7 @@ public class NetworkScoreManager { try { return mService.updateScores(networks); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -186,7 +186,7 @@ public class NetworkScoreManager { try { return mService.clearScores(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -206,7 +206,7 @@ public class NetworkScoreManager { try { return mService.setActiveScorer(packageName); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -221,6 +221,7 @@ public class NetworkScoreManager { try { mService.disableScoring(); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -265,6 +266,7 @@ public class NetworkScoreManager { try { mService.registerNetworkScoreCache(networkType, scoreCache); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/net/nsd/NsdManager.java b/core/java/android/net/nsd/NsdManager.java index 377ed88997b3..86bd5028266b 100644 --- a/core/java/android/net/nsd/NsdManager.java +++ b/core/java/android/net/nsd/NsdManager.java @@ -619,7 +619,9 @@ public final class NsdManager { public void setEnabled(boolean enabled) { try { mService.setEnabled(enabled); - } catch (RemoteException e) { } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -632,7 +634,7 @@ public final class NsdManager { try { return mService.getMessenger(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index 56cb250f79d0..e40ebf777b88 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -221,7 +221,7 @@ public class BatteryManager { try { return mBatteryStats.isCharging(); } catch (RemoteException e) { - return true; + throw e.rethrowFromSystemServer(); } } @@ -246,7 +246,7 @@ public class BatteryManager { else ret = Long.MIN_VALUE; } catch (RemoteException e) { - ret = Long.MIN_VALUE; + throw e.rethrowFromSystemServer(); } return ret; diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index fb16150b9abf..f3822413add3 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -2160,6 +2160,14 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo public static native void dumpNativeBacktraceToFile(int pid, String file); /** + * Get description of unreachable native memory. + * @param limit the number of leaks to provide info on, 0 to only get a summary. + * @param contents true to include a hex dump of the contents of unreachable memory. + * @return the String containing a description of unreachable memory. + * @hide */ + public static native String getUnreachableMemory(int limit, boolean contents); + + /** * Return a String describing the calling method and location at a particular stack depth. * @param callStack the Thread stack * @param depth the depth of stack to return information for. diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 1085b1e9dc6b..307bd2d13f83 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -258,6 +258,20 @@ public class Environment { return buildPath(getDataDirectory(), "misc_de", String.valueOf(userId)); } + private static File getDataProfilesDeDirectory(int userId) { + return buildPath(getDataDirectory(), "misc", "profiles", "cur", String.valueOf(userId)); + } + + /** {@hide} */ + public static File getDataProfilesDePackageDirectory(int userId, String packageName) { + return buildPath(getDataProfilesDeDirectory(userId), packageName); + } + + /** {@hide} */ + public static File getDataProfilesDeForeignDexDirectory(int userId) { + return buildPath(getDataProfilesDeDirectory(userId), "foreign-dex"); + } + /** {@hide} */ public static File getDataAppDirectory(String volumeUuid) { return new File(getDataDirectory(volumeUuid), "app"); @@ -493,7 +507,7 @@ public class Environment { * </ul> * @hide */ - private static final String[] STANDARD_DIRECTORIES = { + public static final String[] STANDARD_DIRECTORIES = { DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES, diff --git a/core/java/android/os/HardwarePropertiesManager.java b/core/java/android/os/HardwarePropertiesManager.java index f48306a6737b..9ca1dcd70242 100644 --- a/core/java/android/os/HardwarePropertiesManager.java +++ b/core/java/android/os/HardwarePropertiesManager.java @@ -79,8 +79,7 @@ public class HardwarePropertiesManager { try { return mService.getDeviceTemperatures(mContext.getOpPackageName(), type); } catch (RemoteException e) { - Log.w(TAG, "Could not get device temperatures", e); - return new float[0]; + throw e.rethrowFromSystemServer(); } default: Log.w(TAG, "Unknown device temperature type."); @@ -100,8 +99,7 @@ public class HardwarePropertiesManager { try { return mService.getCpuUsages(mContext.getOpPackageName()); } catch (RemoteException e) { - Log.w(TAG, "Could not get CPU usages", e); - return new CpuUsageInfo[0]; + throw e.rethrowFromSystemServer(); } } @@ -117,8 +115,7 @@ public class HardwarePropertiesManager { try { return mService.getFanSpeeds(mContext.getOpPackageName()); } catch (RemoteException e) { - Log.w(TAG, "Could not get fan speeds", e); - return new float[0]; + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 369ec1572598..2a4507ca027e 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -620,6 +620,7 @@ public final class PowerManager { try { mService.userActivity(when, event, flags); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -671,6 +672,7 @@ public final class PowerManager { try { mService.goToSleep(time, reason, flags); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -697,6 +699,7 @@ public final class PowerManager { try { mService.wakeUp(time, "wakeUp", mContext.getOpPackageName()); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -707,6 +710,7 @@ public final class PowerManager { try { mService.wakeUp(time, reason, mContext.getOpPackageName()); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -735,6 +739,7 @@ public final class PowerManager { try { mService.nap(time); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -757,6 +762,7 @@ public final class PowerManager { try { mService.boostScreenBrightness(time); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -772,7 +778,7 @@ public final class PowerManager { try { return mService.isScreenBrightnessBoosted(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -790,6 +796,7 @@ public final class PowerManager { try { mService.setTemporaryScreenBrightnessSettingOverride(brightness); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -803,7 +810,7 @@ public final class PowerManager { try { return mService.isWakeLockLevelSupported(level); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -867,7 +874,7 @@ public final class PowerManager { try { return mService.isInteractive(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -884,6 +891,7 @@ public final class PowerManager { try { mService.reboot(false, reason, true); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -899,7 +907,7 @@ public final class PowerManager { try { return mService.isPowerSaveMode(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -916,7 +924,7 @@ public final class PowerManager { try { return mService.setPowerSaveMode(mode); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -936,7 +944,7 @@ public final class PowerManager { try { return mService.isDeviceIdleMode(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -956,7 +964,7 @@ public final class PowerManager { try { return mService.isLightDeviceIdleMode(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -975,7 +983,7 @@ public final class PowerManager { try { return mIDeviceIdleController.isPowerSaveWhitelistApp(packageName); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -992,6 +1000,7 @@ public final class PowerManager { try { mService.shutdown(confirm, reason, wait); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -1118,6 +1127,7 @@ public final class PowerManager { try { mService.releaseWakeLock(mToken, 0); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } } @@ -1186,6 +1196,7 @@ public final class PowerManager { mService.acquireWakeLock(mToken, mFlags, mTag, mPackageName, mWorkSource, mHistoryTag); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } mHeld = true; } @@ -1224,6 +1235,7 @@ public final class PowerManager { try { mService.releaseWakeLock(mToken, flags); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } mHeld = false; } @@ -1280,6 +1292,7 @@ public final class PowerManager { try { mService.updateWakeLockWorkSource(mToken, mWorkSource, mHistoryTag); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 20b3798b56b8..6e9e4569c46a 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -36,6 +36,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.storage.StorageManager; import android.provider.Settings; +import android.telephony.TelephonyManager; import android.view.WindowManager.LayoutParams; import com.android.internal.R; @@ -680,6 +681,22 @@ public class UserManager { } /** + * Returns whether switching users is currently allowed. + * <p>For instance switching users is not allowed if the current user is in a phone call, + * or system user hasn't been unlocked yet + * @hide + */ + public boolean canSwitchUsers() { + boolean allowUserSwitchingWhenSystemUserLocked = Settings.Global.getInt( + mContext.getContentResolver(), + Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED, 0) != 0; + boolean isSystemUserUnlocked = isUserUnlocked(UserHandle.SYSTEM); + boolean inCall = TelephonyManager.getDefault().getCallState() + != TelephonyManager.CALL_STATE_IDLE; + return (allowUserSwitchingWhenSystemUserLocked || isSystemUserUnlocked) && !inCall; + } + + /** * Returns the user handle for the user that this process is running under. * * @return the user handle of this process. diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java index d860c7d8ad2e..54d20d361a26 100644 --- a/core/java/android/os/storage/StorageVolume.java +++ b/core/java/android/os/storage/StorageVolume.java @@ -76,7 +76,7 @@ import java.io.File; */ // NOTE: This is a legacy specialization of VolumeInfo which describes the volume for a specific // user, but is now part of the public API. -public class StorageVolume implements Parcelable { +public final class StorageVolume implements Parcelable { private final String mId; private final int mStorageId; diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index 4b706496db20..ea0597d8c68c 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -438,10 +438,6 @@ public class VolumeInfo implements Parcelable { final Intent intent = new Intent(DocumentsContract.ACTION_BROWSE); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(uri); - - // note that docsui treats this as *force* show advanced. So sending - // false permits advanced to be shown based on user preferences. - intent.putExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, isPrimary()); intent.putExtra(DocumentsContract.EXTRA_SHOW_FILESIZE, true); return intent; } diff --git a/core/java/android/provider/BlockedNumberContract.java b/core/java/android/provider/BlockedNumberContract.java index b9213513cc17..0439fe247ee1 100644 --- a/core/java/android/provider/BlockedNumberContract.java +++ b/core/java/android/provider/BlockedNumberContract.java @@ -29,8 +29,11 @@ import android.os.Bundle; * <p> * The content provider exposes a table containing blocked numbers. The columns and URIs for * accessing this table are defined by the {@link BlockedNumbers} class. Messages, and calls from - * blocked numbers are discarded by the platform. Notifications upon provider changes can be - * received using a {@link android.database.ContentObserver}. + * blocked numbers are discarded by the platform. If the user contacts emergency + * services, number blocking is disabled by the platform for a duration defined by + * {@link android.telephony.CarrierConfigManager#KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT}. + * Notifications upon provider changes can be received using a + * {@link android.database.ContentObserver}. * </p> * * <h3> Permissions </h3> @@ -141,25 +144,26 @@ public class BlockedNumberContract { /** * Content URI for the blocked numbers. - * - * Supported operations - * blocked - * - query - * - delete - * - insert - * - * blocked/ID - * - query (selection is not supported) - * - delete (selection is not supported) + * <h3> Supported operations </h3> + * <p> blocked + * <ul> + * <li> query + * <li> delete + * <li> insert + * </ul> + * <p> blocked/ID + * <ul> + * <li> query (selection is not supported) + * <li> delete (selection is not supported) + * </ul> */ - public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, - "blocked"); + public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "blocked"); /** * The MIME type of {@link #CONTENT_URI} itself providing a directory of blocked phone * numbers. */ - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_numbers"; + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/blocked_number"; /** * The MIME type of a blocked phone number under {@link #CONTENT_URI}. @@ -215,7 +219,7 @@ public class BlockedNumberContract { /** * Returns {@code true} if blocking numbers is supported for the current user. - * <p> Typically, blocking numbers is only supported for the primary user. + * <p> Typically, blocking numbers is only supported for one user at a time. */ public static boolean canCurrentUserBlockNumbers(Context context) { final Bundle res = context.getContentResolver().call( @@ -292,6 +296,9 @@ public class BlockedNumberContract { return res != null && res.getBoolean(RES_NUMBER_IS_BLOCKED, false); } + /** + * Returns the current status of block suppression. + */ public static BlockSuppressionStatus getBlockSuppressionStatus(Context context) { final Bundle res = context.getContentResolver().call( AUTHORITY_URI, METHOD_GET_BLOCK_SUPPRESSION_STATUS, null, null); diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 370009893286..3788c746826d 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -93,9 +93,6 @@ public final class DocumentsContract { public static final String EXTRA_PACKAGE_NAME = "android.content.extra.PACKAGE_NAME"; /** {@hide} */ - public static final String EXTRA_SHOW_ADVANCED = "android.content.extra.SHOW_ADVANCED"; - - /** {@hide} */ public static final String EXTRA_SHOW_FILESIZE = "android.content.extra.SHOW_FILESIZE"; /** {@hide} */ @@ -564,22 +561,13 @@ public final class DocumentsContract { public static final int FLAG_EMPTY = 1 << 16; /** - * Flag indicating that this root should only be visible to advanced - * users. - * - * @see #COLUMN_FLAGS - * @hide - */ - public static final int FLAG_ADVANCED = 1 << 17; - - /** * Flag indicating that this root has settings. * * @see #COLUMN_FLAGS * @see DocumentsContract#ACTION_DOCUMENT_ROOT_SETTINGS * @hide */ - public static final int FLAG_HAS_SETTINGS = 1 << 18; + public static final int FLAG_HAS_SETTINGS = 1 << 17; } /** diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java index b5387f14e40c..41af837a1dbc 100644 --- a/core/java/android/service/notification/NotificationAssistantService.java +++ b/core/java/android/service/notification/NotificationAssistantService.java @@ -18,18 +18,17 @@ package android.service.notification; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.app.INotificationManager; -import android.app.Notification; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.os.Handler; import android.os.IBinder; -import android.os.Parcel; -import android.os.Parcelable; +import android.os.Looper; +import android.os.Message; import android.os.RemoteException; -import android.os.ServiceManager; import android.util.Log; +import com.android.internal.os.SomeArgs; /** * A service that helps the user manage notifications by modifying the @@ -125,8 +124,24 @@ public abstract class NotificationAssistantService extends NotificationListenerS } } + private Handler mHandler; + + /** @hide */ + @Override + public void registerAsSystemService(Context context, ComponentName componentName, + int currentUser) throws RemoteException { + super.registerAsSystemService(context, componentName, currentUser); + mHandler = new MyHandler(getContext().getMainLooper()); + } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + mHandler = new MyHandler(getContext().getMainLooper()); + } + @Override - public IBinder onBind(Intent intent) { + public final IBinder onBind(Intent intent) { if (mWrapper == null) { mWrapper = new NotificationAssistantWrapper(); } @@ -198,8 +213,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS * @param key the notification key * @param adjustment the new importance with an explanation */ - public final void adjustImportance(String key, Adjustment adjustment) - { + public final void adjustImportance(String key, Adjustment adjustment) { if (!isBound()) return; try { getNotificationInterface().setImportanceFromAssistant(mWrapper, key, @@ -212,7 +226,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS private class NotificationAssistantWrapper extends NotificationListenerWrapper { @Override public void onNotificationEnqueued(IStatusBarNotificationHolder sbnHolder, - int importance, boolean user) throws RemoteException { + int importance, boolean user) { StatusBarNotification sbn; try { sbn = sbnHolder.get(); @@ -221,54 +235,114 @@ public abstract class NotificationAssistantService extends NotificationListenerS return; } - try { - Adjustment adjustment = - NotificationAssistantService.this.onNotificationEnqueued(sbn, importance, user); - if (adjustment != null) { - adjustImportance(sbn.getKey(), adjustment); - } - } catch (Throwable t) { - Log.w(TAG, "Error running onNotificationEnqueued", t); - } + SomeArgs args = SomeArgs.obtain(); + args.arg1 = sbn; + args.argi1 = importance; + args.argi2 = user ? 1 : 0; + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_ENQUEUED, + args).sendToTarget(); } @Override - public void onNotificationVisibilityChanged(String key, long time, boolean visible) - throws RemoteException { - try { - NotificationAssistantService.this.onNotificationVisibilityChanged(key, time, - visible); - } catch (Throwable t) { - Log.w(TAG, "Error running onNotificationVisibilityChanged", t); - } + public void onNotificationVisibilityChanged(String key, long time, boolean visible) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = key; + args.arg2 = time; + args.argi1 = visible ? 1 : 0; + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_VISIBILITY_CHANGED, + args).sendToTarget(); } @Override - public void onNotificationClick(String key, long time) throws RemoteException { - try { - NotificationAssistantService.this.onNotificationClick(key, time); - } catch (Throwable t) { - Log.w(TAG, "Error running onNotificationClick", t); - } + public void onNotificationClick(String key, long time) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = key; + args.arg2 = time; + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_CLICK, + args).sendToTarget(); } @Override - public void onNotificationActionClick(String key, long time, int actionIndex) - throws RemoteException { - try { - NotificationAssistantService.this.onNotificationActionClick(key, time, actionIndex); - } catch (Throwable t) { - Log.w(TAG, "Error running onNotificationActionClick", t); - } + public void onNotificationActionClick(String key, long time, int actionIndex) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = key; + args.arg2 = time; + args.argi1 = actionIndex; + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_ACTION_CLICK, + args).sendToTarget(); } @Override - public void onNotificationRemovedReason(String key, long time, int reason) - throws RemoteException { - try { - NotificationAssistantService.this.onNotificationRemoved(key, time, reason); - } catch (Throwable t) { - Log.w(TAG, "Error running onNotificationRemoved", t); + public void onNotificationRemovedReason(String key, long time, int reason) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = key; + args.arg2 = time; + args.argi1 = reason; + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_REMOVED_REASON, + args).sendToTarget(); + } + } + + private final class MyHandler extends Handler { + public static final int MSG_ON_NOTIFICATION_ENQUEUED = 1; + public static final int MSG_ON_NOTIFICATION_VISIBILITY_CHANGED = 2; + public static final int MSG_ON_NOTIFICATION_CLICK = 3; + public static final int MSG_ON_NOTIFICATION_ACTION_CLICK = 4; + public static final int MSG_ON_NOTIFICATION_REMOVED_REASON = 5; + + public MyHandler(Looper looper) { + super(looper, null, false); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_ON_NOTIFICATION_ENQUEUED: { + SomeArgs args = (SomeArgs) msg.obj; + StatusBarNotification sbn = (StatusBarNotification) args.arg1; + final int importance = args.argi1; + final boolean user = args.argi2 == 1; + args.recycle(); + Adjustment adjustment = onNotificationEnqueued(sbn, importance, user); + if (adjustment != null) { + adjustImportance(sbn.getKey(), adjustment); + } + } break; + + case MSG_ON_NOTIFICATION_VISIBILITY_CHANGED: { + SomeArgs args = (SomeArgs) msg.obj; + final String key = (String) args.arg1; + final long time = (long) args.arg2; + final boolean visible = args.argi1 == 1; + args.recycle(); + onNotificationVisibilityChanged(key, time, visible); + } break; + + case MSG_ON_NOTIFICATION_CLICK: { + SomeArgs args = (SomeArgs) msg.obj; + final String key = (String) args.arg1; + final long time = (long) args.arg2; + args.recycle(); + onNotificationClick(key, time); + } break; + + case MSG_ON_NOTIFICATION_ACTION_CLICK: { + SomeArgs args = (SomeArgs) msg.obj; + final String key = (String) args.arg1; + final long time = (long) args.arg2; + final int actionIndex = args.argi1; + args.recycle(); + onNotificationActionClick(key, time, actionIndex); + } break; + + case MSG_ON_NOTIFICATION_REMOVED_REASON: { + SomeArgs args = (SomeArgs) msg.obj; + final String key = (String) args.arg1; + final long time = (long) args.arg2; + final int reason = args.argi1; + args.recycle(); + onNotificationRemoved(key, time, reason); + } break; } } } diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index b4332e181fc4..73a890fb0308 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -16,6 +16,10 @@ package android.service.notification; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + import android.annotation.IntDef; import android.annotation.SystemApi; import android.annotation.SdkConstant; @@ -43,7 +47,8 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.widget.RemoteViews; - +import com.android.internal.annotations.GuardedBy; +import com.android.internal.os.SomeArgs; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -163,8 +168,14 @@ public abstract class NotificationListenerService extends Service { @SystemApi public static final int TRIM_LIGHT = 1; + private final Object mLock = new Object(); + + private Handler mHandler; + /** @hide */ protected NotificationListenerWrapper mWrapper = null; + + @GuardedBy("mLock") private RankingMap mRankingMap; private INotificationManager mNoMan; @@ -195,6 +206,12 @@ public abstract class NotificationListenerService extends Service { public static final String CATEGORY_VR_NOTIFICATIONS = "android.intent.category.vr.notifications"; + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + mHandler = new MyHandler(getMainLooper()); + } + /** * Implement this method to learn about new notifications as they are posted by apps. * @@ -642,7 +659,9 @@ public abstract class NotificationListenerService extends Service { * @return A {@link RankingMap} object providing access to ranking information */ public RankingMap getCurrentRanking() { - return mRankingMap; + synchronized (mLock) { + return mRankingMap; + } } @Override @@ -684,6 +703,7 @@ public abstract class NotificationListenerService extends Service { INotificationManager noMan = getNotificationInterface(); noMan.registerListener(mWrapper, componentName, currentUser); mCurrentUser = currentUser; + mHandler = new MyHandler(context.getMainLooper()); } /** @@ -710,7 +730,7 @@ public abstract class NotificationListenerService extends Service { * <P>The service should wait for the {@link #onListenerConnected()} event * before performing any operations. */ - public static final void requestRebind(ComponentName componentName) + public static void requestRebind(ComponentName componentName) throws RemoteException { INotificationManager noMan = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); @@ -782,7 +802,6 @@ public abstract class NotificationListenerService extends Service { } try { - Notification notification = sbn.getNotification(); // convert icon metadata to legacy format for older clients createLegacyIconExtras(sbn.getNotification()); maybePopulateRemoteViews(sbn.getNotification()); @@ -794,20 +813,23 @@ public abstract class NotificationListenerService extends Service { } // protect subclass from concurrent modifications of (@link mNotificationKeys}. - synchronized (mWrapper) { - applyUpdate(update); - try { - if (sbn != null) { - NotificationListenerService.this.onNotificationPosted(sbn, mRankingMap); - } else { - // still pass along the ranking map, it may contain other information - NotificationListenerService.this.onNotificationRankingUpdate(mRankingMap); - } - } catch (Throwable t) { - Log.w(TAG, "Error running onNotificationPosted", t); + synchronized (mLock) { + applyUpdateLocked(update); + if (sbn != null) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = sbn; + args.arg2 = mRankingMap; + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_POSTED, + args).sendToTarget(); + } else { + // still pass along the ranking map, it may contain other information + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_RANKING_UPDATE, + mRankingMap).sendToTarget(); } } + } + @Override public void onNotificationRemoved(IStatusBarNotificationHolder sbnHolder, NotificationRankingUpdate update) { @@ -819,56 +841,48 @@ public abstract class NotificationListenerService extends Service { return; } // protect subclass from concurrent modifications of (@link mNotificationKeys}. - synchronized (mWrapper) { - applyUpdate(update); - try { - NotificationListenerService.this.onNotificationRemoved(sbn, mRankingMap); - } catch (Throwable t) { - Log.w(TAG, "Error running onNotificationRemoved", t); - } + synchronized (mLock) { + applyUpdateLocked(update); + SomeArgs args = SomeArgs.obtain(); + args.arg1 = sbn; + args.arg2 = mRankingMap; + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_REMOVED, + args).sendToTarget(); } + } + @Override public void onListenerConnected(NotificationRankingUpdate update) { // protect subclass from concurrent modifications of (@link mNotificationKeys}. - synchronized (mWrapper) { - applyUpdate(update); - try { - NotificationListenerService.this.onListenerConnected(); - } catch (Throwable t) { - Log.w(TAG, "Error running onListenerConnected", t); - } + synchronized (mLock) { + applyUpdateLocked(update); } + mHandler.obtainMessage(MyHandler.MSG_ON_LISTENER_CONNECTED).sendToTarget(); } + @Override public void onNotificationRankingUpdate(NotificationRankingUpdate update) throws RemoteException { // protect subclass from concurrent modifications of (@link mNotificationKeys}. - synchronized (mWrapper) { - applyUpdate(update); - try { - NotificationListenerService.this.onNotificationRankingUpdate(mRankingMap); - } catch (Throwable t) { - Log.w(TAG, "Error running onNotificationRankingUpdate", t); - } + synchronized (mLock) { + applyUpdateLocked(update); + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_RANKING_UPDATE, + mRankingMap).sendToTarget(); } + } + @Override public void onListenerHintsChanged(int hints) throws RemoteException { - try { - NotificationListenerService.this.onListenerHintsChanged(hints); - } catch (Throwable t) { - Log.w(TAG, "Error running onListenerHintsChanged", t); - } + mHandler.obtainMessage(MyHandler.MSG_ON_LISTENER_HINTS_CHANGED, + hints, 0).sendToTarget(); } @Override public void onInterruptionFilterChanged(int interruptionFilter) throws RemoteException { - try { - NotificationListenerService.this.onInterruptionFilterChanged(interruptionFilter); - } catch (Throwable t) { - Log.w(TAG, "Error running onInterruptionFilterChanged", t); - } + mHandler.obtainMessage(MyHandler.MSG_ON_INTERRUPTION_FILTER_CHANGED, + interruptionFilter, 0).sendToTarget(); } @Override @@ -901,11 +915,12 @@ public abstract class NotificationListenerService extends Service { } } - private void applyUpdate(NotificationRankingUpdate update) { + private void applyUpdateLocked(NotificationRankingUpdate update) { mRankingMap = new RankingMap(update); } - private Context getContext() { + /** @hide */ + protected Context getContext() { if (mSystemContext != null) { return mSystemContext; } @@ -1289,4 +1304,57 @@ public abstract class NotificationListenerService extends Service { } }; } + + private final class MyHandler extends Handler { + public static final int MSG_ON_NOTIFICATION_POSTED = 1; + public static final int MSG_ON_NOTIFICATION_REMOVED = 2; + public static final int MSG_ON_LISTENER_CONNECTED = 3; + public static final int MSG_ON_NOTIFICATION_RANKING_UPDATE = 4; + public static final int MSG_ON_LISTENER_HINTS_CHANGED = 5; + public static final int MSG_ON_INTERRUPTION_FILTER_CHANGED = 6; + + public MyHandler(Looper looper) { + super(looper, null, false); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_ON_NOTIFICATION_POSTED: { + SomeArgs args = (SomeArgs) msg.obj; + StatusBarNotification sbn = (StatusBarNotification) args.arg1; + RankingMap rankingMap = (RankingMap) args.arg2; + args.recycle(); + onNotificationPosted(sbn, rankingMap); + } break; + + case MSG_ON_NOTIFICATION_REMOVED: { + SomeArgs args = (SomeArgs) msg.obj; + StatusBarNotification sbn = (StatusBarNotification) args.arg1; + RankingMap rankingMap = (RankingMap) args.arg2; + args.recycle(); + onNotificationRemoved(sbn, rankingMap); + } break; + + case MSG_ON_LISTENER_CONNECTED: { + onListenerConnected(); + } break; + + case MSG_ON_NOTIFICATION_RANKING_UPDATE: { + RankingMap rankingMap = (RankingMap) msg.obj; + onNotificationRankingUpdate(rankingMap); + } break; + + case MSG_ON_LISTENER_HINTS_CHANGED: { + final int hints = msg.arg1; + onListenerHintsChanged(hints); + } break; + + case MSG_ON_INTERRUPTION_FILTER_CHANGED: { + final int interruptionFilter = msg.arg1; + onInterruptionFilterChanged(interruptionFilter); + } break; + } + } + } } diff --git a/core/java/android/service/notification/ZenModeConfig.aidl b/core/java/android/service/notification/ZenModeConfig.aidl index c73b75ef821f..4644103c435c 100644 --- a/core/java/android/service/notification/ZenModeConfig.aidl +++ b/core/java/android/service/notification/ZenModeConfig.aidl @@ -17,4 +17,5 @@ package android.service.notification; parcelable ZenModeConfig; +parcelable ZenModeConfig.ZenRule; diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 97939a9ba3af..27315ee86d32 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -1017,7 +1017,7 @@ public class ZenModeConfig implements Parcelable { public static class ZenRule implements Parcelable { public boolean enabled; public boolean snoozing; // user manually disabled this instance - public String name; // required for automatic (unique) + public String name; // required for automatic public int zenMode; public Uri conditionId; // required for automatic public Condition condition; // optional diff --git a/core/java/android/util/ArrayMap.java b/core/java/android/util/ArrayMap.java index bdb1fdcb9ff8..92a5803b5ddb 100644 --- a/core/java/android/util/ArrayMap.java +++ b/core/java/android/util/ArrayMap.java @@ -67,7 +67,7 @@ public final class ArrayMap<K, V> implements Map<K, V> { /** * @hide Special immutable empty ArrayMap. */ - public static final ArrayMap EMPTY = new ArrayMap(true); + public static final ArrayMap EMPTY = new ArrayMap<>(-1); /** * Caches of small array objects to avoid spamming garbage. The cache @@ -80,6 +80,7 @@ public final class ArrayMap<K, V> implements Map<K, V> { static Object[] mTwiceBaseCache; static int mTwiceBaseCacheSize; + final boolean mIdentityHashCode; int[] mHashes; Object[] mArray; int mSize; @@ -236,30 +237,32 @@ public final class ArrayMap<K, V> implements Map<K, V> { * will grow once items are added to it. */ public ArrayMap() { - mHashes = EmptyArray.INT; - mArray = EmptyArray.OBJECT; - mSize = 0; + this(0, false); } /** * Create a new ArrayMap with a given initial capacity. */ public ArrayMap(int capacity) { - if (capacity == 0) { - mHashes = EmptyArray.INT; - mArray = EmptyArray.OBJECT; - } else { - allocArrays(capacity); - } - mSize = 0; + this(capacity, false); } - private ArrayMap(boolean immutable) { + /** {@hide} */ + public ArrayMap(int capacity, boolean identityHashCode) { + mIdentityHashCode = identityHashCode; + // If this is immutable, use the sentinal EMPTY_IMMUTABLE_INTS // instance instead of the usual EmptyArray.INT. The reference // is checked later to see if the array is allowed to grow. - mHashes = immutable ? EMPTY_IMMUTABLE_INTS : EmptyArray.INT; - mArray = EmptyArray.OBJECT; + if (capacity < 0) { + mHashes = EMPTY_IMMUTABLE_INTS; + mArray = EmptyArray.OBJECT; + } else if (capacity == 0) { + mHashes = EmptyArray.INT; + mArray = EmptyArray.OBJECT; + } else { + allocArrays(capacity); + } mSize = 0; } @@ -336,7 +339,8 @@ public final class ArrayMap<K, V> implements Map<K, V> { * @return Returns the index of the key if it exists, else a negative integer. */ public int indexOfKey(Object key) { - return key == null ? indexOfNull() : indexOf(key, key.hashCode()); + return key == null ? indexOfNull() + : indexOf(key, mIdentityHashCode ? System.identityHashCode(key) : key.hashCode()); } int indexOfValue(Object value) { @@ -437,7 +441,7 @@ public final class ArrayMap<K, V> implements Map<K, V> { hash = 0; index = indexOfNull(); } else { - hash = key.hashCode(); + hash = mIdentityHashCode ? System.identityHashCode(key) : key.hashCode(); index = indexOf(key, hash); } if (index >= 0) { @@ -488,7 +492,8 @@ public final class ArrayMap<K, V> implements Map<K, V> { */ public void append(K key, V value) { int index = mSize; - final int hash = key == null ? 0 : key.hashCode(); + final int hash = key == null ? 0 + : (mIdentityHashCode ? System.identityHashCode(key) : key.hashCode()); if (index >= mHashes.length) { throw new IllegalStateException("Array is full"); } diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java index b7a3c42e8f24..9e9314fba4c4 100644 --- a/core/java/android/util/ArraySet.java +++ b/core/java/android/util/ArraySet.java @@ -69,6 +69,7 @@ public final class ArraySet<E> implements Collection<E>, Set<E> { static Object[] mTwiceBaseCache; static int mTwiceBaseCacheSize; + final boolean mIdentityHashCode; int[] mHashes; Object[] mArray; int mSize; @@ -222,15 +223,19 @@ public final class ArraySet<E> implements Collection<E>, Set<E> { * will grow once items are added to it. */ public ArraySet() { - mHashes = EmptyArray.INT; - mArray = EmptyArray.OBJECT; - mSize = 0; + this(0, false); } /** * Create a new ArraySet with a given initial capacity. */ public ArraySet(int capacity) { + this(capacity, false); + } + + /** {@hide} */ + public ArraySet(int capacity, boolean identityHashCode) { + mIdentityHashCode = identityHashCode; if (capacity == 0) { mHashes = EmptyArray.INT; mArray = EmptyArray.OBJECT; @@ -306,7 +311,8 @@ public final class ArraySet<E> implements Collection<E>, Set<E> { * @return Returns the index of the value if it exists, else a negative integer. */ public int indexOf(Object key) { - return key == null ? indexOfNull() : indexOf(key, key.hashCode()); + return key == null ? indexOfNull() + : indexOf(key, mIdentityHashCode ? System.identityHashCode(key) : key.hashCode()); } /** @@ -343,7 +349,7 @@ public final class ArraySet<E> implements Collection<E>, Set<E> { hash = 0; index = indexOfNull(); } else { - hash = value.hashCode(); + hash = mIdentityHashCode ? System.identityHashCode(value) : value.hashCode(); index = indexOf(value, hash); } if (index >= 0) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index e7be7af48a7b..9bd3df0c1a1f 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -10270,6 +10270,27 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Like {@link #getWindowVisibleDisplayFrame}, but returns the "full" display frame this window + * is currently in without any insets. + * + * @hide + */ + public void getWindowDisplayFrame(Rect outRect) { + if (mAttachInfo != null) { + try { + mAttachInfo.mSession.getDisplayFrame(mAttachInfo.mWindow, outRect); + } catch (RemoteException e) { + return; + } + return; + } + // The view is not attached to a display so we don't have a context. + // Make a best guess about the display size. + Display d = DisplayManagerGlobal.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY); + d.getRectSize(outRect); + } + + /** * Dispatch a notification about a resource configuration change down * the view hierarchy. * ViewGroups should override to route to their children. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index c5b165321d91..afe2f1061f3a 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -4398,8 +4398,14 @@ public final class ViewRootImpl implements ViewParent, private boolean updatePointerIcon(MotionEvent event) { final float x = event.getX(); final float y = event.getY(); + if (mView == null) { + // E.g. click outside a popup to dismiss it + Slog.d(mTag, "updatePointerIcon called after view was removed"); + return false; + } if (x < 0 || x >= mView.getWidth() || y < 0 || y >= mView.getHeight()) { - Slog.e(mTag, "updatePointerIcon called with position out of bounds"); + // E.g. when moving window divider with mouse + Slog.d(mTag, "updatePointerIcon called with position out of bounds"); return false; } final PointerIcon pointerIcon = mView.getPointerIcon(event, x, y); diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 4c015ba9e2d3..859df432eb8c 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -664,7 +664,7 @@ public final class InputMethodManager { try { return mService.getInputMethodList(); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -672,7 +672,7 @@ public final class InputMethodManager { try { return mService.getEnabledInputMethodList(); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -689,7 +689,7 @@ public final class InputMethodManager { return mService.getEnabledInputMethodSubtypeList( imi == null ? null : imi.getId(), allowsImplicitlySelectedSubtypes); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -697,7 +697,7 @@ public final class InputMethodManager { try { mService.updateStatusIcon(imeToken, packageName, iconId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -705,7 +705,7 @@ public final class InputMethodManager { try { mService.updateStatusIcon(imeToken, null, 0); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -714,7 +714,7 @@ public final class InputMethodManager { try { mService.setImeWindowStatus(imeToken, vis, backDisposition); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -728,7 +728,7 @@ public final class InputMethodManager { try { mService.registerSuggestionSpansForNotification(spans); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -737,7 +737,7 @@ public final class InputMethodManager { try { mService.notifySuggestionPicked(span, originalString, index); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -833,6 +833,7 @@ public final class InputMethodManager { try { mService.finishInput(mClient); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } notifyInputConnectionFinished(); @@ -996,9 +997,8 @@ public final class InputMethodManager { try { return mService.showSoftInput(mClient, flags, resultReceiver); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - - return false; } } @@ -1007,6 +1007,7 @@ public final class InputMethodManager { try { mService.showSoftInput(mClient, flags, resultReceiver); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -1065,8 +1066,8 @@ public final class InputMethodManager { try { return mService.hideSoftInput(mClient, flags, resultReceiver); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - return false; } } @@ -1421,6 +1422,7 @@ public final class InputMethodManager { try { mService.hideSoftInput(mClient, HIDE_NOT_ALWAYS, null); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -1476,6 +1478,7 @@ public final class InputMethodManager { rootView.getWindowToken(), controlFlags, softInputMode, windowFlags, null, null); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } } @@ -1716,7 +1719,7 @@ public final class InputMethodManager { try { mService.setInputMethod(token, id); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1733,7 +1736,7 @@ public final class InputMethodManager { try { mService.setInputMethodAndSubtype(token, id, subtype); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1753,7 +1756,7 @@ public final class InputMethodManager { try { mService.hideMySoftInput(token, flags); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1774,7 +1777,7 @@ public final class InputMethodManager { try { mService.showMySoftInput(token, flags); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1980,7 +1983,7 @@ public final class InputMethodManager { SHOW_IM_PICKER_MODE_EXCLUDE_AUXILIARY_SUBTYPES; mService.showInputMethodPickerFromClient(mClient, mode); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); + throw e.rethrowFromSystemServer(); } } } @@ -1989,7 +1992,7 @@ public final class InputMethodManager { try { mService.showInputMethodPickerFromClient(mClient, SHOW_IM_PICKER_MODE_AUTO); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); + throw e.rethrowFromSystemServer(); } } @@ -2003,7 +2006,7 @@ public final class InputMethodManager { try { mService.showInputMethodAndSubtypeEnablerFromClient(mClient, imiId); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); + throw e.rethrowFromSystemServer(); } } } @@ -2018,8 +2021,7 @@ public final class InputMethodManager { try { return mService.getCurrentInputMethodSubtype(); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); - return null; + throw e.rethrowFromSystemServer(); } } } @@ -2036,8 +2038,7 @@ public final class InputMethodManager { try { return mService.setCurrentInputMethodSubtype(subtype); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); - return false; + throw e.rethrowFromSystemServer(); } } } @@ -2071,7 +2072,7 @@ public final class InputMethodManager { mLastSentUserActionNotificationSequenceNumber = mNextUserActionNotificationSequenceNumber; } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); + throw e.rethrowFromSystemServer(); } } } @@ -2104,7 +2105,7 @@ public final class InputMethodManager { } } } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); + throw e.rethrowFromSystemServer(); } return ret; } @@ -2119,8 +2120,7 @@ public final class InputMethodManager { try { return mService.getInputMethodWindowVisibleHeight(); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); - return 0; + throw e.rethrowFromSystemServer(); } } } @@ -2139,8 +2139,7 @@ public final class InputMethodManager { try { return mService.switchToLastInputMethod(imeToken); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); - return false; + throw e.rethrowFromSystemServer(); } } } @@ -2160,8 +2159,7 @@ public final class InputMethodManager { try { return mService.switchToNextInputMethod(imeToken, onlyCurrentIme); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); - return false; + throw e.rethrowFromSystemServer(); } } } @@ -2182,8 +2180,7 @@ public final class InputMethodManager { try { return mService.shouldOfferSwitchingToNextInputMethod(imeToken); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); - return false; + throw e.rethrowFromSystemServer(); } } } @@ -2218,7 +2215,7 @@ public final class InputMethodManager { try { mService.setAdditionalInputMethodSubtypes(imiId, subtypes); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); + throw e.rethrowFromSystemServer(); } } } @@ -2228,8 +2225,7 @@ public final class InputMethodManager { try { return mService.getLastInputMethodSubtype(); } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); - return null; + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 496f7eee27f7..d2aef0ac362c 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -3078,7 +3078,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te final int motionPosition = mClickMotionPosition; if (adapter != null && mItemCount > 0 && motionPosition != INVALID_POSITION && - motionPosition < adapter.getCount() && sameWindow()) { + motionPosition < adapter.getCount() && sameWindow() && + adapter.isEnabled(motionPosition)) { final View view = getChildAt(motionPosition - mFirstPosition); // If there is no view, something bad happened (the view scrolled off the // screen, etc.) and we should cancel the click diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 87bee44611d8..6e3dbd8c5e1d 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -23,32 +23,17 @@ import android.content.res.Configuration; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; -import android.text.TextUtils; -import android.text.InputType; -import android.text.format.DateFormat; -import android.text.format.DateUtils; import android.util.AttributeSet; -import android.util.Log; import android.util.SparseArray; -import android.view.LayoutInflater; import android.view.View; import android.view.accessibility.AccessibilityEvent; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputMethodManager; -import android.widget.NumberPicker.OnValueChangeListener; import com.android.internal.R; -import java.text.DateFormatSymbols; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.Calendar; import java.util.Locale; import java.util.TimeZone; -import libcore.icu.ICU; - /** * Provides a widget for selecting a date. * <p> @@ -527,674 +512,123 @@ public class DatePicker extends FrameLayout { protected void onLocaleChanged(Locale locale) { // Stub. } - } - - /** - * A callback interface for updating input validity when the date picker - * when included into a dialog. - * - * @hide - */ - public static interface ValidationCallback { - void onValidationChanged(boolean valid); - } - - /** - * A delegate implementing the basic DatePicker - */ - private static class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate { - - private static final String DATE_FORMAT = "MM/dd/yyyy"; - - private static final int DEFAULT_START_YEAR = 1900; - - private static final int DEFAULT_END_YEAR = 2100; - - private static final boolean DEFAULT_CALENDAR_VIEW_SHOWN = true; - - private static final boolean DEFAULT_SPINNERS_SHOWN = true; - - private static final boolean DEFAULT_ENABLED_STATE = true; - - private final LinearLayout mSpinners; - - private final NumberPicker mDaySpinner; - - private final NumberPicker mMonthSpinner; - - private final NumberPicker mYearSpinner; - - private final EditText mDaySpinnerInput; - - private final EditText mMonthSpinnerInput; - private final EditText mYearSpinnerInput; - - private final CalendarView mCalendarView; - - private String[] mShortMonths; - - private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT); - - private int mNumberOfMonths; - - private Calendar mTempDate; - - private Calendar mMinDate; - - private Calendar mMaxDate; - - private Calendar mCurrentDate; - - private boolean mIsEnabled = DEFAULT_ENABLED_STATE; - - DatePickerSpinnerDelegate(DatePicker delegator, Context context, AttributeSet attrs, - int defStyleAttr, int defStyleRes) { - super(delegator, context); - - mDelegator = delegator; - mContext = context; - - // initialization based on locale - setCurrentLocale(Locale.getDefault()); - - final TypedArray attributesArray = context.obtainStyledAttributes(attrs, - R.styleable.DatePicker, defStyleAttr, defStyleRes); - boolean spinnersShown = attributesArray.getBoolean(R.styleable.DatePicker_spinnersShown, - DEFAULT_SPINNERS_SHOWN); - boolean calendarViewShown = attributesArray.getBoolean( - R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN); - int startYear = attributesArray.getInt(R.styleable.DatePicker_startYear, - DEFAULT_START_YEAR); - int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR); - String minDate = attributesArray.getString(R.styleable.DatePicker_minDate); - String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate); - int layoutResourceId = attributesArray.getResourceId( - R.styleable.DatePicker_legacyLayout, R.layout.date_picker_legacy); - attributesArray.recycle(); - - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(layoutResourceId, mDelegator, true); - - OnValueChangeListener onChangeListener = new OnValueChangeListener() { - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - updateInputState(); - mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis()); - // take care of wrapping of days and months to update greater fields - if (picker == mDaySpinner) { - int maxDayOfMonth = mTempDate.getActualMaximum(Calendar.DAY_OF_MONTH); - if (oldVal == maxDayOfMonth && newVal == 1) { - mTempDate.add(Calendar.DAY_OF_MONTH, 1); - } else if (oldVal == 1 && newVal == maxDayOfMonth) { - mTempDate.add(Calendar.DAY_OF_MONTH, -1); - } else { - mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal); - } - } else if (picker == mMonthSpinner) { - if (oldVal == 11 && newVal == 0) { - mTempDate.add(Calendar.MONTH, 1); - } else if (oldVal == 0 && newVal == 11) { - mTempDate.add(Calendar.MONTH, -1); - } else { - mTempDate.add(Calendar.MONTH, newVal - oldVal); - } - } else if (picker == mYearSpinner) { - mTempDate.set(Calendar.YEAR, newVal); - } else { - throw new IllegalArgumentException(); - } - // now set the date to the adjusted one - setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH), - mTempDate.get(Calendar.DAY_OF_MONTH)); - updateSpinners(); - updateCalendarView(); - notifyDateChanged(); - } - }; - - mSpinners = (LinearLayout) mDelegator.findViewById(R.id.pickers); - - // calendar view day-picker - mCalendarView = (CalendarView) mDelegator.findViewById(R.id.calendar_view); - mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { - public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) { - setDate(year, month, monthDay); - updateSpinners(); - notifyDateChanged(); - } - }); - - // day - mDaySpinner = (NumberPicker) mDelegator.findViewById(R.id.day); - mDaySpinner.setFormatter(NumberPicker.getTwoDigitFormatter()); - mDaySpinner.setOnLongPressUpdateInterval(100); - mDaySpinner.setOnValueChangedListener(onChangeListener); - mDaySpinnerInput = (EditText) mDaySpinner.findViewById(R.id.numberpicker_input); - - // month - mMonthSpinner = (NumberPicker) mDelegator.findViewById(R.id.month); - mMonthSpinner.setMinValue(0); - mMonthSpinner.setMaxValue(mNumberOfMonths - 1); - mMonthSpinner.setDisplayedValues(mShortMonths); - mMonthSpinner.setOnLongPressUpdateInterval(200); - mMonthSpinner.setOnValueChangedListener(onChangeListener); - mMonthSpinnerInput = (EditText) mMonthSpinner.findViewById(R.id.numberpicker_input); - - // year - mYearSpinner = (NumberPicker) mDelegator.findViewById(R.id.year); - mYearSpinner.setOnLongPressUpdateInterval(100); - mYearSpinner.setOnValueChangedListener(onChangeListener); - mYearSpinnerInput = (EditText) mYearSpinner.findViewById(R.id.numberpicker_input); - - // show only what the user required but make sure we - // show something and the spinners have higher priority - if (!spinnersShown && !calendarViewShown) { - setSpinnersShown(true); - } else { - setSpinnersShown(spinnersShown); - setCalendarViewShown(calendarViewShown); + /** + * Class for managing state storing/restoring. + */ + static class SavedState extends View.BaseSavedState { + private final int mSelectedYear; + private final int mSelectedMonth; + private final int mSelectedDay; + private final long mMinDate; + private final long mMaxDate; + private final int mCurrentView; + private final int mListPosition; + private final int mListPositionOffset; + + public SavedState(Parcelable superState, int year, int month, int day, long minDate, + long maxDate) { + this(superState, year, month, day, minDate, maxDate, 0, 0, 0); } - // set the min date giving priority of the minDate over startYear - mTempDate.clear(); - if (!TextUtils.isEmpty(minDate)) { - if (!parseDate(minDate, mTempDate)) { - mTempDate.set(startYear, 0, 1); - } - } else { - mTempDate.set(startYear, 0, 1); + /** + * Constructor called from {@link DatePicker#onSaveInstanceState()} + */ + public SavedState(Parcelable superState, int year, int month, int day, long minDate, + long maxDate, int currentView, int listPosition, int listPositionOffset) { + super(superState); + mSelectedYear = year; + mSelectedMonth = month; + mSelectedDay = day; + mMinDate = minDate; + mMaxDate = maxDate; + mCurrentView = currentView; + mListPosition = listPosition; + mListPositionOffset = listPositionOffset; } - setMinDate(mTempDate.getTimeInMillis()); - // set the max date giving priority of the maxDate over endYear - mTempDate.clear(); - if (!TextUtils.isEmpty(maxDate)) { - if (!parseDate(maxDate, mTempDate)) { - mTempDate.set(endYear, 11, 31); - } - } else { - mTempDate.set(endYear, 11, 31); + /** + * Constructor called from {@link #CREATOR} + */ + private SavedState(Parcel in) { + super(in); + mSelectedYear = in.readInt(); + mSelectedMonth = in.readInt(); + mSelectedDay = in.readInt(); + mMinDate = in.readLong(); + mMaxDate = in.readLong(); + mCurrentView = in.readInt(); + mListPosition = in.readInt(); + mListPositionOffset = in.readInt(); } - setMaxDate(mTempDate.getTimeInMillis()); - // initialize to current date - mCurrentDate.setTimeInMillis(System.currentTimeMillis()); - init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), mCurrentDate - .get(Calendar.DAY_OF_MONTH), null); - - // re-order the number spinners to match the current date format - reorderSpinners(); - - // accessibility - setContentDescriptions(); - - // If not explicitly specified this view is important for accessibility. - if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { - mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeInt(mSelectedYear); + dest.writeInt(mSelectedMonth); + dest.writeInt(mSelectedDay); + dest.writeLong(mMinDate); + dest.writeLong(mMaxDate); + dest.writeInt(mCurrentView); + dest.writeInt(mListPosition); + dest.writeInt(mListPositionOffset); } - } - - @Override - public void init(int year, int monthOfYear, int dayOfMonth, - OnDateChangedListener onDateChangedListener) { - setDate(year, monthOfYear, dayOfMonth); - updateSpinners(); - updateCalendarView(); - mOnDateChangedListener = onDateChangedListener; - } - @Override - public void updateDate(int year, int month, int dayOfMonth) { - if (!isNewDate(year, month, dayOfMonth)) { - return; + public int getSelectedDay() { + return mSelectedDay; } - setDate(year, month, dayOfMonth); - updateSpinners(); - updateCalendarView(); - notifyDateChanged(); - } - - @Override - public int getYear() { - return mCurrentDate.get(Calendar.YEAR); - } - - @Override - public int getMonth() { - return mCurrentDate.get(Calendar.MONTH); - } - @Override - public int getDayOfMonth() { - return mCurrentDate.get(Calendar.DAY_OF_MONTH); - } - - @Override - public void setFirstDayOfWeek(int firstDayOfWeek) { - mCalendarView.setFirstDayOfWeek(firstDayOfWeek); - } - - @Override - public int getFirstDayOfWeek() { - return mCalendarView.getFirstDayOfWeek(); - } - - @Override - public void setMinDate(long minDate) { - mTempDate.setTimeInMillis(minDate); - if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) - && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) { - return; - } - mMinDate.setTimeInMillis(minDate); - mCalendarView.setMinDate(minDate); - if (mCurrentDate.before(mMinDate)) { - mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); - updateCalendarView(); + public int getSelectedMonth() { + return mSelectedMonth; } - updateSpinners(); - } - - @Override - public Calendar getMinDate() { - final Calendar minDate = Calendar.getInstance(); - minDate.setTimeInMillis(mCalendarView.getMinDate()); - return minDate; - } - @Override - public void setMaxDate(long maxDate) { - mTempDate.setTimeInMillis(maxDate); - if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) - && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { - return; - } - mMaxDate.setTimeInMillis(maxDate); - mCalendarView.setMaxDate(maxDate); - if (mCurrentDate.after(mMaxDate)) { - mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); - updateCalendarView(); + public int getSelectedYear() { + return mSelectedYear; } - updateSpinners(); - } - - @Override - public Calendar getMaxDate() { - final Calendar maxDate = Calendar.getInstance(); - maxDate.setTimeInMillis(mCalendarView.getMaxDate()); - return maxDate; - } - - @Override - public void setEnabled(boolean enabled) { - mDaySpinner.setEnabled(enabled); - mMonthSpinner.setEnabled(enabled); - mYearSpinner.setEnabled(enabled); - mCalendarView.setEnabled(enabled); - mIsEnabled = enabled; - } - - @Override - public boolean isEnabled() { - return mIsEnabled; - } - - @Override - public CalendarView getCalendarView() { - return mCalendarView; - } - - @Override - public void setCalendarViewShown(boolean shown) { - mCalendarView.setVisibility(shown ? VISIBLE : GONE); - } - - @Override - public boolean getCalendarViewShown() { - return (mCalendarView.getVisibility() == View.VISIBLE); - } - @Override - public void setSpinnersShown(boolean shown) { - mSpinners.setVisibility(shown ? VISIBLE : GONE); - } - - @Override - public boolean getSpinnersShown() { - return mSpinners.isShown(); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - setCurrentLocale(newConfig.locale); - } - - @Override - public Parcelable onSaveInstanceState(Parcelable superState) { - return new SavedState(superState, getYear(), getMonth(), getDayOfMonth()); - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState ss = (SavedState) state; - setDate(ss.mYear, ss.mMonth, ss.mDay); - updateSpinners(); - updateCalendarView(); - } - - @Override - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - onPopulateAccessibilityEvent(event); - return true; - } - - @Override - public void onPopulateAccessibilityEvent(AccessibilityEvent event) { - final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR; - String selectedDateUtterance = DateUtils.formatDateTime(mContext, - mCurrentDate.getTimeInMillis(), flags); - event.getText().add(selectedDateUtterance); - } - - /** - * Sets the current locale. - * - * @param locale The current locale. - */ - @Override - protected void setCurrentLocale(Locale locale) { - super.setCurrentLocale(locale); - - mTempDate = getCalendarForLocale(mTempDate, locale); - mMinDate = getCalendarForLocale(mMinDate, locale); - mMaxDate = getCalendarForLocale(mMaxDate, locale); - mCurrentDate = getCalendarForLocale(mCurrentDate, locale); - - mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1; - mShortMonths = new DateFormatSymbols().getShortMonths(); - - if (usingNumericMonths()) { - // We're in a locale where a date should either be all-numeric, or all-text. - // All-text would require custom NumberPicker formatters for day and year. - mShortMonths = new String[mNumberOfMonths]; - for (int i = 0; i < mNumberOfMonths; ++i) { - mShortMonths[i] = String.format("%d", i + 1); - } + public long getMinDate() { + return mMinDate; } - } - /** - * Tests whether the current locale is one where there are no real month names, - * such as Chinese, Japanese, or Korean locales. - */ - private boolean usingNumericMonths() { - return Character.isDigit(mShortMonths[Calendar.JANUARY].charAt(0)); - } - - /** - * Gets a calendar for locale bootstrapped with the value of a given calendar. - * - * @param oldCalendar The old calendar. - * @param locale The locale. - */ - private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) { - if (oldCalendar == null) { - return Calendar.getInstance(locale); - } else { - final long currentTimeMillis = oldCalendar.getTimeInMillis(); - Calendar newCalendar = Calendar.getInstance(locale); - newCalendar.setTimeInMillis(currentTimeMillis); - return newCalendar; + public long getMaxDate() { + return mMaxDate; } - } - /** - * Reorders the spinners according to the date format that is - * explicitly set by the user and if no such is set fall back - * to the current locale's default format. - */ - private void reorderSpinners() { - mSpinners.removeAllViews(); - // We use numeric spinners for year and day, but textual months. Ask icu4c what - // order the user's locale uses for that combination. http://b/7207103. - String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "yyyyMMMdd"); - char[] order = ICU.getDateFormatOrder(pattern); - final int spinnerCount = order.length; - for (int i = 0; i < spinnerCount; i++) { - switch (order[i]) { - case 'd': - mSpinners.addView(mDaySpinner); - setImeOptions(mDaySpinner, spinnerCount, i); - break; - case 'M': - mSpinners.addView(mMonthSpinner); - setImeOptions(mMonthSpinner, spinnerCount, i); - break; - case 'y': - mSpinners.addView(mYearSpinner); - setImeOptions(mYearSpinner, spinnerCount, i); - break; - default: - throw new IllegalArgumentException(Arrays.toString(order)); - } + public int getCurrentView() { + return mCurrentView; } - } - - /** - * Parses the given <code>date</code> and in case of success sets the result - * to the <code>outDate</code>. - * - * @return True if the date was parsed. - */ - private boolean parseDate(String date, Calendar outDate) { - try { - outDate.setTime(mDateFormat.parse(date)); - return true; - } catch (ParseException e) { - Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT); - return false; - } - } - - private boolean isNewDate(int year, int month, int dayOfMonth) { - return (mCurrentDate.get(Calendar.YEAR) != year - || mCurrentDate.get(Calendar.MONTH) != month - || mCurrentDate.get(Calendar.DAY_OF_MONTH) != dayOfMonth); - } - private void setDate(int year, int month, int dayOfMonth) { - mCurrentDate.set(year, month, dayOfMonth); - if (mCurrentDate.before(mMinDate)) { - mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); - } else if (mCurrentDate.after(mMaxDate)) { - mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); + public int getListPosition() { + return mListPosition; } - } - private void updateSpinners() { - // set the spinner ranges respecting the min and max dates - if (mCurrentDate.equals(mMinDate)) { - mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); - mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); - mDaySpinner.setWrapSelectorWheel(false); - mMonthSpinner.setDisplayedValues(null); - mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH)); - mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH)); - mMonthSpinner.setWrapSelectorWheel(false); - } else if (mCurrentDate.equals(mMaxDate)) { - mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH)); - mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); - mDaySpinner.setWrapSelectorWheel(false); - mMonthSpinner.setDisplayedValues(null); - mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH)); - mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH)); - mMonthSpinner.setWrapSelectorWheel(false); - } else { - mDaySpinner.setMinValue(1); - mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); - mDaySpinner.setWrapSelectorWheel(true); - mMonthSpinner.setDisplayedValues(null); - mMonthSpinner.setMinValue(0); - mMonthSpinner.setMaxValue(11); - mMonthSpinner.setWrapSelectorWheel(true); + public int getListPositionOffset() { + return mListPositionOffset; } - // make sure the month names are a zero based array - // with the months in the month spinner - String[] displayedValues = Arrays.copyOfRange(mShortMonths, - mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1); - mMonthSpinner.setDisplayedValues(displayedValues); - - // year spinner range does not change based on the current date - mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); - mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); - mYearSpinner.setWrapSelectorWheel(false); - - // set the spinner values - mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR)); - mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); - mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); + @SuppressWarnings("all") + // suppress unused and hiding + public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { - if (usingNumericMonths()) { - mMonthSpinnerInput.setRawInputType(InputType.TYPE_CLASS_NUMBER); - } - } - - /** - * Updates the calendar view with the current date. - */ - private void updateCalendarView() { - mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false); - } - - - /** - * Notifies the listener, if such, for a change in the selected date. - */ - private void notifyDateChanged() { - mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); - if (mOnDateChangedListener != null) { - mOnDateChangedListener.onDateChanged(mDelegator, getYear(), getMonth(), - getDayOfMonth()); - } - } - - /** - * Sets the IME options for a spinner based on its ordering. - * - * @param spinner The spinner. - * @param spinnerCount The total spinner count. - * @param spinnerIndex The index of the given spinner. - */ - private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) { - final int imeOptions; - if (spinnerIndex < spinnerCount - 1) { - imeOptions = EditorInfo.IME_ACTION_NEXT; - } else { - imeOptions = EditorInfo.IME_ACTION_DONE; - } - TextView input = (TextView) spinner.findViewById(R.id.numberpicker_input); - input.setImeOptions(imeOptions); - } - - private void setContentDescriptions() { - // Day - trySetContentDescription(mDaySpinner, R.id.increment, - R.string.date_picker_increment_day_button); - trySetContentDescription(mDaySpinner, R.id.decrement, - R.string.date_picker_decrement_day_button); - // Month - trySetContentDescription(mMonthSpinner, R.id.increment, - R.string.date_picker_increment_month_button); - trySetContentDescription(mMonthSpinner, R.id.decrement, - R.string.date_picker_decrement_month_button); - // Year - trySetContentDescription(mYearSpinner, R.id.increment, - R.string.date_picker_increment_year_button); - trySetContentDescription(mYearSpinner, R.id.decrement, - R.string.date_picker_decrement_year_button); - } - - private void trySetContentDescription(View root, int viewId, int contDescResId) { - View target = root.findViewById(viewId); - if (target != null) { - target.setContentDescription(mContext.getString(contDescResId)); - } - } + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } - private void updateInputState() { - // Make sure that if the user changes the value and the IME is active - // for one of the inputs if this widget, the IME is closed. If the user - // changed the value via the IME and there is a next input the IME will - // be shown, otherwise the user chose another means of changing the - // value and having the IME up makes no sense. - InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); - if (inputMethodManager != null) { - if (inputMethodManager.isActive(mYearSpinnerInput)) { - mYearSpinnerInput.clearFocus(); - inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); - } else if (inputMethodManager.isActive(mMonthSpinnerInput)) { - mMonthSpinnerInput.clearFocus(); - inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); - } else if (inputMethodManager.isActive(mDaySpinnerInput)) { - mDaySpinnerInput.clearFocus(); - inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); + public SavedState[] newArray(int size) { + return new SavedState[size]; } - } + }; } } /** - * Class for managing state storing/restoring. + * A callback interface for updating input validity when the date picker + * when included into a dialog. + * + * @hide */ - private static class SavedState extends BaseSavedState { - - private final int mYear; - - private final int mMonth; - - private final int mDay; - - /** - * Constructor called from {@link DatePicker#onSaveInstanceState()} - */ - private SavedState(Parcelable superState, int year, int month, int day) { - super(superState); - mYear = year; - mMonth = month; - mDay = day; - } - - /** - * Constructor called from {@link #CREATOR} - */ - private SavedState(Parcel in) { - super(in); - mYear = in.readInt(); - mMonth = in.readInt(); - mDay = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(mYear); - dest.writeInt(mMonth); - dest.writeInt(mDay); - } - - @SuppressWarnings("all") - // suppress unused and hiding - public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { - - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; + public interface ValidationCallback { + void onValidationChanged(boolean valid); } } diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java index cbb61093cd39..5adac0195701 100755 --- a/core/java/android/widget/DatePickerCalendarDelegate.java +++ b/core/java/android/widget/DatePickerCalendarDelegate.java @@ -16,13 +16,14 @@ package android.widget; +import com.android.internal.R; + import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; -import android.os.Parcel; import android.os.Parcelable; import android.text.format.DateFormat; import android.text.format.DateUtils; @@ -37,8 +38,6 @@ import android.view.accessibility.AccessibilityEvent; import android.widget.DayPickerView.OnDaySelectedListener; import android.widget.YearPickerView.OnYearSelectedListener; -import com.android.internal.R; - import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; @@ -550,25 +549,27 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { @Override public void onRestoreInstanceState(Parcelable state) { - final SavedState ss = (SavedState) state; - - // TODO: Move instance state into DayPickerView, YearPickerView. - mCurrentDate.set(ss.getSelectedYear(), ss.getSelectedMonth(), ss.getSelectedDay()); - mMinDate.setTimeInMillis(ss.getMinDate()); - mMaxDate.setTimeInMillis(ss.getMaxDate()); - - onCurrentDateChanged(false); - - final int currentView = ss.getCurrentView(); - setCurrentView(currentView); - - final int listPosition = ss.getListPosition(); - if (listPosition != -1) { - if (currentView == VIEW_MONTH_DAY) { - mDayPickerView.setPosition(listPosition); - } else if (currentView == VIEW_YEAR) { - final int listPositionOffset = ss.getListPositionOffset(); - mYearPickerView.setSelectionFromTop(listPosition, listPositionOffset); + if (state instanceof SavedState) { + final SavedState ss = (SavedState) state; + + // TODO: Move instance state into DayPickerView, YearPickerView. + mCurrentDate.set(ss.getSelectedYear(), ss.getSelectedMonth(), ss.getSelectedDay()); + mMinDate.setTimeInMillis(ss.getMinDate()); + mMaxDate.setTimeInMillis(ss.getMaxDate()); + + onCurrentDateChanged(false); + + final int currentView = ss.getCurrentView(); + setCurrentView(currentView); + + final int listPosition = ss.getListPosition(); + if (listPosition != -1) { + if (currentView == VIEW_MONTH_DAY) { + mDayPickerView.setPosition(listPosition); + } else if (currentView == VIEW_YEAR) { + final int listPositionOffset = ss.getListPositionOffset(); + mYearPickerView.setSelectionFromTop(listPosition, listPositionOffset); + } } } } @@ -613,108 +614,4 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { private void tryVibrate() { mDelegator.performHapticFeedback(HapticFeedbackConstants.CALENDAR_DATE); } - - /** - * Class for managing state storing/restoring. - */ - private static class SavedState extends View.BaseSavedState { - private final int mSelectedYear; - private final int mSelectedMonth; - private final int mSelectedDay; - private final long mMinDate; - private final long mMaxDate; - private final int mCurrentView; - private final int mListPosition; - private final int mListPositionOffset; - - /** - * Constructor called from {@link DatePicker#onSaveInstanceState()} - */ - private SavedState(Parcelable superState, int year, int month, int day, - long minDate, long maxDate, int currentView, int listPosition, - int listPositionOffset) { - super(superState); - mSelectedYear = year; - mSelectedMonth = month; - mSelectedDay = day; - mMinDate = minDate; - mMaxDate = maxDate; - mCurrentView = currentView; - mListPosition = listPosition; - mListPositionOffset = listPositionOffset; - } - - /** - * Constructor called from {@link #CREATOR} - */ - private SavedState(Parcel in) { - super(in); - mSelectedYear = in.readInt(); - mSelectedMonth = in.readInt(); - mSelectedDay = in.readInt(); - mMinDate = in.readLong(); - mMaxDate = in.readLong(); - mCurrentView = in.readInt(); - mListPosition = in.readInt(); - mListPositionOffset = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(mSelectedYear); - dest.writeInt(mSelectedMonth); - dest.writeInt(mSelectedDay); - dest.writeLong(mMinDate); - dest.writeLong(mMaxDate); - dest.writeInt(mCurrentView); - dest.writeInt(mListPosition); - dest.writeInt(mListPositionOffset); - } - - public int getSelectedDay() { - return mSelectedDay; - } - - public int getSelectedMonth() { - return mSelectedMonth; - } - - public int getSelectedYear() { - return mSelectedYear; - } - - public long getMinDate() { - return mMinDate; - } - - public long getMaxDate() { - return mMaxDate; - } - - public int getCurrentView() { - return mCurrentView; - } - - public int getListPosition() { - return mListPosition; - } - - public int getListPositionOffset() { - return mListPositionOffset; - } - - @SuppressWarnings("all") - // suppress unused and hiding - public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { - - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } } diff --git a/core/java/android/widget/DatePickerSpinnerDelegate.java b/core/java/android/widget/DatePickerSpinnerDelegate.java new file mode 100644 index 000000000000..255de79dbf32 --- /dev/null +++ b/core/java/android/widget/DatePickerSpinnerDelegate.java @@ -0,0 +1,652 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.os.Parcelable; +import android.text.InputType; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.text.format.DateUtils; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.DatePicker.AbstractDatePickerDelegate; +import android.widget.NumberPicker.OnValueChangeListener; + +import java.text.DateFormatSymbols; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Locale; + +import libcore.icu.ICU; + +/** + * A delegate implementing the basic DatePicker + */ +class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate { + + private static final String DATE_FORMAT = "MM/dd/yyyy"; + + private static final int DEFAULT_START_YEAR = 1900; + + private static final int DEFAULT_END_YEAR = 2100; + + private static final boolean DEFAULT_CALENDAR_VIEW_SHOWN = true; + + private static final boolean DEFAULT_SPINNERS_SHOWN = true; + + private static final boolean DEFAULT_ENABLED_STATE = true; + + private final LinearLayout mSpinners; + + private final NumberPicker mDaySpinner; + + private final NumberPicker mMonthSpinner; + + private final NumberPicker mYearSpinner; + + private final EditText mDaySpinnerInput; + + private final EditText mMonthSpinnerInput; + + private final EditText mYearSpinnerInput; + + private final CalendarView mCalendarView; + + private String[] mShortMonths; + + private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT); + + private int mNumberOfMonths; + + private Calendar mTempDate; + + private Calendar mMinDate; + + private Calendar mMaxDate; + + private Calendar mCurrentDate; + + private boolean mIsEnabled = DEFAULT_ENABLED_STATE; + + DatePickerSpinnerDelegate(DatePicker delegator, Context context, AttributeSet attrs, + int defStyleAttr, int defStyleRes) { + super(delegator, context); + + mDelegator = delegator; + mContext = context; + + // initialization based on locale + setCurrentLocale(Locale.getDefault()); + + final TypedArray attributesArray = context.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.DatePicker, defStyleAttr, defStyleRes); + boolean spinnersShown = attributesArray.getBoolean(com.android.internal.R.styleable.DatePicker_spinnersShown, + DEFAULT_SPINNERS_SHOWN); + boolean calendarViewShown = attributesArray.getBoolean( + com.android.internal.R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN); + int startYear = attributesArray.getInt(com.android.internal.R.styleable.DatePicker_startYear, + DEFAULT_START_YEAR); + int endYear = attributesArray.getInt(com.android.internal.R.styleable.DatePicker_endYear, DEFAULT_END_YEAR); + String minDate = attributesArray.getString(com.android.internal.R.styleable.DatePicker_minDate); + String maxDate = attributesArray.getString(com.android.internal.R.styleable.DatePicker_maxDate); + int layoutResourceId = attributesArray.getResourceId( + com.android.internal.R.styleable.DatePicker_legacyLayout, com.android.internal.R.layout.date_picker_legacy); + attributesArray.recycle(); + + LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + inflater.inflate(layoutResourceId, mDelegator, true); + + OnValueChangeListener onChangeListener = new OnValueChangeListener() { + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + updateInputState(); + mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis()); + // take care of wrapping of days and months to update greater fields + if (picker == mDaySpinner) { + int maxDayOfMonth = mTempDate.getActualMaximum(Calendar.DAY_OF_MONTH); + if (oldVal == maxDayOfMonth && newVal == 1) { + mTempDate.add(Calendar.DAY_OF_MONTH, 1); + } else if (oldVal == 1 && newVal == maxDayOfMonth) { + mTempDate.add(Calendar.DAY_OF_MONTH, -1); + } else { + mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal); + } + } else if (picker == mMonthSpinner) { + if (oldVal == 11 && newVal == 0) { + mTempDate.add(Calendar.MONTH, 1); + } else if (oldVal == 0 && newVal == 11) { + mTempDate.add(Calendar.MONTH, -1); + } else { + mTempDate.add(Calendar.MONTH, newVal - oldVal); + } + } else if (picker == mYearSpinner) { + mTempDate.set(Calendar.YEAR, newVal); + } else { + throw new IllegalArgumentException(); + } + // now set the date to the adjusted one + setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH), + mTempDate.get(Calendar.DAY_OF_MONTH)); + updateSpinners(); + updateCalendarView(); + notifyDateChanged(); + } + }; + + mSpinners = (LinearLayout) mDelegator.findViewById(com.android.internal.R.id.pickers); + + // calendar view day-picker + mCalendarView = (CalendarView) mDelegator.findViewById(com.android.internal.R.id.calendar_view); + mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { + public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) { + setDate(year, month, monthDay); + updateSpinners(); + notifyDateChanged(); + } + }); + + // day + mDaySpinner = (NumberPicker) mDelegator.findViewById(com.android.internal.R.id.day); + mDaySpinner.setFormatter(NumberPicker.getTwoDigitFormatter()); + mDaySpinner.setOnLongPressUpdateInterval(100); + mDaySpinner.setOnValueChangedListener(onChangeListener); + mDaySpinnerInput = (EditText) mDaySpinner.findViewById(com.android.internal.R.id.numberpicker_input); + + // month + mMonthSpinner = (NumberPicker) mDelegator.findViewById(com.android.internal.R.id.month); + mMonthSpinner.setMinValue(0); + mMonthSpinner.setMaxValue(mNumberOfMonths - 1); + mMonthSpinner.setDisplayedValues(mShortMonths); + mMonthSpinner.setOnLongPressUpdateInterval(200); + mMonthSpinner.setOnValueChangedListener(onChangeListener); + mMonthSpinnerInput = (EditText) mMonthSpinner.findViewById(com.android.internal.R.id.numberpicker_input); + + // year + mYearSpinner = (NumberPicker) mDelegator.findViewById(com.android.internal.R.id.year); + mYearSpinner.setOnLongPressUpdateInterval(100); + mYearSpinner.setOnValueChangedListener(onChangeListener); + mYearSpinnerInput = (EditText) mYearSpinner.findViewById(com.android.internal.R.id.numberpicker_input); + + // show only what the user required but make sure we + // show something and the spinners have higher priority + if (!spinnersShown && !calendarViewShown) { + setSpinnersShown(true); + } else { + setSpinnersShown(spinnersShown); + setCalendarViewShown(calendarViewShown); + } + + // set the min date giving priority of the minDate over startYear + mTempDate.clear(); + if (!TextUtils.isEmpty(minDate)) { + if (!parseDate(minDate, mTempDate)) { + mTempDate.set(startYear, 0, 1); + } + } else { + mTempDate.set(startYear, 0, 1); + } + setMinDate(mTempDate.getTimeInMillis()); + + // set the max date giving priority of the maxDate over endYear + mTempDate.clear(); + if (!TextUtils.isEmpty(maxDate)) { + if (!parseDate(maxDate, mTempDate)) { + mTempDate.set(endYear, 11, 31); + } + } else { + mTempDate.set(endYear, 11, 31); + } + setMaxDate(mTempDate.getTimeInMillis()); + + // initialize to current date + mCurrentDate.setTimeInMillis(System.currentTimeMillis()); + init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), mCurrentDate + .get(Calendar.DAY_OF_MONTH), null); + + // re-order the number spinners to match the current date format + reorderSpinners(); + + // accessibility + setContentDescriptions(); + + // If not explicitly specified this view is important for accessibility. + if (mDelegator.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { + mDelegator.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + } + } + + @Override + public void init(int year, int monthOfYear, int dayOfMonth, + DatePicker.OnDateChangedListener onDateChangedListener) { + setDate(year, monthOfYear, dayOfMonth); + updateSpinners(); + updateCalendarView(); + mOnDateChangedListener = onDateChangedListener; + } + + @Override + public void updateDate(int year, int month, int dayOfMonth) { + if (!isNewDate(year, month, dayOfMonth)) { + return; + } + setDate(year, month, dayOfMonth); + updateSpinners(); + updateCalendarView(); + notifyDateChanged(); + } + + @Override + public int getYear() { + return mCurrentDate.get(Calendar.YEAR); + } + + @Override + public int getMonth() { + return mCurrentDate.get(Calendar.MONTH); + } + + @Override + public int getDayOfMonth() { + return mCurrentDate.get(Calendar.DAY_OF_MONTH); + } + + @Override + public void setFirstDayOfWeek(int firstDayOfWeek) { + mCalendarView.setFirstDayOfWeek(firstDayOfWeek); + } + + @Override + public int getFirstDayOfWeek() { + return mCalendarView.getFirstDayOfWeek(); + } + + @Override + public void setMinDate(long minDate) { + mTempDate.setTimeInMillis(minDate); + if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) + && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) { + return; + } + mMinDate.setTimeInMillis(minDate); + mCalendarView.setMinDate(minDate); + if (mCurrentDate.before(mMinDate)) { + mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); + updateCalendarView(); + } + updateSpinners(); + } + + @Override + public Calendar getMinDate() { + final Calendar minDate = Calendar.getInstance(); + minDate.setTimeInMillis(mCalendarView.getMinDate()); + return minDate; + } + + @Override + public void setMaxDate(long maxDate) { + mTempDate.setTimeInMillis(maxDate); + if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) + && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { + return; + } + mMaxDate.setTimeInMillis(maxDate); + mCalendarView.setMaxDate(maxDate); + if (mCurrentDate.after(mMaxDate)) { + mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); + updateCalendarView(); + } + updateSpinners(); + } + + @Override + public Calendar getMaxDate() { + final Calendar maxDate = Calendar.getInstance(); + maxDate.setTimeInMillis(mCalendarView.getMaxDate()); + return maxDate; + } + + @Override + public void setEnabled(boolean enabled) { + mDaySpinner.setEnabled(enabled); + mMonthSpinner.setEnabled(enabled); + mYearSpinner.setEnabled(enabled); + mCalendarView.setEnabled(enabled); + mIsEnabled = enabled; + } + + @Override + public boolean isEnabled() { + return mIsEnabled; + } + + @Override + public CalendarView getCalendarView() { + return mCalendarView; + } + + @Override + public void setCalendarViewShown(boolean shown) { + mCalendarView.setVisibility(shown ? View.VISIBLE : View.GONE); + } + + @Override + public boolean getCalendarViewShown() { + return (mCalendarView.getVisibility() == View.VISIBLE); + } + + @Override + public void setSpinnersShown(boolean shown) { + mSpinners.setVisibility(shown ? View.VISIBLE : View.GONE); + } + + @Override + public boolean getSpinnersShown() { + return mSpinners.isShown(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + setCurrentLocale(newConfig.locale); + } + + @Override + public Parcelable onSaveInstanceState(Parcelable superState) { + return new SavedState(superState, getYear(), getMonth(), getDayOfMonth(), + getMinDate().getTimeInMillis(), getMaxDate().getTimeInMillis()); + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + if (state instanceof SavedState) { + final SavedState ss = (SavedState) state; + setDate(ss.getSelectedYear(), ss.getSelectedMonth(), ss.getSelectedDay()); + updateSpinners(); + updateCalendarView(); + } + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + onPopulateAccessibilityEvent(event); + return true; + } + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR; + String selectedDateUtterance = DateUtils.formatDateTime(mContext, + mCurrentDate.getTimeInMillis(), flags); + event.getText().add(selectedDateUtterance); + } + + /** + * Sets the current locale. + * + * @param locale The current locale. + */ + @Override + protected void setCurrentLocale(Locale locale) { + super.setCurrentLocale(locale); + + mTempDate = getCalendarForLocale(mTempDate, locale); + mMinDate = getCalendarForLocale(mMinDate, locale); + mMaxDate = getCalendarForLocale(mMaxDate, locale); + mCurrentDate = getCalendarForLocale(mCurrentDate, locale); + + mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1; + mShortMonths = new DateFormatSymbols().getShortMonths(); + + if (usingNumericMonths()) { + // We're in a locale where a date should either be all-numeric, or all-text. + // All-text would require custom NumberPicker formatters for day and year. + mShortMonths = new String[mNumberOfMonths]; + for (int i = 0; i < mNumberOfMonths; ++i) { + mShortMonths[i] = String.format("%d", i + 1); + } + } + } + + /** + * Tests whether the current locale is one where there are no real month names, + * such as Chinese, Japanese, or Korean locales. + */ + private boolean usingNumericMonths() { + return Character.isDigit(mShortMonths[Calendar.JANUARY].charAt(0)); + } + + /** + * Gets a calendar for locale bootstrapped with the value of a given calendar. + * + * @param oldCalendar The old calendar. + * @param locale The locale. + */ + private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) { + if (oldCalendar == null) { + return Calendar.getInstance(locale); + } else { + final long currentTimeMillis = oldCalendar.getTimeInMillis(); + Calendar newCalendar = Calendar.getInstance(locale); + newCalendar.setTimeInMillis(currentTimeMillis); + return newCalendar; + } + } + + /** + * Reorders the spinners according to the date format that is + * explicitly set by the user and if no such is set fall back + * to the current locale's default format. + */ + private void reorderSpinners() { + mSpinners.removeAllViews(); + // We use numeric spinners for year and day, but textual months. Ask icu4c what + // order the user's locale uses for that combination. http://b/7207103. + String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "yyyyMMMdd"); + char[] order = ICU.getDateFormatOrder(pattern); + final int spinnerCount = order.length; + for (int i = 0; i < spinnerCount; i++) { + switch (order[i]) { + case 'd': + mSpinners.addView(mDaySpinner); + setImeOptions(mDaySpinner, spinnerCount, i); + break; + case 'M': + mSpinners.addView(mMonthSpinner); + setImeOptions(mMonthSpinner, spinnerCount, i); + break; + case 'y': + mSpinners.addView(mYearSpinner); + setImeOptions(mYearSpinner, spinnerCount, i); + break; + default: + throw new IllegalArgumentException(Arrays.toString(order)); + } + } + } + + /** + * Parses the given <code>date</code> and in case of success sets the result + * to the <code>outDate</code>. + * + * @return True if the date was parsed. + */ + private boolean parseDate(String date, Calendar outDate) { + try { + outDate.setTime(mDateFormat.parse(date)); + return true; + } catch (ParseException e) { + e.printStackTrace(); + return false; + } + } + + private boolean isNewDate(int year, int month, int dayOfMonth) { + return (mCurrentDate.get(Calendar.YEAR) != year + || mCurrentDate.get(Calendar.MONTH) != month + || mCurrentDate.get(Calendar.DAY_OF_MONTH) != dayOfMonth); + } + + private void setDate(int year, int month, int dayOfMonth) { + mCurrentDate.set(year, month, dayOfMonth); + if (mCurrentDate.before(mMinDate)) { + mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); + } else if (mCurrentDate.after(mMaxDate)) { + mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); + } + } + + private void updateSpinners() { + // set the spinner ranges respecting the min and max dates + if (mCurrentDate.equals(mMinDate)) { + mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); + mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); + mDaySpinner.setWrapSelectorWheel(false); + mMonthSpinner.setDisplayedValues(null); + mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH)); + mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH)); + mMonthSpinner.setWrapSelectorWheel(false); + } else if (mCurrentDate.equals(mMaxDate)) { + mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH)); + mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); + mDaySpinner.setWrapSelectorWheel(false); + mMonthSpinner.setDisplayedValues(null); + mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH)); + mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH)); + mMonthSpinner.setWrapSelectorWheel(false); + } else { + mDaySpinner.setMinValue(1); + mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); + mDaySpinner.setWrapSelectorWheel(true); + mMonthSpinner.setDisplayedValues(null); + mMonthSpinner.setMinValue(0); + mMonthSpinner.setMaxValue(11); + mMonthSpinner.setWrapSelectorWheel(true); + } + + // make sure the month names are a zero based array + // with the months in the month spinner + String[] displayedValues = Arrays.copyOfRange(mShortMonths, + mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1); + mMonthSpinner.setDisplayedValues(displayedValues); + + // year spinner range does not change based on the current date + mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); + mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); + mYearSpinner.setWrapSelectorWheel(false); + + // set the spinner values + mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR)); + mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); + mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); + + if (usingNumericMonths()) { + mMonthSpinnerInput.setRawInputType(InputType.TYPE_CLASS_NUMBER); + } + } + + /** + * Updates the calendar view with the current date. + */ + private void updateCalendarView() { + mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false); + } + + + /** + * Notifies the listener, if such, for a change in the selected date. + */ + private void notifyDateChanged() { + mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + if (mOnDateChangedListener != null) { + mOnDateChangedListener.onDateChanged(mDelegator, getYear(), getMonth(), + getDayOfMonth()); + } + } + + /** + * Sets the IME options for a spinner based on its ordering. + * + * @param spinner The spinner. + * @param spinnerCount The total spinner count. + * @param spinnerIndex The index of the given spinner. + */ + private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) { + final int imeOptions; + if (spinnerIndex < spinnerCount - 1) { + imeOptions = EditorInfo.IME_ACTION_NEXT; + } else { + imeOptions = EditorInfo.IME_ACTION_DONE; + } + TextView input = (TextView) spinner.findViewById(com.android.internal.R.id.numberpicker_input); + input.setImeOptions(imeOptions); + } + + private void setContentDescriptions() { + // Day + trySetContentDescription(mDaySpinner, com.android.internal.R.id.increment, + com.android.internal.R.string.date_picker_increment_day_button); + trySetContentDescription(mDaySpinner, com.android.internal.R.id.decrement, + com.android.internal.R.string.date_picker_decrement_day_button); + // Month + trySetContentDescription(mMonthSpinner, com.android.internal.R.id.increment, + com.android.internal.R.string.date_picker_increment_month_button); + trySetContentDescription(mMonthSpinner, com.android.internal.R.id.decrement, + com.android.internal.R.string.date_picker_decrement_month_button); + // Year + trySetContentDescription(mYearSpinner, com.android.internal.R.id.increment, + com.android.internal.R.string.date_picker_increment_year_button); + trySetContentDescription(mYearSpinner, com.android.internal.R.id.decrement, + com.android.internal.R.string.date_picker_decrement_year_button); + } + + private void trySetContentDescription(View root, int viewId, int contDescResId) { + View target = root.findViewById(viewId); + if (target != null) { + target.setContentDescription(mContext.getString(contDescResId)); + } + } + + private void updateInputState() { + // Make sure that if the user changes the value and the IME is active + // for one of the inputs if this widget, the IME is closed. If the user + // changed the value via the IME and there is a next input the IME will + // be shown, otherwise the user chose another means of changing the + // value and having the IME up makes no sense. + InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); + if (inputMethodManager != null) { + if (inputMethodManager.isActive(mYearSpinnerInput)) { + mYearSpinnerInput.clearFocus(); + inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); + } else if (inputMethodManager.isActive(mMonthSpinnerInput)) { + mMonthSpinnerInput.clearFocus(); + inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); + } else if (inputMethodManager.isActive(mDaySpinnerInput)) { + mDaySpinnerInput.clearFocus(); + inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); + } + } + } +} diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 54b3932dfeb2..df2f57589361 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -23,7 +23,6 @@ import com.android.internal.R; import android.annotation.NonNull; import android.content.Context; -import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.PixelFormat; import android.graphics.Rect; @@ -1587,18 +1586,16 @@ public class PopupWindow { public int getMaxAvailableHeight( @NonNull View anchor, int yOffset, boolean ignoreBottomDecorations) { final Rect displayFrame = new Rect(); - anchor.getWindowVisibleDisplayFrame(displayFrame); + if (ignoreBottomDecorations) { + anchor.getWindowDisplayFrame(displayFrame); + } else { + anchor.getWindowVisibleDisplayFrame(displayFrame); + } final int[] anchorPos = mDrawingLocation; anchor.getLocationOnScreen(anchorPos); - final int bottomEdge; - if (ignoreBottomDecorations) { - final Resources res = anchor.getContext().getResources(); - bottomEdge = res.getDisplayMetrics().heightPixels; - } else { - bottomEdge = displayFrame.bottom; - } + final int bottomEdge = displayFrame.bottom; final int distanceToBottom; if (mOverlapAnchor) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 95fcdc179643..f19bf02a238f 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -662,11 +662,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ private int mDeviceProvisionedState = DEVICE_PROVISIONED_UNKNOWN; - /* + /** * Kick-start the font cache for the zygote process (to pay the cost of * initializing freetype for our default font only once). + * @hide */ - static { + public static void preloadFontCache() { Paint p = new Paint(); p.setAntiAlias(true); // We don't care about the result, just the side-effect of measuring. diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index a24d37f4b097..f2fc617ccc33 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -22,8 +22,11 @@ import android.annotation.Widget; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; +import android.os.Parcel; import android.os.Parcelable; +import android.os.Parcelable.Creator; import android.util.AttributeSet; +import android.view.View; import android.view.accessibility.AccessibilityEvent; import com.android.internal.R; @@ -301,5 +304,69 @@ public class TimePicker extends FrameLayout { mContext = context; mLocale = context.getResources().getConfiguration().locale; } + + protected static class SavedState extends View.BaseSavedState { + private final int mHour; + private final int mMinute; + private final boolean mIs24HourMode; + private final int mCurrentItemShowing; + + public SavedState(Parcelable superState, int hour, int minute, boolean is24HourMode) { + this(superState, hour, minute, is24HourMode, 0); + } + + public SavedState(Parcelable superState, int hour, int minute, boolean is24HourMode, + int currentItemShowing) { + super(superState); + mHour = hour; + mMinute = minute; + mIs24HourMode = is24HourMode; + mCurrentItemShowing = currentItemShowing; + } + + private SavedState(Parcel in) { + super(in); + mHour = in.readInt(); + mMinute = in.readInt(); + mIs24HourMode = (in.readInt() == 1); + mCurrentItemShowing = in.readInt(); + } + + public int getHour() { + return mHour; + } + + public int getMinute() { + return mMinute; + } + + public boolean is24HourMode() { + return mIs24HourMode; + } + + public int getCurrentItemShowing() { + return mCurrentItemShowing; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeInt(mHour); + dest.writeInt(mMinute); + dest.writeInt(mIs24HourMode ? 1 : 0); + dest.writeInt(mCurrentItemShowing); + } + + @SuppressWarnings({"unused", "hiding"}) + public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } } } diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java index 05fd4c8ab69f..4a24e26a2828 100644 --- a/core/java/android/widget/TimePickerClockDelegate.java +++ b/core/java/android/widget/TimePickerClockDelegate.java @@ -21,7 +21,6 @@ import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.TypedArray; -import android.os.Parcel; import android.os.Parcelable; import android.text.SpannableStringBuilder; import android.text.format.DateFormat; @@ -45,7 +44,6 @@ import com.android.internal.widget.NumericTextView; import com.android.internal.widget.NumericTextView.OnValueChangedListener; import java.util.Calendar; -import java.util.Locale; /** * A delegate implementing the radial clock-based TimePicker. @@ -501,9 +499,11 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl @Override public void onRestoreInstanceState(Parcelable state) { - final SavedState ss = (SavedState) state; - initialize(ss.getHour(), ss.getMinute(), ss.is24HourMode(), ss.getCurrentItemShowing()); - mRadialTimePickerView.invalidate(); + if (state instanceof SavedState) { + final SavedState ss = (SavedState) state; + initialize(ss.getHour(), ss.getMinute(), ss.is24HourMode(), ss.getCurrentItemShowing()); + mRadialTimePickerView.invalidate(); + } } @Override @@ -544,70 +544,6 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl } } - /** - * Used to save / restore state of time picker - */ - private static class SavedState extends View.BaseSavedState { - - private final int mHour; - private final int mMinute; - private final boolean mIs24HourMode; - private final int mCurrentItemShowing; - - private SavedState(Parcelable superState, int hour, int minute, boolean is24HourMode, - int currentItemShowing) { - super(superState); - mHour = hour; - mMinute = minute; - mIs24HourMode = is24HourMode; - mCurrentItemShowing = currentItemShowing; - } - - private SavedState(Parcel in) { - super(in); - mHour = in.readInt(); - mMinute = in.readInt(); - mIs24HourMode = (in.readInt() == 1); - mCurrentItemShowing = in.readInt(); - } - - public int getHour() { - return mHour; - } - - public int getMinute() { - return mMinute; - } - - public boolean is24HourMode() { - return mIs24HourMode; - } - - public int getCurrentItemShowing() { - return mCurrentItemShowing; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(mHour); - dest.writeInt(mMinute); - dest.writeInt(mIs24HourMode ? 1 : 0); - dest.writeInt(mCurrentItemShowing); - } - - @SuppressWarnings({"unused", "hiding"}) - public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - private void tryVibrate() { mDelegator.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK); } diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java index 863d40913836..b113fd94f21d 100644 --- a/core/java/android/widget/TimePickerSpinnerDelegate.java +++ b/core/java/android/widget/TimePickerSpinnerDelegate.java @@ -18,7 +18,6 @@ package android.widget; import android.content.Context; import android.content.res.TypedArray; -import android.os.Parcel; import android.os.Parcelable; import android.text.format.DateFormat; import android.text.format.DateUtils; @@ -32,7 +31,6 @@ import android.view.inputmethod.InputMethodManager; import com.android.internal.R; import java.util.Calendar; -import java.util.Locale; import libcore.icu.LocaleData; @@ -387,14 +385,16 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate { @Override public Parcelable onSaveInstanceState(Parcelable superState) { - return new SavedState(superState, getHour(), getMinute()); + return new SavedState(superState, getHour(), getMinute(), is24Hour()); } @Override public void onRestoreInstanceState(Parcelable state) { - SavedState ss = (SavedState) state; - setHour(ss.getHour()); - setMinute(ss.getMinute()); + if (state instanceof SavedState) { + final SavedState ss = (SavedState) state; + setHour(ss.getHour()); + setMinute(ss.getMinute()); + } } @Override @@ -525,52 +525,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate { } } - /** - * Used to save / restore state of time picker - */ - private static class SavedState extends View.BaseSavedState { - private final int mHour; - private final int mMinute; - - private SavedState(Parcelable superState, int hour, int minute) { - super(superState); - mHour = hour; - mMinute = minute; - } - - private SavedState(Parcel in) { - super(in); - mHour = in.readInt(); - mMinute = in.readInt(); - } - - public int getHour() { - return mHour; - } - - public int getMinute() { - return mMinute; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(mHour); - dest.writeInt(mMinute); - } - - @SuppressWarnings({"unused", "hiding"}) - public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - public static String[] getAmPmStrings(Context context) { String[] result = new String[2]; LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale); diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index f178c8cf7ece..1b521465ed18 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -754,8 +754,7 @@ public final class BatteryStatsHelper { try { ParcelFileDescriptor pfd = service.getStatisticsStream(); if (pfd != null) { - FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd); - try { + try (FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) { byte[] data = readFully(fis, MemoryFile.getSize(pfd.getFileDescriptor())); Parcel parcel = Parcel.obtain(); parcel.unmarshall(data, 0, data.length); diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 6ad9e20360e0..eb509c2632c1 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -36,6 +36,7 @@ import android.text.Hyphenator; import android.util.EventLog; import android.util.Log; import android.webkit.WebViewFactory; +import android.widget.TextView; import com.android.internal.os.InstallerConnection.InstallerException; @@ -214,6 +215,7 @@ public class ZygoteInit { private static void preloadTextResources() { Hyphenator.init(); + TextView.preloadFontCache(); } /** diff --git a/core/java/com/android/internal/util/WakeupMessage.java b/core/java/com/android/internal/util/WakeupMessage.java index 451078b1b047..26537451992c 100644 --- a/core/java/com/android/internal/util/WakeupMessage.java +++ b/core/java/com/android/internal/util/WakeupMessage.java @@ -21,7 +21,9 @@ import android.content.Context; import android.os.Handler; import android.os.Message; -/** +import com.android.internal.annotations.VisibleForTesting; + + /** * An AlarmListener that sends the specified message to a Handler and keeps the system awake until * the message is processed. * @@ -36,9 +38,13 @@ import android.os.Message; */ public class WakeupMessage implements AlarmManager.OnAlarmListener { private final AlarmManager mAlarmManager; - private final Handler mHandler; - private final String mCmdName; - private final int mCmd, mArg1, mArg2; + + @VisibleForTesting + protected final Handler mHandler; + @VisibleForTesting + protected final String mCmdName; + @VisibleForTesting + protected final int mCmd, mArg1, mArg2; private boolean mScheduled; public WakeupMessage(Context context, Handler handler, diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index cbc735fc065c..795012dab4d1 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -896,8 +896,7 @@ public class LockPatternUtils { * @return true if device is file encrypted */ public static boolean isFileEncryptionEnabled() { - final String status = SystemProperties.get("ro.crypto.type", ""); - return "file".equalsIgnoreCase(status); + return StorageManager.isFileBasedEncryptionEnabled(); } /** diff --git a/core/java/com/android/server/net/NetworkPinner.java b/core/java/com/android/server/net/NetworkPinner.java new file mode 100644 index 000000000000..d922a48f6dc2 --- /dev/null +++ b/core/java/com/android/server/net/NetworkPinner.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.net; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.ConnectivityManager.NetworkCallback; +import android.net.Network; +import android.net.NetworkRequest; +import android.util.Log; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; + +/** + * A class that pins a process to the first network that satisfies a particular NetworkRequest. + * + * 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. + * + * This class is a per-process singleton because the process default network is a per-process + * singleton. + * + */ +public class NetworkPinner extends NetworkCallback { + + private static final String TAG = NetworkPinner.class.getSimpleName(); + + @VisibleForTesting + protected static final Object sLock = new Object(); + + @GuardedBy("sLock") + private static ConnectivityManager sCM; + @GuardedBy("sLock") + private static Callback sCallback; + @VisibleForTesting + @GuardedBy("sLock") + protected static Network sNetwork; + + private static void maybeInitConnectivityManager(Context context) { + // 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) { + // Getting a ConnectivityManager does not leak the calling context, because it stores + // the application context and not the calling context. + sCM = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (sCM == null) { + throw new IllegalStateException("Bad luck, ConnectivityService not started."); + } + } + } + + private static class Callback extends NetworkCallback { + @Override + public void onAvailable(Network network) { + synchronized(sLock) { + if (this != sCallback) return; + + if (sCM.getBoundNetworkForProcess() == null && sNetwork == null) { + sCM.bindProcessToNetwork(network); + sNetwork = network; + Log.d(TAG, "Wifi alternate reality enabled on network " + network); + } + sLock.notify(); + } + } + + @Override + public void onLost(Network network) { + synchronized (sLock) { + if (this != sCallback) return; + + if (network.equals(sNetwork) && network.equals(sCM.getBoundNetworkForProcess())) { + unpin(); + Log.d(TAG, "Wifi alternate reality disabled on network " + network); + } + sLock.notify(); + } + } + } + + public static void pin(Context context, NetworkRequest request) { + synchronized (sLock) { + if (sCallback == null) { + maybeInitConnectivityManager(context); + sCallback = new Callback(); + try { + sCM.registerNetworkCallback(request, sCallback); + } catch (SecurityException e) { + Log.d(TAG, "Failed to register network callback", e); + sCallback = null; + } + } + } + } + + public static void unpin() { + synchronized (sLock) { + if (sCallback != null) { + try { + sCM.bindProcessToNetwork(null); + sCM.unregisterNetworkCallback(sCallback); + } catch (SecurityException e) { + Log.d(TAG, "Failed to unregister network callback", e); + } + sCallback = null; + sNetwork = null; + } + } + } +} diff --git a/core/jni/Android.mk b/core/jni/Android.mk index a8d684d7a612..ed3fe428b5a3 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -33,6 +33,7 @@ LOCAL_SRC_FILES:= \ com_android_internal_content_NativeLibraryHelper.cpp \ com_google_android_gles_jni_EGLImpl.cpp \ com_google_android_gles_jni_GLImpl.cpp.arm \ + android_app_Activity.cpp \ android_app_ApplicationLoaders.cpp \ android_app_NativeActivity.cpp \ android_auditing_SecurityLog.cpp \ @@ -260,7 +261,8 @@ LOCAL_SHARED_LIBRARIES := \ libprocessgroup \ libnativebridge \ libradio_metadata \ - libnativeloader + libnativeloader \ + libmemunreachable \ LOCAL_SHARED_LIBRARIES += \ libhwui \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 6ed07a7c9990..2a04526ed3eb 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -178,6 +178,7 @@ extern int register_android_backup_FileBackupHelperBase(JNIEnv *env); extern int register_android_backup_BackupHelperDispatcher(JNIEnv *env); extern int register_android_app_backup_FullBackup(JNIEnv *env); extern int register_android_app_ApplicationLoaders(JNIEnv* env); +extern int register_android_app_Activity(JNIEnv *env); extern int register_android_app_ActivityThread(JNIEnv *env); extern int register_android_app_NativeActivity(JNIEnv *env); extern int register_android_media_RemoteDisplay(JNIEnv *env); @@ -1373,6 +1374,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_backup_BackupHelperDispatcher), REG_JNI(register_android_app_backup_FullBackup), REG_JNI(register_android_app_ApplicationLoaders), + REG_JNI(register_android_app_Activity), REG_JNI(register_android_app_ActivityThread), REG_JNI(register_android_app_NativeActivity), REG_JNI(register_android_util_jar_StrictJarFile), diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 8b248b07a07d..29c1075a3420 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -555,6 +555,12 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file, SkFILEStream::kCallerPasses_Ownership)); + // If there is no offset for the file descriptor, we use SkFILEStream directly. + if (::lseek(descriptor, 0, SEEK_CUR) == 0) { + assert(isSeekable(dupDescriptor)); + return doDecode(env, fileStream.release(), padding, bitmapFactoryOptions); + } + // Use a buffered stream. Although an SkFILEStream can be rewound, this // ensures that SkImageDecoder::Factory never rewinds beyond the // current position of the file descriptor. @@ -584,7 +590,7 @@ static jobject nativeDecodeByteArray(JNIEnv* env, jobject, jbyteArray byteArray, static jboolean nativeIsSeekable(JNIEnv* env, jobject, jobject fileDescriptor) { jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor); - return ::lseek64(descriptor, 0, SEEK_CUR) != -1 ? JNI_TRUE : JNI_FALSE; + return isSeekable(descriptor) ? JNI_TRUE : JNI_FALSE; } jobject decodeBitmap(JNIEnv* env, void* data, size_t size) { diff --git a/core/jni/android/graphics/Utils.cpp b/core/jni/android/graphics/Utils.cpp index 4f9ce8bfcef7..5fa445e256fe 100644 --- a/core/jni/android/graphics/Utils.cpp +++ b/core/jni/android/graphics/Utils.cpp @@ -116,3 +116,7 @@ jobject android::nullObjectReturn(const char msg[]) { } return NULL; } + +bool android::isSeekable(int descriptor) { + return ::lseek64(descriptor, 0, SEEK_CUR) != -1; +} diff --git a/core/jni/android/graphics/Utils.h b/core/jni/android/graphics/Utils.h index c0b941004758..d1a74a0adf6c 100644 --- a/core/jni/android/graphics/Utils.h +++ b/core/jni/android/graphics/Utils.h @@ -68,6 +68,10 @@ private: jobject nullObjectReturn(const char msg[]); +/** Check if the file descriptor is seekable. + */ +bool isSeekable(int descriptor); + }; // namespace android #endif // _ANDROID_GRAPHICS_UTILS_H_ diff --git a/core/jni/android_app_Activity.cpp b/core/jni/android_app_Activity.cpp new file mode 100644 index 000000000000..b1d7e82c73ae --- /dev/null +++ b/core/jni/android_app_Activity.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2010 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 <poll.h> +#include <android/dlext.h> + +#include "core_jni_helpers.h" + +namespace android +{ + +static jstring getDlWarning_native(JNIEnv* env, jobject) { + const char* text = android_dlwarning(); + return text == nullptr ? nullptr : env->NewStringUTF(text); +} + +static const JNINativeMethod g_methods[] = { + { "getDlWarning", + "()Ljava/lang/String;", + reinterpret_cast<void*>(getDlWarning_native) }, +}; + +static const char* const kActivityPathName = "android/app/Activity"; + +int register_android_app_Activity(JNIEnv* env) { + return RegisterMethodsOrDie(env, kActivityPathName, g_methods, NELEM(g_methods)); +} + +} // namespace android diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 2fb749866f62..1eb011100919 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -320,7 +320,7 @@ android_media_AudioSystem_isSourceActive(JNIEnv *env, jobject thiz, jint source) static jint android_media_AudioSystem_newAudioSessionId(JNIEnv *env, jobject thiz) { - return AudioSystem::newAudioUniqueId(); + return AudioSystem::newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION); } static jint diff --git a/core/jni/android_opengl_GLES30.cpp b/core/jni/android_opengl_GLES30.cpp index 2d69eaa516c3..59b8911487b9 100644 --- a/core/jni/android_opengl_GLES30.cpp +++ b/core/jni/android_opengl_GLES30.cpp @@ -2012,22 +2012,35 @@ exit: static void android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2B (JNIEnv *_env, jobject _this, jint program, jint index, jint bufsize, jobject length_buf, jobject size_buf, jobject type_buf, jbyte name) { + jniThrowException(_env, "java/lang/UnsupportedOperationException", "deprecated"); +} + +/* void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) */ +static void +android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_ByteBuffer_2 + (JNIEnv *_env, jobject _this, jint program, jint index, jint bufsize, jobject length_buf, jobject size_buf, jobject type_buf, jobject name_buf) { jintArray _lengthArray = (jintArray) 0; jint _lengthBufferOffset = (jint) 0; jintArray _sizeArray = (jintArray) 0; jint _sizeBufferOffset = (jint) 0; jintArray _typeArray = (jintArray) 0; jint _typeBufferOffset = (jint) 0; + jbyteArray _nameArray = (jbyteArray)0; + jint _nameBufferOffset = (jint)0; jint _lengthRemaining; GLsizei *length = (GLsizei *) 0; jint _sizeRemaining; GLint *size = (GLint *) 0; jint _typeRemaining; GLenum *type = (GLenum *) 0; + jint _nameRemaining; + GLchar* name = (GLchar*)0; + length = (GLsizei *)getPointer(_env, length_buf, (jarray*)&_lengthArray, &_lengthRemaining, &_lengthBufferOffset); size = (GLint *)getPointer(_env, size_buf, (jarray*)&_sizeArray, &_sizeRemaining, &_sizeBufferOffset); type = (GLenum *)getPointer(_env, type_buf, (jarray*)&_typeArray, &_typeRemaining, &_typeBufferOffset); + name = (GLchar*)getPointer(_env, name_buf, (jarray*)&_nameArray, &_nameRemaining, &_nameBufferOffset); if (length == NULL) { char * _lengthBase = (char *)_env->GetIntArrayElements(_lengthArray, (jboolean *) 0); length = (GLsizei *) (_lengthBase + _lengthBufferOffset); @@ -2040,6 +2053,10 @@ android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuff char * _typeBase = (char *)_env->GetIntArrayElements(_typeArray, (jboolean *) 0); type = (GLenum *) (_typeBase + _typeBufferOffset); } + if (name == NULL) { + char* _nameBase = (char *)_env->GetByteArrayElements(_nameArray, (jboolean*)0); + name = (GLchar *) (_nameBase + _nameBufferOffset); + } glGetTransformFeedbackVarying( (GLuint)program, (GLuint)index, @@ -2047,11 +2064,7 @@ android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuff (GLsizei *)length, (GLint *)size, (GLenum *)type, - // The cast below is incorrect. The driver will end up writing to the - // address specified by name, which will always crash the process since - // it is guaranteed to be in low memory. The additional static_cast - // suppresses the warning for now. http://b/19478262 - (char *)static_cast<uintptr_t>(name) + (GLchar*)name ); if (_typeArray) { releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _typeArray, (jint*)type, JNI_TRUE); @@ -2062,6 +2075,9 @@ android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuff if (_lengthArray) { releaseArrayPointer<jintArray, jint*, IntArrayReleaser>(_env, _lengthArray, (jint*)length, JNI_TRUE); } + if (_nameArray) { + releaseArrayPointer<jbyteArray, jbyte*, ByteArrayReleaser>(_env, _nameArray, (jbyte*)name, JNI_TRUE); + } } /* void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) */ @@ -5233,6 +5249,7 @@ static const JNINativeMethod methods[] = { {"glTransformFeedbackVaryings", "(I[Ljava/lang/String;I)V", (void *) android_glTransformFeedbackVaryings }, {"glGetTransformFeedbackVarying", "(III[II[II[II[BI)V", (void *) android_glGetTransformFeedbackVarying__III_3II_3II_3II_3BI }, {"glGetTransformFeedbackVarying", "(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V", (void *) android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2B }, +{"glGetTransformFeedbackVarying", "(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)V", (void *) android_glGetTransformFeedbackVarying__IIILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_nio_ByteBuffer_2 }, {"glGetTransformFeedbackVarying", "(II[II[II)Ljava/lang/String;", (void *) android_glGetTransformFeedbackVarying1 }, {"glGetTransformFeedbackVarying", "(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;", (void *) android_glGetTransformFeedbackVarying2 }, {"glVertexAttribIPointerBounds", "(IIIILjava/nio/Buffer;I)V", (void *) android_glVertexAttribIPointerBounds__IIIILjava_nio_Buffer_2I }, diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 03a1e718d2ea..3df0876532cb 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -21,6 +21,7 @@ #include "utils/misc.h" #include "cutils/debugger.h" #include <memtrack/memtrack.h> +#include <memunreachable/memunreachable.h> #include <cutils/log.h> #include <fcntl.h> @@ -36,6 +37,9 @@ #include <ctype.h> #include <malloc.h> +#include <iomanip> +#include <string> + namespace android { @@ -1023,6 +1027,13 @@ static void android_os_Debug_dumpNativeBacktraceToFile(JNIEnv* env, jobject claz close(fd); } +static jstring android_os_Debug_getUnreachableMemory(JNIEnv* env, jobject clazz, + jint limit, jboolean contents) +{ + std::string s = GetUnreachableMemoryString(contents, limit); + return env->NewStringUTF(s.c_str()); +} + /* * JNI registration. */ @@ -1058,6 +1069,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_os_Debug_getDeathObjectCount }, { "dumpNativeBacktraceToFile", "(ILjava/lang/String;)V", (void*)android_os_Debug_dumpNativeBacktraceToFile }, + { "getUnreachableMemory", "(IZ)Ljava/lang/String;", + (void*)android_os_Debug_getUnreachableMemory }, }; int register_android_os_Debug(JNIEnv *env) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 03d93a1720df..588e738ba1b8 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1598,6 +1598,11 @@ <permission android:name="android.permission.GET_PACKAGE_IMPORTANCE" android:protectionLevel="signature|privileged" /> + <!-- Allows use of PendingIntent.getIntent(). + @hide --> + <permission android:name="android.permission.GET_INTENT_SENDER_INTENT" + android:protectionLevel="signature" /> + <!-- ================================== --> <!-- Permissions affecting the display of other applications --> <!-- ================================== --> diff --git a/core/res/res/drawable-nodpi/default_wallpaper.jpg b/core/res/res/drawable-nodpi/default_wallpaper.jpg Binary files differdeleted file mode 100644 index d7475b4c66db..000000000000 --- a/core/res/res/drawable-nodpi/default_wallpaper.jpg +++ /dev/null diff --git a/core/res/res/drawable-nodpi/default_wallpaper.png b/core/res/res/drawable-nodpi/default_wallpaper.png Binary files differnew file mode 100644 index 000000000000..91ad252507e5 --- /dev/null +++ b/core/res/res/drawable-nodpi/default_wallpaper.png diff --git a/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.jpg b/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.jpg Binary files differdeleted file mode 100644 index 03a14c09c720..000000000000 --- a/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.jpg +++ /dev/null diff --git a/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png b/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png Binary files differnew file mode 100644 index 000000000000..af8e2512385a --- /dev/null +++ b/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png diff --git a/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.jpg b/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.jpg Binary files differdeleted file mode 100644 index 543d118f21a5..000000000000 --- a/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.jpg +++ /dev/null diff --git a/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png b/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png Binary files differnew file mode 100644 index 000000000000..cb00d82a826f --- /dev/null +++ b/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png diff --git a/core/res/res/drawable/work_widget_mask_view_background.xml b/core/res/res/drawable/work_widget_mask_view_background.xml deleted file mode 100644 index 17f0dbc2b91c..000000000000 --- a/core/res/res/drawable/work_widget_mask_view_background.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?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. ---> - <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - <padding android:left="5dp" android:right="5dp" android:top="5dp" android:bottom="5dp"/> - <stroke android:width="1dp" android:color="#CCCCCC" /> - </shape> diff --git a/core/res/res/layout/work_widget_mask_view.xml b/core/res/res/layout/work_widget_mask_view.xml index ce86ddc61876..3c4770552383 100644 --- a/core/res/res/layout/work_widget_mask_view.xml +++ b/core/res/res/layout/work_widget_mask_view.xml @@ -15,20 +15,24 @@ Copyright (C) 2015 The Android Open Source Project limitations under the License. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/work_widget_mask_frame" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#F3374248" > + android:background="#F3374248" + android:clickable="true" > <ImageView android:id="@+id/work_widget_app_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center"/> + android:layout_gravity="center" + android:clickable="false" /> - <ImageView + <ImageView android:id="@+id/work_widget_badge_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:layout_marginBottom="4dp" android:layout_marginRight="4dp" - android:src="@drawable/ic_corp_badge_off" /> + android:src="@drawable/ic_corp_badge_off" + android:clickable="false" /> </FrameLayout> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 8c00151c5fef..7ed9a20ce2d3 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -163,7 +163,7 @@ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Previše <xliff:g id="CONTENT_TYPE">%s</xliff:g> izbrisanih stavki."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Memorija tableta je puna! Izbrišite neke datoteke da biste oslobodili prostor."</string> <string name="low_memory" product="watch" msgid="4415914910770005166">"Memorija sata je puna. Izbrišite neke datoteke da biste oslobodili prostor."</string> - <string name="low_memory" product="tv" msgid="516619861191025923">"Skladišni prostor na TV-u je popunjen. Izbrišite neke datoteke da biste oslobodili prostor."</string> + <string name="low_memory" product="tv" msgid="516619861191025923">"Memorijski prostor na TV-u je popunjen. Izbrišite neke datoteke da biste oslobodili prostor."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Skladište telefona je puno! Izbrišite neke datoteke kako biste oslobodili prostor."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Mreža se možda nadgleda"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Od strane nepoznate treće strane"</string> @@ -312,7 +312,7 @@ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Dozvoljava aplikaciji da učini sopstvene komponente trajnim u memoriji. Ovo može da ograniči memoriju dostupnu drugim aplikacijama i uspori tablet."</string> <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Dozvoljava aplikaciji da neke svoje delove trajno zadrži u memoriji. To može da ograniči memoriju dostupnu drugim aplikacijama i uspori TV."</string> <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Dozvoljava aplikaciji da učini sopstvene komponente trajnim u memoriji. Ovo može da ograniči memoriju dostupnu drugim aplikacijama i uspori telefon."</string> - <string name="permlab_getPackageSize" msgid="7472921768357981986">"merenje prostora za skladištenje u aplikaciji"</string> + <string name="permlab_getPackageSize" msgid="7472921768357981986">"merenje memorijskog prostora u aplikaciji"</string> <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Dozvoljava aplikaciji da preuzme veličine kôda, podataka i keša."</string> <string name="permlab_writeSettings" msgid="2226195290955224730">"izmena podešavanja sistema"</string> <string name="permdesc_writeSettings" msgid="7775723441558907181">"Dozvoljava aplikaciji da menja podatke o podešavanju sistema. Zlonamerne aplikacije mogu da oštete konfiguraciju sistema."</string> @@ -885,9 +885,9 @@ <string name="deleteText" msgid="6979668428458199034">"Izbriši"</string> <string name="inputMethod" msgid="1653630062304567879">"Metod unosa"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Radnje u vezi sa tekstom"</string> - <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Prostor za skladištenje je na izmaku"</string> + <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Memorijski prostor je na izmaku"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Neke sistemske funkcije možda ne funkcionišu"</string> - <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno skladišnog prostora za sistem. Uverite se da imate 250 MB slobodnog prostora i ponovo pokrenite."</string> + <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno memorijskog prostora za sistem. Uverite se da imate 250 MB slobodnog prostora i ponovo pokrenite."</string> <string name="app_running_notification_title" msgid="8718335121060787914">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je pokrenuta"</string> <string name="app_running_notification_text" msgid="4653586947747330058">"Dodirnite za više informacija ili zaustavljanje aplikacije."</string> <string name="ok" msgid="5970060430562524910">"Potvrdi"</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 67776e737109..2ed546372c0b 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -1468,7 +1468,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Eskatu desblokeatzeko eredua aingura kendu aurretik"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Eskatu pasahitza aingura kendu aurretik"</string> <string name="dock_forced_resizable" msgid="5914261505436217520">"Baliteke aplikazioak ez funtzionatzea pantaila zatituan."</string> - <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikazioak ez du onartzen pantaila banatua"</string> + <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikazioak ez du onartzen pantaila zatitua"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Administratzaileak instalatu du"</string> <string name="package_updated_device_owner" msgid="8856631322440187071">"Administratzaileak eguneratu du"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Administratzaileak ezabatu du"</string> @@ -1541,7 +1541,7 @@ <string name="importance_from_person" msgid="9160133597262938296">"Garrantzitsua da eragiten dien pertsonengatik."</string> <string name="user_creation_account_exists" msgid="1942606193570143289">"<xliff:g id="APP">%1$s</xliff:g> aplikazioari <xliff:g id="ACCOUNT">%2$s</xliff:g> kontua duen erabiltzailea sortzea baimendu nahi diozu?"</string> <string name="user_creation_adding" msgid="4482658054622099197">"<xliff:g id="APP">%1$s</xliff:g> aplikazioari <xliff:g id="ACCOUNT">%2$s</xliff:g> kontua duen erabiltzailea sortzea baimendu nahi diozu? (Badago kontu hori duen erabiltzaile bat)"</string> - <string name="language_selection_title" msgid="2680677278159281088">"Gehitu hizkuntza bat"</string> + <string name="language_selection_title" msgid="2680677278159281088">"Gehitu hizkuntza"</string> <string name="country_selection_title" msgid="2954859441620215513">"Lurralde-hobespena"</string> <string name="search_language_hint" msgid="7042102592055108574">"Adierazi hizkuntza"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Iradokitakoak"</string> diff --git a/core/res/res/values-h426dp-port/integers.xml b/core/res/res/values-h426dp-port/integers.xml new file mode 100644 index 000000000000..94abbecdf64c --- /dev/null +++ b/core/res/res/values-h426dp-port/integers.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2016, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources> + <integer name="date_picker_mode">2</integer> + <integer name="time_picker_mode">2</integer> +</resources> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 018e05454a80..a6ee7703213e 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -1468,7 +1468,7 @@ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Бошотуудан мурун PIN суралсын"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Бошотуудан мурун кулпуну ачкан үлгү суралсын"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Бошотуудан мурун сырсөз суралсын"</string> - <string name="dock_forced_resizable" msgid="5914261505436217520">"Колдонмо бөлүнгөн экранда иштебей калышы мүмкүн."</string> + <string name="dock_forced_resizable" msgid="5914261505436217520">"Колдонмодо экран бөлүнбөшү мүмкүн."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Колдонмодо экран бөлүнбөйт."</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Администраторуңуз тарабынан орнотулган"</string> <string name="package_updated_device_owner" msgid="8856631322440187071">"Администраторуңуз жаңырткан"</string> @@ -1542,7 +1542,7 @@ <string name="importance_from_person" msgid="9160133597262938296">"Булар сиз үчүн маанилүү адамдар."</string> <string name="user_creation_account_exists" msgid="1942606193570143289">"<xliff:g id="APP">%1$s</xliff:g> колдонмосу <xliff:g id="ACCOUNT">%2$s</xliff:g> каттоо эсеби менен жаңы колдонуучу түзө берсинби ?"</string> <string name="user_creation_adding" msgid="4482658054622099197">"<xliff:g id="APP">%1$s</xliff:g> колдонмосу <xliff:g id="ACCOUNT">%2$s</xliff:g> каттоо эсеби менен жаңы колдонуучу түзө берсинби (мындай каттоо эсеби бар колдонуучу мурунтан эле бар) ?"</string> - <string name="language_selection_title" msgid="2680677278159281088">"Тилди кошуңуз"</string> + <string name="language_selection_title" msgid="2680677278159281088">"Тил кошуңуз"</string> <string name="country_selection_title" msgid="2954859441620215513">"Чөлкөмдүк жөндөөлөр"</string> <string name="search_language_hint" msgid="7042102592055108574">"Тилди киргизиңиз"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Сунушталган"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 8604e621aa8a..ecf45b7d94c6 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1579,7 +1579,7 @@ <string name="importance_from_person" msgid="9160133597262938296">"Tai svarbu dėl susijusių žmonių."</string> <string name="user_creation_account_exists" msgid="1942606193570143289">"Leisti „<xliff:g id="APP">%1$s</xliff:g>“ kurti naują <xliff:g id="ACCOUNT">%2$s</xliff:g> naudotoją?"</string> <string name="user_creation_adding" msgid="4482658054622099197">"Leisti „<xliff:g id="APP">%1$s</xliff:g>“ kurti naują <xliff:g id="ACCOUNT">%2$s</xliff:g> naudotoją (šią paskyrą naudojantis naudotojas jau yra)?"</string> - <string name="language_selection_title" msgid="2680677278159281088">"Kalbos pridėjimas"</string> + <string name="language_selection_title" msgid="2680677278159281088">"Pridėkite kalbą"</string> <string name="country_selection_title" msgid="2954859441620215513">"Regiono nuostata"</string> <string name="search_language_hint" msgid="7042102592055108574">"Įveskite kalbos pav."</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Siūloma"</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 06401bf26b8f..cd31b2b8047c 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -1467,7 +1467,7 @@ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Minta PIN sebelum menyahsemat"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Minta corak buka kunci sebelum menyahsemat"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Minta kata laluan sebelum menyahsemat"</string> - <string name="dock_forced_resizable" msgid="5914261505436217520">"Apl mungkin tidak berfungsi dengan skrin terpisah."</string> + <string name="dock_forced_resizable" msgid="5914261505436217520">"Apl mungkin tidak berfungsi dengan skrin pisah."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Apl tidak menyokong skrin pisah."</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Dipasang oleh pentadbir anda"</string> <string name="package_updated_device_owner" msgid="8856631322440187071">"Dikemas kini oleh pentadbir anda"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index d1ac852ed04a..1e3a88625107 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -163,7 +163,7 @@ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Превише <xliff:g id="CONTENT_TYPE">%s</xliff:g> избрисаних ставки."</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Меморија таблета је пуна! Избришите неке датотеке да бисте ослободили простор."</string> <string name="low_memory" product="watch" msgid="4415914910770005166">"Меморија сата је пуна. Избришите неке датотеке да бисте ослободили простор."</string> - <string name="low_memory" product="tv" msgid="516619861191025923">"Складишни простор на ТВ-у је попуњен. Избришите неке датотеке да бисте ослободили простор."</string> + <string name="low_memory" product="tv" msgid="516619861191025923">"Меморијски простор на ТВ-у је попуњен. Избришите неке датотеке да бисте ослободили простор."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Складиште телефона је пуно! Избришите неке датотеке како бисте ослободили простор."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мрежа се можда надгледа"</string> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Од стране непознате треће стране"</string> @@ -312,7 +312,7 @@ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Дозвољава апликацији да учини сопствене компоненте трајним у меморији. Ово може да ограничи меморију доступну другим апликацијама и успори таблет."</string> <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Дозвољава апликацији да неке своје делове трајно задржи у меморији. То може да ограничи меморију доступну другим апликацијама и успори ТВ."</string> <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Дозвољава апликацији да учини сопствене компоненте трајним у меморији. Ово може да ограничи меморију доступну другим апликацијама и успори телефон."</string> - <string name="permlab_getPackageSize" msgid="7472921768357981986">"мерење простора за складиштење у апликацији"</string> + <string name="permlab_getPackageSize" msgid="7472921768357981986">"мерење меморијског простора у апликацији"</string> <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Дозвољава апликацији да преузме величине кôда, података и кеша."</string> <string name="permlab_writeSettings" msgid="2226195290955224730">"измена подешавања система"</string> <string name="permdesc_writeSettings" msgid="7775723441558907181">"Дозвољава апликацији да мења податке о подешавању система. Злонамерне апликације могу да оштете конфигурацију система."</string> @@ -885,9 +885,9 @@ <string name="deleteText" msgid="6979668428458199034">"Избриши"</string> <string name="inputMethod" msgid="1653630062304567879">"Метод уноса"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Радње у вези са текстом"</string> - <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Простор за складиштење је на измаку"</string> + <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Меморијски простор је на измаку"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Неке системске функције можда не функционишу"</string> - <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Нема довољно складишног простора за систем. Уверите се да имате 250 MB слободног простора и поново покрените."</string> + <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Нема довољно меморијског простора за систем. Уверите се да имате 250 MB слободног простора и поново покрените."</string> <string name="app_running_notification_title" msgid="8718335121060787914">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је покренута"</string> <string name="app_running_notification_text" msgid="4653586947747330058">"Додирните за више информација или заустављање апликације."</string> <string name="ok" msgid="5970060430562524910">"Потврди"</string> diff --git a/core/res/res/values-w426dp-land/integers.xml b/core/res/res/values-w426dp-land/integers.xml new file mode 100644 index 000000000000..94abbecdf64c --- /dev/null +++ b/core/res/res/values-w426dp-land/integers.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2016, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources> + <integer name="date_picker_mode">2</integer> + <integer name="time_picker_mode">2</integer> +</resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 85616b160d61..24a5b79366c8 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1467,7 +1467,7 @@ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"取消时要求输入PIN码"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"取消时要求绘制解锁图案"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"取消时要求输入密码"</string> - <string name="dock_forced_resizable" msgid="5914261505436217520">"应用可能无法在分屏模式下运行。"</string> + <string name="dock_forced_resizable" msgid="5914261505436217520">"应用可能无法在分屏模式下正常运行。"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"应用不支持分屏。"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"已由管理员安装"</string> <string name="package_updated_device_owner" msgid="8856631322440187071">"由您单位的管理员更新"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 7c0212801851..90a573ba8fbd 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -8189,11 +8189,8 @@ i <!-- @hide From Theme.colorPrimary, used for the TaskDescription primary color. --> <attr name="colorPrimary" /> - <!-- @hide From Theme.windowBackground, used for calculating the - TaskDescription background color. --> - <attr name="windowBackground" /> - <!-- @hide From Theme.windowBackgroundFallback, used for calculating the - TaskDescription background color. --> - <attr name="windowBackgroundFallback" /> + <!-- @hide From Theme.colorBackground, used for the TaskDescription background + color. --> + <attr name="colorBackground" /> </declare-styleable> </resources> diff --git a/core/res/res/values/integers.xml b/core/res/res/values/integers.xml index 8e272267efc9..8f8d59e95782 100644 --- a/core/res/res/values/integers.xml +++ b/core/res/res/values/integers.xml @@ -23,4 +23,7 @@ <integer name="button_pressed_animation_delay">100</integer> <integer name="disabled_alpha_animation_duration">100</integer> <integer name="dock_enter_exit_duration">250</integer> + + <integer name="date_picker_mode">1</integer> + <integer name="time_picker_mode">1</integer> </resources> diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml index db418f7947b9..a9c8a06369f5 100644 --- a/core/res/res/values/styles_material.xml +++ b/core/res/res/values/styles_material.xml @@ -652,7 +652,7 @@ please see styles_device_defaults.xml. </style> <style name="Widget.Material.TimePicker"> - <item name="timePickerMode">clock</item> + <item name="timePickerMode">@integer/time_picker_mode</item> <item name="legacyLayout">@layout/time_picker_legacy_material</item> <!-- Attributes for new-style TimePicker. --> <item name="internalLayout">@layout/time_picker_material</item> @@ -666,7 +666,7 @@ please see styles_device_defaults.xml. </style> <style name="Widget.Material.DatePicker"> - <item name="datePickerMode">calendar</item> + <item name="datePickerMode">@integer/date_picker_mode</item> <item name="legacyLayout">@layout/date_picker_legacy_holo</item> <item name="calendarViewShown">true</item> <!-- Attributes for new-style DatePicker. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 44a7a8d39077..eba2e6a243fd 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2431,8 +2431,9 @@ <java-symbol type="string" name="importance_from_person" /> <java-symbol type="layout" name="work_widget_mask_view" /> + <java-symbol type="id" name="work_widget_mask_frame" /> <java-symbol type="id" name="work_widget_app_icon" /> - <java-symbol type="drawable" name="work_widget_mask_view_background" /> + <java-symbol type="id" name="work_widget_badge_icon" /> <java-symbol type="id" name="aerr_report" /> <java-symbol type="id" name="aerr_reset" /> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index dd8baa76c05e..11bb106a6873 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -544,9 +544,7 @@ easier. <item name="windowNoTitle">true</item> <item name="windowBackground">@color/transparent</item> <item name="backgroundDimEnabled">true</item> - <item name="windowTranslucentStatus">false</item> - <item name="windowTranslucentNavigation">false</item> - <item name="windowDrawsSystemBarBackgrounds">false</item> + <item name="statusBarColor">@color/transparent</item> <item name="windowContentOverlay">@null</item> <item name="colorControlActivated">?attr/colorControlHighlight</item> <item name="listPreferredItemPaddingStart">?attr/dialogPreferredPadding</item> diff --git a/core/res/res/values/themes_micro.xml b/core/res/res/values/themes_micro.xml index 8bf635e68cf9..478d66c767c0 100644 --- a/core/res/res/values/themes_micro.xml +++ b/core/res/res/values/themes_micro.xml @@ -24,7 +24,6 @@ <item name="windowBackground">@color/black</item> <item name="windowContentOverlay">@null</item> <item name="windowIsFloating">false</item> - <item name="windowSwipeToDismiss">true</item> <!-- Required to force windowInsets dispatch through application UI. --> <item name="windowOverscan">true</item> </style> @@ -42,7 +41,6 @@ <item name="windowBackground">@color/white</item> <item name="windowContentOverlay">@null</item> <item name="windowIsFloating">false</item> - <item name="windowSwipeToDismiss">true</item> <!-- Required to force windowInsets dispatch through application UI. --> <item name="windowOverscan">true</item> </style> diff --git a/core/tests/coretests/src/android/content/pm/ContainerEncryptionParamsTest.java b/core/tests/coretests/src/android/content/pm/ContainerEncryptionParamsTest.java deleted file mode 100644 index 7deaa9a70a81..000000000000 --- a/core/tests/coretests/src/android/content/pm/ContainerEncryptionParamsTest.java +++ /dev/null @@ -1,370 +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.content.pm; - -import android.os.Parcel; -import android.test.AndroidTestCase; - -import java.util.Arrays; - -import javax.crypto.SecretKey; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; - -public class ContainerEncryptionParamsTest extends AndroidTestCase { - private static final String ENC_ALGORITHM = "AES/CBC/PKCS7Padding"; - - private static final byte[] IV_BYTES = "FOOBAR".getBytes(); - - private static final IvParameterSpec ENC_PARAMS = new IvParameterSpec(IV_BYTES); - - private static final byte[] ENC_KEY_BYTES = "abcd1234wxyz7890".getBytes(); - - private static final SecretKey ENC_KEY = new SecretKeySpec(ENC_KEY_BYTES, "RAW"); - - private static final String MAC_ALGORITHM = "HMAC-SHA1"; - - private static final byte[] MAC_KEY_BYTES = "4wxyzabcd1237890".getBytes(); - - private static final SecretKey MAC_KEY = new SecretKeySpec(MAC_KEY_BYTES, "RAW"); - - private static final byte[] MAC_TAG = "faketag".getBytes(); - - private static final int AUTHENTICATED_START = 5; - - private static final int ENCRYPTED_START = 11; - - private static final int DATA_END = 19; - - public void testParcel() throws Exception { - ContainerEncryptionParams expected = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - Parcel parcel = Parcel.obtain(); - expected.writeToParcel(parcel, 0); - parcel.setDataPosition(0); - - ContainerEncryptionParams actual = ContainerEncryptionParams.CREATOR - .createFromParcel(parcel); - - assertEquals(ENC_ALGORITHM, actual.getEncryptionAlgorithm()); - - if (!(actual.getEncryptionSpec() instanceof IvParameterSpec)) { - fail("encryption parameters should be IvParameterSpec"); - } else { - IvParameterSpec actualParams = (IvParameterSpec) actual.getEncryptionSpec(); - assertTrue(Arrays.equals(IV_BYTES, actualParams.getIV())); - } - - assertEquals(ENC_KEY, actual.getEncryptionKey()); - - assertEquals(MAC_ALGORITHM, actual.getMacAlgorithm()); - - assertNull(actual.getMacSpec()); - - assertEquals(MAC_KEY, actual.getMacKey()); - - assertTrue(Arrays.equals(MAC_TAG, actual.getMacTag())); - - assertEquals(AUTHENTICATED_START, actual.getAuthenticatedDataStart()); - - assertEquals(ENCRYPTED_START, actual.getEncryptedDataStart()); - - assertEquals(DATA_END, actual.getDataEnd()); - } - - public void testEquals_Success() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertEquals(params1, params2); - } - - public void testEquals_EncAlgo_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams(new String( - "AES-256/CBC/PKCS7Padding"), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.equals(params2)); - } - - public void testEquals_EncParams_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec("BLAHBLAH".getBytes()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.equals(params2)); - } - - public void testEquals_EncKey_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec("BLAHBLAH".getBytes(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.equals(params2)); - } - - public void testEquals_MacAlgo_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), "BLAHBLAH", null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.equals(params2)); - } - - public void testEquals_MacKey_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec("FAKE_MAC_KEY".getBytes(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.equals(params2)); - } - - public void testEquals_MacTag_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), "broken".getBytes(), - AUTHENTICATED_START, ENCRYPTED_START, DATA_END); - - assertFalse(params1.equals(params2)); - } - - public void testEquals_AuthenticatedStart_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START - 1, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.equals(params2)); - } - - public void testEquals_EncryptedStart_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START - 1, DATA_END); - - assertFalse(params1.equals(params2)); - } - - public void testEquals_DataEnd_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END + 1); - - assertFalse(params1.equals(params2)); - } - - public void testHashCode_Success() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertEquals(params1.hashCode(), params2.hashCode()); - } - - public void testHashCode_EncAlgo_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams(new String( - "AES-256/CBC/PKCS7Padding"), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.hashCode() == params2.hashCode()); - } - - public void testHashCode_EncParams_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec("BLAHBLAH".getBytes()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.hashCode() == params2.hashCode()); - } - - public void testHashCode_EncKey_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec("BLAHBLAH".getBytes(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.hashCode() == params2.hashCode()); - } - - public void testHashCode_MacAlgo_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), "BLAHBLAH", null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.hashCode() == params2.hashCode()); - } - - public void testHashCode_MacKey_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec("FAKE_MAC_KEY".getBytes(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.hashCode() == params2.hashCode()); - } - - public void testHashCode_MacTag_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), "broken".getBytes(), - AUTHENTICATED_START, ENCRYPTED_START, DATA_END); - - assertFalse(params1.hashCode() == params2.hashCode()); - } - - public void testHashCode_AuthenticatedStart_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START - 1, - ENCRYPTED_START, DATA_END); - - assertFalse(params1.hashCode() == params2.hashCode()); - } - - public void testHashCode_EncryptedStart_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START - 1, DATA_END); - - assertFalse(params1.hashCode() == params2.hashCode()); - } - - public void testHashCode_DataEnd_Failure() throws Exception { - ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, - ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END); - - ContainerEncryptionParams params2 = new ContainerEncryptionParams( - new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), - new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, - new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, - ENCRYPTED_START, DATA_END + 1); - - assertFalse(params1.hashCode() == params2.hashCode()); - } -} diff --git a/data/keyboards/qwerty2.kcm b/data/keyboards/qwerty2.kcm index d96914f08f06..b981d835bdfb 100644 --- a/data/keyboards/qwerty2.kcm +++ b/data/keyboards/qwerty2.kcm @@ -23,8 +23,8 @@ key A { number: '2' base: 'a' shift, capslock: 'A' - alt: 'a' - shift+alt, capslock+alt: 'A' + alt: '\u00e1' + shift+alt, capslock+alt: '\u00c1' } key B { @@ -41,8 +41,8 @@ key C { number: '2' base: 'c' shift, capslock: 'C' - alt: '\u00e7' - shift+alt, capslock+alt: '\u00e7' + alt: '\u00a9' + shift+alt, capslock+alt: '\u00a2' } key D { @@ -50,8 +50,8 @@ key D { number: '3' base: 'd' shift, capslock: 'D' - alt: '\'' - shift+alt, capslock+alt: '\'' + alt: '\u00f0' + shift+alt, capslock+alt: '\u00d0' } key E { @@ -59,8 +59,8 @@ key E { number: '3' base: 'e' shift, capslock: 'E' - alt: '"' - shift+alt, capslock+alt: '\u0301' + alt: '\u00e9' + shift+alt, capslock+alt: '\u00c9' } key F { @@ -95,8 +95,8 @@ key I { number: '4' base: 'i' shift, capslock: 'I' - alt: '-' - shift+alt, capslock+alt: '\u0302' + alt: '\u00ed' + shift+alt, capslock+alt: '\u00cd' } key J { @@ -122,8 +122,8 @@ key L { number: '5' base: 'l' shift, capslock: 'L' - alt: ':' - shift+alt, capslock+alt: '`' + alt: '\u00f8' + shift+alt, capslock+alt: '\u00d8' } key M { @@ -131,7 +131,7 @@ key M { number: '6' base: 'm' shift, capslock: 'M' - alt: '%' + alt: '\u00b5' shift+alt, capslock+alt: none } @@ -140,8 +140,8 @@ key N { number: '6' base: 'n' shift, capslock: 'N' - alt: none - shift+alt, capslock+alt: '\u0303' + alt: '\u00f1' + shift+alt, capslock+alt: '\u00d1' } key O { @@ -149,8 +149,8 @@ key O { number: '6' base: 'o' shift, capslock: 'O' - alt: '+' - shift+alt, capslock+alt: '+' + alt: '\u00f3' + shift+alt, capslock+alt: '\u00d3' } key P { @@ -158,8 +158,8 @@ key P { number: '7' base: 'p' shift, capslock: 'P' - alt: '=' - shift+alt, capslock+alt: '\u00a5' + alt: '\u00f6' + shift+alt, capslock+alt: '\u00d6' } key Q { @@ -167,8 +167,8 @@ key Q { number: '7' base: 'q' shift, capslock: 'Q' - alt: '|' - shift+alt, capslock+alt: '\u0300' + alt: '\u00e4' + shift+alt, capslock+alt: '\u00c4' } key R { @@ -176,8 +176,8 @@ key R { number: '7' base: 'r' shift, capslock: 'R' - alt: '`' - shift+alt, capslock+alt: '\u20ac' + alt: '\u00ae' + shift+alt, capslock+alt: 'R' } key S { @@ -185,8 +185,8 @@ key S { number: '7' base: 's' shift, capslock: 'S' - alt: '\\' - shift+alt, capslock+alt: '\u00df' + alt: '\u00df' + shift+alt, capslock+alt: '\u00a7' } key T { @@ -194,8 +194,8 @@ key T { number: '8' base: 't' shift, capslock: 'T' - alt: '{' - shift+alt, capslock+alt: '\u00a3' + alt: '\u00fe' + shift+alt, capslock+alt: '\u00de' } key U { @@ -203,8 +203,8 @@ key U { number: '8' base: 'u' shift, capslock: 'U' - alt: '_' - shift+alt, capslock+alt: '\u0308' + alt: '\u00fa' + shift+alt, capslock+alt: '\u00da' } key V { @@ -221,8 +221,8 @@ key W { number: '9' base: 'w' shift, capslock: 'W' - alt: '~' - shift+alt, capslock+alt: '~' + alt: '\u00e5' + shift+alt, capslock+alt: '\u00c5' } key X { @@ -239,8 +239,8 @@ key Y { number: '9' base: 'y' shift, capslock: 'Y' - alt: '}' - shift+alt, capslock+alt: '\u00a1' + alt: '\u00fc' + shift+alt, capslock+alt: '\u00dc' } key Z { @@ -248,8 +248,8 @@ key Z { number: '9' base: 'z' shift, capslock: 'Z' - alt: 'z' - shift+alt, capslock+alt: 'Z' + alt: '\u00e6' + shift+alt, capslock+alt: '\u00c6' } key COMMA { @@ -257,8 +257,8 @@ key COMMA { number: ',' base: ',' shift: '<' - alt: ',' - shift+alt: ',' + alt: '\u00e7' + shift+alt: '\u00c7' } key PERIOD { @@ -284,7 +284,7 @@ key SLASH { number: '/' base: '/' shift: '?' - alt: '?' + alt: '\u00bf' shift+alt: '?' } @@ -320,7 +320,7 @@ key 0 { number: '0' base: '0' shift: ')' - alt: ')' + alt: '\u02bc' shift+alt: ')' } @@ -329,8 +329,8 @@ key 1 { number: '1' base: '1' shift: '!' - alt: '!' - shift+alt: '!' + alt: '\u00a1' + shift+alt: '\u00b9' } key 2 { @@ -338,7 +338,7 @@ key 2 { number: '2' base: '2' shift: '@' - alt: '@' + alt: '\u00b2' shift+alt: '@' } @@ -347,7 +347,7 @@ key 3 { number: '3' base: '3' shift: '#' - alt: '#' + alt: '\u00b3' shift+alt: '#' } @@ -356,8 +356,8 @@ key 4 { number: '4' base: '4' shift: '$' - alt: '$' - shift+alt: '$' + alt: '\u00a4' + shift+alt: '\u00a3' } key 5 { @@ -365,7 +365,7 @@ key 5 { number: '5' base: '5' shift: '%' - alt: '%' + alt: '\u20ac' shift+alt: '%' } @@ -374,8 +374,8 @@ key 6 { number: '6' base: '6' shift: '^' - alt: '^' - shift+alt: '^' + alt: '\u00bc' + shift+alt: '\u0302' } key 7 { @@ -383,7 +383,7 @@ key 7 { number: '7' base: '7' shift: '&' - alt: '&' + alt: '\u00bd' shift+alt: '&' } @@ -392,7 +392,7 @@ key 8 { number: '8' base: '8' shift: '*' - alt: '*' + alt: '\u00be' shift+alt: '*' } @@ -401,7 +401,7 @@ key 9 { number: '9' base: '9' shift: '(' - alt: '(' + alt: '\u02bb' shift+alt: '(' } @@ -410,8 +410,8 @@ key GRAVE { number: '`' base: '`' shift: '~' - alt: '`' - shift+alt: '~' + alt: '\u0300' + shift+alt: '\u0303' } key MINUS { @@ -419,7 +419,7 @@ key MINUS { number: '-' base: '-' shift: '_' - alt: '-' + alt: '\u00a5' shift+alt: '_' } @@ -428,8 +428,8 @@ key EQUALS { number: '=' base: '=' shift: '+' - alt: '=' - shift+alt: '+' + alt: '\u00d7' + shift+alt: '\u00f7' } key LEFT_BRACKET { @@ -437,7 +437,7 @@ key LEFT_BRACKET { number: '[' base: '[' shift: '{' - alt: '[' + alt: '\u00ab' shift+alt: '{' } @@ -446,7 +446,7 @@ key RIGHT_BRACKET { number: ']' base: ']' shift: '}' - alt: ']' + alt: '\u00bb' shift+alt: '}' } @@ -455,8 +455,8 @@ key BACKSLASH { number: '\\' base: '\\' shift: '|' - alt: '\\' - shift+alt: '|' + alt: '\u00ac' + shift+alt: '\u00a6' } key SEMICOLON { @@ -464,8 +464,8 @@ key SEMICOLON { number: ';' base: ';' shift: ':' - alt: ';' - shift+alt: ':' + alt: '\u00b6' + shift+alt: '\u00b0' } key APOSTROPHE { @@ -473,8 +473,8 @@ key APOSTROPHE { number: '\'' base: '\'' shift: '"' - alt: '\'' - shift+alt: '"' + alt: '\u0301' + shift+alt: '\u0308' } key STAR { diff --git a/docs/html/guide/topics/sensors/sensors_overview.jd b/docs/html/guide/topics/sensors/sensors_overview.jd index 0b3cb2b1cd48..53faca0a911a 100644 --- a/docs/html/guide/topics/sensors/sensors_overview.jd +++ b/docs/html/guide/topics/sensors/sensors_overview.jd @@ -465,6 +465,7 @@ private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); +mSensor = null; if (mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){ List<Sensor> gravSensors = mSensorManager.getSensorList(Sensor.TYPE_GRAVITY); @@ -476,7 +477,7 @@ if (mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){ } } } -else{ +if (mSensor == null){ // Use the accelerometer. if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index d4f745d818bd..af99f79e4b3b 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -91,8 +91,11 @@ public class Canvas { // a Canvas object. private static final long NATIVE_ALLOCATION_SIZE = 525; - private static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( - getNativeFinalizer(), NATIVE_ALLOCATION_SIZE); + // Use a Holder to allow static initialization of Canvas in the boot image. + private static class NoImagePreloadHolder { + public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( + getNativeFinalizer(), NATIVE_ALLOCATION_SIZE); + } // This field is used to finalize the native Canvas properly private Runnable mFinalizer; @@ -107,7 +110,8 @@ public class Canvas { if (!isHardwareAccelerated()) { // 0 means no native bitmap mNativeCanvasWrapper = initRaster(null); - mFinalizer = sRegistry.registerNativeAllocation(this, mNativeCanvasWrapper); + mFinalizer = NoImagePreloadHolder.sRegistry.registerNativeAllocation( + this, mNativeCanvasWrapper); } else { mFinalizer = null; } @@ -128,7 +132,8 @@ public class Canvas { } throwIfCannotDraw(bitmap); mNativeCanvasWrapper = initRaster(bitmap); - mFinalizer = sRegistry.registerNativeAllocation(this, mNativeCanvasWrapper); + mFinalizer = NoImagePreloadHolder.sRegistry.registerNativeAllocation( + this, mNativeCanvasWrapper); mBitmap = bitmap; mDensity = bitmap.mDensity; } @@ -139,7 +144,8 @@ public class Canvas { throw new IllegalStateException(); } mNativeCanvasWrapper = nativeCanvas; - mFinalizer = sRegistry.registerNativeAllocation(this, mNativeCanvasWrapper); + mFinalizer = NoImagePreloadHolder.sRegistry.registerNativeAllocation( + this, mNativeCanvasWrapper); mDensity = Bitmap.getDefaultDensity(); } diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 534121a2e361..291fdc4f8e05 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -44,8 +44,11 @@ public class Paint { // The approximate size of a native paint object. private static final long NATIVE_PAINT_SIZE = 98; - private static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( - nGetNativeFinalizer(), NATIVE_PAINT_SIZE); + // Use a Holder to allow static initialization of Paint in the boot image. + private static class NoImagePreloadHolder { + public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( + nGetNativeFinalizer(), NATIVE_PAINT_SIZE); + } /** * @hide @@ -452,7 +455,7 @@ public class Paint { */ public Paint(int flags) { mNativePaint = nInit(); - sRegistry.registerNativeAllocation(this, mNativePaint); + NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativePaint); setFlags(flags | HIDDEN_DEFAULT_PAINT_FLAGS); // TODO: Turning off hinting has undesirable side effects, we need to // revisit hinting once we add support for subpixel positioning @@ -471,7 +474,7 @@ public class Paint { */ public Paint(Paint paint) { mNativePaint = nInitWithPaint(paint.getNativeInstance()); - sRegistry.registerNativeAllocation(this, mNativePaint); + NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativePaint); setClassVariablesFrom(paint); } diff --git a/include/androidfw/ResourceTypes.h b/include/androidfw/ResourceTypes.h index d8801b8709ee..16bea7994177 100644 --- a/include/androidfw/ResourceTypes.h +++ b/include/androidfw/ResourceTypes.h @@ -1896,6 +1896,13 @@ private: mutable Mutex mLock; + // Mutex that controls access to the list of pre-filtered configurations + // to check when looking up entries. + // When iterating over a bag, the mLock mutex is locked. While mLock is locked, + // we do resource lookups. + // Mutex is not reentrant, so we must use a different lock than mLock. + mutable Mutex mFilteredConfigLock; + status_t mError; ResTable_config mParams; diff --git a/keystore/java/android/security/Credentials.java b/keystore/java/android/security/Credentials.java index 302b0bd73065..6830a7487dbc 100644 --- a/keystore/java/android/security/Credentials.java +++ b/keystore/java/android/security/Credentials.java @@ -217,42 +217,42 @@ public class Credentials { } /** - * Delete all types (private key, certificate, CA certificate) for a + * Delete all types (private key, user certificate, CA certificate) for a * particular {@code alias}. All three can exist for any given alias. - * Returns {@code true} if there was at least one of those types. + * Returns {@code true} if the alias no longer contains any types. */ public static boolean deleteAllTypesForAlias(KeyStore keystore, String alias) { return deleteAllTypesForAlias(keystore, alias, KeyStore.UID_SELF); } /** - * Delete all types (private key, certificate, CA certificate) for a + * Delete all types (private key, user certificate, CA certificate) for a * particular {@code alias}. All three can exist for any given alias. - * Returns {@code true} if there was at least one of those types. + * Returns {@code true} if the alias no longer contains any types. */ public static boolean deleteAllTypesForAlias(KeyStore keystore, String alias, int uid) { /* * Make sure every type is deleted. There can be all three types, so * don't use a conditional here. */ - return keystore.delete(Credentials.USER_PRIVATE_KEY + alias, uid) - | keystore.delete(Credentials.USER_SECRET_KEY + alias, uid) - | deleteCertificateTypesForAlias(keystore, alias, uid); + return deletePrivateKeyTypeForAlias(keystore, alias, uid) + & deleteSecretKeyTypeForAlias(keystore, alias, uid) + & deleteCertificateTypesForAlias(keystore, alias, uid); } /** - * Delete all types (private key, certificate, CA certificate) for a - * particular {@code alias}. All three can exist for any given alias. - * Returns {@code true} if there was at least one of those types. + * Delete certificate types (user certificate, CA certificate) for a + * particular {@code alias}. Both can exist for any given alias. + * Returns {@code true} if the alias no longer contains either type. */ public static boolean deleteCertificateTypesForAlias(KeyStore keystore, String alias) { return deleteCertificateTypesForAlias(keystore, alias, KeyStore.UID_SELF); } /** - * Delete all types (private key, certificate, CA certificate) for a - * particular {@code alias}. All three can exist for any given alias. - * Returns {@code true} if there was at least one of those types. + * Delete certificate types (user certificate, CA certificate) for a + * particular {@code alias}. Both can exist for any given alias. + * Returns {@code true} if the alias no longer contains either type. */ public static boolean deleteCertificateTypesForAlias(KeyStore keystore, String alias, int uid) { /* @@ -260,12 +260,12 @@ public class Credentials { * so don't use a conditional here. */ return keystore.delete(Credentials.USER_CERTIFICATE + alias, uid) - | keystore.delete(Credentials.CA_CERTIFICATE + alias, uid); + & keystore.delete(Credentials.CA_CERTIFICATE + alias, uid); } /** * Delete private key for a particular {@code alias}. - * Returns {@code true} if an entry was was deleted. + * Returns {@code true} if the entry no longer exists. */ static boolean deletePrivateKeyTypeForAlias(KeyStore keystore, String alias) { return deletePrivateKeyTypeForAlias(keystore, alias, KeyStore.UID_SELF); @@ -273,7 +273,7 @@ public class Credentials { /** * Delete private key for a particular {@code alias}. - * Returns {@code true} if an entry was was deleted. + * Returns {@code true} if the entry no longer exists. */ static boolean deletePrivateKeyTypeForAlias(KeyStore keystore, String alias, int uid) { return keystore.delete(Credentials.USER_PRIVATE_KEY + alias, uid); @@ -281,7 +281,7 @@ public class Credentials { /** * Delete secret key for a particular {@code alias}. - * Returns {@code true} if an entry was was deleted. + * Returns {@code true} if the entry no longer exists. */ public static boolean deleteSecretKeyTypeForAlias(KeyStore keystore, String alias) { return deleteSecretKeyTypeForAlias(keystore, alias, KeyStore.UID_SELF); @@ -289,7 +289,7 @@ public class Credentials { /** * Delete secret key for a particular {@code alias}. - * Returns {@code true} if an entry was was deleted. + * Returns {@code true} if the entry no longer exists. */ public static boolean deleteSecretKeyTypeForAlias(KeyStore keystore, String alias, int uid) { return keystore.delete(Credentials.USER_SECRET_KEY + alias, uid); diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index 3090ac1c6180..70e4b6ff2e59 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -183,7 +183,8 @@ public class KeyStore { public boolean delete(String key, int uid) { try { - return mBinder.del(key, uid) == NO_ERROR; + int ret = mBinder.del(key, uid); + return (ret == NO_ERROR || ret == KEY_NOT_FOUND); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to keystore", e); return false; diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java index d7d4f1c50e32..fcbb553c7214 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java @@ -765,11 +765,6 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { @Override public void engineDeleteEntry(String alias) throws KeyStoreException { - if (!engineContainsAlias(alias)) { - return; - } - // At least one entry corresponding to this alias exists in keystore - if (!Credentials.deleteAllTypesForAlias(mKeyStore, alias, mUid)) { throw new KeyStoreException("Failed to delete entry: " + alias); } diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 3277c36c8a33..c73bb584be3a 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -25,6 +25,7 @@ #include <string.h> #include <limits> +#include <memory> #include <type_traits> #include <androidfw/ByteBucketArray.h> @@ -3146,6 +3147,9 @@ struct ResTable::Entry { StringPoolRef keyStr; }; +template <typename T> +using SharedVector = std::shared_ptr<Vector<T>>; + struct ResTable::Type { Type(const Header* _header, const Package* _package, size_t count) @@ -3158,6 +3162,10 @@ struct ResTable::Type const uint32_t* typeSpecFlags; IdmapEntries idmapEntries; Vector<const ResTable_type*> configs; + + // The set of configurations that match the current parameters. + // This will be swapped with a new set when the parameters change. + SharedVector<const ResTable_type*> filteredConfigs; }; struct ResTable::Package @@ -4430,18 +4438,44 @@ ssize_t ResTable::getBagLocked(uint32_t resID, const bag_entry** outBag, void ResTable::setParameters(const ResTable_config* params) { - mLock.lock(); + AutoMutex _lock(mLock); + AutoMutex _lock2(mFilteredConfigLock); + if (kDebugTableGetEntry) { ALOGI("Setting parameters: %s\n", params->toString().string()); } mParams = *params; - for (size_t i=0; i<mPackageGroups.size(); i++) { + for (size_t p = 0; p < mPackageGroups.size(); p++) { + PackageGroup* packageGroup = mPackageGroups.editItemAt(p); if (kDebugTableNoisy) { - ALOGI("CLEARING BAGS FOR GROUP %zu!", i); + ALOGI("CLEARING BAGS FOR GROUP %zu!", p); + } + packageGroup->clearBagCache(); + + for (size_t t = 0; t < packageGroup->types.size(); t++) { + TypeList& typeList = packageGroup->types.editItemAt(t); + for (size_t ts = 0; ts < typeList.size(); ts++) { + Type* type = typeList.editItemAt(ts); + + SharedVector<const ResTable_type*> newFilteredConfigs = + std::make_shared<Vector<const ResTable_type*>>(); + for (size_t ti = 0; ti < type->configs.size(); ti++) { + ResTable_config config; + config.copyFromDtoH(type->configs[ti]->config); + + if (config.match(mParams)) { + newFilteredConfigs->add(type->configs[ti]); + } + } + + if (kDebugTableNoisy) { + ALOGD("Updating pkg=%zu type=%zu with %zu filtered configs", + p, t, newFilteredConfigs->size()); + } + type->filteredConfigs = newFilteredConfigs; + } } - mPackageGroups[i]->clearBagCache(); } - mLock.unlock(); } void ResTable::getParameters(ResTable_config* params) const @@ -5974,9 +6008,29 @@ status_t ResTable::getEntry( specFlags = -1; } - const size_t numConfigs = typeSpec->configs.size(); + const Vector<const ResTable_type*>* candidateConfigs = &typeSpec->configs; + + SharedVector<const ResTable_type*> filteredConfigs; + if (config && memcmp(&mParams, config, sizeof(mParams)) == 0) { + // Grab the lock first so we can safely get the current filtered list. + AutoMutex _lock(mFilteredConfigLock); + + // This configuration is equal to the one we have previously cached for, + // so use the filtered configs. + + if (typeSpec->filteredConfigs) { + // Grab a reference to the shared_ptr so it doesn't get destroyed while + // going through this list. + filteredConfigs = typeSpec->filteredConfigs; + + // Use this filtered list. + candidateConfigs = filteredConfigs.get(); + } + } + + const size_t numConfigs = candidateConfigs->size(); for (size_t c = 0; c < numConfigs; c++) { - const ResTable_type* const thisType = typeSpec->configs[c]; + const ResTable_type* const thisType = candidateConfigs->itemAt(c); if (thisType == NULL) { continue; } diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 8831bafd43d7..54b453d044b4 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -242,6 +242,7 @@ LOCAL_SRC_FILES += \ tests/unit/GpuMemoryTrackerTests.cpp \ tests/unit/LayerUpdateQueueTests.cpp \ tests/unit/LinearAllocatorTests.cpp \ + tests/unit/MatrixTests.cpp \ tests/unit/OffscreenBufferPoolTests.cpp \ tests/unit/SkiaBehaviorTests.cpp \ tests/unit/StringUtilsTests.cpp \ diff --git a/libs/hwui/AnimatorManager.cpp b/libs/hwui/AnimatorManager.cpp index 2198fcc95fe5..f170e9cda8af 100644 --- a/libs/hwui/AnimatorManager.cpp +++ b/libs/hwui/AnimatorManager.cpp @@ -95,11 +95,11 @@ void AnimatorManager::onAnimatorTargetChanged(BaseRenderNodeAnimator* animator) class AnimateFunctor { public: - AnimateFunctor(TreeInfo& info, AnimationContext& context) - : dirtyMask(0), mInfo(info), mContext(context) {} + AnimateFunctor(TreeInfo& info, AnimationContext& context, uint32_t* outDirtyMask) + : mInfo(info), mContext(context), mDirtyMask(outDirtyMask) {} bool operator() (sp<BaseRenderNodeAnimator>& animator) { - dirtyMask |= animator->dirtyMask(); + *mDirtyMask |= animator->dirtyMask(); bool remove = animator->animate(mContext); if (remove) { animator->detach(); @@ -114,11 +114,10 @@ public: return remove; } - uint32_t dirtyMask; - private: TreeInfo& mInfo; AnimationContext& mContext; + uint32_t* mDirtyMask; }; uint32_t AnimatorManager::animate(TreeInfo& info) { @@ -143,12 +142,13 @@ void AnimatorManager::animateNoDamage(TreeInfo& info) { } uint32_t AnimatorManager::animateCommon(TreeInfo& info) { - AnimateFunctor functor(info, mAnimationHandle->context()); + uint32_t dirtyMask; + AnimateFunctor functor(info, mAnimationHandle->context(), &dirtyMask); auto newEnd = std::remove_if(mAnimators.begin(), mAnimators.end(), functor); mAnimators.erase(newEnd, mAnimators.end()); mAnimationHandle->notifyAnimationsRan(); mParent.mProperties.updateMatrix(); - return functor.dirtyMask; + return dirtyMask; } static void endStagingAnimator(sp<BaseRenderNodeAnimator>& animator) { diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp index 78764b5f4448..80180068c44a 100644 --- a/libs/hwui/BakedOpDispatcher.cpp +++ b/libs/hwui/BakedOpDispatcher.cpp @@ -30,6 +30,7 @@ #include <algorithm> #include <math.h> #include <SkPaintDefaults.h> +#include <SkPathOps.h> namespace android { namespace uirenderer { @@ -368,7 +369,7 @@ void BakedOpDispatcher::onArcOp(BakedOpRenderer& renderer, const ArcOp& op, cons op.startAngle, op.sweepAngle, op.useCenter, op.paint); const AutoTexture holder(texture); if (CC_LIKELY(holder.texture)) { - renderPathTexture(renderer, state, op.unmappedBounds.left, op.unmappedBounds.right, + renderPathTexture(renderer, state, op.unmappedBounds.left, op.unmappedBounds.top, *texture, *(op.paint)); } } else { @@ -527,6 +528,12 @@ void BakedOpDispatcher::onOvalOp(BakedOpRenderer& renderer, const OvalOp& op, co SkPath path; SkRect rect = getBoundsOfFill(op); path.addOval(rect); + + if (state.computedState.localProjectionPathMask != nullptr) { + // Mask the ripple path by the local space projection mask in local space. + // Note that this can create CCW paths. + Op(path, *state.computedState.localProjectionPathMask, kIntersect_SkPathOp, &path); + } renderConvexPath(renderer, state, path, *(op.paint)); } } diff --git a/libs/hwui/BakedOpState.cpp b/libs/hwui/BakedOpState.cpp index 682bd045098d..26653f77daeb 100644 --- a/libs/hwui/BakedOpState.cpp +++ b/libs/hwui/BakedOpState.cpp @@ -63,9 +63,22 @@ ResolvedRenderState::ResolvedRenderState(LinearAllocator& allocator, Snapshot& s clipState = nullptr; clippedBounds.setEmpty(); } else { - // Not rejected! compute true clippedBounds and clipSideFlags + // Not rejected! compute true clippedBounds, clipSideFlags, and path mask clipSideFlags = computeClipSideFlags(clipRect, clippedBounds); clippedBounds.doIntersect(clipRect); + + if (CC_UNLIKELY(snapshot.projectionPathMask)) { + // map projection path mask from render target space into op space, + // so intersection with op geometry is possible + Matrix4 inverseTransform; + inverseTransform.loadInverse(transform); + SkMatrix skInverseTransform; + inverseTransform.copyTo(skInverseTransform); + + auto localMask = allocator.create<SkPath>(); + snapshot.projectionPathMask->transform(skInverseTransform, localMask); + localProjectionPathMask = localMask; + } } } @@ -73,13 +86,15 @@ ResolvedRenderState::ResolvedRenderState(LinearAllocator& allocator, Snapshot& s : transform(*snapshot.transform) , clipState(snapshot.mutateClipArea().serializeClip(allocator)) , clippedBounds(clipState->rect) - , clipSideFlags(OpClipSideFlags::Full) {} + , clipSideFlags(OpClipSideFlags::Full) + , localProjectionPathMask(nullptr) {} ResolvedRenderState::ResolvedRenderState(const ClipRect* clipRect, const Rect& dstRect) : transform(Matrix4::identity()) , clipState(clipRect) , clippedBounds(dstRect) - , clipSideFlags(computeClipSideFlags(clipRect->rect, dstRect)) { + , clipSideFlags(computeClipSideFlags(clipRect->rect, dstRect)) + , localProjectionPathMask(nullptr) { clippedBounds.doIntersect(clipRect->rect); } diff --git a/libs/hwui/BakedOpState.h b/libs/hwui/BakedOpState.h index 4365ef870dda..ffe2901782a9 100644 --- a/libs/hwui/BakedOpState.h +++ b/libs/hwui/BakedOpState.h @@ -88,6 +88,7 @@ public: const ClipBase* clipState = nullptr; Rect clippedBounds; int clipSideFlags = 0; + const SkPath* localProjectionPathMask = nullptr; }; /** @@ -154,7 +155,6 @@ public: // simple state (straight pointer/value storage): const float alpha; const RoundRectClipState* roundRectClipState; - const ProjectionPathMask* projectionPathMask; const RecordedOp* op; private: @@ -165,21 +165,18 @@ private: : computedState(allocator, snapshot, recordedOp, expandForStroke) , alpha(snapshot.alpha) , roundRectClipState(snapshot.roundRectClipState) - , projectionPathMask(snapshot.projectionPathMask) , op(&recordedOp) {} BakedOpState(LinearAllocator& allocator, Snapshot& snapshot, const ShadowOp* shadowOpPtr) : computedState(allocator, snapshot) , alpha(snapshot.alpha) , roundRectClipState(snapshot.roundRectClipState) - , projectionPathMask(snapshot.projectionPathMask) , op(shadowOpPtr) {} BakedOpState(const ClipRect* clipRect, const Rect& dstRect, const RecordedOp& recordedOp) : computedState(clipRect, dstRect) , alpha(1.0f) , roundRectClipState(nullptr) - , projectionPathMask(nullptr) , op(&recordedOp) {} }; diff --git a/libs/hwui/ClipArea.cpp b/libs/hwui/ClipArea.cpp index e368537f0b4f..501cbe50ee05 100644 --- a/libs/hwui/ClipArea.cpp +++ b/libs/hwui/ClipArea.cpp @@ -404,11 +404,17 @@ static bool cannotFitInRectangleList(const ClipArea& clipArea, const ClipBase* s return currentRectCount + recordedRectCount > RectangleList::kMaxTransformedRectangles; } +static const ClipRect sEmptyClipRect(Rect(0, 0)); + const ClipBase* ClipArea::serializeIntersectedClip(LinearAllocator& allocator, const ClipBase* recordedClip, const Matrix4& recordedClipTransform) { + // if no recordedClip passed, just serialize current state if (!recordedClip) return serializeClip(allocator); + // if either is empty, clip is empty + if (CC_UNLIKELY(recordedClip->rect.isEmpty())|| mClipRect.isEmpty()) return &sEmptyClipRect; + if (!mLastResolutionResult || recordedClip != mLastResolutionClip || recordedClipTransform != mLastResolutionTransform) { diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index 04de98afe85c..1bc37e25f934 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -389,34 +389,38 @@ void FrameBuilder::deferShadow(const RenderNodeOp& casterNodeOp) { } void FrameBuilder::deferProjectedChildren(const RenderNode& renderNode) { - const SkPath* projectionReceiverOutline = renderNode.properties().getOutline().getPath(); int count = mCanvasState.save(SaveFlags::MatrixClip); + const SkPath* projectionReceiverOutline = renderNode.properties().getOutline().getPath(); - // can't be null, since DL=null node rejection happens before deferNodePropsAndOps - const DisplayList& displayList = *(renderNode.getDisplayList()); + SkPath transformedMaskPath; // on stack, since BakedOpState makes a deep copy + if (projectionReceiverOutline) { + // transform the mask for this projector into render target space + // TODO: consider combining both transforms by stashing transform instead of applying + SkMatrix skCurrentTransform; + mCanvasState.currentTransform()->copyTo(skCurrentTransform); + projectionReceiverOutline->transform( + skCurrentTransform, + &transformedMaskPath); + mCanvasState.setProjectionPathMask(mAllocator, &transformedMaskPath); + } - const RecordedOp* op = (displayList.getOps()[displayList.projectionReceiveIndex]); - const RenderNodeOp* backgroundOp = static_cast<const RenderNodeOp*>(op); - const RenderProperties& backgroundProps = backgroundOp->renderNode->properties(); + for (size_t i = 0; i < renderNode.mProjectedNodes.size(); i++) { + RenderNodeOp* childOp = renderNode.mProjectedNodes[i]; + RenderNode& childNode = *childOp->renderNode; - // Transform renderer to match background we're projecting onto - // (by offsetting canvas by translationX/Y of background rendernode, since only those are set) - mCanvasState.translate(backgroundProps.getTranslationX(), backgroundProps.getTranslationY()); + // Draw child if it has content, but ignore state in childOp - matrix already applied to + // transformFromCompositingAncestor, and record-time clip is ignored when projecting + if (!childNode.nothingToDraw()) { + int restoreTo = mCanvasState.save(SaveFlags::MatrixClip); - // If the projection receiver has an outline, we mask projected content to it - // (which we know, apriori, are all tessellated paths) - mCanvasState.setProjectionPathMask(mAllocator, projectionReceiverOutline); + // Apply transform between ancestor and projected descendant + mCanvasState.concatMatrix(childOp->transformFromCompositingAncestor); - // draw projected nodes - for (size_t i = 0; i < renderNode.mProjectedNodes.size(); i++) { - RenderNodeOp* childOp = renderNode.mProjectedNodes[i]; + deferNodePropsAndOps(childNode); - int restoreTo = mCanvasState.save(SaveFlags::Matrix); - mCanvasState.concatMatrix(childOp->transformFromCompositingAncestor); - deferRenderNodeOpImpl(*childOp); - mCanvasState.restoreToCount(restoreTo); + mCanvasState.restoreToCount(restoreTo); + } } - mCanvasState.restoreToCount(count); } diff --git a/libs/hwui/LayerBuilder.cpp b/libs/hwui/LayerBuilder.cpp index bc39621f2cb2..c5af279653d9 100644 --- a/libs/hwui/LayerBuilder.cpp +++ b/libs/hwui/LayerBuilder.cpp @@ -140,7 +140,10 @@ public: // Identical round rect clip state means both ops will clip in the same way, or not at all. // As the state objects are const, we can compare their pointers to determine mergeability if (lhs->roundRectClipState != rhs->roundRectClipState) return false; - if (lhs->projectionPathMask != rhs->projectionPathMask) return false; + + // Local masks prevent merge, since they're potentially in different coordinate spaces + if (lhs->computedState.localProjectionPathMask + || rhs->computedState.localProjectionPathMask) return false; /* Clipping compatibility check * diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index e04b9a2b5fd7..5bce8ac83020 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -353,7 +353,7 @@ void LayerRenderer::flushLayer(RenderState& renderState, Layer* layer) { bool LayerRenderer::copyLayer(RenderState& renderState, Layer* layer, SkBitmap* bitmap) { Caches& caches = Caches::getInstance(); - if (layer + if (layer && layer->getRenderTarget() != GL_NONE && bitmap->width() <= caches.maxTextureSize && bitmap->height() <= caches.maxTextureSize) { diff --git a/libs/hwui/Matrix.cpp b/libs/hwui/Matrix.cpp index 73ebd1304750..deab95690d0e 100644 --- a/libs/hwui/Matrix.cpp +++ b/libs/hwui/Matrix.cpp @@ -438,7 +438,7 @@ void Matrix4::mapPoint(float& x, float& y) const { } void Matrix4::mapRect(Rect& r) const { - if (isIdentity()) return; + if (isIdentity() || r.isEmpty()) return; if (isSimple()) { MUL_ADD_STORE(r.left, data[kScaleX], data[kTranslateX]); diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index b7a5923cdd65..7693fdcbe817 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1148,7 +1148,9 @@ bool OpenGLRenderer::storeDisplayState(DeferredDisplayState& state, int stateDef // always store/restore, since these are just pointers state.mRoundRectClipState = currentSnapshot()->roundRectClipState; +#if !HWUI_NEW_OPS state.mProjectionPathMask = currentSnapshot()->projectionPathMask; +#endif return false; } @@ -1156,7 +1158,9 @@ void OpenGLRenderer::restoreDisplayState(const DeferredDisplayState& state, bool setGlobalMatrix(state.mMatrix); writableSnapshot()->alpha = state.mAlpha; writableSnapshot()->roundRectClipState = state.mRoundRectClipState; +#if !HWUI_NEW_OPS writableSnapshot()->projectionPathMask = state.mProjectionPathMask; +#endif if (state.mClipValid && !skipClipRestore) { writableSnapshot()->setClip(state.mClip.left, state.mClip.top, @@ -1833,6 +1837,7 @@ void OpenGLRenderer::drawCircle(float x, float y, float radius, const SkPaint* p path.addCircle(x, y, radius); } +#if !HWUI_NEW_OPS if (CC_UNLIKELY(currentSnapshot()->projectionPathMask != nullptr)) { // mask ripples with projection mask SkPath maskPath = *(currentSnapshot()->projectionPathMask->projectionMask); @@ -1852,6 +1857,7 @@ void OpenGLRenderer::drawCircle(float x, float y, float radius, const SkPaint* p // in local space. Note that this can create CCW paths. Op(path, maskPath, kIntersect_SkPathOp, &path); } +#endif drawConvexPath(path, p); } diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 31de305d5246..9ae2212d0732 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -594,7 +594,14 @@ void RecordingCanvas::callDrawGLFunction(Functor* functor) { } size_t RecordingCanvas::addOp(RecordedOp* op) { - // TODO: validate if "addDrawOp" quickrejection logic is useful before adding + // skip op with empty clip + if (op->localClip && op->localClip->rect.isEmpty()) { + // NOTE: this rejection happens after op construction/content ref-ing, so content ref'd + // and held by renderthread isn't affected by clip rejection. + // Could rewind alloc here if desired, but callers would have to not touch op afterwards. + return -1; + } + int insertIndex = mDisplayList->ops.size(); mDisplayList->ops.push_back(op); if (mDeferredBarrierType != DeferredBarrierType::None) { diff --git a/libs/hwui/Snapshot.cpp b/libs/hwui/Snapshot.cpp index 27fea1ff59f5..cf5e69a1e6ae 100644 --- a/libs/hwui/Snapshot.cpp +++ b/libs/hwui/Snapshot.cpp @@ -146,6 +146,9 @@ void Snapshot::resetTransform(float x, float y, float z) { } void Snapshot::buildScreenSpaceTransform(Matrix4* outTransform) const { +#if HWUI_NEW_OPS + LOG_ALWAYS_FATAL("not supported - not needed by new ops"); +#else // build (reverse ordered) list of the stack of snapshots, terminated with a NULL Vector<const Snapshot*> snapshotList; snapshotList.push(nullptr); @@ -171,6 +174,7 @@ void Snapshot::buildScreenSpaceTransform(Matrix4* outTransform) const { outTransform->multiply(*(current->transform)); } } +#endif } /////////////////////////////////////////////////////////////////////////////// @@ -223,15 +227,19 @@ void Snapshot::setClippingRoundRect(LinearAllocator& allocator, const Rect& boun } void Snapshot::setProjectionPathMask(LinearAllocator& allocator, const SkPath* path) { +#if HWUI_NEW_OPS + // TODO: remove allocator param for HWUI_NEW_OPS + projectionPathMask = path; +#else if (path) { ProjectionPathMask* mask = new (allocator) ProjectionPathMask; mask->projectionMask = path; buildScreenSpaceTransform(&(mask->projectionMaskTransform)); - projectionPathMask = mask; } else { projectionPathMask = nullptr; } +#endif } /////////////////////////////////////////////////////////////////////////////// diff --git a/libs/hwui/Snapshot.h b/libs/hwui/Snapshot.h index b03643f06f1c..3a01d049109c 100644 --- a/libs/hwui/Snapshot.h +++ b/libs/hwui/Snapshot.h @@ -63,6 +63,7 @@ public: float radius; }; +// TODO: remove for HWUI_NEW_OPS class ProjectionPathMask { public: static void* operator new(size_t size) = delete; @@ -219,6 +220,7 @@ public: * Fills outTransform with the current, total transform to screen space, * across layer boundaries. */ + // TODO: remove for HWUI_NEW_OPS void buildScreenSpaceTransform(Matrix4* outTransform) const; /** @@ -294,9 +296,13 @@ public: const RoundRectClipState* roundRectClipState; /** - * Current projection masking path - used exclusively to mask tessellated circles. + * Current projection masking path - used exclusively to mask projected, tessellated circles. */ +#if HWUI_NEW_OPS + const SkPath* projectionPathMask; +#else const ProjectionPathMask* projectionPathMask; +#endif void dump() const; diff --git a/libs/hwui/tests/unit/ClipAreaTests.cpp b/libs/hwui/tests/unit/ClipAreaTests.cpp index 679569ef5a78..dc2ea0784b7e 100644 --- a/libs/hwui/tests/unit/ClipAreaTests.cpp +++ b/libs/hwui/tests/unit/ClipAreaTests.cpp @@ -228,6 +228,7 @@ TEST(ClipArea, serializeIntersectedClip) { ClipRegion recordedClip; recordedClip.region.setPath(ovalPath, SkRegion(SkIRect::MakeWH(200, 200))); + recordedClip.rect = Rect(200, 200); Matrix4 translate10x20; translate10x20.loadTranslate(10, 20, 0); diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp index f86898fd669a..8802d07de753 100644 --- a/libs/hwui/tests/unit/FrameBuilderTests.cpp +++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp @@ -990,21 +990,26 @@ TEST(FrameBuilder, projectionReorder) { EXPECT_EQ(Rect(100, 100), op.unmappedBounds); EXPECT_EQ(SK_ColorWHITE, op.paint->getColor()); expectedMatrix.loadIdentity(); + EXPECT_EQ(nullptr, state.computedState.localProjectionPathMask); break; case 1: EXPECT_EQ(Rect(-10, -10, 60, 60), op.unmappedBounds); EXPECT_EQ(SK_ColorDKGRAY, op.paint->getColor()); - expectedMatrix.loadTranslate(50, 50, 0); // TODO: should scroll be respected here? + expectedMatrix.loadTranslate(50 - scrollX, 50 - scrollY, 0); + ASSERT_NE(nullptr, state.computedState.localProjectionPathMask); + EXPECT_EQ(Rect(-35, -30, 45, 50), + Rect(state.computedState.localProjectionPathMask->getBounds())); break; case 2: EXPECT_EQ(Rect(100, 50), op.unmappedBounds); EXPECT_EQ(SK_ColorBLUE, op.paint->getColor()); expectedMatrix.loadTranslate(-scrollX, 50 - scrollY, 0); + EXPECT_EQ(nullptr, state.computedState.localProjectionPathMask); break; default: ADD_FAILURE(); } - EXPECT_MATRIX_APPROX_EQ(expectedMatrix, state.computedState.transform); + EXPECT_EQ(expectedMatrix, state.computedState.transform); } }; @@ -1045,6 +1050,9 @@ TEST(FrameBuilder, projectionReorder) { }); auto parent = TestUtils::createNode(0, 0, 100, 100, [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) { + // Set a rect outline for the projecting ripple to be masked against. + properties.mutableOutline().setRoundRect(10, 10, 90, 90, 5, 1.0f); + canvas.save(SaveFlags::MatrixClip); canvas.translate(-scrollX, -scrollY); // Apply scroll (note: bg undoes this internally) canvas.drawRenderNode(receiverBackground.get()); @@ -1059,6 +1067,145 @@ TEST(FrameBuilder, projectionReorder) { EXPECT_EQ(3, renderer.getIndex()); } +RENDERTHREAD_TEST(FrameBuilder, projectionHwLayer) { + static const int scrollX = 5; + static const int scrollY = 10; + class ProjectionHwLayerTestRenderer : public TestRendererBase { + public: + void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override { + EXPECT_EQ(0, mIndex++); + } + void onArcOp(const ArcOp& op, const BakedOpState& state) override { + EXPECT_EQ(1, mIndex++); + ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask); + } + void endLayer() override { + EXPECT_EQ(2, mIndex++); + } + void onRectOp(const RectOp& op, const BakedOpState& state) override { + EXPECT_EQ(3, mIndex++); + ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask); + } + void onOvalOp(const OvalOp& op, const BakedOpState& state) override { + EXPECT_EQ(4, mIndex++); + ASSERT_NE(nullptr, state.computedState.localProjectionPathMask); + Matrix4 expected; + expected.loadTranslate(100 - scrollX, 100 - scrollY, 0); + EXPECT_EQ(expected, state.computedState.transform); + EXPECT_EQ(Rect(-85, -80, 295, 300), + Rect(state.computedState.localProjectionPathMask->getBounds())); + } + void onLayerOp(const LayerOp& op, const BakedOpState& state) override { + EXPECT_EQ(5, mIndex++); + ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask); + } + }; + auto receiverBackground = TestUtils::createNode(0, 0, 400, 400, + [](RenderProperties& properties, RecordingCanvas& canvas) { + properties.setProjectionReceiver(true); + // scroll doesn't apply to background, so undone via translationX/Y + // NOTE: translationX/Y only! no other transform properties may be set for a proj receiver! + properties.setTranslationX(scrollX); + properties.setTranslationY(scrollY); + + canvas.drawRect(0, 0, 400, 400, SkPaint()); + }); + auto projectingRipple = TestUtils::createNode(0, 0, 200, 200, + [](RenderProperties& properties, RecordingCanvas& canvas) { + properties.setProjectBackwards(true); + properties.setClipToBounds(false); + canvas.drawOval(100, 100, 300, 300, SkPaint()); // drawn mostly out of layer bounds + }); + auto child = TestUtils::createNode(100, 100, 300, 300, + [&projectingRipple](RenderProperties& properties, RecordingCanvas& canvas) { + properties.mutateLayerProperties().setType(LayerType::RenderLayer); + canvas.drawRenderNode(projectingRipple.get()); + canvas.drawArc(0, 0, 200, 200, 0.0f, 280.0f, true, SkPaint()); + }); + auto parent = TestUtils::createNode(0, 0, 400, 400, + [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) { + // Set a rect outline for the projecting ripple to be masked against. + properties.mutableOutline().setRoundRect(10, 10, 390, 390, 0, 1.0f); + canvas.translate(-scrollX, -scrollY); // Apply scroll (note: bg undoes this internally) + canvas.drawRenderNode(receiverBackground.get()); + canvas.drawRenderNode(child.get()); + }); + + OffscreenBuffer** layerHandle = child->getLayerHandle(); + + // create RenderNode's layer here in same way prepareTree would, setting windowTransform + OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 200, 200); + Matrix4 windowTransform; + windowTransform.loadTranslate(100, 100, 0); // total transform of layer's origin + layer.setWindowTransform(windowTransform); + *layerHandle = &layer; + + auto syncedList = TestUtils::createSyncedNodeList(parent); + LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid + layerUpdateQueue.enqueueLayerWithDamage(child.get(), Rect(200, 200)); + FrameBuilder frameBuilder(layerUpdateQueue, SkRect::MakeWH(400, 400), 400, 400, + syncedList, sLightGeometry, nullptr); + ProjectionHwLayerTestRenderer renderer; + frameBuilder.replayBakedOps<TestDispatcher>(renderer); + EXPECT_EQ(6, renderer.getIndex()); + + // clean up layer pointer, so we can safely destruct RenderNode + *layerHandle = nullptr; +} + +RENDERTHREAD_TEST(FrameBuilder, projectionChildScroll) { + static const int scrollX = 500000; + static const int scrollY = 0; + class ProjectionChildScrollTestRenderer : public TestRendererBase { + public: + void onRectOp(const RectOp& op, const BakedOpState& state) override { + EXPECT_EQ(0, mIndex++); + EXPECT_TRUE(state.computedState.transform.isIdentity()); + } + void onOvalOp(const OvalOp& op, const BakedOpState& state) override { + EXPECT_EQ(1, mIndex++); + ASSERT_NE(nullptr, state.computedState.clipState); + ASSERT_EQ(ClipMode::Rectangle, state.computedState.clipState->mode); + ASSERT_EQ(Rect(400, 400), state.computedState.clipState->rect); + EXPECT_TRUE(state.computedState.transform.isIdentity()); + } + }; + auto receiverBackground = TestUtils::createNode(0, 0, 400, 400, + [](RenderProperties& properties, RecordingCanvas& canvas) { + properties.setProjectionReceiver(true); + canvas.drawRect(0, 0, 400, 400, SkPaint()); + }); + auto projectingRipple = TestUtils::createNode(0, 0, 200, 200, + [](RenderProperties& properties, RecordingCanvas& canvas) { + // scroll doesn't apply to background, so undone via translationX/Y + // NOTE: translationX/Y only! no other transform properties may be set for a proj receiver! + properties.setTranslationX(scrollX); + properties.setTranslationY(scrollY); + properties.setProjectBackwards(true); + properties.setClipToBounds(false); + canvas.drawOval(0, 0, 200, 200, SkPaint()); + }); + auto child = TestUtils::createNode(0, 0, 400, 400, + [&projectingRipple](RenderProperties& properties, RecordingCanvas& canvas) { + // Record time clip will be ignored by projectee + canvas.clipRect(100, 100, 300, 300, SkRegion::kIntersect_Op); + + canvas.translate(-scrollX, -scrollY); // Apply scroll (note: bg undoes this internally) + canvas.drawRenderNode(projectingRipple.get()); + }); + auto parent = TestUtils::createNode(0, 0, 400, 400, + [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) { + canvas.drawRenderNode(receiverBackground.get()); + canvas.drawRenderNode(child.get()); + }); + + FrameBuilder frameBuilder(sEmptyLayerUpdateQueue, SkRect::MakeWH(400, 400), 400, 400, + TestUtils::createSyncedNodeList(parent), sLightGeometry, nullptr); + ProjectionChildScrollTestRenderer renderer; + frameBuilder.replayBakedOps<TestDispatcher>(renderer); + EXPECT_EQ(2, renderer.getIndex()); +} + // creates a 100x100 shadow casting node with provided translationZ static sp<RenderNode> createWhiteRectShadowCaster(float translationZ) { return TestUtils::createNode(0, 0, 100, 100, diff --git a/libs/hwui/tests/unit/MatrixTests.cpp b/libs/hwui/tests/unit/MatrixTests.cpp new file mode 100644 index 000000000000..da2263788c25 --- /dev/null +++ b/libs/hwui/tests/unit/MatrixTests.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <gtest/gtest.h> + +#include "Matrix.h" +#include "Rect.h" + +using namespace android::uirenderer; + +TEST(Matrix, mapRect) { + // Skew, so we don't hit identity/translate/simple fast paths + Matrix4 matrix; + matrix.skew(0.1f, 0.1f); + + // non-zero empty rect, so sorting x/y would make rect non-empty + Rect empty(100, 100, -100, -100); + ASSERT_TRUE(empty.isEmpty()); + matrix.mapRect(empty); + EXPECT_TRUE(empty.isEmpty()) + << "Empty rect should always remain empty, regardless of mapping."; +} diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp index f988da399665..c39047ca1d89 100644 --- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp +++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp @@ -58,6 +58,17 @@ TEST(RecordingCanvas, clipRect) { << "Clip should be serialized once"; } +TEST(RecordingCanvas, emptyClipRect) { + auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { + canvas.save(SaveFlags::MatrixClip); + canvas.clipRect(0, 0, 100, 100, SkRegion::kIntersect_Op); + canvas.clipRect(100, 100, 200, 200, SkRegion::kIntersect_Op); + canvas.drawRect(0, 0, 50, 50, SkPaint()); // rejected at record time + canvas.restore(); + }); + ASSERT_EQ(0u, dl->getOps().size()) << "Must be zero ops. Rect should be rejected."; +} + TEST(RecordingCanvas, drawArc) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { canvas.drawArc(0, 0, 200, 200, 0, 180, true, SkPaint()); diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index b0411a2b63f5..abb6f4e9964c 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -212,7 +212,7 @@ import java.util.Objects; * AudioTrack.getPlaybackHeadPosition()}), * depending on the context where audio frame is used. */ -public class AudioFormat implements Parcelable { +public final class AudioFormat implements Parcelable { //--------------------------------------------------------- // Constants diff --git a/media/java/android/media/AudioRecordConfiguration.java b/media/java/android/media/AudioRecordConfiguration.java index c2cd9b3d0637..2fc8ee82efa9 100644 --- a/media/java/android/media/AudioRecordConfiguration.java +++ b/media/java/android/media/AudioRecordConfiguration.java @@ -29,7 +29,7 @@ import java.util.Objects; * {@link AudioManager#getActiveRecordConfigurations()} method. * */ -public class AudioRecordConfiguration implements Parcelable { +public final class AudioRecordConfiguration implements Parcelable { private final static String TAG = new String("AudioRecordConfiguration"); private final int mSessionId; diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 247c4aea9106..f597440ccbb3 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -638,7 +638,7 @@ public class AudioSystem public static final int PHONE_STATE_RINGING = 1; public static final int PHONE_STATE_INCALL = 2; - // device categories config for setForceUse, must match AudioSystem::forced_config + // device categories config for setForceUse, must match audio_policy_forced_cfg_t public static final int FORCE_NONE = 0; public static final int FORCE_SPEAKER = 1; public static final int FORCE_HEADPHONES = 2; @@ -652,17 +652,20 @@ public class AudioSystem public static final int FORCE_NO_BT_A2DP = 10; public static final int FORCE_SYSTEM_ENFORCED = 11; public static final int FORCE_HDMI_SYSTEM_AUDIO_ENFORCED = 12; - private static final int NUM_FORCE_CONFIG = 13; + public static final int FORCE_ENCODED_SURROUND_NEVER = 13; + public static final int FORCE_ENCODED_SURROUND_ALWAYS = 14; + public static final int NUM_FORCE_CONFIG = 15; public static final int FORCE_DEFAULT = FORCE_NONE; - // usage for setForceUse, must match AudioSystem::force_use + // usage for setForceUse, must match audio_policy_force_use_t public static final int FOR_COMMUNICATION = 0; public static final int FOR_MEDIA = 1; public static final int FOR_RECORD = 2; public static final int FOR_DOCK = 3; public static final int FOR_SYSTEM = 4; public static final int FOR_HDMI_SYSTEM_AUDIO = 5; - private static final int NUM_FORCE_USE = 6; + public static final int FOR_ENCODED_SURROUND = 6; + private static final int NUM_FORCE_USE = 7; // usage for AudioRecord.startRecordingSync(), must match AudioSystem::sync_event_t public static final int SYNC_EVENT_NONE = 0; diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index f02e8375f072..c48bfc532965 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -1214,13 +1214,12 @@ public class AudioTrack implements AudioRouting * An underrun occurs if the application does not write audio * data quickly enough, causing the buffer to underflow * and a potential audio glitch or pop. + * <p> * Underruns are less likely when buffer sizes are large. - * <p> Though the "int" type is signed 32-bits, the value should be reinterpreted - * as if it is unsigned 32-bits. - * That is, the next position after 0x7FFFFFFF is (int) 0x80000000. - * This is a continuously advancing counter. It can wrap around to zero - * if there are too many underruns. If there were, for example, 68 underruns per - * second then the counter would wrap in 2 years. + * It may be possible to eliminate underruns by recreating the AudioTrack with + * a larger buffer. + * Or by using {@link #setBufferSizeInFrames(int)} to dynamically increase the + * effective size of the buffer. */ public int getUnderrunCount() { return native_get_underrun_count(); diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index f1f84375c36b..4c6f0e6258f1 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -2221,7 +2221,10 @@ final public class MediaCodec { public int mode; /** - * Metadata describing encryption pattern for the protected bytes in a subsample. + * Metadata describing an encryption pattern for the protected bytes in + * a subsample. An encryption pattern consists of a repeating sequence + * of crypto blocks comprised of a number of encrypted blocks followed + * by a number of unencrypted, or skipped, blocks. */ public final static class Pattern { /** @@ -2273,6 +2276,10 @@ final public class MediaCodec { */ private Pattern pattern; + /** + * Set the subsample count, clear/encrypted sizes, key, IV and mode fields of + * a {@link MediaCodec.CryptoInfo} instance. + */ public void set( int newNumSubSamples, @NonNull int[] newNumBytesOfClearData, @@ -2289,6 +2296,10 @@ final public class MediaCodec { pattern = new Pattern(0, 0); } + /** + * Set the encryption pattern on a {@link MediaCodec.CryptoInfo} instance. + * See {@link MediaCodec.CryptoInfo.Pattern}. + */ public void setPattern(Pattern newPattern) { pattern = newPattern; } @@ -3339,14 +3350,6 @@ final public class MediaCodec { } - private int readInt(@NonNull ByteBuffer buffer, boolean asLong) { - if (asLong) { - return (int)buffer.getLong(); - } else { - return buffer.getInt(); - } - } - public MediaImage( @NonNull ByteBuffer buffer, @NonNull ByteBuffer info, boolean readOnly, long timestamp, int xOffset, int yOffset, @Nullable Rect cropRect) { @@ -3361,39 +3364,46 @@ final public class MediaCodec { mYOffset = yOffset; mInfo = info; - // read media-info. the size of media info can be 80 or 156/160 depending on - // whether it was created on a 32- or 64-bit process. See MediaImage - if (info.remaining() == 80 || info.remaining() == 156 || info.remaining() == 160) { - boolean sizeIsLong = info.remaining() != 80; - int type = readInt(info, info.remaining() == 160); + // read media-info. See MediaImage2 + if (info.remaining() == 104) { + int type = info.getInt(); if (type != TYPE_YUV) { throw new UnsupportedOperationException("unsupported type: " + type); } - int numPlanes = readInt(info, sizeIsLong); + int numPlanes = info.getInt(); if (numPlanes != 3) { throw new RuntimeException("unexpected number of planes: " + numPlanes); } - mWidth = readInt(info, sizeIsLong); - mHeight = readInt(info, sizeIsLong); + mWidth = info.getInt(); + mHeight = info.getInt(); if (mWidth < 1 || mHeight < 1) { throw new UnsupportedOperationException( "unsupported size: " + mWidth + "x" + mHeight); } - int bitDepth = readInt(info, sizeIsLong); + int bitDepth = info.getInt(); if (bitDepth != 8) { throw new UnsupportedOperationException("unsupported bit depth: " + bitDepth); } + int bitDepthAllocated = info.getInt(); + if (bitDepthAllocated != 8) { + throw new UnsupportedOperationException( + "unsupported allocated bit depth: " + bitDepthAllocated); + } mPlanes = new MediaPlane[numPlanes]; for (int ix = 0; ix < numPlanes; ix++) { - int planeOffset = readInt(info, sizeIsLong); - int colInc = readInt(info, sizeIsLong); - int rowInc = readInt(info, sizeIsLong); - int horiz = readInt(info, sizeIsLong); - int vert = readInt(info, sizeIsLong); + int planeOffset = info.getInt(); + int colInc = info.getInt(); + int rowInc = info.getInt(); + int horiz = info.getInt(); + int vert = info.getInt(); if (horiz != vert || horiz != (ix == 0 ? 1 : 2)) { throw new UnsupportedOperationException("unexpected subsampling: " + horiz + "x" + vert + " on plane " + ix); } + if (colInc < 1 || rowInc < 1) { + throw new UnsupportedOperationException("unexpected strides: " + + colInc + " pixel, " + rowInc + " row on plane " + ix); + } buffer.clear(); buffer.position(mBuffer.position() + planeOffset diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index d9690f005364..b1c1b79732c5 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -2231,6 +2231,7 @@ public final class MediaCodecInfo { switch (profileLevel.profile) { case CodecProfileLevel.HEVCProfileMain: case CodecProfileLevel.HEVCProfileMain10: + case CodecProfileLevel.HEVCProfileMain10HDR10: break; default: Log.w(TAG, "Unrecognized profile " @@ -2632,8 +2633,9 @@ public final class MediaCodecInfo { public static final int VP9Level62 = 0x1000; // from OMX_VIDEO_HEVCPROFILETYPE - public static final int HEVCProfileMain = 0x01; - public static final int HEVCProfileMain10 = 0x02; + public static final int HEVCProfileMain = 0x01; + public static final int HEVCProfileMain10 = 0x02; + public static final int HEVCProfileMain10HDR10 = 0x1000; // from OMX_VIDEO_HEVCLEVELTYPE public static final int HEVCMainTierLevel1 = 0x1; diff --git a/media/java/android/media/MediaMetadata.java b/media/java/android/media/MediaMetadata.java index 39bcef508c0a..722605f5d544 100644 --- a/media/java/android/media/MediaMetadata.java +++ b/media/java/android/media/MediaMetadata.java @@ -16,6 +16,7 @@ package android.media; import android.annotation.NonNull; +import android.annotation.StringDef; import android.content.ContentResolver; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -30,6 +31,8 @@ import android.util.ArrayMap; import android.util.Log; import android.util.SparseArray; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Set; /** @@ -39,6 +42,40 @@ public final class MediaMetadata implements Parcelable { private static final String TAG = "MediaMetadata"; /** + * @hide + */ + @StringDef({METADATA_KEY_TITLE, METADATA_KEY_ARTIST, METADATA_KEY_ALBUM, METADATA_KEY_AUTHOR, + METADATA_KEY_WRITER, METADATA_KEY_COMPOSER, METADATA_KEY_COMPILATION, + METADATA_KEY_DATE, METADATA_KEY_GENRE, METADATA_KEY_ALBUM_ARTIST, METADATA_KEY_ART_URI, + METADATA_KEY_ALBUM_ART_URI, METADATA_KEY_DISPLAY_TITLE, METADATA_KEY_DISPLAY_SUBTITLE, + METADATA_KEY_DISPLAY_DESCRIPTION, METADATA_KEY_DISPLAY_ICON_URI, + METADATA_KEY_MEDIA_ID}) + @Retention(RetentionPolicy.SOURCE) + public @interface TextKey {} + + /** + * @hide + */ + @StringDef({METADATA_KEY_DURATION, METADATA_KEY_YEAR, METADATA_KEY_TRACK_NUMBER, + METADATA_KEY_NUM_TRACKS, METADATA_KEY_DISC_NUMBER}) + @Retention(RetentionPolicy.SOURCE) + public @interface LongKey {} + + /** + * @hide + */ + @StringDef({METADATA_KEY_ART, METADATA_KEY_ALBUM_ART, METADATA_KEY_DISPLAY_ICON}) + @Retention(RetentionPolicy.SOURCE) + public @interface BitmapKey {} + + /** + * @hide + */ + @StringDef({METADATA_KEY_USER_RATING, METADATA_KEY_RATING}) + @Retention(RetentionPolicy.SOURCE) + public @interface RatingKey {} + + /** * The title of the media. */ public static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE"; @@ -232,7 +269,7 @@ public final class MediaMetadata implements Parcelable { */ public static final String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID"; - private static final String[] PREFERRED_DESCRIPTION_ORDER = { + private static final @TextKey String[] PREFERRED_DESCRIPTION_ORDER = { METADATA_KEY_TITLE, METADATA_KEY_ARTIST, METADATA_KEY_ALBUM, @@ -242,13 +279,13 @@ public final class MediaMetadata implements Parcelable { METADATA_KEY_COMPOSER }; - private static final String[] PREFERRED_BITMAP_ORDER = { + private static final @BitmapKey String[] PREFERRED_BITMAP_ORDER = { METADATA_KEY_DISPLAY_ICON, METADATA_KEY_ART, METADATA_KEY_ALBUM_ART }; - private static final String[] PREFERRED_URI_ORDER = { + private static final @TextKey String[] PREFERRED_URI_ORDER = { METADATA_KEY_DISPLAY_ICON_URI, METADATA_KEY_ART_URI, METADATA_KEY_ALBUM_ART_URI @@ -349,7 +386,7 @@ public final class MediaMetadata implements Parcelable { * @param key The key the value is stored under * @return a CharSequence value, or null */ - public CharSequence getText(String key) { + public CharSequence getText(@TextKey String key) { return mBundle.getCharSequence(key); } @@ -362,7 +399,7 @@ public final class MediaMetadata implements Parcelable { * @param key The key the value is stored under * @return a String value, or null */ - public String getString(String key) { + public String getString(@TextKey String key) { CharSequence text = getText(key); if (text != null) { return text.toString(); @@ -377,7 +414,7 @@ public final class MediaMetadata implements Parcelable { * @param key The key the value is stored under * @return a long value */ - public long getLong(String key) { + public long getLong(@LongKey String key) { return mBundle.getLong(key, 0); } @@ -388,7 +425,7 @@ public final class MediaMetadata implements Parcelable { * @param key The key the value is stored under * @return A {@link Rating} or null */ - public Rating getRating(String key) { + public Rating getRating(@RatingKey String key) { Rating rating = null; try { rating = mBundle.getParcelable(key); @@ -406,7 +443,7 @@ public final class MediaMetadata implements Parcelable { * @param key The key the value is stored under * @return A {@link Bitmap} or null */ - public Bitmap getBitmap(String key) { + public Bitmap getBitmap(@BitmapKey String key) { Bitmap bmp = null; try { bmp = mBundle.getParcelable(key); @@ -612,7 +649,7 @@ public final class MediaMetadata implements Parcelable { * @param value The CharSequence value to store * @return The Builder to allow chaining */ - public Builder putText(String key, CharSequence value) { + public Builder putText(@TextKey String key, CharSequence value) { if (METADATA_KEYS_TYPE.containsKey(key)) { if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_TEXT) { throw new IllegalArgumentException("The " + key @@ -654,7 +691,7 @@ public final class MediaMetadata implements Parcelable { * @param value The String value to store * @return The Builder to allow chaining */ - public Builder putString(String key, String value) { + public Builder putString(@TextKey String key, String value) { if (METADATA_KEYS_TYPE.containsKey(key)) { if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_TEXT) { throw new IllegalArgumentException("The " + key @@ -681,7 +718,7 @@ public final class MediaMetadata implements Parcelable { * @param value The long value to store * @return The Builder to allow chaining */ - public Builder putLong(String key, long value) { + public Builder putLong(@LongKey String key, long value) { if (METADATA_KEYS_TYPE.containsKey(key)) { if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_LONG) { throw new IllegalArgumentException("The " + key @@ -705,7 +742,7 @@ public final class MediaMetadata implements Parcelable { * @param value The Rating value to store * @return The Builder to allow chaining */ - public Builder putRating(String key, Rating value) { + public Builder putRating(@RatingKey String key, Rating value) { if (METADATA_KEYS_TYPE.containsKey(key)) { if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_RATING) { throw new IllegalArgumentException("The " + key @@ -734,7 +771,7 @@ public final class MediaMetadata implements Parcelable { * @param value The Bitmap to store * @return The Builder to allow chaining */ - public Builder putBitmap(String key, Bitmap value) { + public Builder putBitmap(@BitmapKey String key, Bitmap value) { if (METADATA_KEYS_TYPE.containsKey(key)) { if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_BITMAP) { throw new IllegalArgumentException("The " + key diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java index 8618ec98c6c3..ebe509ce1a29 100644 --- a/media/java/android/media/MediaMuxer.java +++ b/media/java/android/media/MediaMuxer.java @@ -127,7 +127,8 @@ final public class MediaMuxer { * @param path The path of the output media file. * @param format The format of the output media file. * @see android.media.MediaMuxer.OutputFormat - * @throws IOException if failed to open the file for write + * @throws IllegalArgumentException if path is invalid or format is not supported. + * @throws IOException if failed to open the file for write. */ public MediaMuxer(@NonNull String path, @Format int format) throws IOException { if (path == null) { @@ -165,6 +166,8 @@ final public class MediaMuxer { * By default, the rotation degree is 0.</p> * @param degrees the angle to be rotated clockwise in degrees. * The supported angles are 0, 90, 180, and 270 degrees. + * @throws IllegalArgumentException if degree is not supported. + * @throws IllegalStateException If this method is called after {@link #start}. */ public void setOrientationHint(int degrees) { if (degrees != 0 && degrees != 90 && degrees != 180 && degrees != 270) { @@ -217,6 +220,8 @@ final public class MediaMuxer { * Starts the muxer. * <p>Make sure this is called after {@link #addTrack} and before * {@link #writeSampleData}.</p> + * @throws IllegalStateException If this method is called after {@link #start} + * or Muxer is released */ public void start() { if (mNativeObject == 0) { @@ -233,6 +238,7 @@ final public class MediaMuxer { /** * Stops the muxer. * <p>Once the muxer stops, it can not be restarted.</p> + * @throws IllegalStateException if muxer is in the wrong state. */ public void stop() { if (mState == MUXER_STATE_STARTED) { @@ -264,6 +270,8 @@ final public class MediaMuxer { * MediaFormat. * @return The track index for this newly added track, and it should be used * in the {@link #writeSampleData}. + * @throws IllegalArgumentException if format is invalid. + * @throws IllegalStateException if muxer is in the wrong state. */ public int addTrack(@NonNull MediaFormat format) { if (format == null) { @@ -314,6 +322,8 @@ final public class MediaMuxer { * @param byteBuf The encoded sample. * @param trackIndex The track index for this sample. * @param bufferInfo The buffer information related to this sample. + * @throws IllegalArgumentException if trackIndex, byteBuf or bufferInfo is invalid. + * @throws IllegalStateException if muxer is in wrong state. * MediaMuxer uses the flags provided in {@link MediaCodec.BufferInfo}, * to signal sync frames. */ diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index bcc2b40643be..d8e0d6dca9e6 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -1547,18 +1547,30 @@ public class MediaRouter { private Object mTag; + /** @hide */ + @IntDef({PLAYBACK_TYPE_LOCAL, PLAYBACK_TYPE_REMOTE}) + @Retention(RetentionPolicy.SOURCE) + public @interface PlaybackType {} + /** * The default playback type, "local", indicating the presentation of the media is happening * on the same device (e.g. a phone, a tablet) as where it is controlled from. * @see #getPlaybackType() */ public final static int PLAYBACK_TYPE_LOCAL = 0; + /** * A playback type indicating the presentation of the media is happening on * a different device (i.e. the remote device) than where it is controlled from. * @see #getPlaybackType() */ public final static int PLAYBACK_TYPE_REMOTE = 1; + + /** @hide */ + @IntDef({PLAYBACK_VOLUME_FIXED,PLAYBACK_VOLUME_VARIABLE}) + @Retention(RetentionPolicy.SOURCE) + private @interface PlaybackVolume {} + /** * Playback information indicating the playback volume is fixed, i.e. it cannot be * controlled from this object. An example of fixed playback volume is a remote player, @@ -1783,6 +1795,7 @@ public class MediaRouter { * @return the type of playback associated with this route * @see UserRouteInfo#setPlaybackType(int) */ + @PlaybackType public int getPlaybackType() { return mPlaybackType; } @@ -1874,6 +1887,7 @@ public class MediaRouter { * @return how volume is handling on the route * @see UserRouteInfo#setVolumeHandling(int) */ + @PlaybackVolume public int getVolumeHandling() { return mVolumeHandling; } @@ -2164,7 +2178,7 @@ public class MediaRouter { * ({@link RouteInfo#PLAYBACK_TYPE_REMOTE}). * @param type */ - public void setPlaybackType(int type) { + public void setPlaybackType(@RouteInfo.PlaybackType int type) { if (mPlaybackType != type) { mPlaybackType = type; configureSessionVolume(); @@ -2177,7 +2191,7 @@ public class MediaRouter { * ({@link RouteInfo#PLAYBACK_VOLUME_VARIABLE}). * @param volumeHandling */ - public void setVolumeHandling(int volumeHandling) { + public void setVolumeHandling(@RouteInfo.PlaybackVolume int volumeHandling) { if (mVolumeHandling != volumeHandling) { mVolumeHandling = volumeHandling; configureSessionVolume(); @@ -2268,7 +2282,8 @@ public class MediaRouter { return; } if (mPlaybackType == RemoteControlClient.PLAYBACK_TYPE_REMOTE) { - int volumeControl = VolumeProvider.VOLUME_CONTROL_FIXED; + @VolumeProvider.ControlType int volumeControl = + VolumeProvider.VOLUME_CONTROL_FIXED; switch (mVolumeHandling) { case RemoteControlClient.PLAYBACK_VOLUME_VARIABLE: volumeControl = VolumeProvider.VOLUME_CONTROL_ABSOLUTE; @@ -2294,7 +2309,8 @@ public class MediaRouter { class SessionVolumeProvider extends VolumeProvider { - public SessionVolumeProvider(int volumeControl, int maxVolume, int currentVolume) { + public SessionVolumeProvider(@VolumeProvider.ControlType int volumeControl, + int maxVolume, int currentVolume) { super(volumeControl, maxVolume, currentVolume); } diff --git a/media/java/android/media/Rating.java b/media/java/android/media/Rating.java index a518bb4552d3..04d5364f7c81 100644 --- a/media/java/android/media/Rating.java +++ b/media/java/android/media/Rating.java @@ -16,10 +16,14 @@ package android.media; +import android.annotation.IntDef; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * A class to encapsulate rating information used as content metadata. * A rating is defined by its rating style (see {@link #RATING_HEART}, @@ -32,6 +36,21 @@ public final class Rating implements Parcelable { private final static String TAG = "Rating"; /** + * @hide + */ + @IntDef({RATING_NONE, RATING_HEART, RATING_THUMB_UP_DOWN, RATING_3_STARS, RATING_4_STARS, + RATING_5_STARS, RATING_PERCENTAGE}) + @Retention(RetentionPolicy.SOURCE) + public @interface Style {} + + /** + * @hide + */ + @IntDef({RATING_3_STARS, RATING_4_STARS, RATING_5_STARS}) + @Retention(RetentionPolicy.SOURCE) + public @interface StarStyle {} + + /** * Indicates a rating style is not supported. A Rating will never have this * type, but can be used by other classes to indicate they do not support * Rating. @@ -75,7 +94,7 @@ public final class Rating implements Parcelable { private final float mRatingValue; - private Rating(int ratingStyle, float rating) { + private Rating(@Style int ratingStyle, float rating) { mRatingStyle = ratingStyle; mRatingValue = rating; } @@ -124,7 +143,7 @@ public final class Rating implements Parcelable { * or {@link #RATING_PERCENTAGE}. * @return null if an invalid rating style is passed, a new Rating instance otherwise. */ - public static Rating newUnratedRating(int ratingStyle) { + public static Rating newUnratedRating(@Style int ratingStyle) { switch(ratingStyle) { case RATING_HEART: case RATING_THUMB_UP_DOWN: @@ -172,7 +191,7 @@ public final class Rating implements Parcelable { * @return null if the rating style is invalid, or the rating is out of range, * a new Rating instance otherwise. */ - public static Rating newStarRating(int starRatingStyle, float starRating) { + public static Rating newStarRating(@StarStyle int starRatingStyle, float starRating) { float maxRating = -1.0f; switch(starRatingStyle) { case RATING_3_STARS: @@ -225,6 +244,7 @@ public final class Rating implements Parcelable { * {@link #RATING_3_STARS}, {@link #RATING_4_STARS}, {@link #RATING_5_STARS}, * or {@link #RATING_PERCENTAGE}. */ + @Style public int getRatingStyle() { return mRatingStyle; } @@ -285,4 +305,4 @@ public final class Rating implements Parcelable { return mRatingValue; } } -}
\ No newline at end of file +} diff --git a/media/java/android/media/VolumeProvider.java b/media/java/android/media/VolumeProvider.java index 5d1e0041585c..1c017c564b43 100644 --- a/media/java/android/media/VolumeProvider.java +++ b/media/java/android/media/VolumeProvider.java @@ -15,8 +15,12 @@ */ package android.media; +import android.annotation.IntDef; import android.media.session.MediaSession; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Handles requests to adjust or set the volume on a session. This is also used * to push volume updates back to the session. The provider must call @@ -26,6 +30,14 @@ import android.media.session.MediaSession; * {@link MediaSession#setPlaybackToRemote}. */ public abstract class VolumeProvider { + + /** + * @hide + */ + @IntDef({VOLUME_CONTROL_FIXED, VOLUME_CONTROL_RELATIVE, VOLUME_CONTROL_ABSOLUTE}) + @Retention(RetentionPolicy.SOURCE) + public @interface ControlType {} + /** * The volume is fixed and can not be modified. Requests to change volume * should be ignored. @@ -61,7 +73,7 @@ public abstract class VolumeProvider { * @param maxVolume The maximum allowed volume. * @param currentVolume The current volume on the output. */ - public VolumeProvider(int volumeControl, int maxVolume, int currentVolume) { + public VolumeProvider(@ControlType int volumeControl, int maxVolume, int currentVolume) { mControlType = volumeControl; mMaxVolume = maxVolume; mCurrentVolume = currentVolume; @@ -72,6 +84,7 @@ public abstract class VolumeProvider { * * @return The volume control type for this volume provider */ + @ControlType public final int getVolumeControl() { return mControlType; } @@ -145,4 +158,4 @@ public abstract class VolumeProvider { public static abstract class Callback { public abstract void onVolumeChanged(VolumeProvider volumeProvider); } -}
\ No newline at end of file +} diff --git a/media/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java index 9e67c151b8cc..ada0e2cc653f 100644 --- a/media/java/android/media/browse/MediaBrowser.java +++ b/media/java/android/media/browse/MediaBrowser.java @@ -633,7 +633,6 @@ public final class MediaBrowser { return; } - List<MediaItem> data = list == null ? null : list.getList(); if (DBG) { Log.d(TAG, "onLoadChildren for " + mServiceComponent + " id=" + parentId); } @@ -644,10 +643,19 @@ public final class MediaBrowser { // Tell the app. SubscriptionCallback subscriptionCallback = subscription.getCallback(options); if (subscriptionCallback != null) { + List<MediaItem> data = list == null ? null : list.getList(); if (options == null) { - subscriptionCallback.onChildrenLoaded(parentId, data); + if (data == null) { + subscriptionCallback.onError(parentId); + } else { + subscriptionCallback.onChildrenLoaded(parentId, data); + } } else { - subscriptionCallback.onChildrenLoaded(parentId, data, options); + if (data == null) { + subscriptionCallback.onError(parentId, options); + } else { + subscriptionCallback.onChildrenLoaded(parentId, data, options); + } } return; } @@ -848,21 +856,21 @@ public final class MediaBrowser { * Called when the list of children is loaded or updated. * * @param parentId The media id of the parent media item. - * @param children The children which were loaded, or null if the id is invalid. + * @param children The children which were loaded. */ - public void onChildrenLoaded(@NonNull String parentId, List<MediaItem> children) { + public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaItem> children) { } /** * Called when the list of children is loaded or updated. * * @param parentId The media id of the parent media item. - * @param children The children which were loaded, or null if the id is invalid. + * @param children The children which were loaded. * @param options A bundle of service-specific arguments sent to the media * browse service. The contents of this bundle may affect the * information returned when browsing. */ - public void onChildrenLoaded(@NonNull String parentId, List<MediaItem> children, + public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaItem> children, @NonNull Bundle options) { } diff --git a/media/java/android/media/midi/MidiManager.java b/media/java/android/media/midi/MidiManager.java index 266b0d97cb53..07c8ae86adcf 100644 --- a/media/java/android/media/midi/MidiManager.java +++ b/media/java/android/media/midi/MidiManager.java @@ -186,8 +186,7 @@ public final class MidiManager { try { mService.registerListener(mToken, deviceListener); } catch (RemoteException e) { - Log.e(TAG, "RemoteException in registerDeviceListener"); - return; + throw e.rethrowFromSystemServer(); } mDeviceListeners.put(callback, deviceListener); } @@ -203,7 +202,7 @@ public final class MidiManager { try { mService.unregisterListener(mToken, deviceListener); } catch (RemoteException e) { - Log.e(TAG, "RemoteException in unregisterDeviceListener"); + throw e.rethrowFromSystemServer(); } } } @@ -217,8 +216,7 @@ public final class MidiManager { try { return mService.getDevices(); } catch (RemoteException e) { - Log.e(TAG, "RemoteException in getDevices"); - return new MidiDeviceInfo[0]; + throw e.rethrowFromSystemServer(); } } @@ -267,7 +265,7 @@ public final class MidiManager { try { mService.openDevice(mToken, deviceInfo, callback); } catch (RemoteException e) { - Log.e(TAG, "RemoteException in openDevice"); + throw e.rethrowFromSystemServer(); } } @@ -306,7 +304,7 @@ public final class MidiManager { try { mService.openBluetoothDevice(mToken, bluetoothDevice, callback); } catch (RemoteException e) { - Log.e(TAG, "RemoteException in openDevice"); + throw e.rethrowFromSystemServer(); } } @@ -326,8 +324,7 @@ public final class MidiManager { } return server; } catch (RemoteException e) { - Log.e(TAG, "RemoteException in createVirtualDevice"); - return null; + throw e.rethrowFromSystemServer(); } } } diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index 0bd1713c4a34..7f9653d336df 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -469,7 +469,7 @@ public final class MediaSession { * <li>{@link Rating#RATING_THUMB_UP_DOWN}</li> * </ul> */ - public void setRatingType(int type) { + public void setRatingType(@Rating.Style int type) { try { mBinder.setRatingType(type); } catch (RemoteException e) { diff --git a/media/java/android/media/session/PlaybackState.java b/media/java/android/media/session/PlaybackState.java index 1485cd782605..8283c8b967e8 100644 --- a/media/java/android/media/session/PlaybackState.java +++ b/media/java/android/media/session/PlaybackState.java @@ -16,6 +16,7 @@ package android.media.session; import android.annotation.DrawableRes; +import android.annotation.IntDef; import android.annotation.Nullable; import android.media.RemoteControlClient; import android.os.Bundle; @@ -26,6 +27,9 @@ import android.text.TextUtils; import java.util.ArrayList; import java.util.List; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Playback state for a {@link MediaSession}. This includes a state like * {@link PlaybackState#STATE_PLAYING}, the current playback position, @@ -35,6 +39,17 @@ public final class PlaybackState implements Parcelable { private static final String TAG = "PlaybackState"; /** + * @hide + */ + @IntDef(flag=true, value={ACTION_STOP, ACTION_PAUSE, ACTION_PLAY, ACTION_REWIND, + ACTION_SKIP_TO_PREVIOUS, ACTION_SKIP_TO_NEXT, ACTION_FAST_FORWARD, ACTION_SET_RATING, + ACTION_SEEK_TO, ACTION_PLAY_PAUSE, ACTION_PLAY_FROM_MEDIA_ID, ACTION_PLAY_FROM_SEARCH, + ACTION_SKIP_TO_QUEUE_ITEM, ACTION_PLAY_FROM_URI, ACTION_PREPARE, + ACTION_PREPARE_FROM_MEDIA_ID, ACTION_PREPARE_FROM_SEARCH, ACTION_PREPARE_FROM_URI}) + @Retention(RetentionPolicy.SOURCE) + public @interface Actions {} + + /** * Indicates this session supports the stop command. * * @see Builder#setActions(long) @@ -161,6 +176,15 @@ public final class PlaybackState implements Parcelable { public static final long ACTION_PREPARE_FROM_URI = 1 << 17; /** + * @hide + */ + @IntDef({STATE_NONE, STATE_STOPPED, STATE_PAUSED, STATE_PLAYING, STATE_FAST_FORWARDING, + STATE_REWINDING, STATE_BUFFERING, STATE_ERROR, STATE_CONNECTING, + STATE_SKIPPING_TO_PREVIOUS, STATE_SKIPPING_TO_NEXT, STATE_SKIPPING_TO_QUEUE_ITEM}) + @Retention(RetentionPolicy.SOURCE) + public @interface State {} + + /** * This is the default playback state and indicates that no media has been * added yet, or the performer has been reset and has no content to play. * @@ -349,9 +373,11 @@ public final class PlaybackState implements Parcelable { * <li> {@link PlaybackState#STATE_SKIPPING_TO_QUEUE_ITEM}</li> * </ul> */ + @State public int getState() { return mState; } + /** * Get the current playback position in ms. */ @@ -403,6 +429,7 @@ public final class PlaybackState implements Parcelable { * <li> {@link PlaybackState#ACTION_PREPARE_FROM_URI}</li> * </ul> */ + @Actions public long getActions() { return mActions; } @@ -866,7 +893,8 @@ public final class PlaybackState implements Parcelable { * timebase that the position was updated at. * @return this */ - public Builder setState(int state, long position, float playbackSpeed, long updateTime) { + public Builder setState(@State int state, long position, float playbackSpeed, + long updateTime) { mState = state; mPosition = position; mUpdateTime = updateTime; @@ -907,7 +935,7 @@ public final class PlaybackState implements Parcelable { * normal playback. * @return this */ - public Builder setState(int state, long position, float playbackSpeed) { + public Builder setState(@State int state, long position, float playbackSpeed) { return setState(state, position, playbackSpeed, SystemClock.elapsedRealtime()); } @@ -938,7 +966,7 @@ public final class PlaybackState implements Parcelable { * @param actions The set of actions allowed. * @return this */ - public Builder setActions(long actions) { + public Builder setActions(@Actions long actions) { mActions = actions; return this; } diff --git a/media/java/android/media/soundtrigger/SoundTriggerManager.java b/media/java/android/media/soundtrigger/SoundTriggerManager.java index 4fd331056b81..fdd7fc2a8f19 100644 --- a/media/java/android/media/soundtrigger/SoundTriggerManager.java +++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java @@ -69,6 +69,7 @@ public final class SoundTriggerManager { try { mSoundTriggerService.updateSoundModel(model.getGenericSoundModel()); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -81,7 +82,7 @@ public final class SoundTriggerManager { return new Model(mSoundTriggerService.getSoundModel( new ParcelUuid(soundModelId))); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -92,6 +93,7 @@ public final class SoundTriggerManager { try { mSoundTriggerService.deleteSoundModel(new ParcelUuid(soundModelId)); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } diff --git a/media/java/android/media/tv/ITvInputClient.aidl b/media/java/android/media/tv/ITvInputClient.aidl index 5dd4e85efa2c..72f8b5773c9e 100644 --- a/media/java/android/media/tv/ITvInputClient.aidl +++ b/media/java/android/media/tv/ITvInputClient.aidl @@ -45,7 +45,7 @@ oneway interface ITvInputClient { void onTimeShiftCurrentPositionChanged(long timeMs, int seq); // For the recording session - void onTuned(int seq); + void onTuned(int seq, in Uri channelUri); void onRecordingStopped(in Uri recordedProgramUri, int seq); void onError(int error, int seq); } diff --git a/media/java/android/media/tv/ITvInputSessionCallback.aidl b/media/java/android/media/tv/ITvInputSessionCallback.aidl index 60d6f0df9855..af76f9033b25 100644 --- a/media/java/android/media/tv/ITvInputSessionCallback.aidl +++ b/media/java/android/media/tv/ITvInputSessionCallback.aidl @@ -42,7 +42,7 @@ oneway interface ITvInputSessionCallback { void onTimeShiftCurrentPositionChanged(long timeMs); // For the recording session - void onTuned(); + void onTuned(in Uri channelUri); void onRecordingStopped(in Uri recordedProgramUri); void onError(int error); } diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java index 6e0f5f2c1a43..63e3edcffa40 100644 --- a/media/java/android/media/tv/TvInputInfo.java +++ b/media/java/android/media/tv/TvInputInfo.java @@ -677,11 +677,12 @@ public final class TvInputInfo implements Parcelable { * Constructs a new builder for {@link TvInputInfo}. * * @param context A Context of the application package implementing this class. - * @param cls The component class that is to be used for the {@link TvInputService}. + * @param component The name of the application component to be used for the + * {@link TvInputService}. */ - public Builder(Context context, Class<?> cls) { + public Builder(Context context, ComponentName component) { mContext = context; - Intent intent = new Intent(TvInputService.SERVICE_INTERFACE).setClass(context, cls); + Intent intent = new Intent(TvInputService.SERVICE_INTERFACE).setComponent(component); mResolveInfo = context.getPackageManager().resolveService(intent, PackageManager.GET_SERVICES | PackageManager.GET_META_DATA); } diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 2703b1ae13e8..0b0306c2c4fa 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -478,8 +478,10 @@ public final class TvInputManager { /** * This is called when the recording session has been tuned to the given channel and is * ready to start recording. + * + * @param channelUri The URI of a channel. */ - void onTuned(Session session) { + void onTuned(Session session, Uri channelUri) { } // For the recording session only @@ -653,11 +655,11 @@ public final class TvInputManager { } // For the recording session only - void postTuned() { + void postTuned(final Uri channelUri) { mHandler.post(new Runnable() { @Override public void run() { - mSessionCallback.onTuned(mSession); + mSessionCallback.onTuned(mSession, channelUri); } }); } @@ -1013,14 +1015,14 @@ public final class TvInputManager { } @Override - public void onTuned(int seq) { + public void onTuned(int seq, Uri channelUri) { synchronized (mSessionCallbackRecordMap) { SessionCallbackRecord record = mSessionCallbackRecordMap.get(seq); if (record == null) { Log.e(TAG, "Callback not found for seq " + seq); return; } - record.postTuned(); + record.postTuned(channelUri); } } @@ -1109,7 +1111,7 @@ public final class TvInputManager { } } } catch (RemoteException e) { - Log.e(TAG, "TvInputManager initialization failed", e); + throw e.rethrowFromSystemServer(); } } @@ -1122,7 +1124,7 @@ public final class TvInputManager { try { return mService.getTvInputList(mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1138,7 +1140,7 @@ public final class TvInputManager { try { return mService.getTvInputInfo(inputId, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1155,7 +1157,7 @@ public final class TvInputManager { try { mService.updateTvInputInfo(inputInfo, mUserId); } catch (RemoteException e) { - throw new RuntimeException("Error trying to update " + inputInfo, e); + throw e.rethrowFromSystemServer(); } } @@ -1226,7 +1228,7 @@ public final class TvInputManager { try { return mService.isParentalControlsEnabled(mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1243,7 +1245,7 @@ public final class TvInputManager { try { mService.setParentalControlsEnabled(enabled, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1258,7 +1260,7 @@ public final class TvInputManager { try { return mService.isRatingBlocked(rating.flattenToString(), mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1277,7 +1279,7 @@ public final class TvInputManager { } return ratings; } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1295,7 +1297,7 @@ public final class TvInputManager { try { mService.addBlockedRating(rating.flattenToString(), mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1313,7 +1315,7 @@ public final class TvInputManager { try { mService.removeBlockedRating(rating.flattenToString(), mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1326,7 +1328,7 @@ public final class TvInputManager { try { return mService.getTvContentRatingSystemList(mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1376,7 +1378,7 @@ public final class TvInputManager { try { mService.createSession(mClient, inputId, isRecordingSession, seq, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } } @@ -1400,7 +1402,7 @@ public final class TvInputManager { try { return mService.getAvailableTvStreamConfigList(inputId, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1418,7 +1420,7 @@ public final class TvInputManager { try { return mService.captureFrame(inputId, surface, config, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1432,7 +1434,7 @@ public final class TvInputManager { try { return mService.isSingleSessionActive(mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1446,7 +1448,7 @@ public final class TvInputManager { try { return mService.getHardwareList(); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1476,7 +1478,7 @@ public final class TvInputManager { } }, info, mUserId)); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1490,7 +1492,7 @@ public final class TvInputManager { try { mService.releaseTvInputHardware(deviceId, hardware.getInterface(), mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1504,7 +1506,7 @@ public final class TvInputManager { try { return mService.getDvbDeviceList(); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1527,7 +1529,7 @@ public final class TvInputManager { } return mService.openDvbDevice(info, device); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1598,7 +1600,7 @@ public final class TvInputManager { try { mService.releaseSession(mToken, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } releaseInternal(); @@ -1618,7 +1620,7 @@ public final class TvInputManager { try { mService.setMainSession(mToken, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1636,7 +1638,7 @@ public final class TvInputManager { try { mService.setSurface(mToken, surface, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1658,7 +1660,7 @@ public final class TvInputManager { try { mService.dispatchSurfaceChanged(mToken, format, width, height, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1679,7 +1681,7 @@ public final class TvInputManager { } mService.setVolume(mToken, volume, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1719,7 +1721,7 @@ public final class TvInputManager { try { mService.tune(mToken, channelUri, params, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1736,7 +1738,7 @@ public final class TvInputManager { try { mService.setCaptionEnabled(mToken, enabled, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1778,7 +1780,7 @@ public final class TvInputManager { try { mService.selectTrack(mToken, type, trackId, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1926,7 +1928,7 @@ public final class TvInputManager { try { mService.timeShiftPlay(mToken, recordedProgramUri, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1941,7 +1943,7 @@ public final class TvInputManager { try { mService.timeShiftPause(mToken, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1956,7 +1958,7 @@ public final class TvInputManager { try { mService.timeShiftResume(mToken, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1977,7 +1979,7 @@ public final class TvInputManager { try { mService.timeShiftSeekTo(mToken, timeMs, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -1994,7 +1996,7 @@ public final class TvInputManager { try { mService.timeShiftSetPlaybackParams(mToken, params, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -2011,7 +2013,7 @@ public final class TvInputManager { try { mService.timeShiftEnablePositionTracking(mToken, enable, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -2029,7 +2031,7 @@ public final class TvInputManager { try { mService.startRecording(mToken, programHint, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -2044,7 +2046,7 @@ public final class TvInputManager { try { mService.stopRecording(mToken, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -2067,7 +2069,7 @@ public final class TvInputManager { try { mService.sendAppPrivateCommand(mToken, action, data, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -2095,7 +2097,7 @@ public final class TvInputManager { try { mService.createOverlayView(mToken, view.getWindowToken(), frame, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -2113,7 +2115,7 @@ public final class TvInputManager { try { mService.relayoutOverlayView(mToken, frame, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -2128,7 +2130,7 @@ public final class TvInputManager { try { mService.removeOverlayView(mToken, mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } @@ -2144,7 +2146,7 @@ public final class TvInputManager { try { mService.unblockContent(mToken, unblockedRating.flattenToString(), mUserId); } catch (RemoteException e) { - throw new RuntimeException(e); + throw e.rethrowFromSystemServer(); } } diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index db851a31d363..8fb58b5ce068 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -1567,8 +1567,10 @@ public abstract class TvInputService extends Service { * passed channel and call this method to indicate that it is now available for immediate * recording. When {@link #onStartRecording(Uri)} is called, recording must start with * minimal delay. + * + * @param channelUri The URI of a channel. */ - public void notifyTuned() { + public void notifyTuned(Uri channelUri) { executeOrPostRunnableOnMainThread(new Runnable() { @MainThread @Override @@ -1576,7 +1578,7 @@ public abstract class TvInputService extends Service { try { if (DEBUG) Log.d(TAG, "notifyTuned"); if (mSessionCallback != null) { - mSessionCallback.onTuned(); + mSessionCallback.onTuned(channelUri); } } catch (RemoteException e) { Log.w(TAG, "error in notifyTuned", e); @@ -1679,7 +1681,7 @@ public abstract class TvInputService extends Service { * <p>The application may call this method before starting or after stopping recording, but * not during recording. * - * <p>The session must call {@link #notifyTuned()} if the tune request was fulfilled, or + * <p>The session must call {@link #notifyTuned(Uri)} if the tune request was fulfilled, or * {@link #notifyError(int)} otherwise. * * @param channelUri The URI of a channel. @@ -1708,8 +1710,8 @@ public abstract class TvInputService extends Service { * Called when the application requests to start TV program recording. Recording must start * immediately when this method is called. * - * <p>The application may supply the URI for a TV program as a hint for filling in program - * specific data fields in the {@link android.media.tv.TvContract.RecordedPrograms} table. + * <p>The application may supply the URI for a TV program for filling in program specific + * data fields in the {@link android.media.tv.TvContract.RecordedPrograms} table. * A non-null {@code programHint} implies the started recording should be of that specific * program, whereas null {@code programHint} does not impose such a requirement and the * recording can span across multiple TV programs. In either case, the application must call @@ -1718,10 +1720,10 @@ public abstract class TvInputService extends Service { * <p>The session must call {@link #notifyError(int)} if the start request cannot be * fulfilled. * - * @param programHint The URI for the TV program to record as a hint, built by + * @param programUri The URI for the TV program to record, built by * {@link TvContract#buildProgramUri(long)}. Can be {@code null}. */ - public abstract void onStartRecording(@Nullable Uri programHint); + public abstract void onStartRecording(@Nullable Uri programUri); /** * Called when the application requests to stop TV program recording. Recording must stop diff --git a/media/java/android/media/tv/TvRecordingClient.java b/media/java/android/media/tv/TvRecordingClient.java index 1c920f57de2a..d48ea21e07d9 100644 --- a/media/java/android/media/tv/TvRecordingClient.java +++ b/media/java/android/media/tv/TvRecordingClient.java @@ -76,11 +76,12 @@ public class TvRecordingClient { * during recording. * * <p>The recording session will respond by calling - * {@link RecordingCallback#onTuned()} if the tune request was fulfilled, or + * {@link RecordingCallback#onTuned(Uri)} if the tune request was fulfilled, or * {@link RecordingCallback#onError(int)} otherwise. * * @param inputId The ID of the TV input for the given channel. * @param channelUri The URI of a channel. + * @throws IllegalStateException If recording is already started. */ public void tune(String inputId, Uri channelUri) { tune(inputId, channelUri, null); @@ -102,6 +103,7 @@ public class TvRecordingClient { * @param inputId The ID of the TV input for the given channel. * @param channelUri The URI of a channel. * @param params Extra parameters. + * @throws IllegalStateException If recording is already started. * @hide */ @SystemApi @@ -152,8 +154,8 @@ public class TvRecordingClient { * immediately when this method is called. If the current recording session has not yet tuned to * any channel, this method throws an exception. * - * <p>The application may supply the URI for a TV program as a hint for filling in program - * specific data fields in the {@link android.media.tv.TvContract.RecordedPrograms} table. + * <p>The application may supply the URI for a TV program for filling in program specific data + * fields in the {@link android.media.tv.TvContract.RecordedPrograms} table. * A non-null {@code programHint} implies the started recording should be of that specific * program, whereas null {@code programHint} does not impose such a requirement and the * recording can span across multiple TV programs. In either case, the application must call @@ -162,15 +164,16 @@ public class TvRecordingClient { * <p>The recording session will respond by calling {@link RecordingCallback#onError(int)} if * the start request cannot be fulfilled. * - * @param programHint The URI for the TV program to record as a hint, built by + * @param programUri The URI for the TV program to record, built by * {@link TvContract#buildProgramUri(long)}. Can be {@code null}. + * @throws IllegalStateException If {@link #tune} request hasn't been handled yet. */ - public void startRecording(@Nullable Uri programHint) { + public void startRecording(@Nullable Uri programUri) { if (!mIsTuned) { throw new IllegalStateException("startRecording failed - not yet tuned"); } if (mSession != null) { - mSession.startRecording(programHint); + mSession.startRecording(programUri); mIsRecordingStarted = true; } } @@ -245,8 +248,10 @@ public class TvRecordingClient { /** * This is called when the recording session has been tuned to the given channel and is * ready to start recording. + * + * @param channelUri The URI of a channel. */ - public void onTuned() { + public void onTuned(Uri channelUri) { } /** @@ -327,7 +332,7 @@ public class TvRecordingClient { } @Override - void onTuned(TvInputManager.Session session) { + void onTuned(TvInputManager.Session session, Uri channelUri) { if (DEBUG) { Log.d(TAG, "onTuned()"); } @@ -336,7 +341,7 @@ public class TvRecordingClient { return; } mIsTuned = true; - mCallback.onTuned(); + mCallback.onTuned(channelUri); } @Override diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 29bcc1928115..760a2d13eecb 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -713,8 +713,7 @@ public class MtpDatabase implements AutoCloseable { }; } - - private MtpPropertyList getObjectPropertyList(long handle, int format, long property, + private MtpPropertyList getObjectPropertyList(int handle, int format, int property, int groupCode, int depth) { // FIXME - implement group support if (groupCode != 0) { @@ -722,29 +721,29 @@ public class MtpDatabase implements AutoCloseable { } MtpPropertyGroup propertyGroup; - if (property == 0xFFFFFFFFL) { - if (format == 0 && handle > 0) { + if (property == 0xffffffff) { + if (format == 0 && handle != 0 && handle != 0xffffffff) { // return properties based on the object's format - format = getObjectFormat((int)handle); + format = getObjectFormat(handle); } - propertyGroup = mPropertyGroupsByFormat.get(format); - if (propertyGroup == null) { + propertyGroup = mPropertyGroupsByFormat.get(format); + if (propertyGroup == null) { int[] propertyList = getSupportedObjectProperties(format); propertyGroup = new MtpPropertyGroup(this, mMediaProvider, mVolumeName, propertyList); - mPropertyGroupsByFormat.put(new Integer(format), propertyGroup); + mPropertyGroupsByFormat.put(format, propertyGroup); } } else { - propertyGroup = mPropertyGroupsByProperty.get(property); - if (propertyGroup == null) { - int[] propertyList = new int[] { (int)property }; - propertyGroup = new MtpPropertyGroup(this, mMediaProvider, - mVolumeName, propertyList); - mPropertyGroupsByProperty.put(new Integer((int)property), propertyGroup); + propertyGroup = mPropertyGroupsByProperty.get(property); + if (propertyGroup == null) { + final int[] propertyList = new int[] { property }; + propertyGroup = new MtpPropertyGroup( + this, mMediaProvider, mVolumeName, propertyList); + mPropertyGroupsByProperty.put(property, propertyGroup); } } - return propertyGroup.getPropertyList((int)handle, format, depth); + return propertyGroup.getPropertyList(handle, format, depth); } private int renameFile(int handle, String newName) { @@ -970,7 +969,7 @@ public class MtpDatabase implements AutoCloseable { Cursor c = null; try { c = mMediaProvider.query(mObjectsUri, FORMAT_PROJECTION, - ID_WHERE, new String[] { Integer.toString(handle) }, null, null); + ID_WHERE, new String[] { Integer.toString(handle) }, null, null); if (c != null && c.moveToNext()) { return c.getInt(1); } else { diff --git a/media/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java index 480acd991283..b5ea2a0a0f03 100644 --- a/media/java/android/service/media/MediaBrowserService.java +++ b/media/java/android/service/media/MediaBrowserService.java @@ -45,6 +45,7 @@ import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -120,8 +121,8 @@ public abstract class MediaBrowserService extends Service { * they are done. If more than one of those methods is called, an exception will * be thrown. * - * @see MediaBrowserService#onLoadChildren - * @see MediaBrowserService#onLoadItem + * @see #onLoadChildren + * @see #onLoadItem */ public class Result<T> { private Object mDebug; @@ -367,10 +368,16 @@ public abstract class MediaBrowserService extends Service { * {@link Result#detach result.detach} may be called before returning from * this function, and then {@link Result#sendResult result.sendResult} * called when the loading is complete. + * </p><p> + * In case the media item does not have any children, call {@link Result#sendResult} + * with an empty list which is not {@code null}. If {@code null} is sent that means + * the given {@code parentId} is invalid and {@link MediaBrowser.SubscriptionCallback#onError} + * will be called. + * </p> * * @param parentId The id of the parent media item whose children are to be * queried. - * @param result The Result to send the list of children to, or null if the + * @param result The Result to send the list of children to. Send null if the * id is invalid. */ public abstract void onLoadChildren(@NonNull String parentId, @@ -385,10 +392,16 @@ public abstract class MediaBrowserService extends Service { * {@link Result#detach result.detach} may be called before returning from * this function, and then {@link Result#sendResult result.sendResult} * called when the loading is complete. + * </p><p> + * In case the media item does not have any children, call {@link Result#sendResult} + * with an empty list which is not {@code null}. If {@code null} is sent that means + * the given {@code parentId} is invalid and {@link MediaBrowser.SubscriptionCallback#onError} + * will be called. + * </p> * * @param parentId The id of the parent media item whose children are to be * queried. - * @param result The Result to send the list of children to, or null if the + * @param result The Result to send the list of children to. Send null if the * id is invalid. * @param options A bundle of service-specific arguments sent from the media * browse. The information returned through the result should be @@ -416,7 +429,7 @@ public abstract class MediaBrowserService extends Service { * * @param itemId The id for the specific * {@link android.media.browse.MediaBrowser.MediaItem}. - * @param result The Result to send the item to, or null if the id is + * @param result The Result to send the item to. Send null if the id is * invalid. */ public void onLoadItem(String itemId, Result<MediaBrowser.MediaItem> result) { @@ -630,6 +643,9 @@ public abstract class MediaBrowserService extends Service { private List<MediaBrowser.MediaItem> applyOptions(List<MediaBrowser.MediaItem> list, final Bundle options) { + if (list == null) { + return null; + } int page = options.getInt(MediaBrowser.EXTRA_PAGE, -1); int pageSize = options.getInt(MediaBrowser.EXTRA_PAGE_SIZE, -1); if (page == -1 && pageSize == -1) { @@ -638,7 +654,7 @@ public abstract class MediaBrowserService extends Service { int fromIndex = pageSize * (page - 1); int toIndex = fromIndex + pageSize; if (page < 1 || pageSize < 1 || fromIndex >= list.size()) { - return null; + return Collections.EMPTY_LIST; } if (toIndex > list.size()) { toIndex = list.size(); diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index 556f2c770648..5722cb013026 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -231,11 +231,11 @@ MyMtpDatabase::~MyMtpDatabase() { } MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, - MtpObjectFormat format, - MtpObjectHandle parent, - MtpStorageID storage, - uint64_t size, - time_t modified) { + MtpObjectFormat format, + MtpObjectHandle parent, + MtpStorageID storage, + uint64_t size, + time_t modified) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jstring pathStr = env->NewStringUTF(path); MtpObjectHandle result = env->CallIntMethod(mDatabase, method_beginSendObject, @@ -249,7 +249,7 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, } void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, - MtpObjectFormat format, bool succeeded) { + MtpObjectFormat format, bool succeeded) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jstring pathStr = env->NewStringUTF(path); env->CallVoidMethod(mDatabase, method_endSendObject, pathStr, @@ -261,8 +261,8 @@ void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, } MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, - MtpObjectFormat format, - MtpObjectHandle parent) { + MtpObjectFormat format, + MtpObjectHandle parent) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectList, (jint)storageID, (jint)format, (jint)parent); @@ -281,8 +281,8 @@ MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, } int MyMtpDatabase::getNumObjects(MtpStorageID storageID, - MtpObjectFormat format, - MtpObjectHandle parent) { + MtpObjectFormat format, + MtpObjectHandle parent) { JNIEnv* env = AndroidRuntime::getJNIEnv(); int result = env->CallIntMethod(mDatabase, method_getNumObjects, (jint)storageID, (jint)format, (jint)parent); @@ -364,11 +364,21 @@ MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() { } MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle, - MtpObjectProperty property, - MtpDataPacket& packet) { + MtpObjectProperty property, + MtpDataPacket& packet) { + static_assert(sizeof(jint) >= sizeof(MtpObjectHandle), + "Casting MtpObjectHandle to jint loses a value"); + static_assert(sizeof(jint) >= sizeof(MtpObjectProperty), + "Casting MtpObjectProperty to jint loses a value"); JNIEnv* env = AndroidRuntime::getJNIEnv(); - jobject list = env->CallObjectMethod(mDatabase, method_getObjectPropertyList, - (jlong)handle, 0, (jlong)property, 0, 0); + jobject list = env->CallObjectMethod( + mDatabase, + method_getObjectPropertyList, + static_cast<jint>(handle), + 0, + static_cast<jint>(property), + 0, + 0); MtpResponseCode result = env->GetIntField(list, field_mResult); int count = env->GetIntField(list, field_mCount); if (result == MTP_RESPONSE_OK && count != 1) @@ -532,8 +542,8 @@ static bool readLongValue(int type, MtpDataPacket& packet, jlong& longValue) { } MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, - MtpObjectProperty property, - MtpDataPacket& packet) { + MtpObjectProperty property, + MtpDataPacket& packet) { int type; if (!getObjectPropertyInfo(property, type)) @@ -563,7 +573,7 @@ fail: } MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property, - MtpDataPacket& packet) { + MtpDataPacket& packet) { JNIEnv* env = AndroidRuntime::getJNIEnv(); if (property == MTP_DEVICE_PROPERTY_BATTERY_LEVEL) { @@ -636,7 +646,7 @@ MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property } MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property, - MtpDataPacket& packet) { + MtpDataPacket& packet) { int type; if (!getDevicePropertyInfo(property, type)) @@ -670,12 +680,20 @@ MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty /*property* } MtpResponseCode MyMtpDatabase::getObjectPropertyList(MtpObjectHandle handle, - uint32_t format, uint32_t property, - int groupCode, int depth, - MtpDataPacket& packet) { + uint32_t format, uint32_t property, + int groupCode, int depth, + MtpDataPacket& packet) { + static_assert(sizeof(jint) >= sizeof(MtpObjectHandle), + "Casting MtpObjectHandle to jint loses a value"); JNIEnv* env = AndroidRuntime::getJNIEnv(); - jobject list = env->CallObjectMethod(mDatabase, method_getObjectPropertyList, - (jlong)handle, (jint)format, (jlong)property, (jint)groupCode, (jint)depth); + jobject list = env->CallObjectMethod( + mDatabase, + method_getObjectPropertyList, + static_cast<jint>(handle), + static_cast<jint>(format), + static_cast<jint>(property), + static_cast<jint>(groupCode), + static_cast<jint>(depth)); checkAndClearExceptionFromCallback(env, __FUNCTION__); if (!list) return MTP_RESPONSE_GENERAL_ERROR; @@ -787,7 +805,7 @@ static long getLongFromExifEntry(ExifEntry *e) { } MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, - MtpObjectInfo& info) { + MtpObjectInfo& info) { MtpString path; int64_t length; MtpObjectFormat format; @@ -940,9 +958,9 @@ void* MyMtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) } MtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle, - MtpString& outFilePath, - int64_t& outFileLength, - MtpObjectFormat& outFormat) { + MtpString& outFilePath, + int64_t& outFileLength, + MtpObjectFormat& outFormat) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jint result = env->CallIntMethod(mDatabase, method_getObjectFilePath, (jint)handle, mStringBuffer, mLongBuffer); @@ -1056,7 +1074,7 @@ MtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) } MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, - MtpObjectHandleList* references) { + MtpObjectHandleList* references) { JNIEnv* env = AndroidRuntime::getJNIEnv(); int count = references->size(); jintArray array = env->NewIntArray(count); @@ -1077,7 +1095,7 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, } MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, - MtpObjectFormat format) { + MtpObjectFormat format) { static const int channelEnum[] = { 1, // mono 2, // stereo @@ -1313,7 +1331,7 @@ int register_android_mtp_MtpDatabase(JNIEnv *env) return -1; } method_getObjectPropertyList = env->GetMethodID(clazz, "getObjectPropertyList", - "(JIJII)Landroid/mtp/MtpPropertyList;"); + "(IIIII)Landroid/mtp/MtpPropertyList;"); if (method_getObjectPropertyList == NULL) { ALOGE("Can't find getObjectPropertyList"); return -1; diff --git a/opengl/java/android/opengl/GLES30.java b/opengl/java/android/opengl/GLES30.java index 9c3b505e3270..74181c513753 100644 --- a/opengl/java/android/opengl/GLES30.java +++ b/opengl/java/android/opengl/GLES30.java @@ -889,7 +889,10 @@ public class GLES30 extends GLES20 { ); // C function void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) - + /** + * @deprecated + * Use the version that takes a ByteBuffer as the last argument, or the versions that return a String. + * */ public static native void glGetTransformFeedbackVarying( int program, int index, @@ -902,6 +905,18 @@ public class GLES30 extends GLES20 { // C function void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) + public static native void glGetTransformFeedbackVarying( + int program, + int index, + int bufsize, + java.nio.IntBuffer length, + java.nio.IntBuffer size, + java.nio.IntBuffer type, + java.nio.ByteBuffer name + ); + + // C function void glGetTransformFeedbackVarying ( GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name ) + public static native String glGetTransformFeedbackVarying( int program, int index, diff --git a/packages/DocumentsUI/Android.mk b/packages/DocumentsUI/Android.mk index e1650e1bb411..d5e48b5855e7 100644 --- a/packages/DocumentsUI/Android.mk +++ b/packages/DocumentsUI/Android.mk @@ -30,9 +30,12 @@ LOCAL_AAPT_FLAGS := \ --extra-packages android.support.design \ --extra-packages android.support.v7.recyclerview +LOCAL_JACK_FLAGS := \ + -D jack.assert.policy=enable \ + -D jack.optimization.inner-class.accessors=true + LOCAL_PACKAGE_NAME := DocumentsUI LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) - -include $(LOCAL_PATH)/tests/Android.mk +include $(call all-makefiles-under, $(LOCAL_PATH)) diff --git a/packages/DocumentsUI/perf-tests/Android.mk b/packages/DocumentsUI/perf-tests/Android.mk new file mode 100644 index 000000000000..c83094e352b6 --- /dev/null +++ b/packages/DocumentsUI/perf-tests/Android.mk @@ -0,0 +1,22 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests +#LOCAL_SDK_VERSION := current + +LOCAL_SRC_FILES := $(call all-java-files-under, src) \ + $(call all-java-files-under, ../tests/src/com/android/documentsui/bots) \ + ../tests/src/com/android/documentsui/ActivityTest.java \ + ../tests/src/com/android/documentsui/DocumentsProviderHelper.java \ + ../tests/src/com/android/documentsui/StubProvider.java + +LOCAL_JAVA_LIBRARIES := android.test.runner +LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 mockito-target ub-uiautomator + +LOCAL_PACKAGE_NAME := DocumentsUIPerfTests +LOCAL_INSTRUMENTATION_FOR := DocumentsUI + +LOCAL_CERTIFICATE := platform + +include $(BUILD_PACKAGE) + diff --git a/packages/DocumentsUI/perf-tests/AndroidManifest.xml b/packages/DocumentsUI/perf-tests/AndroidManifest.xml new file mode 100644 index 000000000000..97353e7df73b --- /dev/null +++ b/packages/DocumentsUI/perf-tests/AndroidManifest.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.documentsui.perftests"> + + <application> + <uses-library android:name="android.test.runner" /> + <provider + android:name="com.android.documentsui.StressProvider" + android:authorities="com.android.documentsui.stressprovider" + android:exported="true" + android:grantUriPermissions="true" + android:permission="android.permission.MANAGE_DOCUMENTS" + android:enabled="true"> + <intent-filter> + <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> + </intent-filter> + </provider> + </application> + + <instrumentation android:name="android.test.InstrumentationTestRunner" + android:targetPackage="com.android.documentsui" + android:label="Performance tests for DocumentsUI" /> + +</manifest> diff --git a/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java b/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java new file mode 100644 index 000000000000..05fd2f7b19cd --- /dev/null +++ b/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import static com.android.documentsui.StressProvider.DEFAULT_AUTHORITY; +import static com.android.documentsui.StressProvider.STRESS_ROOT_0_ID; +import static com.android.documentsui.StressProvider.STRESS_ROOT_1_ID; + +import android.app.Activity; +import android.net.Uri; +import android.os.Bundle; +import android.os.RemoteException; +import android.test.suitebuilder.annotation.LargeTest; +import android.util.Log; +import android.view.KeyEvent; + +import com.android.documentsui.model.RootInfo; +import com.android.documentsui.EventListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.concurrent.CountDownLatch; + +@LargeTest +public class FilesActivityPerfTest extends ActivityTest<FilesActivity> { + + // Constants starting with KEY_ are used to report metrics to APCT. + private static final String KEY_FILES_LISTED_PERFORMANCE_FIRST = + "files-listed-performance-first"; + + private static final String KEY_FILES_LISTED_PERFORMANCE_MEDIAN = + "files-listed-performance-median"; + + private static final String TESTED_URI = + "content://com.android.documentsui.stressprovider/document/STRESS_ROOT_1_DOC"; + + private static final int NUM_MEASUREMENTS = 10; + + public FilesActivityPerfTest() { + super(FilesActivity.class); + } + + @Override + protected RootInfo getInitialRoot() { + return rootDir0; + } + + @Override + protected String getTestingProviderAuthority() { + return DEFAULT_AUTHORITY; + } + + @Override + protected void setupTestingRoots() throws RemoteException { + rootDir0 = mDocsHelper.getRoot(STRESS_ROOT_0_ID); + rootDir1 = mDocsHelper.getRoot(STRESS_ROOT_1_ID); + } + + @Override + public void initTestFiles() throws RemoteException { + // Nothing to create, already done by StressProvider. + } + + public void testFilesListedPerformance() throws Exception { + final BaseActivity activity = getActivity(); + + final List<Long> measurements = new ArrayList<Long>(); + EventListener listener; + for (int i = 0; i < 10; i++) { + final CountDownLatch signal = new CountDownLatch(1); + listener = new EventListener() { + @Override + public void onDirectoryNavigated(Uri uri) { + if (uri != null && TESTED_URI.equals(uri.toString())) { + mStartTime = System.currentTimeMillis(); + } else { + mStartTime = -1; + } + } + + @Override + public void onDirectoryLoaded(Uri uri) { + if (uri == null || !TESTED_URI.equals(uri.toString())) { + return; + } + assertTrue(mStartTime != -1); + getInstrumentation().waitForIdle(new Runnable() { + @Override + public void run() { + assertTrue(mStartTime != -1); + measurements.add(System.currentTimeMillis() - mStartTime); + signal.countDown(); + } + }); + } + + private long mStartTime = -1; + }; + + try { + activity.addEventListener(listener); + bots.roots.openRoot(STRESS_ROOT_1_ID); + signal.await(); + } finally { + activity.removeEventListener(listener); + } + + assertEquals(i, measurements.size()); + + // Go back to the empty root. + bots.roots.openRoot(STRESS_ROOT_0_ID); + } + + assertEquals(NUM_MEASUREMENTS, measurements.size()); + + final Bundle status = new Bundle(); + status.putDouble(KEY_FILES_LISTED_PERFORMANCE_FIRST, measurements.get(0)); + + final Long[] rawMeasurements = measurements.toArray(new Long[NUM_MEASUREMENTS]); + Arrays.sort(rawMeasurements); + + final long median = rawMeasurements[NUM_MEASUREMENTS / 2 - 1]; + status.putDouble(KEY_FILES_LISTED_PERFORMANCE_MEDIAN, median); + + getInstrumentation().sendStatus(Activity.RESULT_OK, status); + } +} diff --git a/packages/DocumentsUI/perf-tests/src/com/android/documentsui/StressProvider.java b/packages/DocumentsUI/perf-tests/src/com/android/documentsui/StressProvider.java new file mode 100644 index 000000000000..1bc802a00ec6 --- /dev/null +++ b/packages/DocumentsUI/perf-tests/src/com/android/documentsui/StressProvider.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import android.content.Context; +import android.content.pm.ProviderInfo; +import android.database.Cursor; +import android.database.MatrixCursor.RowBuilder; +import android.database.MatrixCursor; +import android.os.CancellationSignal; +import android.os.FileUtils; +import android.os.ParcelFileDescriptor; +import android.provider.DocumentsContract.Document; +import android.provider.DocumentsContract.Root; +import android.provider.DocumentsContract; +import android.provider.DocumentsProvider; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * Provider with thousands of files for testing loading time of directories in DocumentsUI. + * It doesn't support any file operations. + */ +public class StressProvider extends DocumentsProvider { + + public static final String DEFAULT_AUTHORITY = "com.android.documentsui.stressprovider"; + + // Empty root. + public static final String STRESS_ROOT_0_ID = "STRESS_ROOT_0"; + + // Root with thousands of items. + public static final String STRESS_ROOT_1_ID = "STRESS_ROOT_1"; + + private static final String STRESS_ROOT_0_DOC_ID = "STRESS_ROOT_0_DOC"; + private static final String STRESS_ROOT_1_DOC_ID = "STRESS_ROOT_1_DOC"; + + private static final String[] DEFAULT_ROOT_PROJECTION = new String[] { + Root.COLUMN_ROOT_ID, Root.COLUMN_FLAGS, Root.COLUMN_TITLE, Root.COLUMN_DOCUMENT_ID, + Root.COLUMN_AVAILABLE_BYTES + }; + private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] { + Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE, Document.COLUMN_DISPLAY_NAME, + Document.COLUMN_LAST_MODIFIED, Document.COLUMN_FLAGS, Document.COLUMN_SIZE, + }; + + private String mAuthority = DEFAULT_AUTHORITY; + private ArrayList<String> mIds = new ArrayList<>(); + + @Override + public void attachInfo(Context context, ProviderInfo info) { + mAuthority = info.authority; + super.attachInfo(context, info); + } + + @Override + public boolean onCreate() { + mIds = new ArrayList(); + for (int i = 0; i < 10000; i++) { + mIds.add(createRandomId(i)); + } + mIds.add(STRESS_ROOT_0_DOC_ID); + mIds.add(STRESS_ROOT_1_DOC_ID); + return true; + } + + @Override + public Cursor queryRoots(String[] projection) throws FileNotFoundException { + final MatrixCursor result = new MatrixCursor(DEFAULT_ROOT_PROJECTION); + includeRoot(result, STRESS_ROOT_0_ID, STRESS_ROOT_0_DOC_ID); + includeRoot(result, STRESS_ROOT_1_ID, STRESS_ROOT_1_DOC_ID); + return result; + } + + @Override + public Cursor queryDocument(String documentId, String[] projection) + throws FileNotFoundException { + final MatrixCursor result = new MatrixCursor(DEFAULT_DOCUMENT_PROJECTION); + includeDocument(result, documentId); + return result; + } + + @Override + public Cursor queryChildDocuments(String parentDocumentId, String[] projection, String sortOrder) + throws FileNotFoundException { + final MatrixCursor result = new MatrixCursor(DEFAULT_DOCUMENT_PROJECTION); + if (STRESS_ROOT_1_DOC_ID.equals(parentDocumentId)) { + for (String id : mIds) { + includeDocument(result, id); + } + } + return result; + } + + @Override + public ParcelFileDescriptor openDocument(String docId, String mode, CancellationSignal signal) + throws FileNotFoundException { + throw new UnsupportedOperationException(); + } + + private void includeRoot(MatrixCursor result, String rootId, String docId) { + final RowBuilder row = result.newRow(); + row.add(Root.COLUMN_ROOT_ID, rootId); + row.add(Root.COLUMN_FLAGS, 0); + row.add(Root.COLUMN_TITLE, rootId); + row.add(Root.COLUMN_DOCUMENT_ID, docId); + } + + private void includeDocument(MatrixCursor result, String id) { + final RowBuilder row = result.newRow(); + row.add(Document.COLUMN_DOCUMENT_ID, id); + row.add(Document.COLUMN_DISPLAY_NAME, id); + row.add(Document.COLUMN_SIZE, 0); + row.add(Document.COLUMN_MIME_TYPE, DocumentsContract.Document.MIME_TYPE_DIR); + row.add(Document.COLUMN_FLAGS, 0); + row.add(Document.COLUMN_LAST_MODIFIED, null); + } + + private static String getDocumentIdForFile(File file) { + return file.getAbsolutePath(); + } + + private String createRandomId(int index) { + final Random random = new Random(index); + final StringBuilder builder = new StringBuilder(); + for (int i = 0; i < 20; i++) { + builder.append((char) (random.nextInt(96) + 32)); + } + builder.append(index); // Append a number to guarantee uniqueness. + return builder.toString(); + } +} diff --git a/packages/SystemUI/res/drawable/qs_background_secondary.xml b/packages/DocumentsUI/res/layout/dialog_delete_confirmation.xml index 31c01629cf67..990ce0b3352b 100644 --- a/packages/SystemUI/res/drawable/qs_background_secondary.xml +++ b/packages/DocumentsUI/res/layout/dialog_delete_confirmation.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2014 The Android Open Source Project +<!-- Copyright (C) 2016 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -13,9 +13,13 @@ See the License for the specific language governing permissions and limitations under the License. --> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@color/system_secondary_color" /> - <corners - android:topLeftRadius="0dp" - android:topRightRadius="0dp" /> -</shape> + +<TextView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingTop="30dp" + android:gravity="center" + android:textAppearance="@android:style/TextAppearance.Material.Subhead" + android:textColor="@*android:color/primary_text_default_material_light"> +</TextView> diff --git a/packages/DocumentsUI/res/layout/item_doc_list.xml b/packages/DocumentsUI/res/layout/item_doc_list.xml index b169ec89320a..29f65e09f184 100644 --- a/packages/DocumentsUI/res/layout/item_doc_list.xml +++ b/packages/DocumentsUI/res/layout/item_doc_list.xml @@ -73,7 +73,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:orientation="vertical" > + android:orientation="vertical" + android:layout_gravity="center_vertical" > <TextView android:id="@android:id/title" diff --git a/packages/DocumentsUI/res/layout/item_root.xml b/packages/DocumentsUI/res/layout/item_root.xml index ff80d0730b41..816cb8a0d556 100644 --- a/packages/DocumentsUI/res/layout/item_root.xml +++ b/packages/DocumentsUI/res/layout/item_root.xml @@ -27,8 +27,6 @@ <FrameLayout android:layout_width="@dimen/icon_size" android:layout_height="@dimen/icon_size" - android:layout_marginStart="@dimen/root_icon_margin" - android:layout_marginEnd="@dimen/root_icon_margin" android:duplicateParentState="true"> <ImageView @@ -55,7 +53,7 @@ android:singleLine="true" android:ellipsize="end" android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Body1" + android:textAppearance="@android:style/TextAppearance.Material.Menu" android:textColor="@color/item_root_primary_text" /> <TextView @@ -65,7 +63,7 @@ android:singleLine="true" android:ellipsize="end" android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Body1" + android:textAppearance="@android:style/TextAppearance.Material.Caption" android:textColor="@color/item_root_primary_text" /> </LinearLayout> diff --git a/packages/DocumentsUI/res/menu/activity.xml b/packages/DocumentsUI/res/menu/activity.xml index 73571af20134..79f6fa994232 100644 --- a/packages/DocumentsUI/res/menu/activity.xml +++ b/packages/DocumentsUI/res/menu/activity.xml @@ -84,10 +84,6 @@ android:showAsAction="never" android:visible="false" /> <item - android:id="@+id/menu_advanced" - android:showAsAction="never" - android:visible="false" /> - <item android:id="@+id/menu_settings" android:title="@string/menu_settings" android:showAsAction="never" diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml index 9c665029a2de..8846b62f0c5f 100644 --- a/packages/DocumentsUI/res/values-af/strings.xml +++ b/packages/DocumentsUI/res/values-af/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Deel via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopieer tans lêers"</string> <string name="move_notification_title" msgid="6193835179777284805">"Skuif tans lêers"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Vee tans lêers uit"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> oor"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Kopieer tans <xliff:g id="COUNT_1">%1$d</xliff:g> lêers.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sommige lêers is omgeskakel"</string> <string name="allow" msgid="7225948811296386551">"Laat toe"</string> <string name="deny" msgid="2081879885755434506">"Weier"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Vee lêers uit?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Is jy seker jy wil <xliff:g id="COUNT_1">%1$d</xliff:g> lêers uitvee?</item> + <item quantity="one">Is jy seker jy wil <xliff:g id="COUNT_0">%1$d</xliff:g> lêer uitvee?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml index c255e36181aa..6f975dac6392 100644 --- a/packages/DocumentsUI/res/values-am/strings.xml +++ b/packages/DocumentsUI/res/values-am/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"በሚከተለው በኩል ያጋሩ"</string> <string name="copy_notification_title" msgid="6374299806748219777">"ፋይሎች በመገልበጥ ላይ"</string> <string name="move_notification_title" msgid="6193835179777284805">"ፋይሎችን በመውሰድ ላይ"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"ፋይሎችን በመሰረዝ ላይ"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ቀርቷል"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች በመቅዳት ላይ።</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"አንዳንድ ፋይሎች ተለውጠዋል"</string> <string name="allow" msgid="7225948811296386551">"ይፍቀዱ"</string> <string name="deny" msgid="2081879885755434506">"ያስተባብሉ"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"ፋይሎች ይሰረዙ?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml index 81a4f9bdf98a..ea4485b71c19 100644 --- a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml +++ b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Delite preko"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopiranje datoteka"</string> <string name="move_notification_title" msgid="6193835179777284805">"Datoteke se premeštaju"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Datoteke se brišu"</string> <string name="copy_remaining" msgid="6283790937387975095">"Još <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> @@ -120,7 +119,10 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Neke datoteke su konvertovane"</string> <string name="allow" msgid="7225948811296386551">"Dozvoli"</string> <string name="deny" msgid="2081879885755434506">"Odbij"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Želite li da izbrišete datoteke?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Želite li stvarno da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> datoteku?</item> + <item quantity="few">Želite li stvarno da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke?</item> + <item quantity="other">Želite li stvarno da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml index 7c096d965eeb..66af887d939e 100644 --- a/packages/DocumentsUI/res/values-bg/strings.xml +++ b/packages/DocumentsUI/res/values-bg/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Споделяне чрез"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Файловете се копират"</string> <string name="move_notification_title" msgid="6193835179777284805">"Файловете се преместват"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Изтриване на файлове"</string> <string name="copy_remaining" msgid="6283790937387975095">"Оставащо време: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Копират се <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Някои файлове бяха преобразувани"</string> <string name="allow" msgid="7225948811296386551">"Разрешаване"</string> <string name="deny" msgid="2081879885755434506">"Отказване"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Да се изтрият ли файловете?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-bs-rBA/strings.xml b/packages/DocumentsUI/res/values-bs-rBA/strings.xml index 68a2b422220f..9f5f9321f3dd 100644 --- a/packages/DocumentsUI/res/values-bs-rBA/strings.xml +++ b/packages/DocumentsUI/res/values-bs-rBA/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Podijeli preko"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopiraju se fajlovi"</string> <string name="move_notification_title" msgid="6193835179777284805">"Premještanje fajlova"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Brisanje fajlova"</string> <string name="copy_remaining" msgid="6283790937387975095">"Još <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Kopira se <xliff:g id="COUNT_1">%1$d</xliff:g> fajl.</item> @@ -120,7 +119,10 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Neke od datoteka su pretvorene"</string> <string name="allow" msgid="7225948811296386551">"Dozvoli"</string> <string name="deny" msgid="2081879885755434506">"Odbijte"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Zaista želite obrisati fajlove?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one"> Jeste li sigurni da želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajl?</item> + <item quantity="few"> Jeste li sigurni da želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajla?</item> + <item quantity="other"> Jeste li sigurni da želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml index e979b1181af6..2b136f120047 100644 --- a/packages/DocumentsUI/res/values-ca/strings.xml +++ b/packages/DocumentsUI/res/values-ca/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Comparteix mitjançant"</string> <string name="copy_notification_title" msgid="6374299806748219777">"S\'estan copiant fitxers"</string> <string name="move_notification_title" msgid="6193835179777284805">"S\'estan movent fitxers"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Suprimint els fitxers"</string> <string name="copy_remaining" msgid="6283790937387975095">"Temps restant: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">S\'estan copiant <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"S\'han convertit alguns fitxers"</string> <string name="allow" msgid="7225948811296386551">"Permet"</string> <string name="deny" msgid="2081879885755434506">"Denega"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Vols suprimir els fitxers?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Confirmes que vols suprimir <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers?</item> + <item quantity="one">Confirmes que vols suprimir <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml index 0f3b4e023578..7196c6a610bc 100644 --- a/packages/DocumentsUI/res/values-cs/strings.xml +++ b/packages/DocumentsUI/res/values-cs/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Sdílet pomocí"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopírování souborů"</string> <string name="move_notification_title" msgid="6193835179777284805">"Přesouvání souborů"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Mazání souborů"</string> <string name="copy_remaining" msgid="6283790937387975095">"Zbývající čas: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="few">Kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souborů</item> @@ -127,7 +126,11 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Některé soubory byly převedeny"</string> <string name="allow" msgid="7225948811296386551">"Povolit"</string> <string name="deny" msgid="2081879885755434506">"Odepřít"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Smazat soubory?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="few">Opravdu chcete smazat <xliff:g id="COUNT_1">%1$d</xliff:g> soubory?</item> + <item quantity="many">Opravdu chcete smazat <xliff:g id="COUNT_1">%1$d</xliff:g> souboru?</item> + <item quantity="other">Opravdu chcete smazat <xliff:g id="COUNT_1">%1$d</xliff:g> souborů?</item> + <item quantity="one">Opravdu chcete smazat <xliff:g id="COUNT_0">%1$d</xliff:g> soubor?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml index 3854f0fa6fc2..ab9271c38b9e 100644 --- a/packages/DocumentsUI/res/values-da/strings.xml +++ b/packages/DocumentsUI/res/values-da/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Del via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopierer filer"</string> <string name="move_notification_title" msgid="6193835179777284805">"Flytter filer"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Filerne slettes"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> tilbage"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Nogle filer er konverteret"</string> <string name="allow" msgid="7225948811296386551">"Tillad"</string> <string name="deny" msgid="2081879885755434506">"Afvis"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Vil du slette filerne?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Er du sikker på, at du vil slette <xliff:g id="COUNT_1">%1$d</xliff:g> fil?</item> + <item quantity="other">Er du sikker på, at du vil slette <xliff:g id="COUNT_1">%1$d</xliff:g> filer?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml index fd7f35c6db31..8c06c7fc4206 100644 --- a/packages/DocumentsUI/res/values-de/strings.xml +++ b/packages/DocumentsUI/res/values-de/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Teilen über"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Dateien werden kopiert"</string> <string name="move_notification_title" msgid="6193835179777284805">"Dateien werden verschoben"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Dateien werden gelöscht"</string> <string name="copy_remaining" msgid="6283790937387975095">"Noch <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien werden kopiert.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Einige Dateien wurden konvertiert"</string> <string name="allow" msgid="7225948811296386551">"Zulassen"</string> <string name="deny" msgid="2081879885755434506">"Ablehnen"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Dateien löschen?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Möchtest du wirklich <xliff:g id="COUNT_1">%1$d</xliff:g> Dateien löschen?</item> + <item quantity="one">Möchtest du wirklich <xliff:g id="COUNT_0">%1$d</xliff:g> Datei löschen?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml index 6257e1712c87..1752a2968c83 100644 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ b/packages/DocumentsUI/res/values-el/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Κοινή χρήση μέσω"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Αντιγραφή αρχείων"</string> <string name="move_notification_title" msgid="6193835179777284805">"Μετακίνηση αρχείων"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Διαγραφή αρχείων"</string> <string name="copy_remaining" msgid="6283790937387975095">"Απομένουν <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Αντιγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Ορισμένα αρχεία μετατράπηκαν"</string> <string name="allow" msgid="7225948811296386551">"Να επιτρέπεται"</string> <string name="deny" msgid="2081879885755434506">"Άρνηση"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Διαγραφή αρχείων;"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml index 29b91111121e..1ba7c2d85777 100644 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Compartir mediante"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando archivos"</string> <string name="move_notification_title" msgid="6193835179777284805">"Moviendo archivos"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Borrando los archivos"</string> <string name="copy_remaining" msgid="6283790937387975095">"Faltan <xliff:g id="DURATION">%s</xliff:g>."</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Se convirtieron algunos archivos"</string> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Denegar"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"¿Quieres borrar los archivos?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">¿Confirmas que quieres borrar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos?</item> + <item quantity="one">¿Confirmas que quieres borrar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml index 02e6d744fb8d..0c1f2dd7352a 100644 --- a/packages/DocumentsUI/res/values-es/strings.xml +++ b/packages/DocumentsUI/res/values-es/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando archivos"</string> <string name="move_notification_title" msgid="6193835179777284805">"Moviendo archivos"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Eliminando archivos"</string> <string name="copy_remaining" msgid="6283790937387975095">"Tiempo restante: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> archivos.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Se han convertido algunos archivos"</string> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Denegar"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"¿Eliminar archivos?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">¿Seguro que quieres eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos?</item> + <item quantity="one">¿Seguro que quieres eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-eu-rES/strings.xml b/packages/DocumentsUI/res/values-eu-rES/strings.xml index 125d899e44af..c66bae442d28 100644 --- a/packages/DocumentsUI/res/values-eu-rES/strings.xml +++ b/packages/DocumentsUI/res/values-eu-rES/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Partekatu honen bidez:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Fitxategiak kopiatzen"</string> <string name="move_notification_title" msgid="6193835179777284805">"Fitxategiak mugitzea"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Fitxategiak ezabatzea"</string> <string name="copy_remaining" msgid="6283790937387975095">"Falta den denbora: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi kopiatzen.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Artxibo batzuk bihurtu dira"</string> <string name="allow" msgid="7225948811296386551">"Onartu"</string> <string name="deny" msgid="2081879885755434506">"Ukatu"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Fitxategiak ezabatu nahi dituzu?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Ziur <xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi ezabatu nahi dituzula?</item> + <item quantity="one">Ziur <xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi ezabatu nahi duzula?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml index 0788598b5a75..1dfbe1543f2e 100644 --- a/packages/DocumentsUI/res/values-fi/strings.xml +++ b/packages/DocumentsUI/res/values-fi/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Jaa sovelluksessa"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopioidaan tiedostoja"</string> <string name="move_notification_title" msgid="6193835179777284805">"Siirretään tiedostoja"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Poistetaan tiedostoja"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> jäljellä"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Kopioidaan <xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Joitakin tiedostoja muunnettiin."</string> <string name="allow" msgid="7225948811296386551">"Salli"</string> <string name="deny" msgid="2081879885755434506">"Kiellä"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Poistetaanko tiedostot?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Haluatko varmasti poistaa <xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa?</item> + <item quantity="one">Haluatko varmasti poistaa <xliff:g id="COUNT_0">%1$d</xliff:g> tiedoston?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index 6b4c7fd12263..08dacac9d43b 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Partager par"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copie de fichiers..."</string> <string name="move_notification_title" msgid="6193835179777284805">"Déplacement des fichiers"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Suppression des fichiers"</string> <string name="copy_remaining" msgid="6283790937387975095">"Durée restante : <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Copier de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Certains fichiers ont été convertis"</string> <string name="allow" msgid="7225948811296386551">"Autoriser"</string> <string name="deny" msgid="2081879885755434506">"Refuser"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Supprimer les fichiers?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Voulez-vous vraiment supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier?</item> + <item quantity="other">Voulez-vous vraiment supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml index 84021b0e7ae1..6378191fbaab 100644 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ b/packages/DocumentsUI/res/values-fr/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Partager via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copie de fichiers en cours"</string> <string name="move_notification_title" msgid="6193835179777284805">"Déplacement de fichiers"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Suppression des fichiers…"</string> <string name="copy_remaining" msgid="6283790937387975095">"Temps restant : <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours…</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Certains fichiers ont été convertis"</string> <string name="allow" msgid="7225948811296386551">"Autoriser"</string> <string name="deny" msgid="2081879885755434506">"Refuser"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Supprimer les fichiers ?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Voulez-vous vraiment supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier ?</item> + <item quantity="other">Voulez-vous vraiment supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers ?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-gl-rES/strings.xml b/packages/DocumentsUI/res/values-gl-rES/strings.xml index fd03af710962..79cc70f5b2c2 100644 --- a/packages/DocumentsUI/res/values-gl-rES/strings.xml +++ b/packages/DocumentsUI/res/values-gl-rES/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando ficheiros"</string> <string name="move_notification_title" msgid="6193835179777284805">"Mover ficheiros"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Eliminando ficheiros"</string> <string name="copy_remaining" msgid="6283790937387975095">"Tempo restante: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Convertéronse algúns ficheiros"</string> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Rexeitar"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Queres eliminar os ficheiros?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Seguro que queres eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros?</item> + <item quantity="one">Seguro que queres eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index 2ad2aa7c2ec8..35989344173b 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Տարածել"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Ֆայլերի պատճենում"</string> <string name="move_notification_title" msgid="6193835179777284805">"Ֆայլերի տեղափոխում"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Ֆայլերը ջնջվում են"</string> <string name="copy_remaining" msgid="6283790937387975095">"Մնացել է <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի պատճենում:</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Որոշ ֆայլեր փոխարկվել են"</string> <string name="allow" msgid="7225948811296386551">"Թույլատրել"</string> <string name="deny" msgid="2081879885755434506">"Մերժել"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Ջնջե՞լ ֆայլերը:"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml index 66d40d21f9e7..d87fad336d0d 100644 --- a/packages/DocumentsUI/res/values-in/strings.xml +++ b/packages/DocumentsUI/res/values-in/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Bagikan melalui"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Menyalin file"</string> <string name="move_notification_title" msgid="6193835179777284805">"Memindahkan file"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Menghapus file"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> lagi"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Beberapa file dikonversi"</string> <string name="allow" msgid="7225948811296386551">"Izinkan"</string> <string name="deny" msgid="2081879885755434506">"Tolak"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Hapus file?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Yakin ingin menghapus <xliff:g id="COUNT_1">%1$d</xliff:g> file?</item> + <item quantity="one">Yakin ingin menghapus <xliff:g id="COUNT_0">%1$d</xliff:g> file?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-is-rIS/strings.xml b/packages/DocumentsUI/res/values-is-rIS/strings.xml index 290ec9268e05..5b2531d96d6f 100644 --- a/packages/DocumentsUI/res/values-is-rIS/strings.xml +++ b/packages/DocumentsUI/res/values-is-rIS/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Deila í gegnum"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Afritar skrár"</string> <string name="move_notification_title" msgid="6193835179777284805">"Skrár færðar"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Eyðir skrám"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> eftir"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Afritar <xliff:g id="COUNT_1">%1$d</xliff:g> skrá.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sumum skrám var umbreytt"</string> <string name="allow" msgid="7225948811296386551">"Leyfa"</string> <string name="deny" msgid="2081879885755434506">"Hafna"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Eyða skrám?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Ertu viss um að þú viljir eyða <xliff:g id="COUNT_1">%1$d</xliff:g> skrá?</item> + <item quantity="other">Ertu viss um að þú viljir eyða <xliff:g id="COUNT_1">%1$d</xliff:g> skrám?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml index 43f5fcb5b859..4785ffc06627 100644 --- a/packages/DocumentsUI/res/values-it/strings.xml +++ b/packages/DocumentsUI/res/values-it/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Condividi via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copia di file in corso"</string> <string name="move_notification_title" msgid="6193835179777284805">"Spostamento di file"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Eliminazione dei file"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> rimanenti"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Copia di <xliff:g id="COUNT_1">%1$d</xliff:g> file in corso.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alcuni file sono stati convertiti"</string> <string name="allow" msgid="7225948811296386551">"Consenti"</string> <string name="deny" msgid="2081879885755434506">"Nega"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Eliminare i file?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Vuoi eliminare <xliff:g id="COUNT_1">%1$d</xliff:g> file?</item> + <item quantity="one">Vuoi eliminare <xliff:g id="COUNT_0">%1$d</xliff:g> file?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml index 622785c4b500..1fb81ddba5e4 100644 --- a/packages/DocumentsUI/res/values-iw/strings.xml +++ b/packages/DocumentsUI/res/values-iw/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"שתף באמצעות"</string> <string name="copy_notification_title" msgid="6374299806748219777">"מעתיק קבצים"</string> <string name="move_notification_title" msgid="6193835179777284805">"מעביר קבצים"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"מחיקת קבצים מתבצעת"</string> <string name="copy_remaining" msgid="6283790937387975095">"זמן נותר: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="two">מעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> @@ -127,7 +126,11 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"קבצים מסוימים הומרו"</string> <string name="allow" msgid="7225948811296386551">"אפשר"</string> <string name="deny" msgid="2081879885755434506">"דחה"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"האם למחוק את הקבצים?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml index 3319af070bd1..32bc414f00c6 100644 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ b/packages/DocumentsUI/res/values-ja/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"共有ツール"</string> <string name="copy_notification_title" msgid="6374299806748219777">"ファイルのコピー中"</string> <string name="move_notification_title" msgid="6193835179777284805">"ファイルを移動中"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"ファイルを削除しています"</string> <string name="copy_remaining" msgid="6283790937387975095">"残り<xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>個のファイルをコピーしています。</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"一部のファイルが変換されました"</string> <string name="allow" msgid="7225948811296386551">"許可"</string> <string name="deny" msgid="2081879885755434506">"拒否"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"ファイルを削除しますか?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml index 30b78e5f7ef4..ce32f232d6af 100644 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"გაზიარება:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"მიმდ. ფაილების კოპირება"</string> <string name="move_notification_title" msgid="6193835179777284805">"ფაილების გადაადგილება"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"ფაილების წაშლა…"</string> <string name="copy_remaining" msgid="6283790937387975095">"დარჩა <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">მიმდინარეობს <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილის კოპირება.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ზოგიერთი ფაილი გარდაქმნილია"</string> <string name="allow" msgid="7225948811296386551">"უფლების მიცემა"</string> <string name="deny" msgid="2081879885755434506">"აკრძალვა"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"გსურთ ფაილების წაშლა?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml index ab045c66d915..ad1092087d51 100644 --- a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml +++ b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Бөлісу"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Файлдарды көшіру"</string> <string name="move_notification_title" msgid="6193835179777284805">"Файлдар тасымалдануда"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Файлдар жойылуда"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> қалды"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды көшіру.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Кейбір файлдар түрлендірілді"</string> <string name="allow" msgid="7225948811296386551">"Рұқсат беру"</string> <string name="deny" msgid="2081879885755434506">"Бас тарту"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Файлдарды жою керек пе?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-ky-rKG/strings.xml b/packages/DocumentsUI/res/values-ky-rKG/strings.xml index ba3a6e32d8c4..134b5b8b275f 100644 --- a/packages/DocumentsUI/res/values-ky-rKG/strings.xml +++ b/packages/DocumentsUI/res/values-ky-rKG/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Кийинки аркылуу бөлүшүү:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Файлдар көчүрүлүүдө"</string> <string name="move_notification_title" msgid="6193835179777284805">"Файлдар жылдырылууда…"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Файлдар жок кылынууда"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> калды"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл көчүрүлүүдө.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Айрым файлдардын форматы өзгөртүлдү"</string> <string name="allow" msgid="7225948811296386551">"Уруксат берүү"</string> <string name="deny" msgid="2081879885755434506">"Жок"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Файлдар жок кылынсынбы?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml index 7e4292249652..194e59008426 100644 --- a/packages/DocumentsUI/res/values-lt/strings.xml +++ b/packages/DocumentsUI/res/values-lt/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Bendrinti naudojant"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopijuojami failai"</string> <string name="move_notification_title" msgid="6193835179777284805">"Perkeliami failai"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Failų ištrynimas"</string> <string name="copy_remaining" msgid="6283790937387975095">"Liko: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Kopijuojamas <xliff:g id="COUNT_1">%1$d</xliff:g> failas.</item> @@ -127,7 +126,11 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Kai kurie failai buvo konvertuoti"</string> <string name="allow" msgid="7225948811296386551">"Leisti"</string> <string name="deny" msgid="2081879885755434506">"Atmesti"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Ištrinti failus?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">]Ar tikrai norite ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failą?</item> + <item quantity="few">]Ar tikrai norite ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failus?</item> + <item quantity="many">]Ar tikrai norite ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failo?</item> + <item quantity="other">]Ar tikrai norite ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failų?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml index 14bd7a8b6c43..cd4cb5e3c6a1 100644 --- a/packages/DocumentsUI/res/values-lv/strings.xml +++ b/packages/DocumentsUI/res/values-lv/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Kopīgot, izmantojot"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Notiek failu kopēšana"</string> <string name="move_notification_title" msgid="6193835179777284805">"Failu pārvietošana"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Notiek failu dzēšana"</string> <string name="copy_remaining" msgid="6283790937387975095">"Atlikušais laiks: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="zero">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu kopēšana.</item> @@ -120,7 +119,10 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Daži faili tika pārveidoti."</string> <string name="allow" msgid="7225948811296386551">"Atļaut"</string> <string name="deny" msgid="2081879885755434506">"Noraidīt"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Vai dzēst failus?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="zero">Vai tiešām vēlaties dzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failus?</item> + <item quantity="one">Vai tiešām vēlaties dzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failu?</item> + <item quantity="other">Vai tiešām vēlaties dzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failus?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml index 85312952e7cd..a2617f9762a0 100644 --- a/packages/DocumentsUI/res/values-mn-rMN/strings.xml +++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Дараахаар дамжуулан хуваалцах"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Файлуудыг хуулж байна"</string> <string name="move_notification_title" msgid="6193835179777284805">"Файлыг зөөвөрлөж байна"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Эдгээр файлыг устгаж байна"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> үлдсэн"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файлуудыг хуулж байна.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Зарим файлыг хөрвүүлсэн"</string> <string name="allow" msgid="7225948811296386551">"Зөвшөөрөх"</string> <string name="deny" msgid="2081879885755434506">"Татгалзах"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Эдгээр файлыг устгах уу?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-mr-rIN/strings.xml b/packages/DocumentsUI/res/values-mr-rIN/strings.xml index f747d1a62dde..c44b4810080b 100644 --- a/packages/DocumentsUI/res/values-mr-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-mr-rIN/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"द्वारे सामायिक करा"</string> <string name="copy_notification_title" msgid="6374299806748219777">"फायली कॉपी करीत आहे"</string> <string name="move_notification_title" msgid="6193835179777284805">"फायली हलविणे"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"फायली हटवित आहे"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> शिल्लक"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फाईल कॉपी करीत आहे.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"काही फायली रूपांतरित केल्या होत्या"</string> <string name="allow" msgid="7225948811296386551">"अनुमती द्या"</string> <string name="deny" msgid="2081879885755434506">"नकार द्या"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"फायली हटवायच्या?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml index d481125a12e9..17cd3486ef0f 100644 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Kongsi melalui"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Menyalin fail"</string> <string name="move_notification_title" msgid="6193835179777284805">"Mengalihkan fail"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Memadamkan fail"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> lagi"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> fail.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sesetengah fail telah ditukarkan"</string> <string name="allow" msgid="7225948811296386551">"Benarkan"</string> <string name="deny" msgid="2081879885755434506">"Nafi"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Padamkan fail?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Adakah anda pasti mahu memadamkan <xliff:g id="COUNT_1">%1$d</xliff:g> fail?</item> + <item quantity="one">Adakah anda pasti mahu memadamkan <xliff:g id="COUNT_0">%1$d</xliff:g> fail?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml index 8271428c9037..d42c98ea6bc6 100644 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ b/packages/DocumentsUI/res/values-nb/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Del via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopierer filer"</string> <string name="move_notification_title" msgid="6193835179777284805">"Flytter filer"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Sletter filene"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> gjenstår"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Noen filer er konvertert"</string> <string name="allow" msgid="7225948811296386551">"Tillat"</string> <string name="deny" msgid="2081879885755434506">"Avslå"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Vil du slette filene?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Er du sikker på at du vil slette <xliff:g id="COUNT_1">%1$d</xliff:g> filer?</item> + <item quantity="one">Er du sikker på at du vil slette <xliff:g id="COUNT_0">%1$d</xliff:g> fil?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml index 7330e1e89224..d3341943005a 100644 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ b/packages/DocumentsUI/res/values-pl/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Udostępnij przez:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopiowanie plików"</string> <string name="move_notification_title" msgid="6193835179777284805">"Przenoszenie plików"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Usuwam pliki"</string> <string name="copy_remaining" msgid="6283790937387975095">"Pozostało: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="few">Kopiowanie <xliff:g id="COUNT_1">%1$d</xliff:g> plików.</item> @@ -127,7 +126,11 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Niektóre pliki zostały przekonwertowane"</string> <string name="allow" msgid="7225948811296386551">"Zezwól"</string> <string name="deny" msgid="2081879885755434506">"Odmów"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Usunąć pliki?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="few">Na pewno chcesz usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> pliki?</item> + <item quantity="many">Na pewno chcesz usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> plików?</item> + <item quantity="other">Na pewno chcesz usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> pliku?</item> + <item quantity="one">Na pewno chcesz usunąć <xliff:g id="COUNT_0">%1$d</xliff:g> plik?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-pt-rBR/strings.xml b/packages/DocumentsUI/res/values-pt-rBR/strings.xml index 44f2ab84830a..cc5500637e29 100644 --- a/packages/DocumentsUI/res/values-pt-rBR/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rBR/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando arquivos"</string> <string name="move_notification_title" msgid="6193835179777284805">"Movendo arquivos"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Excluindo arquivos"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> restantes"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns arquivos foram convertidos"</string> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Negar"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Excluir arquivos?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Tem certeza de que deseja excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos?</item> + <item quantity="other">Tem certeza de que deseja excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml index 3d999c7258bb..1e5101982462 100644 --- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Partilhar através de"</string> <string name="copy_notification_title" msgid="6374299806748219777">"A copiar ficheiros"</string> <string name="move_notification_title" msgid="6193835179777284805">"A mover ficheiros"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Eliminar ficheiros"</string> <string name="copy_remaining" msgid="6283790937387975095">"Faltam <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">A copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns ficheiros foram convertidos"</string> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Recusar"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Pretende eliminar ficheiros?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Tem a certeza de que pretende eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros?</item> + <item quantity="one">Tem a certeza de que pretende eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml index 44f2ab84830a..cc5500637e29 100644 --- a/packages/DocumentsUI/res/values-pt/strings.xml +++ b/packages/DocumentsUI/res/values-pt/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando arquivos"</string> <string name="move_notification_title" msgid="6193835179777284805">"Movendo arquivos"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Excluindo arquivos"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> restantes"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns arquivos foram convertidos"</string> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Negar"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Excluir arquivos?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Tem certeza de que deseja excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos?</item> + <item quantity="other">Tem certeza de que deseja excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index d256a268ccb4..9932bd862552 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Trimiteți prin"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Se copiază fișierele"</string> <string name="move_notification_title" msgid="6193835179777284805">"Se mută fișierele"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Se șterg fișierele"</string> <string name="copy_remaining" msgid="6283790937387975095">"Timp rămas: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="few">Se copiază <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere.</item> @@ -120,7 +119,10 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Unele fișiere au fost convertite"</string> <string name="allow" msgid="7225948811296386551">"Permiteți"</string> <string name="deny" msgid="2081879885755434506">"Refuzați"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Ștergeți fișierele?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="few">Sigur doriți să ștergeți <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere?</item> + <item quantity="other">Sigur doriți să ștergeți <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere?</item> + <item quantity="one">Sigur doriți să ștergeți <xliff:g id="COUNT_0">%1$d</xliff:g> fișier?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml index 161bb195ebd9..ebddb27366d8 100644 --- a/packages/DocumentsUI/res/values-ru/strings.xml +++ b/packages/DocumentsUI/res/values-ru/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Поделиться"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Копирование файлов"</string> <string name="move_notification_title" msgid="6193835179777284805">"Перемещение файлов"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Удаление файлов…"</string> <string name="copy_remaining" msgid="6283790937387975095">"Осталось <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файл...</item> @@ -127,7 +126,11 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Формат некоторых файлов изменен"</string> <string name="allow" msgid="7225948811296386551">"Разрешить"</string> <string name="deny" msgid="2081879885755434506">"Отклонить"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Удаление файлов"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml index 7919533b7b6f..7b3c213c148d 100644 --- a/packages/DocumentsUI/res/values-sk/strings.xml +++ b/packages/DocumentsUI/res/values-sk/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Zdieľať"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopírovanie súborov"</string> <string name="move_notification_title" msgid="6193835179777284805">"Presúvajú sa súbory"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Odstraňujú sa súbory"</string> <string name="copy_remaining" msgid="6283790937387975095">"Zostáva: <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="few">Kopírujú sa <xliff:g id="COUNT_1">%1$d</xliff:g> súbory.</item> @@ -127,7 +126,11 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Niektoré súbory boli konvertované"</string> <string name="allow" msgid="7225948811296386551">"Povoliť"</string> <string name="deny" msgid="2081879885755434506">"Zamietnuť"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Odstrániť súbory?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="few">Naozaj chcete odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súbory?</item> + <item quantity="many">Naozaj chcete odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súboru?</item> + <item quantity="other">Naozaj chcete odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súborov?</item> + <item quantity="one">Naozaj chcete odstrániť <xliff:g id="COUNT_0">%1$d</xliff:g> súbor?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index ffa6944b70e3..7575ff8cbd64 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Делите преко"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Копирање датотека"</string> <string name="move_notification_title" msgid="6193835179777284805">"Датотеке се премештају"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Датотеке се бришу"</string> <string name="copy_remaining" msgid="6283790937387975095">"Још <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item> @@ -120,7 +119,10 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Неке датотеке су конвертоване"</string> <string name="allow" msgid="7225948811296386551">"Дозволи"</string> <string name="deny" msgid="2081879885755434506">"Одбиј"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Желите ли да избришете датотеке?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml index 656ef8f04db0..97e6ab068cc4 100644 --- a/packages/DocumentsUI/res/values-sv/strings.xml +++ b/packages/DocumentsUI/res/values-sv/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Dela via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopierar filer"</string> <string name="move_notification_title" msgid="6193835179777284805">"Filer flyttas"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Filerna tas bort"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> återstår"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">Kopierar <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Vissa filer konverterades"</string> <string name="allow" msgid="7225948811296386551">"Tillåt"</string> <string name="deny" msgid="2081879885755434506">"Neka"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Vill du ta bort filerna?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other">Vill du ta bort <xliff:g id="COUNT_1">%1$d</xliff:g> filer?</item> + <item quantity="one">Vill du ta bort <xliff:g id="COUNT_0">%1$d</xliff:g> fil?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-sw720dp/dimens.xml b/packages/DocumentsUI/res/values-sw720dp/dimens.xml index 2488fa26d544..b5d1150eda63 100644 --- a/packages/DocumentsUI/res/values-sw720dp/dimens.xml +++ b/packages/DocumentsUI/res/values-sw720dp/dimens.xml @@ -18,4 +18,6 @@ <dimen name="grid_padding_horiz">16dp</dimen> <dimen name="grid_padding_vert">16dp</dimen> + <dimen name="list_item_padding">24dp</dimen> + </resources> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml index ad4c5b9008c8..8881fcd182c9 100644 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ b/packages/DocumentsUI/res/values-th/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"แชร์ผ่าน"</string> <string name="copy_notification_title" msgid="6374299806748219777">"กำลังคัดลอกไฟล์"</string> <string name="move_notification_title" msgid="6193835179777284805">"กำลังย้ายไฟล์"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"กำลังลบไฟล์"</string> <string name="copy_remaining" msgid="6283790937387975095">"เหลือ <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">กำลังคัดลอก <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"แปลงบางไฟล์แล้ว"</string> <string name="allow" msgid="7225948811296386551">"อนุญาต"</string> <string name="deny" msgid="2081879885755434506">"ปฏิเสธ"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"ลบไฟล์เหล่านี้ไหม"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index 8c8b018b1bd2..1639425c8eed 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Ibahagi sa pamamagitan ng"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kinokopya ang mga file"</string> <string name="move_notification_title" msgid="6193835179777284805">"Inililipat ang mga file"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Pagde-delete ng mga file"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> na lang ang natitira"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Kumokopya ng <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Na-convert ang ilang file"</string> <string name="allow" msgid="7225948811296386551">"Payagan"</string> <string name="deny" msgid="2081879885755434506">"Tanggihan"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"I-delete ang mga file?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Sigurado ka bang gusto mong i-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> file?</item> + <item quantity="other">Sigurado ka bang gusto mong i-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index 602f8d7978ea..822a9ed76053 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Şunu kullanarak paylaş:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Dosyalar kopyalanıyor"</string> <string name="move_notification_title" msgid="6193835179777284805">"Dosyalar taşınıyor"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Dosyalar siliniyor"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> kaldı"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya kopyalanıyor.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Bazı dosyalar dönüştürüldü"</string> <string name="allow" msgid="7225948811296386551">"İzin Ver"</string> <string name="deny" msgid="2081879885755434506">"Reddet"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Dosyalar silinsin mi?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosyayı silmek istediğinizden emin misiniz?</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosyayı silmek istediğinizden emin misiniz?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml index 15ae4249e780..1886ca382b91 100644 --- a/packages/DocumentsUI/res/values-uk/strings.xml +++ b/packages/DocumentsUI/res/values-uk/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Надіслати через"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Копіювання файлів"</string> <string name="move_notification_title" msgid="6193835179777284805">"Переміщення файлів"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Видалення файлів"</string> <string name="copy_remaining" msgid="6283790937387975095">"Залишилося <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлу.</item> @@ -127,7 +126,11 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Деякі файли конвертовано"</string> <string name="allow" msgid="7225948811296386551">"Дозвол."</string> <string name="deny" msgid="2081879885755434506">"Забор."</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Видалити файли?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml index 272677f036d7..82d20e341183 100644 --- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml +++ b/packages/DocumentsUI/res/values-ur-rPK/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"اشتراک کریں بذریعہ"</string> <string name="copy_notification_title" msgid="6374299806748219777">"فائلیں کاپی ہو رہی ہیں"</string> <string name="move_notification_title" msgid="6193835179777284805">"فائلیں منتقل ہو رہی ہیں"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"فائلیں حذف کی جا رہی ہیں"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> باقی ہے"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں کاپی کی جا رہی ہیں۔</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"کچھ فائلوں کو تبدیل کیا گیا تھا"</string> <string name="allow" msgid="7225948811296386551">"اجازت دیں"</string> <string name="deny" msgid="2081879885755434506">"مسترد کریں"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"فائلوں کو حذف کریں؟"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml index 0a599c5dd455..ce43fc25ae1c 100644 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Quyidagi orqali ulashish"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Fayllar nusxalanmoqda"</string> <string name="move_notification_title" msgid="6193835179777284805">"Ko‘chirib o‘tkazilmoqda"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Fayllar o‘chirilmoqda"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> qoldi"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ta fayl nusxalanmoqda</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Bir nechta fayllar o‘girildi"</string> <string name="allow" msgid="7225948811296386551">"Ruxsat berish"</string> <string name="deny" msgid="2081879885755434506">"Rad qilish"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Fayllar o‘chirib tashlansinmi?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta fayl o‘chirib tashlansinmi?</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta fayl o‘chirib tashlansinmi?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml index 83a9204256e0..6e87c81ce72a 100644 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"分享方式"</string> <string name="copy_notification_title" msgid="6374299806748219777">"正在复制文件"</string> <string name="move_notification_title" msgid="6193835179777284805">"正在移动文件"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"正在删除文件"</string> <string name="copy_remaining" msgid="6283790937387975095">"剩余时间:<xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">正在复制 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件。</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分文件已转换成其他格式"</string> <string name="allow" msgid="7225948811296386551">"允许"</string> <string name="deny" msgid="2081879885755434506">"拒绝"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"要删除文件吗?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml index 532f976f0766..345bba46b7c0 100644 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"正在複製檔案"</string> <string name="move_notification_title" msgid="6193835179777284805">"正在移動檔案"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"正在刪除檔案"</string> <string name="copy_remaining" msgid="6283790937387975095">"剩餘 <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">正在複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分檔案已轉換成其他格式"</string> <string name="allow" msgid="7225948811296386551">"允許"</string> <string name="deny" msgid="2081879885755434506">"拒絕"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"要刪除檔案嗎?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml index e8b48ccc594e..c799fb314147 100644 --- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"複製檔案"</string> <string name="move_notification_title" msgid="6193835179777284805">"正在移動檔案"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"正在刪除檔案"</string> <string name="copy_remaining" msgid="6283790937387975095">"剩餘 <xliff:g id="DURATION">%s</xliff:g>"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="other">正在複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分檔案已轉換成其他格式"</string> <string name="allow" msgid="7225948811296386551">"允許"</string> <string name="deny" msgid="2081879885755434506">"拒絕"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"要刪除檔案嗎?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <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> </resources> diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml index b22f99455897..eda4f7b76eec 100644 --- a/packages/DocumentsUI/res/values-zu/strings.xml +++ b/packages/DocumentsUI/res/values-zu/strings.xml @@ -67,8 +67,7 @@ <string name="share_via" msgid="8966594246261344259">"Yabelana nge-"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Ikopisha amafayela"</string> <string name="move_notification_title" msgid="6193835179777284805">"Ihambisa amafayela"</string> - <!-- no translation found for delete_notification_title (3329403967712437496) --> - <skip /> + <string name="delete_notification_title" msgid="3329403967712437496">"Ukususa amafayela"</string> <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> okusele"</string> <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> <item quantity="one">Ikopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> @@ -113,7 +112,9 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Amanye amafayela aguqulelwe"</string> <string name="allow" msgid="7225948811296386551">"Vumela"</string> <string name="deny" msgid="2081879885755434506">"Yala"</string> - <!-- no translation found for delete_confirmation_title (1958369150786342998) --> - <skip /> - <!-- no translation found for delete_confirmation_message (6608317554854868128) --> + <string name="delete_confirmation_title" msgid="1958369150786342998">"Susa amafayela?"</string> + <plurals name="delete_confirmation_message" formatted="false" msgid="6608317554854868128"> + <item quantity="one">Ingabe uqinisekile ukuthi ufuna ukususa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>?</item> + <item quantity="other">Ingabe uqinisekile ukuthi ufuna ukususa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>?</item> + </plurals> </resources> diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml index 3dc111aa9703..6e1b30e97b30 100644 --- a/packages/DocumentsUI/res/values/strings.xml +++ b/packages/DocumentsUI/res/values/strings.xml @@ -208,11 +208,9 @@ <string name="allow">Allow</string> <!-- Text in the button asking user to deny access to a given directory. --> <string name="deny">Deny</string> - <!-- Dialog title shown to users when asking if they want to delete files (a confirmation). --> - <string name="delete_confirmation_title">Delete files?</string> <!-- Dialog text shown to users when asking if they want to delete files (a confirmation). --> <plurals name="delete_confirmation_message"> - <item quantity="one">Are you sure you want to delete <xliff:g id="count" example="1">%1$d</xliff:g> file?</item> - <item quantity="other">Are you sure you want to delete <xliff:g id="count" example="3">%1$d</xliff:g> files?</item> + <item quantity="one">Delete <xliff:g id="count" example="1">%1$d</xliff:g> file?</item> + <item quantity="other">Delete <xliff:g id="count" example="3">%1$d</xliff:g> files?</item> </plurals> </resources> diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java index 95c49ffe8a92..6efe9d17d203 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -22,8 +22,6 @@ import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_ENTER; import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_LEAVE; import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_NONE; import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_SIDE; -import static com.android.internal.util.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkState; import android.app.Activity; import android.app.Fragment; @@ -41,6 +39,7 @@ import android.provider.DocumentsContract.Root; import android.support.annotation.CallSuper; import android.support.annotation.LayoutRes; import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; @@ -54,7 +53,6 @@ import com.android.documentsui.dirlist.Model; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.RootInfo; -import com.android.internal.util.Preconditions; import java.io.FileNotFoundException; import java.util.ArrayList; @@ -70,6 +68,7 @@ public abstract class BaseActivity extends Activity SearchViewManager mSearchManager; DrawerController mDrawer; NavigationView mNavigator; + List<EventListener> mEventListeners = new ArrayList<>(); private final String mTag; @@ -152,7 +151,6 @@ public abstract class BaseActivity extends Activity final MenuItem sortSize = menu.findItem(R.id.menu_sort_size); final MenuItem grid = menu.findItem(R.id.menu_grid); final MenuItem list = menu.findItem(R.id.menu_list); - final MenuItem advanced = menu.findItem(R.id.menu_advanced); final MenuItem fileSize = menu.findItem(R.id.menu_file_size); // Search uses backend ranking; no sorting, recents doesn't support sort. @@ -164,9 +162,6 @@ public abstract class BaseActivity extends Activity grid.setVisible(mState.derivedMode != State.MODE_GRID); list.setVisible(mState.derivedMode != State.MODE_LIST); - advanced.setVisible(!mState.forceAdvanced); - advanced.setTitle(LocalPreferences.getDisplayAdvancedDevices(this) - ? R.string.menu_advanced_hide : R.string.menu_advanced_show); fileSize.setTitle(LocalPreferences.getDisplayFileSize(this) ? R.string.menu_file_size_hide : R.string.menu_file_size_show); @@ -202,10 +197,6 @@ public abstract class BaseActivity extends Activity state.forceSize = intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_FILESIZE, false); state.showSize = state.forceSize || LocalPreferences.getDisplayFileSize(this); - state.forceAdvanced = intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, false); - state.showAdvanced = state.forceAdvanced - || LocalPreferences.getDisplayAdvancedDevices(this); - state.initAcceptMimes(intent); state.excludedAuthorities = getExcludedAuthorities(); @@ -281,10 +272,6 @@ public abstract class BaseActivity extends Activity } return true; - case R.id.menu_advanced: - setDisplayAdvancedDevices(!LocalPreferences.getDisplayAdvancedDevices(this)); - return true; - case R.id.menu_file_size: setDisplayFileSize(!LocalPreferences.getDisplayFileSize(this)); return true; @@ -330,7 +317,10 @@ public abstract class BaseActivity extends Activity } void openContainerDocument(DocumentInfo doc) { - checkArgument(doc.isContainer()); + assert(doc.isContainer()); + + notifyDirectoryNavigated(doc.derivedUri); + mState.pushDocument(doc); // Show an opening animation only if pressing "back" would get us back to the // previous directory. Especially after opening a root document, pressing @@ -373,7 +363,8 @@ public abstract class BaseActivity extends Activity @Override public void onSearchChanged(@Nullable String query) { // We should not get here if root is not searchable - checkState(canSearchRoot()); + assert(canSearchRoot()); + reloadSearch(query); } @@ -432,13 +423,6 @@ public abstract class BaseActivity extends Activity return mState; } - void setDisplayAdvancedDevices(boolean display) { - LocalPreferences.setDisplayAdvancedDevices(this, display); - mState.showAdvanced = mState.forceAdvanced | display; - RootsFragment.get(getFragmentManager()).onDisplayStateChanged(); - invalidateOptionsMenu(); - } - void setDisplayFileSize(boolean display) { LocalPreferences.setDisplayFileSize(this, display); mState.showSize = display; @@ -595,6 +579,28 @@ public abstract class BaseActivity extends Activity return super.onKeyDown(keyCode, event); } + @VisibleForTesting + public void addEventListener(EventListener listener) { + mEventListeners.add(listener); + } + + @VisibleForTesting + public void removeEventListener(EventListener listener) { + mEventListeners.remove(listener); + } + + public void notifyDirectoryLoaded(Uri uri) { + for (EventListener listener : mEventListeners) { + listener.onDirectoryLoaded(uri); + } + } + + void notifyDirectoryNavigated(Uri uri) { + for (EventListener listener : mEventListeners) { + listener.onDirectoryNavigated(uri); + } + } + /** * Toggles focus between the navigation drawer and the directory listing. If the drawer isn't * locked, open/close it as appropriate. @@ -673,7 +679,8 @@ public abstract class BaseActivity extends Activity @Override protected RootInfo run(RootInfo... roots) { - checkArgument(roots.length == 1); + assert(roots.length == 1); + final RootInfo currentRoot = roots[0]; final Collection<RootInfo> cachedRoots = mOwner.mRoots.getRootsBlocking(); RootInfo homeRoot = null; @@ -686,7 +693,7 @@ public abstract class BaseActivity extends Activity return null; } } - Preconditions.checkNotNull(homeRoot); + assert(homeRoot != null); mHome = mOwner.getRootDocumentBlocking(homeRoot); return homeRoot; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java index 13b7b14600eb..d2e918c918e8 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java @@ -59,7 +59,6 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { private CancellationSignal mSignal; private DirectoryResult mResult; - public DirectoryLoader(Context context, int type, RootInfo root, DocumentInfo doc, Uri uri, int userSortOrder, boolean inSearchMode) { super(context, ProviderExecutor.forAuthority(root.authority)); @@ -84,6 +83,7 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { final String authority = mUri.getAuthority(); final DirectoryResult result = new DirectoryResult(); + result.doc = mDoc; // Use default document when searching if (mSearchMode) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryResult.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryResult.java index 22e438addc4c..62686439c11b 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryResult.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryResult.java @@ -22,12 +22,15 @@ import static com.android.documentsui.State.SORT_ORDER_UNKNOWN; import android.content.ContentProviderClient; import android.database.Cursor; +import com.android.documentsui.model.DocumentInfo; + import libcore.io.IoUtils; public class DirectoryResult implements AutoCloseable { ContentProviderClient client; public Cursor cursor; public Exception exception; + public DocumentInfo doc; public int sortOrder = SORT_ORDER_UNKNOWN; diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentClipper.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentClipper.java index b3c28469e71d..15bfc3b93087 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentClipper.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentClipper.java @@ -28,7 +28,6 @@ import android.support.annotation.Nullable; import android.util.Log; import com.android.documentsui.model.DocumentInfo; -import com.android.internal.util.Preconditions; import libcore.io.IoUtils; @@ -85,7 +84,7 @@ public final class DocumentClipper { * This should be run from inside an AsyncTask. */ public List<DocumentInfo> getDocumentsFromClipData(ClipData clipData) { - Preconditions.checkNotNull(clipData); + assert(clipData != null); final List<DocumentInfo> srcDocs = new ArrayList<>(); int count = clipData.getItemCount(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index ed531a8e1be3..12a41862e436 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -23,7 +23,6 @@ import static com.android.documentsui.State.ACTION_OPEN; import static com.android.documentsui.State.ACTION_OPEN_TREE; import static com.android.documentsui.State.ACTION_PICK_COPY_DESTINATION; import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_NONE; -import static com.android.internal.util.Preconditions.checkArgument; import android.app.Activity; import android.app.Fragment; @@ -333,7 +332,7 @@ public class DocumentsActivity extends BaseActivity { @Override void onDirectoryCreated(DocumentInfo doc) { - checkArgument(doc.isDirectory()); + assert(doc.isDirectory()); openContainerDocument(doc); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DownloadsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DownloadsActivity.java index 536feeb4ecc8..2f784cbf2ac3 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DownloadsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DownloadsActivity.java @@ -16,10 +16,8 @@ package com.android.documentsui; -import static com.android.documentsui.Shared.DEBUG; import static com.android.documentsui.State.ACTION_MANAGE; import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_NONE; -import static com.android.internal.util.Preconditions.checkState; import android.app.Activity; import android.app.Fragment; @@ -41,7 +39,6 @@ import com.android.documentsui.dirlist.DirectoryFragment; import com.android.documentsui.dirlist.Model; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.RootInfo; -import com.android.internal.util.Preconditions; import java.util.Arrays; import java.util.List; @@ -101,12 +98,10 @@ public class DownloadsActivity extends BaseActivity { public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - final MenuItem advanced = menu.findItem(R.id.menu_advanced); final MenuItem createDir = menu.findItem(R.id.menu_create_dir); final MenuItem pasteFromCb = menu.findItem(R.id.menu_paste_from_clipboard); final MenuItem fileSize = menu.findItem(R.id.menu_file_size); - advanced.setVisible(false); createDir.setVisible(false); pasteFromCb.setEnabled(false); fileSize.setVisible(false); @@ -121,11 +116,11 @@ public class DownloadsActivity extends BaseActivity { final RootInfo root = getCurrentRoot(); final DocumentInfo cwd = getCurrentDirectory(); - if (DEBUG) checkState(!mSearchManager.isSearching()); + assert(!mSearchManager.isSearching()); // If started in manage roots mode, there has to be a cwd (i.e. the root dir of the managed // root). - Preconditions.checkNotNull(cwd); + assert(cwd != null); // Normal boring directory DirectoryFragment.showDirectory(fm, root, cwd, anim); @@ -133,7 +128,8 @@ public class DownloadsActivity extends BaseActivity { @Override public void onDocumentPicked(DocumentInfo doc, Model model) { - Preconditions.checkArgument(!doc.isDirectory()); + assert(!doc.isDirectory()); + // First try managing the document; we expect manager to filter // based on authority, so we don't grant. final Intent manage = new Intent(DocumentsContract.ACTION_MANAGE_DOCUMENT); diff --git a/packages/DocumentsUI/src/com/android/documentsui/DrawerController.java b/packages/DocumentsUI/src/com/android/documentsui/DrawerController.java index bcf69c44070a..9fceff569d76 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DrawerController.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DrawerController.java @@ -16,8 +16,6 @@ package com.android.documentsui; -import static com.android.internal.util.Preconditions.checkArgument; - import android.app.Activity; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; @@ -83,7 +81,7 @@ abstract class DrawerController implements DrawerListener { DrawerLayout layout, View drawer, ActionBarDrawerToggle toggle, Toolbar drawerToolbar) { mToolbar = drawerToolbar; - checkArgument(layout != null); + assert(layout != null); mLayout = layout; mDrawer = drawer; diff --git a/packages/DocumentsUI/src/com/android/documentsui/EventListener.java b/packages/DocumentsUI/src/com/android/documentsui/EventListener.java new file mode 100644 index 000000000000..c15e9a641cfe --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/EventListener.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import android.net.Uri; +import android.support.annotation.Nullable; + +public interface EventListener { + /** + * @param uri Uri navigated to. If recents, then null. + */ + void onDirectoryNavigated(@Nullable Uri uri); + + /** + * @param uri Uri of the loaded directory. If recents, then null. + */ + void onDirectoryLoaded(@Nullable Uri uri); +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java index a3378ad7e3bd..c17be067d55d 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java @@ -19,8 +19,6 @@ package com.android.documentsui; import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_UNKNOWN; import static com.android.documentsui.Shared.DEBUG; import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_NONE; -import static com.android.internal.util.Preconditions.checkArgument; -import static com.android.internal.util.Preconditions.checkState; import android.app.Activity; import android.app.FragmentManager; @@ -97,11 +95,11 @@ public class FilesActivity extends BaseActivity { // Launch URIs support sensible activity management, but don't specify a real // content target. if (DEBUG) Log.d(TAG, "Launching with non-empty stack."); - checkState(uri == null || uri.getAuthority() == null || + assert(uri == null || uri.getAuthority() == null || LauncherActivity.isLaunchUri(uri)); refreshCurrentRootAndDirectory(ANIM_NONE); } else if (intent.getAction() == Intent.ACTION_VIEW) { - checkArgument(uri != null); + assert(uri != null); new OpenUriForViewTask(this).executeOnExecutor( ProviderExecutor.forAuthority(uri.getAuthority()), uri); } else if (DocumentsContract.isRootUri(this, uri)) { @@ -143,7 +141,7 @@ public class FilesActivity extends BaseActivity { state.allowMultiple = true; // Options specific to the DocumentsActivity. - checkArgument(!intent.hasExtra(Intent.EXTRA_LOCAL_ONLY)); + assert(!intent.hasExtra(Intent.EXTRA_LOCAL_ONLY)); final DocumentStack stack = intent.getParcelableExtra(Shared.EXTRA_STACK); if (stack != null) { @@ -212,7 +210,7 @@ public class FilesActivity extends BaseActivity { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_create_dir: - checkState(canCreateDirectory()); + assert(canCreateDirectory()); showCreateDirectoryDialog(); return true; case R.id.menu_new_window: @@ -250,7 +248,7 @@ public class FilesActivity extends BaseActivity { final RootInfo root = getCurrentRoot(); final DocumentInfo cwd = getCurrentDirectory(); - if (DEBUG) checkState(!mSearchManager.isSearching()); + assert(!mSearchManager.isSearching()); if (cwd == null) { DirectoryFragment.showRecentsOpen(fm, anim); diff --git a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java index 4bffc49e5ac0..c7c61c3189ac 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java +++ b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java @@ -17,7 +17,6 @@ package com.android.documentsui; import static com.android.documentsui.State.MODE_UNKNOWN; -import static com.android.internal.util.Preconditions.checkArgument; import android.content.Context; import android.preference.PreferenceManager; @@ -26,17 +25,9 @@ import com.android.documentsui.State.ViewMode; import com.android.documentsui.model.RootInfo; public class LocalPreferences { - private static final String KEY_ADVANCED_DEVICES = "advancedDevices"; private static final String KEY_FILE_SIZE = "fileSize"; private static final String ROOT_VIEW_MODE_PREFIX = "rootViewMode-"; - public static boolean getDisplayAdvancedDevices(Context context) { - boolean defaultAdvanced = context.getResources() - .getBoolean(R.bool.config_defaultAdvancedDevices); - return PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(KEY_ADVANCED_DEVICES, defaultAdvanced); - } - public static boolean getDisplayFileSize(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(KEY_FILE_SIZE, false); @@ -48,18 +39,14 @@ public class LocalPreferences { .getInt(createKey(root), fallback); } - public static void setDisplayAdvancedDevices(Context context, boolean display) { - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putBoolean(KEY_ADVANCED_DEVICES, display).apply(); - } - public static void setDisplayFileSize(Context context, boolean display) { PreferenceManager.getDefaultSharedPreferences(context).edit() .putBoolean(KEY_FILE_SIZE, display).apply(); } public static void setViewMode(Context context, RootInfo root, @ViewMode int viewMode) { - checkArgument(viewMode != MODE_UNKNOWN); + assert(viewMode != MODE_UNKNOWN); + PreferenceManager.getDefaultSharedPreferences(context).edit() .putInt(createKey(root), viewMode).apply(); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java index 699605f5cdcb..dcaea15459a6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java @@ -16,11 +16,12 @@ package com.android.documentsui; +import static android.os.Environment.STANDARD_DIRECTORIES; import static com.android.documentsui.Shared.DEBUG; -import static com.android.internal.util.Preconditions.checkArgument; - import android.annotation.IntDef; import android.annotation.Nullable; +import android.annotation.StringDef; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; @@ -33,6 +34,7 @@ import com.android.documentsui.model.RootInfo; import com.android.documentsui.services.FileOperationService; import com.android.documentsui.services.FileOperationService.OpType; import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -363,7 +365,7 @@ public final class Metrics { if (operationType == FileOperationService.OPERATION_DELETE) { logHistogram(context, histogram, FILEOP_DELETE); } else { - checkArgument(dst != null); + assert(dst != null); @Provider int providerType = isSystemProvider(dst.authority) ? PROVIDER_SYSTEM : PROVIDER_EXTERNAL; logHistogram(context, histogram, getOpCode(operationType, providerType)); @@ -377,6 +379,84 @@ public final class Metrics { logHistogram(context, histogram, getOpCode(operationType, PROVIDER_INTRA)); } + // Types for logInvalidScopedAccessRequest + public static final String SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS = + "scoped_directory_access_invalid_args"; + public static final String SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY = + "scoped_directory_access_invalid_dir"; + public static final String SCOPED_DIRECTORY_ACCESS_ERROR = + "scoped_directory_access_error"; + + @StringDef(value = { + SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS, + SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY, + SCOPED_DIRECTORY_ACCESS_ERROR + }) + @Retention(RetentionPolicy.SOURCE) + public @interface InvalidScopedAccess{} + + public static void logInvalidScopedAccessRequest(Context context, + @InvalidScopedAccess String type) { + MetricsLogger.count(context, type, 1); + switch (type) { + case SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS: + case SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY: + case SCOPED_DIRECTORY_ACCESS_ERROR: + MetricsLogger.count(context, type, 1); + break; + default: + Log.wtf(TAG, "invalid InvalidScopedAccess: " + type); + } + } + + // Types for logValidScopedAccessRequest + public static final int SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED = 0; + public static final int SCOPED_DIRECTORY_ACCESS_GRANTED = 1; + public static final int SCOPED_DIRECTORY_ACCESS_DENIED = 2; + + @IntDef(flag = true, value = { + SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED, + SCOPED_DIRECTORY_ACCESS_GRANTED, + SCOPED_DIRECTORY_ACCESS_DENIED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ScopedAccessGrant {} + + public static void logValidScopedAccessRequest(Activity activity, String directory, + @ScopedAccessGrant int type) { + int index = -1; + for (int i = 0; i < STANDARD_DIRECTORIES.length; i++) { + if (STANDARD_DIRECTORIES[i].equals(directory)) { + index = i; + break; + } + } + final String packageName = activity.getCallingPackage(); + switch (type) { + case SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED: + MetricsLogger.action(activity, + MetricsEvent.ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_PACKAGE, + packageName); + MetricsLogger.action(activity, + MetricsEvent.ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_FOLDER, index); + break; + case SCOPED_DIRECTORY_ACCESS_GRANTED: + MetricsLogger.action(activity, + MetricsEvent.ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_PACKAGE, packageName); + MetricsLogger.action(activity, + MetricsEvent.ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_FOLDER, index); + break; + case SCOPED_DIRECTORY_ACCESS_DENIED: + MetricsLogger.action(activity, + MetricsEvent.ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_PACKAGE, packageName); + MetricsLogger.action(activity, + MetricsEvent.ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_FOLDER, index); + break; + default: + Log.wtf(TAG, "invalid ScopedAccessGrant: " + type); + } + } + /** * Internal method for making a MetricsLogger.count call. Increments the given counter by 1. * diff --git a/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java b/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java index 27d6797fdce6..dc529ceb18ec 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java @@ -17,9 +17,18 @@ package com.android.documentsui; import static android.os.Environment.isStandardDirectory; +import static android.os.Environment.STANDARD_DIRECTORIES; import static android.os.storage.StorageVolume.EXTRA_DIRECTORY_NAME; import static android.os.storage.StorageVolume.EXTRA_STORAGE_VOLUME; import static com.android.documentsui.Shared.DEBUG; +import static com.android.documentsui.Metrics.logInvalidScopedAccessRequest; +import static com.android.documentsui.Metrics.logValidScopedAccessRequest; +import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED; +import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_DENIED; +import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_ERROR; +import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_GRANTED; +import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS; +import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY; import android.app.Activity; import android.app.ActivityManager; @@ -73,6 +82,7 @@ public class OpenExternalDirectoryActivity extends Activity { final Intent intent = getIntent(); if (intent == null) { if (DEBUG) Log.d(TAG, "missing intent"); + logInvalidScopedAccessRequest(this, SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS); setResult(RESULT_CANCELED); finish(); return; @@ -82,12 +92,14 @@ public class OpenExternalDirectoryActivity extends Activity { if (DEBUG) Log.d(TAG, "extra " + EXTRA_STORAGE_VOLUME + " is not a StorageVolume: " + storageVolume); + logInvalidScopedAccessRequest(this, SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS); setResult(RESULT_CANCELED); finish(); return; } final String directoryName = intent.getStringExtra(EXTRA_DIRECTORY_NAME); if (directoryName == null) { + logInvalidScopedAccessRequest(this, SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS); if (DEBUG) Log.d(TAG, "missing extra " + EXTRA_DIRECTORY_NAME + " on " + intent); setResult(RESULT_CANCELED); finish(); @@ -125,6 +137,7 @@ public class OpenExternalDirectoryActivity extends Activity { } catch (IOException e) { Log.e(TAG, "Could not get canonical file for volume " + storageVolume.dump() + " and directory " + directoryName); + logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_ERROR); return false; } final StorageManager sm = @@ -138,6 +151,7 @@ public class OpenExternalDirectoryActivity extends Activity { if (DEBUG) Log.d(TAG, "Directory '" + directory + "' is not standard (full path: '" + file.getAbsolutePath() + "')"); + logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY); return false; } @@ -159,6 +173,8 @@ public class OpenExternalDirectoryActivity extends Activity { // Checks if the user has granted the permission already. final Intent intent = getIntentForExistingPermission(activity, file); if (intent != null) { + logValidScopedAccessRequest(activity, directory, + SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED); activity.setResult(RESULT_OK, intent); activity.finish(); return true; @@ -166,12 +182,14 @@ public class OpenExternalDirectoryActivity extends Activity { if (volumeLabel == null) { Log.e(TAG, "Could not get volume for " + file); + logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_ERROR); return false; } // Gets the package label. final String appLabel = getAppLabel(activity); if (appLabel == null) { + // Error already logged. return false; } @@ -198,6 +216,7 @@ public class OpenExternalDirectoryActivity extends Activity { try { return pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0)).toString(); } catch (NameNotFoundException e) { + logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_ERROR); Log.w(TAG, "Could not get label for package " + packageName); return null; } @@ -217,18 +236,21 @@ public class OpenExternalDirectoryActivity extends Activity { return volume.isVisibleForWrite(userId) && root.equals(path); } - private static Uri getGrantedUriPermission(ContentProviderClient provider, File file) { + private static Uri getGrantedUriPermission(Context context, ContentProviderClient provider, + File file) { // Calls ExternalStorageProvider to get the doc id for the file final Bundle bundle; try { bundle = provider.call("getDocIdForFileCreateNewDir", file.getPath(), null); } catch (RemoteException e) { Log.e(TAG, "Did not get doc id from External Storage provider for " + file, e); + logInvalidScopedAccessRequest(context, SCOPED_DIRECTORY_ACCESS_ERROR); return null; } final String docId = bundle == null ? null : bundle.getString("DOC_ID"); if (docId == null) { Log.e(TAG, "Did not get doc id from External Storage provider for " + file); + logInvalidScopedAccessRequest(context, SCOPED_DIRECTORY_ACCESS_ERROR); return null; } Log.d(TAG, "doc id for " + file + ": " + docId); @@ -242,9 +264,9 @@ public class OpenExternalDirectoryActivity extends Activity { return uri; } - private static Intent createGrantedUriPermissionsIntent(ContentProviderClient provider, - File file) { - final Uri uri = getGrantedUriPermission(provider, file); + private static Intent createGrantedUriPermissionsIntent(Context context, + ContentProviderClient provider, File file) { + final Uri uri = getGrantedUriPermission(context, provider, file); return createGrantedUriPermissionsIntent(uri); } @@ -261,7 +283,8 @@ public class OpenExternalDirectoryActivity extends Activity { private static Intent getIntentForExistingPermission(OpenExternalDirectoryActivity activity, File file) { final String packageName = activity.getCallingPackage(); - final Uri grantedUri = getGrantedUriPermission(activity.getExternalStorageClient(), file); + final Uri grantedUri = + getGrantedUriPermission(activity, activity.getExternalStorageClient(), file); if (DEBUG) Log.d(TAG, "checking if " + packageName + " already has permission for " + grantedUri); final ActivityManager am = @@ -298,7 +321,7 @@ public class OpenExternalDirectoryActivity extends Activity { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final String folder = mFile.getName(); + final String directory = mFile.getName(); final Activity activity = getActivity(); final OnClickListener listener = new OnClickListener() { @@ -306,12 +329,16 @@ public class OpenExternalDirectoryActivity extends Activity { public void onClick(DialogInterface dialog, int which) { Intent intent = null; if (which == DialogInterface.BUTTON_POSITIVE) { - intent = createGrantedUriPermissionsIntent( + intent = createGrantedUriPermissionsIntent(mActivity, mActivity.getExternalStorageClient(), mFile); } if (which == DialogInterface.BUTTON_NEGATIVE || intent == null) { + logValidScopedAccessRequest(activity, directory, + SCOPED_DIRECTORY_ACCESS_DENIED); activity.setResult(RESULT_CANCELED); } else { + logValidScopedAccessRequest(activity, directory, + SCOPED_DIRECTORY_ACCESS_GRANTED); activity.setResult(RESULT_OK, intent); } activity.finish(); @@ -320,7 +347,7 @@ public class OpenExternalDirectoryActivity extends Activity { final CharSequence message = TextUtils .expandTemplate( - getText(R.string.open_external_dialog_request), mAppLabel, folder, + getText(R.string.open_external_dialog_request), mAppLabel, directory, mVolumeLabel); return new AlertDialog.Builder(activity, R.style.AlertDialogTheme) .setMessage(message) @@ -333,6 +360,7 @@ public class OpenExternalDirectoryActivity extends Activity { public void onCancel(DialogInterface dialog) { super.onCancel(dialog); final Activity activity = getActivity(); + logValidScopedAccessRequest(activity, mFile.getName(), SCOPED_DIRECTORY_ACCESS_DENIED); activity.setResult(RESULT_CANCELED); activity.finish(); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java b/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java index 32543c82621e..933506c258f2 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java @@ -19,7 +19,6 @@ package com.android.documentsui; import static com.android.documentsui.services.FileOperationService.OPERATION_DELETE; import static com.android.documentsui.services.FileOperationService.OPERATION_MOVE; import static com.android.documentsui.services.FileOperationService.OPERATION_UNKNOWN; -import static com.android.internal.util.Preconditions.checkArgument; import android.app.Activity; import android.app.Fragment; @@ -101,7 +100,8 @@ public class PickFragment extends Fragment { */ public void setPickTarget( int action, @OpType int copyOperationSubType, DocumentInfo pickTarget) { - checkArgument(copyOperationSubType != OPERATION_DELETE); + assert(copyOperationSubType != OPERATION_DELETE); + mAction = action; mCopyOperationSubType = copyOperationSubType; mPickTarget = pickTarget; diff --git a/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java index b0e332faa3fc..8145edc4d7db 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java +++ b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java @@ -19,7 +19,6 @@ package com.android.documentsui; import android.os.AsyncTask; import com.android.internal.annotations.GuardedBy; -import com.android.internal.util.Preconditions; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -85,7 +84,7 @@ public class ProviderExecutor extends Thread implements Executor { private Executor mNonPreemptingExecutor = new Executor() { @Override public void execute(Runnable command) { - Preconditions.checkNotNull(command); + assert(command != null); mQueue.add(command); } }; @@ -93,7 +92,7 @@ public class ProviderExecutor extends Thread implements Executor { @Override public void execute(Runnable command) { preempt(); - Preconditions.checkNotNull(command); + assert(command != null); mQueue.add(command); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index c4c5124390e8..2b7294a6e6d8 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -17,8 +17,6 @@ package com.android.documentsui; import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.Shared.TAG; -import static com.android.internal.util.Preconditions.checkState; import android.content.ContentProviderClient; import android.content.ContentResolver; @@ -41,7 +39,6 @@ import android.util.Log; import com.android.documentsui.model.RootInfo; import com.android.internal.annotations.GuardedBy; -import com.android.internal.util.Preconditions; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -64,6 +61,8 @@ public class RootsCache { public static final Uri sNotificationUri = Uri.parse( "content://com.android.documentsui.roots/"); + private static final String TAG = "RootsCache"; + private final Context mContext; private final ContentObserver mObserver; private OnCacheUpdateListener mCacheUpdateListener; @@ -117,18 +116,22 @@ public class RootsCache { * Gather roots from all known storage providers. */ public void updateAsync() { - // Verifying an assumption about the recents root being immutable. - if (DEBUG) { - checkState(mRecentsRoot.authority == null); - checkState(mRecentsRoot.rootId == null); - checkState(mRecentsRoot.derivedIcon == R.drawable.ic_root_recent); - checkState(mRecentsRoot.derivedType == RootInfo.TYPE_RECENTS); - checkState(mRecentsRoot.flags == (Root.FLAG_LOCAL_ONLY - | Root.FLAG_SUPPORTS_IS_CHILD - | Root.FLAG_SUPPORTS_CREATE)); - checkState(mRecentsRoot.title == mContext.getString(R.string.root_recent)); - checkState(mRecentsRoot.availableBytes == -1); - } + + // NOTE: This method is called when the UI language changes. + // For that reason we upadte our RecentsRoot to reflect + // the current language. + mRecentsRoot.title = mContext.getString(R.string.root_recent); + + // Nothing else about the root should ever change. + assert(mRecentsRoot.authority == null); + assert(mRecentsRoot.rootId == null); + assert(mRecentsRoot.derivedIcon == R.drawable.ic_root_recent); + assert(mRecentsRoot.derivedType == RootInfo.TYPE_RECENTS); + assert(mRecentsRoot.flags == (Root.FLAG_LOCAL_ONLY + | Root.FLAG_SUPPORTS_IS_CHILD + | Root.FLAG_SUPPORTS_CREATE)); + assert(mRecentsRoot.availableBytes == -1); + new UpdateTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -415,45 +418,64 @@ public class RootsCache { static List<RootInfo> getMatchingRoots(Collection<RootInfo> roots, State state) { final List<RootInfo> matching = new ArrayList<>(); for (RootInfo root : roots) { - // Exclude read-only devices when creating - if (state.action == State.ACTION_CREATE && !root.supportsCreate()) continue; + + if (DEBUG) Log.d(TAG, "Evaluating " + root); + + if (state.action == State.ACTION_CREATE && !root.supportsCreate()) { + if (DEBUG) Log.d(TAG, "Excluding read-only root because: ACTION_CREATE."); + continue; + } + if (state.action == State.ACTION_PICK_COPY_DESTINATION - && !root.supportsCreate()) continue; - // Exclude roots that don't support directory picking - if (state.action == State.ACTION_OPEN_TREE && !root.supportsChildren()) continue; - // Exclude advanced devices when not requested - if (!state.showAdvanced && root.isAdvanced()) continue; - // Exclude non-local devices when local only - if (state.localOnly && !root.isLocalOnly()) continue; - // Exclude downloads roots as it doesn't support directory creation (actually - // we just don't show them). - // TODO: Add flag to check the root supports directory creation. - if (state.directoryCopy && !root.isDownloads()) continue; - - // Only show empty roots when creating, or in browse mode. - if (root.isEmpty() && (state.action == State.ACTION_OPEN - || state.action == State.ACTION_GET_CONTENT)) { - if (DEBUG) Log.i(TAG, "Skipping empty root: " + root); + && !root.supportsCreate()) { + if (DEBUG) Log.d( + TAG, "Excluding read-only root because: ACTION_PICK_COPY_DESTINATION."); + continue; + } + + if (state.action == State.ACTION_OPEN_TREE && !root.supportsChildren()) { + if (DEBUG) Log.d( + TAG, "Excluding root !supportsChildren because: ACTION_OPEN_TREE."); + continue; + } + + if (state.localOnly && !root.isLocalOnly()) { + if (DEBUG) Log.d(TAG, "Excluding root because: unwanted non-local device."); + continue; + } + + if (state.directoryCopy && root.isDownloads()) { + if (DEBUG) Log.d( + TAG, "Excluding downloads root because: unsupported directory copy."); + continue; + } + + if (state.action == State.ACTION_OPEN && root.isEmpty()) { + if (DEBUG) Log.d(TAG, "Excluding empty root because: ACTION_OPEN."); + continue; + } + + if (state.action == State.ACTION_GET_CONTENT && root.isEmpty()) { + if (DEBUG) Log.d(TAG, "Excluding empty root because: ACTION_GET_CONTENT."); continue; } - // Only include roots that serve requested content final boolean overlap = MimePredicate.mimeMatches(root.derivedMimeTypes, state.acceptMimes) || MimePredicate.mimeMatches(state.acceptMimes, root.derivedMimeTypes); if (!overlap) { + if (DEBUG) Log.d( + TAG, "Excluding root because: unsupported content types > " + + state.acceptMimes); continue; } - // Exclude roots from the calling package. if (state.excludedAuthorities.contains(root.authority)) { - if (DEBUG) Log.d( - TAG, "Excluding root " + root.authority + " from calling package."); + if (DEBUG) Log.d(TAG, "Excluding root because: owned by calling package."); continue; } - if (DEBUG) Log.d( - TAG, "Including root " + root + " in roots list."); + if (DEBUG) Log.d(TAG, "Including " + root); matching.add(root); } return matching; diff --git a/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java b/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java index 8beb245934d1..63dc2ee3796e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java +++ b/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java @@ -61,7 +61,8 @@ final class SearchViewManager implements } public void install(DocumentsToolbar actionBar) { - assert (mActionBar == null); + // assert(mActionBar == null); + mActionBar = actionBar; mMenu = actionBar.getSearchMenu(); mView = (SearchView) mMenu.getActionView(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/Shared.java b/packages/DocumentsUI/src/com/android/documentsui/Shared.java index a288fe8f30ab..99c2d80bdfd9 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Shared.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Shared.java @@ -28,6 +28,10 @@ import java.util.List; /** @hide */ public final class Shared { + public static final String TAG = "Documents"; + + public static final boolean DEBUG = true; + /** Intent action name to pick a copy destination. */ public static final String ACTION_PICK_COPY_DESTINATION = "com.android.documentsui.PICK_COPY_DESTINATION"; @@ -79,9 +83,6 @@ public final class Shared { */ public static final String EXTRA_IGNORE_STATE = "ignoreState"; - public static final boolean DEBUG = true; - public static final String TAG = "Documents"; - /** * String prefix used to indicate the document is a directory. diff --git a/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java b/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java index 48c1a733703c..b4d79715d479 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java @@ -16,8 +16,6 @@ package com.android.documentsui; -import static com.android.internal.util.Preconditions.checkNotNull; - import android.app.Activity; import android.support.design.widget.Snackbar; import android.view.View; @@ -26,12 +24,13 @@ public final class Snackbars { private Snackbars() {} public static final Snackbar makeSnackbar(Activity activity, int messageId, int duration) { - return Snackbars.makeSnackbar(activity, activity.getResources().getText(messageId), duration); + return Snackbars.makeSnackbar( + activity, activity.getResources().getText(messageId), duration); } - public static final Snackbar makeSnackbar(Activity activity, CharSequence message, int duration) - { - final View view = checkNotNull(activity.findViewById(R.id.coordinator_layout)); + public static final Snackbar makeSnackbar( + Activity activity, CharSequence message, int duration) { + final View view = activity.findViewById(R.id.coordinator_layout); return Snackbar.make(view, message, duration); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/State.java b/packages/DocumentsUI/src/com/android/documentsui/State.java index 62f9ea7ed804..4f460b4a5cf6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/State.java +++ b/packages/DocumentsUI/src/com/android/documentsui/State.java @@ -82,8 +82,6 @@ public class State implements android.os.Parcelable { public boolean forceSize; public boolean showSize; public boolean localOnly; - public boolean forceAdvanced; - public boolean showAdvanced; public boolean restored; // Indicates that a copy operation (or move) includes a directory. @@ -181,8 +179,6 @@ public class State implements android.os.Parcelable { out.writeInt(forceSize ? 1 : 0); out.writeInt(showSize ? 1 : 0); out.writeInt(localOnly ? 1 : 0); - out.writeInt(forceAdvanced ? 1 : 0); - out.writeInt(showAdvanced ? 1 : 0); out.writeInt(restored ? 1 : 0); DurableUtils.writeToParcel(out, stack); out.writeMap(dirState); @@ -211,8 +207,6 @@ public class State implements android.os.Parcelable { state.forceSize = in.readInt() != 0; state.showSize = in.readInt() != 0; state.localOnly = in.readInt() != 0; - state.forceAdvanced = in.readInt() != 0; - state.showAdvanced = in.readInt() != 0; state.restored = in.readInt() != 0; DurableUtils.readFromParcel(in, state.stack); in.readMap(state.dirState, loader); diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index d1b22643d006..83838d3328fb 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -23,9 +23,6 @@ import static com.android.documentsui.State.MODE_LIST; import static com.android.documentsui.State.SORT_ORDER_UNKNOWN; import static com.android.documentsui.model.DocumentInfo.getCursorInt; import static com.android.documentsui.model.DocumentInfo.getCursorString; -import static com.android.internal.util.Preconditions.checkNotNull; -import static com.android.internal.util.Preconditions.checkState; -import static com.google.common.base.Preconditions.checkArgument; import android.annotation.IntDef; import android.annotation.StringRes; @@ -102,6 +99,7 @@ import com.android.documentsui.model.RootInfo; import com.android.documentsui.services.FileOperationService; import com.android.documentsui.services.FileOperationService.OpType; import com.android.documentsui.services.FileOperations; + import com.google.common.collect.Lists; import java.lang.annotation.Retention; @@ -170,6 +168,7 @@ public class DirectoryFragment extends Fragment private GridLayoutManager mLayout; private int mColumnCount = 1; // This will get updated when layout changes. + private LayoutInflater mInflater; private MessageBar mMessageBar; private View mProgressBar; @@ -184,13 +183,12 @@ public class DirectoryFragment extends Fragment @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + mInflater = inflater; final View view = inflater.inflate(R.layout.fragment_directory, container, false); mMessageBar = MessageBar.create(getChildFragmentManager()); mProgressBar = view.findViewById(R.id.progressbar); - mEmptyView = view.findViewById(android.R.id.empty); - mRecView = (RecyclerView) view.findViewById(R.id.dir_list); mRecView.setRecyclerListener( new RecyclerListener() { @@ -359,7 +357,9 @@ public class DirectoryFragment extends Fragment private boolean handleViewItem(String id) { final Cursor cursor = mModel.getItem(id); - checkNotNull(cursor, "Cursor cannot be null."); + + assert(cursor != null); + final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); if (mTuner.isDocumentEnabled(docMimeType, docFlags)) { @@ -430,7 +430,8 @@ public class DirectoryFragment extends Fragment int cellMargin = 2 * getResources().getDimensionPixelSize(R.dimen.grid_item_margin); int viewPadding = mRecView.getPaddingLeft() + mRecView.getPaddingRight(); - checkState(mRecView.getWidth() > 0); + assert(mRecView.getWidth() > 0); + int columnCount = Math.max(1, (mRecView.getWidth() - viewPadding) / (cellWidth + cellMargin)); @@ -471,7 +472,9 @@ public class DirectoryFragment extends Fragment public boolean onBeforeItemStateChange(String modelId, boolean selected) { if (selected) { final Cursor cursor = mModel.getItem(modelId); - checkNotNull(cursor, "Cursor cannot be null."); + + assert(cursor != null); + final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); return mTuner.canSelectType(docMimeType, docFlags); @@ -564,7 +567,7 @@ public class DirectoryFragment extends Fragment } private void updateActionMenu() { - checkNotNull(mMenu); + assert(mMenu != null); // Delegate update logic to our owning action, since specialized logic is desired. mTuner.updateActionMenu(mMenu, mType, canDeleteSelection(), canRenameSelection()); @@ -699,19 +702,33 @@ public class DirectoryFragment extends Fragment } private void deleteDocuments(final Selection selected) { + assert(!selected.isEmpty()); - checkArgument(!selected.isEmpty()); final DocumentInfo srcParent = getDisplayState().stack.peek(); new GetDocumentsTask() { @Override void onDocumentsReady(final List<DocumentInfo> docs) { + + TextView message = + (TextView) mInflater.inflate(R.layout.dialog_delete_confirmation, null); + message.setText( + Shared.getQuantityString( + getActivity(), + R.plurals.delete_confirmation_message, + docs.size())); + + // This "insta-hides" files that are being deleted, because + // the delete operation may be not execute immediately (it + // may be queued up on the FileOperationService.) + // To hide the files locally, we call the hide method on the adapter + // ...which a live object...cannot be parceled. + // For that reason, for now, we implement this dialog NOT + // as a fragment (which can survive rotation and have its own state), + // but as a simple runtime dialog. So rotating a device with an + // active delete dialog...results in that dialog disappearing. + // We can do better, but don't have cycles for it now. new AlertDialog.Builder(getActivity()) - .setTitle(R.string.delete_confirmation_title) - .setMessage( - Shared.getQuantityString( - getActivity(), - R.plurals.delete_confirmation_message, - docs.size())) + .setView(message) .setPositiveButton( android.R.string.yes, new DialogInterface.OnClickListener() { @@ -777,7 +794,7 @@ public class DirectoryFragment extends Fragment private void renameDocuments(Selection selected) { // Batch renaming not supported // Rename option is only available in menu when 1 document selected - checkArgument(selected.size() == 1); + assert(selected.size() == 1); new GetDocumentsTask() { @Override @@ -890,7 +907,8 @@ public class DirectoryFragment extends Fragment } private void copyFromClipData(final ClipData clipData, final DocumentInfo destination) { - checkNotNull(clipData); + assert(clipData != null); + new AsyncTask<Void, Void, List<DocumentInfo>>() { @Override @@ -941,7 +959,7 @@ public class DirectoryFragment extends Fragment } void copySelectionToClipboard(Selection selection) { - checkArgument(!selection.isEmpty()); + assert(!selection.isEmpty()); new GetDocumentsTask() { @Override void onDocumentsReady(List<DocumentInfo> docs) { @@ -1059,7 +1077,7 @@ public class DirectoryFragment extends Fragment String id = getModelId(v); if (id != null) { Cursor dstCursor = mModel.getItem(id); - checkNotNull(dstCursor, "Cursor cannot be null."); + assert(dstCursor != null); return DocumentInfo.fromDirectoryCursor(dstCursor); } @@ -1132,10 +1150,11 @@ public class DirectoryFragment extends Fragment } final Cursor cursor = mModel.getItem(modelId); - checkNotNull(cursor, "Cursor cannot be null."); - final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor); - return Lists.newArrayList(doc); + assert(cursor != null); + + return Lists.newArrayList( + DocumentInfo.fromDirectoryCursor(cursor)); } private Drawable getDragShadowIcon(List<DocumentInfo> docs) { @@ -1285,6 +1304,11 @@ public class DirectoryFragment extends Fragment showDirectory(); mAdapter.notifyDataSetChanged(); } + + if (!model.isLoading()) { + ((BaseActivity) getActivity()).notifyDirectoryLoaded( + model.doc != null ? model.doc.derivedUri : null); + } } @Override diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentHolder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentHolder.java index 2967a908678d..3b5ce87ebfb0 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentHolder.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentHolder.java @@ -16,9 +16,6 @@ package com.android.documentsui.dirlist; -import static com.android.internal.util.Preconditions.checkNotNull; -import static com.android.internal.util.Preconditions.checkState; - import android.content.Context; import android.database.Cursor; import android.graphics.Rect; @@ -97,19 +94,20 @@ public abstract class DocumentHolder @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // Event listener should always be set. - checkNotNull(mEventListener); + assert(mEventListener != null); + return mEventListener.onKey(this, keyCode, event); } public void addEventListener(DocumentHolder.EventListener listener) { // Just handle one for now; switch to a list if necessary. - checkState(mEventListener == null); + assert(mEventListener == null); mEventListener = listener; } public void addOnKeyListener(View.OnKeyListener listener) { // Just handle one for now; switch to a list if necessary. - checkState(mKeyListener == null); + assert(mKeyListener == null); mKeyListener = listener; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java index 0930c22b356c..0bbecf9b289c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java @@ -74,13 +74,6 @@ abstract class DocumentsAdapter abstract public SparseArray<String> hide(String... ids); /** - * Unhides a set of previously hidden items. - * - * @param ids A sparse array of IDs from a previous call to {@link #hide}. - */ - abstract void unhide(SparseArray<String> ids); - - /** * Returns a class that yields the span size for a particular element. This is * primarily useful in {@link SectionBreakDocumentsAdapterWrapper} where * we adjust sizes. diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java index 8ef891033901..f99ec85c358b 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java @@ -22,7 +22,6 @@ import static com.android.documentsui.State.ACTION_GET_CONTENT; import static com.android.documentsui.State.ACTION_MANAGE; import static com.android.documentsui.State.ACTION_OPEN; import static com.android.documentsui.State.ACTION_OPEN_TREE; -import static com.android.internal.util.Preconditions.checkArgument; import android.content.Context; import android.provider.DocumentsContract.Document; @@ -172,7 +171,7 @@ public abstract class FragmentTuner { @Override public void updateActionMenu( Menu menu, @ResultType int resultType, boolean canDelete, boolean canRename) { - checkArgument(resultType != DirectoryFragment.TYPE_RECENT_OPEN); + assert(resultType != DirectoryFragment.TYPE_RECENT_OPEN); MenuItem open = menu.findItem(R.id.menu_open); MenuItem delete = menu.findItem(R.id.menu_delete); diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDirectoryHolder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDirectoryHolder.java index a0ff1b5812ae..90b23419fcd3 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDirectoryHolder.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDirectoryHolder.java @@ -17,7 +17,6 @@ package com.android.documentsui.dirlist; import static com.android.documentsui.model.DocumentInfo.getCursorString; -import static com.android.internal.util.Preconditions.checkNotNull; import android.content.Context; import android.database.Cursor; @@ -58,7 +57,7 @@ final class GridDirectoryHolder extends DocumentHolder { * @param state Current display state. */ public void bind(Cursor cursor, String modelId, State state) { - checkNotNull(cursor, "Cursor cannot be null."); + assert(cursor != null); this.modelId = modelId; diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDocumentHolder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDocumentHolder.java index 8eaed17e8676..a4bce1626fb4 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDocumentHolder.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDocumentHolder.java @@ -19,7 +19,6 @@ package com.android.documentsui.dirlist; import static com.android.documentsui.model.DocumentInfo.getCursorInt; import static com.android.documentsui.model.DocumentInfo.getCursorLong; import static com.android.documentsui.model.DocumentInfo.getCursorString; -import static com.android.internal.util.Preconditions.checkNotNull; import android.content.Context; import android.database.Cursor; @@ -79,9 +78,9 @@ final class GridDocumentHolder extends DocumentHolder { * @param state Current display state. */ public void bind(Cursor cursor, String modelId, State state) { - this.modelId = modelId; + assert(cursor != null); - checkNotNull(cursor, "Cursor cannot be null."); + this.modelId = modelId; final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListDocumentHolder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListDocumentHolder.java index be6413bfbf6c..11f9aa710349 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListDocumentHolder.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListDocumentHolder.java @@ -19,7 +19,6 @@ package com.android.documentsui.dirlist; import static com.android.documentsui.model.DocumentInfo.getCursorInt; import static com.android.documentsui.model.DocumentInfo.getCursorLong; import static com.android.documentsui.model.DocumentInfo.getCursorString; -import static com.android.internal.util.Preconditions.checkNotNull; import android.content.Context; import android.database.Cursor; @@ -30,6 +29,7 @@ import android.text.format.Formatter; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import com.android.documentsui.R; @@ -39,9 +39,10 @@ import com.android.documentsui.State; final class ListDocumentHolder extends DocumentHolder { final TextView mTitle; - final TextView mSummary; + final LinearLayout mDetails; // Container of date/size/summary final TextView mDate; final TextView mSize; + final TextView mSummary; final ImageView mIconMime; final ImageView mIconThumb; final ImageView mIconCheck; @@ -51,9 +52,10 @@ final class ListDocumentHolder extends DocumentHolder { super(context, parent, R.layout.item_doc_list); mTitle = (TextView) itemView.findViewById(android.R.id.title); - mSummary = (TextView) itemView.findViewById(android.R.id.summary); + mDetails = (LinearLayout) itemView.findViewById(R.id.line2); mDate = (TextView) itemView.findViewById(R.id.date); mSize = (TextView) itemView.findViewById(R.id.size); + mSummary = (TextView) itemView.findViewById(android.R.id.summary); mIconMime = (ImageView) itemView.findViewById(R.id.icon_mime); mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb); mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check); @@ -79,9 +81,9 @@ final class ListDocumentHolder extends DocumentHolder { */ @Override public void bind(Cursor cursor, String modelId, State state) { - this.modelId = modelId; + assert(cursor != null); - checkNotNull(cursor, "Cursor cannot be null."); + this.modelId = modelId; final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); @@ -92,6 +94,7 @@ final class ListDocumentHolder extends DocumentHolder { final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); final String docSummary = getCursorString(cursor, Document.COLUMN_SUMMARY); final long docSize = getCursorLong(cursor, Document.COLUMN_SIZE); + final boolean isDirectory = Document.MIME_TYPE_DIR.equals(docMimeType); mIconHelper.stopLoading(mIconThumb); @@ -106,24 +109,36 @@ final class ListDocumentHolder extends DocumentHolder { mTitle.setText(docDisplayName, TextView.BufferType.SPANNABLE); mTitle.setVisibility(View.VISIBLE); - if (docSummary != null) { - mSummary.setText(docSummary); - mSummary.setVisibility(View.VISIBLE); - } else { - mSummary.setVisibility(View.INVISIBLE); - } - - if (docLastModified == -1) { - mDate.setText(null); - } else { - mDate.setText(Shared.formatTime(mContext, docLastModified)); - } - if (!state.showSize || Document.MIME_TYPE_DIR.equals(docMimeType) || docSize == -1) { - mSize.setVisibility(View.GONE); + // Note, we don't show any details for any directory...ever. + if (isDirectory) { + mDetails.setVisibility(View.GONE); } else { - mSize.setVisibility(View.VISIBLE); - mSize.setText(Formatter.formatFileSize(mContext, docSize)); + boolean hasDetails = false; + if (docSummary != null) { + hasDetails = true; + mSummary.setText(docSummary); + mSummary.setVisibility(View.VISIBLE); + } else { + mSummary.setVisibility(View.INVISIBLE); + } + + if (docLastModified == -1) { + hasDetails = true; + mDate.setText(null); + } else { + mDate.setText(Shared.formatTime(mContext, docLastModified)); + } + + if (!state.showSize || docSize == -1) { + hasDetails = true; + mSize.setVisibility(View.GONE); + mDetails.setVisibility(View.GONE); + } else { + mSize.setVisibility(View.VISIBLE); + mSize.setText(Formatter.formatFileSize(mContext, docSize)); + } + mDetails.setVisibility(hasDetails ? View.VISIBLE : View.GONE); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java index 9684a5a0a2c2..8170e2ab8fa2 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java @@ -22,11 +22,9 @@ import static com.android.documentsui.State.SORT_ORDER_LAST_MODIFIED; import static com.android.documentsui.State.SORT_ORDER_SIZE; import static com.android.documentsui.model.DocumentInfo.getCursorLong; import static com.android.documentsui.model.DocumentInfo.getCursorString; -import static com.android.internal.util.Preconditions.checkNotNull; import android.database.Cursor; import android.os.Bundle; -import android.os.Looper; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; import android.support.annotation.Nullable; @@ -66,6 +64,7 @@ public class Model { @Nullable String info; @Nullable String error; + @Nullable DocumentInfo doc; /** * Generates a Model ID for a cursor entry that refers to a document. The Model ID is a unique @@ -113,6 +112,7 @@ public class Model { mPositions.clear(); info = null; error = null; + doc = null; mIsLoading = false; notifyUpdateListeners(); return; @@ -127,6 +127,7 @@ public class Model { mCursor = result.cursor; mCursorCount = mCursor.getCount(); mSortOrder = result.sortOrder; + doc = result.doc; updateModelData(); @@ -381,9 +382,9 @@ public class Model { final List<DocumentInfo> docs = new ArrayList<>(size); for (String modelId: items.getAll()) { final Cursor cursor = getItem(modelId); - checkNotNull(cursor, "Cursor cannot be null."); - final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor); - docs.add(doc); + assert(cursor != null); + + docs.add(DocumentInfo.fromDirectoryCursor(cursor)); } return docs; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java index 42dba4591326..2b073397f292 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java @@ -24,12 +24,12 @@ import static com.android.documentsui.model.DocumentInfo.getCursorString; import android.database.Cursor; import android.provider.DocumentsContract.Document; -import android.support.annotation.VisibleForTesting; import android.util.Log; import android.util.SparseArray; import android.view.ViewGroup; import com.android.documentsui.State; + import com.google.common.collect.Sets; import java.util.ArrayList; @@ -181,29 +181,6 @@ final class ModelBackedDocumentsAdapter extends DocumentsAdapter { return hiddenItems; } - @VisibleForTesting - @Override - public void unhide(SparseArray<String> ids) { - if (DEBUG) Log.d(TAG, "Unhiding ids: " + ids); - - // An ArrayList can shrink at runtime...and in fact - // it does when we clear it completely. - // This means we can't call add(pos, id) without - // first checking the list size. - List<String> oldIds = mModelIds; - mModelIds = new ArrayList<>(oldIds.size() + ids.size()); - mModelIds.addAll(oldIds); - - // Finally insert the unhidden items. - for (int i = 0; i < ids.size(); i++) { - int pos = ids.keyAt(i); - String id = ids.get(pos); - mHiddenIds.remove(id); - mModelIds.add(pos, id); - notifyItemInserted(pos); - } - } - @Override public List<String> getModelIds() { return mModelIds; diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java index 4cf1048b6ab4..b0cc09a134f9 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java @@ -19,9 +19,6 @@ package com.android.documentsui.dirlist; import static com.android.documentsui.Shared.DEBUG; import static com.android.documentsui.dirlist.ModelBackedDocumentsAdapter.ITEM_TYPE_DIRECTORY; import static com.android.documentsui.dirlist.ModelBackedDocumentsAdapter.ITEM_TYPE_DOCUMENT; -import static com.android.internal.util.Preconditions.checkArgument; -import static com.android.internal.util.Preconditions.checkNotNull; -import static com.android.internal.util.Preconditions.checkState; import android.annotation.IntDef; import android.graphics.Point; @@ -134,8 +131,12 @@ public final class MultiSelectManager { @SelectionMode int mode, @Nullable Selection initialSelection) { - mEnvironment = checkNotNull(environment, "'environment' cannot be null."); - mAdapter = checkNotNull(adapter, "'adapter' cannot be null."); + assert(environment != null); + assert(adapter != null); + + mEnvironment = environment; + mAdapter = adapter; + mSingleSelect = mode == MODE_SINGLE; if (initialSelection != null) { mSelection.copyFrom(initialSelection); @@ -168,8 +169,8 @@ public final class MultiSelectManager { @Override public void onItemRangeRemoved(int startPosition, int itemCount) { - checkState(startPosition >= 0); - checkState(itemCount > 0); + assert(startPosition >= 0); + assert(itemCount > 0); mSelection.cancelProvisionalSelection(); // Remove any disappeared IDs from the selection. @@ -356,7 +357,8 @@ public final class MultiSelectManager { * @param modelId */ public void toggleSelection(String modelId) { - checkNotNull(modelId); + assert(modelId != null); + boolean changed = false; if (mSelection.contains(modelId)) { changed = attemptDeselect(modelId); @@ -389,7 +391,8 @@ public final class MultiSelectManager { * @param pos The new end position for the selection range. */ void snapRangeSelection(int pos) { - checkNotNull(mRanger); + assert(mRanger != null); + mRanger.snapSelection(pos); notifySelectionChanged(); } @@ -436,7 +439,7 @@ public final class MultiSelectManager { * @param selected New selection state. */ private void updateRange(int begin, int end, boolean selected) { - checkState(end >= begin); + assert(end >= begin); for (int i = begin; i <= end; i++) { String id = mAdapter.getModelId(i); if (id == null) { @@ -474,7 +477,7 @@ public final class MultiSelectManager { * @return True if the update was applied. */ private boolean attemptDeselect(String id) { - checkArgument(id != null); + assert(id != null); if (notifyBeforeItemStateChange(id, false)) { mSelection.remove(id); notifyItemStateChanged(id, false); @@ -491,7 +494,7 @@ public final class MultiSelectManager { * @return True if the update was applied. */ private boolean attemptSelect(String id) { - checkArgument(id != null); + assert(id != null); boolean canSelect = notifyBeforeItemStateChange(id, true); if (!canSelect) { return false; @@ -519,7 +522,7 @@ public final class MultiSelectManager { * (identified by {@code position}) changes. */ private void notifyItemStateChanged(String id, boolean selected) { - checkArgument(id != null); + assert(id != null); int lastListener = mCallbacks.size() - 1; for (int i = lastListener; i > -1; i--) { mCallbacks.get(i).onItemStateChanged(id, selected); @@ -555,8 +558,8 @@ public final class MultiSelectManager { } private void snapSelection(int position) { - checkState(mRanger != null); - checkArgument(position != RecyclerView.NO_POSITION); + assert(mRanger != null); + assert(position != RecyclerView.NO_POSITION); if (mEnd == UNDEFINED || mEnd == mBegin) { // Reset mEnd so it can be established in establishRange. @@ -568,7 +571,7 @@ public final class MultiSelectManager { } private void establishRange(int position) { - checkState(mRanger.mEnd == UNDEFINED); + assert(mRanger.mEnd == UNDEFINED); if (position == mBegin) { mEnd = position; @@ -584,8 +587,8 @@ public final class MultiSelectManager { } private void reviseRange(int position) { - checkState(mEnd != UNDEFINED); - checkState(mBegin != mEnd); + assert(mEnd != UNDEFINED); + assert(mBegin != mEnd); if (position == mEnd) { if (DEBUG) Log.i(TAG, "Skipping no-op revision click on mEndRange."); @@ -1185,7 +1188,7 @@ public final class MultiSelectManager { * @param input */ private void processInputEvent(InputEvent input) { - checkArgument(input.isMouseEvent()); + assert(input.isMouseEvent()); if (shouldStop(input)) { endBandSelect(); @@ -1199,7 +1202,6 @@ public final class MultiSelectManager { } mCurrentPosition = input.getOrigin(); - mModel.resizeSelection(input.getOrigin()); scrollViewIfNecessary(); resizeBandSelectRectangle(); } @@ -1488,6 +1490,7 @@ public final class MultiSelectManager { * top-left of the viewport would have a relative origin of (0, 0), even though its * absolute point has a higher y-value. */ + @VisibleForTesting void resizeSelection(Point relativePointer) { mPointer = mHelper.createAbsolutePoint(relativePointer); updateModel(); @@ -1615,7 +1618,7 @@ public final class MultiSelectManager { private void updateSelection(Rect rect) { int columnStart = Collections.binarySearch(mColumnBounds, new Limits(rect.left, rect.left)); - checkState(columnStart >= 0); + assert(columnStart >= 0); int columnEnd = columnStart; for (int i = columnStart; i < mColumnBounds.size() diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/RenameDocumentFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/RenameDocumentFragment.java index 38a71ec2d149..0018d01aa85c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/RenameDocumentFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/RenameDocumentFragment.java @@ -17,7 +17,6 @@ package com.android.documentsui.dirlist; import static com.android.documentsui.Shared.TAG; -import static com.android.internal.util.Preconditions.checkArgument; import android.app.AlertDialog; import android.app.Dialog; @@ -36,9 +35,9 @@ import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.util.Log; import android.view.KeyEvent; -import android.view.inputmethod.EditorInfo; import android.view.LayoutInflater; import android.view.View; +import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; @@ -205,7 +204,7 @@ public class RenameDocumentFragment extends DialogFragment { @Override protected DocumentInfo doInBackground(DocumentInfo... document) { - checkArgument(document.length == 1); + assert(document.length == 1); final ContentResolver resolver = mActivity.getContentResolver(); ContentProviderClient client = null; diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapper.java index 2485ad96a233..b6980596908c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapper.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapper.java @@ -16,8 +16,6 @@ package com.android.documentsui.dirlist; -import static com.android.internal.util.Preconditions.checkArgument; - import android.content.Context; import android.database.Cursor; import android.support.v7.widget.GridLayoutManager; @@ -171,13 +169,6 @@ final class SectionBreakDocumentsAdapterWrapper extends DocumentsAdapter { } @Override - void unhide(SparseArray<String> ids) { - // NOTE: We hear about these changes and adjust break position - // in our AdapterDataObserver. - mDelegate.unhide(ids); - } - - @Override List<String> getModelIds() { return mDelegate.getModelIds(); } @@ -204,12 +195,12 @@ final class SectionBreakDocumentsAdapterWrapper extends DocumentsAdapter { } public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { - checkArgument(itemCount == 1); + assert(itemCount == 1); notifyItemRangeChanged(toViewPosition(positionStart), itemCount, payload); } public void onItemRangeInserted(int positionStart, int itemCount) { - checkArgument(itemCount == 1); + assert(itemCount == 1); if (positionStart < mBreakPosition) { mBreakPosition++; } @@ -217,7 +208,7 @@ final class SectionBreakDocumentsAdapterWrapper extends DocumentsAdapter { } public void onItemRangeRemoved(int positionStart, int itemCount) { - checkArgument(itemCount == 1); + assert(itemCount == 1); if (positionStart < mBreakPosition) { mBreakPosition--; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java index 38970585afc3..29273a36b112 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java @@ -283,10 +283,6 @@ public class RootInfo implements Durable, Parcelable, Comparable<RootInfo> { return (flags & Root.FLAG_SUPPORTS_SEARCH) != 0; } - public boolean isAdvanced() { - return (flags & Root.FLAG_ADVANCED) != 0; - } - public boolean isLocalOnly() { return (flags & Root.FLAG_LOCAL_ONLY) != 0; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java index faedd5e2d355..ad48a70c4075 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java +++ b/packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java @@ -29,7 +29,6 @@ import static com.android.documentsui.services.FileOperationService.EXTRA_DIALOG import static com.android.documentsui.services.FileOperationService.EXTRA_OPERATION; import static com.android.documentsui.services.FileOperationService.EXTRA_SRC_LIST; import static com.android.documentsui.services.FileOperationService.OPERATION_COPY; -import static com.google.common.base.Preconditions.checkArgument; import android.annotation.StringRes; import android.app.Notification; @@ -95,7 +94,7 @@ class CopyJob extends Job { String id, DocumentStack stack, List<DocumentInfo> srcs) { super(service, appContext, listener, OPERATION_COPY, id, stack); - checkArgument(!srcs.isEmpty()); + assert(!srcs.isEmpty()); this.mSrcs = srcs; } @@ -108,7 +107,7 @@ class CopyJob extends Job { @OpType int opType, String id, DocumentStack destination, List<DocumentInfo> srcs) { super(service, appContext, listener, opType, id, destination); - checkArgument(!srcs.isEmpty()); + assert(!srcs.isEmpty()); this.mSrcs = srcs; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/FileOperationService.java b/packages/DocumentsUI/src/com/android/documentsui/services/FileOperationService.java index 05a3f119c7d6..580fa38258a6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/services/FileOperationService.java +++ b/packages/DocumentsUI/src/com/android/documentsui/services/FileOperationService.java @@ -17,9 +17,6 @@ package com.android.documentsui.services; import static com.android.documentsui.Shared.DEBUG; -import static com.android.internal.util.Preconditions.checkArgument; -import static com.android.internal.util.Preconditions.checkNotNull; -import static com.android.internal.util.Preconditions.checkState; import android.annotation.IntDef; import android.app.NotificationManager; @@ -136,12 +133,12 @@ public class FileOperationService extends Service implements Job.Listener { String jobId = intent.getStringExtra(EXTRA_JOB_ID); @OpType int operationType = intent.getIntExtra(EXTRA_OPERATION, OPERATION_UNKNOWN); - checkArgument(jobId != null); + assert(jobId != null); if (intent.hasExtra(EXTRA_CANCEL)) { handleCancel(intent); } else { - checkArgument(operationType != OPERATION_UNKNOWN); + assert(operationType != OPERATION_UNKNOWN); handleOperation(intent, serviceId, jobId, operationType); } @@ -173,9 +170,9 @@ public class FileOperationService extends Service implements Job.Listener { mWakeLock.acquire(); } - checkState(job != null); + assert(job != null); int delay = intent.getIntExtra(EXTRA_DELAY, DEFAULT_DELAY); - checkArgument(delay <= MAX_DELAY); + assert(delay <= MAX_DELAY); if (DEBUG) Log.d( TAG, "Scheduling job " + job.id + " to run in " + delay + " milliseconds."); ScheduledFuture<?> future = executor.schedule(job, delay, TimeUnit.MILLISECONDS); @@ -188,8 +185,10 @@ public class FileOperationService extends Service implements Job.Listener { * @param intent The cancellation intent. */ private void handleCancel(Intent intent) { - checkArgument(intent.hasExtra(EXTRA_CANCEL)); - String jobId = checkNotNull(intent.getStringExtra(EXTRA_JOB_ID)); + assert(intent.hasExtra(EXTRA_CANCEL)); + assert(intent.getStringExtra(EXTRA_JOB_ID) != null); + + String jobId = intent.getStringExtra(EXTRA_JOB_ID); if (DEBUG) Log.d(TAG, "handleCancel: " + jobId); @@ -253,7 +252,8 @@ public class FileOperationService extends Service implements Job.Listener { throw new UnsupportedOperationException(); } - return checkNotNull(job); + assert(job != null); + return job; } @GuardedBy("mRunning") @@ -261,7 +261,7 @@ public class FileOperationService extends Service implements Job.Listener { if (DEBUG) Log.d(TAG, "deleteJob: " + job.id); JobRecord record = mRunning.remove(job.id); - checkArgument(record != null); + assert(record != null); record.job.cleanup(); if (mRunning.isEmpty()) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/Job.java b/packages/DocumentsUI/src/com/android/documentsui/services/Job.java index a15865439f04..c723ac60c334 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/services/Job.java +++ b/packages/DocumentsUI/src/com/android/documentsui/services/Job.java @@ -23,8 +23,6 @@ import static com.android.documentsui.services.FileOperationService.EXTRA_JOB_ID import static com.android.documentsui.services.FileOperationService.EXTRA_OPERATION; import static com.android.documentsui.services.FileOperationService.EXTRA_SRC_LIST; import static com.android.documentsui.services.FileOperationService.OPERATION_UNKNOWN; -import static com.android.internal.util.Preconditions.checkArgument; -import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.DrawableRes; import android.annotation.PluralsRes; @@ -98,7 +96,7 @@ abstract public class Job implements Runnable { Job(Context service, Context appContext, Listener listener, @OpType int operationType, String id, DocumentStack stack) { - checkArgument(operationType != OPERATION_UNKNOWN); + assert(operationType != OPERATION_UNKNOWN); this.service = service; this.appContext = appContext; @@ -150,7 +148,8 @@ abstract public class Job implements Runnable { mClients.put(doc.authority, client); } - return checkNotNull(client); + assert(client != null); + return client; } final void cleanup() { diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java index b5826a46ea84..dc39235b35c5 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java +++ b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java @@ -21,11 +21,9 @@ import static com.android.documentsui.services.FileOperationService.OPERATION_MO import android.app.Notification; import android.app.Notification.Builder; import android.content.Context; -import android.net.Uri; import android.os.RemoteException; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; -import android.util.Log; import com.android.documentsui.R; import com.android.documentsui.model.DocumentInfo; @@ -36,7 +34,6 @@ import java.util.List; // TODO: Stop extending CopyJob. final class MoveJob extends CopyJob { - private static final String TAG = "MoveJob"; final DocumentInfo mSrcParent; /** diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java index adcfef333def..683fd6c92caf 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java @@ -32,8 +32,11 @@ import android.support.test.uiautomator.Configurator; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObjectNotFoundException; import android.test.ActivityInstrumentationTestCase2; +import android.util.Log; import android.view.MotionEvent; +import com.android.documentsui.BaseActivity; +import com.android.documentsui.EventListener; import com.android.documentsui.bots.DirectoryListBot; import com.android.documentsui.bots.KeyboardBot; import com.android.documentsui.bots.RootsListBot; @@ -64,7 +67,6 @@ public abstract class ActivityTest<T extends Activity> extends ActivityInstrumen public RootInfo rootDir0; public RootInfo rootDir1; - ContentResolver mResolver; DocumentsProviderHelper mDocsHelper; ContentProviderClient mClient; @@ -84,6 +86,23 @@ public abstract class ActivityTest<T extends Activity> extends ActivityInstrumen return rootDir0; } + /** + * Returns the authority of the testing provider begin used. + * By default it's StubProvider's authority. + * @return Authority of the provider. + */ + protected String getTestingProviderAuthority() { + return DEFAULT_AUTHORITY; + } + + /** + * Resolves testing roots. + */ + protected void setupTestingRoots() throws RemoteException { + rootDir0 = mDocsHelper.getRoot(ROOT_0_ID); + rootDir1 = mDocsHelper.getRoot(ROOT_1_ID); + } + @Override public void setUp() throws Exception { device = UiDevice.getInstance(getInstrumentation()); @@ -93,18 +112,14 @@ public abstract class ActivityTest<T extends Activity> extends ActivityInstrumen bots = new Bots(device, context, TIMEOUT); Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); - bots.main.revealLauncher(); mResolver = context.getContentResolver(); - mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); - mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); + mClient = mResolver.acquireUnstableContentProviderClient(getTestingProviderAuthority()); + mDocsHelper = new DocumentsProviderHelper(getTestingProviderAuthority(), mClient); - rootDir0 = mDocsHelper.getRoot(ROOT_0_ID); - rootDir1 = mDocsHelper.getRoot(ROOT_1_ID); + setupTestingRoots(); launchActivity(); - - bots.main.revealApp(); resetStorage(); } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java index 7d3498e4e079..e73dd8cdfec2 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java @@ -16,6 +16,9 @@ package com.android.documentsui; +import static com.android.documentsui.RootsCache.getMatchingRoots; +import static com.google.common.collect.Lists.newArrayList; + import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; @@ -28,23 +31,18 @@ import java.util.List; @SmallTest public class RootsCacheTest extends AndroidTestCase { - private static RootInfo buildForMimeTypes(String... mimeTypes) { - final RootInfo root = new RootInfo(); - root.derivedMimeTypes = mimeTypes; - return root; - } - - private RootInfo mNull = new RootInfo(); - private RootInfo mEmpty = buildForMimeTypes(); - private RootInfo mWild = buildForMimeTypes("*/*"); - private RootInfo mImages = buildForMimeTypes("image/*"); - private RootInfo mAudio = buildForMimeTypes("audio/*", "application/ogg", "application/x-flac"); - private RootInfo mDocs = buildForMimeTypes("application/msword", "application/vnd.ms-excel"); - private RootInfo mMalformed1 = buildForMimeTypes("meow"); - private RootInfo mMalformed2 = buildForMimeTypes("*/meow"); + private static RootInfo mNull = new RootInfo(); + private static RootInfo mEmpty = buildForMimeTypes(); + private static RootInfo mWild = buildForMimeTypes("*/*"); + private static RootInfo mImages = buildForMimeTypes("image/*"); + private static RootInfo mAudio = buildForMimeTypes( + "audio/*", "application/ogg", "application/x-flac"); + private static RootInfo mDocs = buildForMimeTypes( + "application/msword", "application/vnd.ms-excel"); + private static RootInfo mMalformed1 = buildForMimeTypes("meow"); + private static RootInfo mMalformed2 = buildForMimeTypes("*/meow"); - private List<RootInfo> mRoots = Lists.newArrayList( - mNull, mWild, mEmpty, mImages, mAudio, mDocs, mMalformed1, mMalformed2); + private List<RootInfo> mRoots; private State mState; @@ -52,70 +50,86 @@ public class RootsCacheTest extends AndroidTestCase { protected void setUp() throws Exception { super.setUp(); + mRoots = Lists.newArrayList( + mNull, mWild, mEmpty, mImages, mAudio, mDocs, mMalformed1, mMalformed2); + mState = new State(); mState.action = State.ACTION_OPEN; - mState.showAdvanced = true; mState.localOnly = false; } - public void testMatchingRootsEverything() throws Exception { + public void testMatchingRoots_Everything() throws Exception { + mState.acceptMimes = new String[] { "*/*" }; + assertContainsExactly( + newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), + getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRoots_DirectoryCopy() throws Exception { + RootInfo downloads = buildForMimeTypes("*/*"); + downloads.authority = "com.android.providers.downloads.documents"; + mRoots.add(downloads); + mState.acceptMimes = new String[] { "*/*" }; + mState.directoryCopy = true; + + // basically we're asserting that the results don't contain downloads assertContainsExactly( - Lists.newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), - RootsCache.getMatchingRoots(mRoots, mState)); + newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), + getMatchingRoots(mRoots, mState)); } - public void testMatchingRootsPngOrWild() throws Exception { + public void testMatchingRoots_PngOrWild() throws Exception { mState.acceptMimes = new String[] { "image/png", "*/*" }; assertContainsExactly( - Lists.newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), - RootsCache.getMatchingRoots(mRoots, mState)); + newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), + getMatchingRoots(mRoots, mState)); } - public void testMatchingRootsAudioWild() throws Exception { + public void testMatchingRoots_AudioWild() throws Exception { mState.acceptMimes = new String[] { "audio/*" }; assertContainsExactly( - Lists.newArrayList(mNull, mWild, mAudio), - RootsCache.getMatchingRoots(mRoots, mState)); + newArrayList(mNull, mWild, mAudio), + getMatchingRoots(mRoots, mState)); } - public void testMatchingRootsAudioWildOrImageWild() throws Exception { + public void testMatchingRoots_AudioWildOrImageWild() throws Exception { mState.acceptMimes = new String[] { "audio/*", "image/*" }; assertContainsExactly( - Lists.newArrayList(mNull, mWild, mAudio, mImages), - RootsCache.getMatchingRoots(mRoots, mState)); + newArrayList(mNull, mWild, mAudio, mImages), + getMatchingRoots(mRoots, mState)); } - public void testMatchingRootsAudioSpecific() throws Exception { + public void testMatchingRoots_AudioSpecific() throws Exception { mState.acceptMimes = new String[] { "audio/mpeg" }; assertContainsExactly( - Lists.newArrayList(mNull, mWild, mAudio), - RootsCache.getMatchingRoots(mRoots, mState)); + newArrayList(mNull, mWild, mAudio), + getMatchingRoots(mRoots, mState)); } - public void testMatchingRootsDocument() throws Exception { + public void testMatchingRoots_Document() throws Exception { mState.acceptMimes = new String[] { "application/msword" }; assertContainsExactly( - Lists.newArrayList(mNull, mWild, mDocs), - RootsCache.getMatchingRoots(mRoots, mState)); + newArrayList(mNull, mWild, mDocs), + getMatchingRoots(mRoots, mState)); } - public void testMatchingRootsApplication() throws Exception { + public void testMatchingRoots_Application() throws Exception { mState.acceptMimes = new String[] { "application/*" }; assertContainsExactly( - Lists.newArrayList(mNull, mWild, mAudio, mDocs), - RootsCache.getMatchingRoots(mRoots, mState)); + newArrayList(mNull, mWild, mAudio, mDocs), + getMatchingRoots(mRoots, mState)); } - public void testMatchingRootsFlacOrPng() throws Exception { + public void testMatchingRoots_FlacOrPng() throws Exception { mState.acceptMimes = new String[] { "application/x-flac", "image/png" }; assertContainsExactly( - Lists.newArrayList(mNull, mWild, mAudio, mImages), - RootsCache.getMatchingRoots(mRoots, mState)); + newArrayList(mNull, mWild, mAudio, mImages), + getMatchingRoots(mRoots, mState)); } public void testExcludedAuthorities() throws Exception { - final List<RootInfo> roots = Lists.newArrayList(); + final List<RootInfo> roots = newArrayList(); // Set up some roots for (int i = 0; i < 5; ++i) { @@ -124,7 +138,7 @@ public class RootsCacheTest extends AndroidTestCase { roots.add(root); } // Make some allowed authorities - List<RootInfo> allowedRoots = Lists.newArrayList( + List<RootInfo> allowedRoots = newArrayList( roots.get(0), roots.get(2), roots.get(4)); // Set up the excluded authority list for (RootInfo root: roots) { @@ -136,7 +150,7 @@ public class RootsCacheTest extends AndroidTestCase { assertContainsExactly( allowedRoots, - RootsCache.getMatchingRoots(roots, mState)); + getMatchingRoots(roots, mState)); } private static void assertContainsExactly(List<?> expected, List<?> actual) { @@ -145,4 +159,10 @@ public class RootsCacheTest extends AndroidTestCase { assertTrue(actual.contains(o)); } } + + private static RootInfo buildForMimeTypes(String... mimeTypes) { + final RootInfo root = new RootInfo(); + root.derivedMimeTypes = mimeTypes; + return root; + } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/UiBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/UiBot.java index a112081dda26..11f519411448 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/UiBot.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/UiBot.java @@ -212,16 +212,6 @@ public class UiBot extends BaseBot { return mDevice.findObject(selector); } - public void revealLauncher() { - mDevice.pressHome(); - mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), mTimeout); - } - - public void revealApp() { - mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), mTimeout); - mDevice.waitForIdle(); - } - public void pressKey(int keyCode) { mDevice.pressKeyCode(keyCode); } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java index 2244be9fa8cc..adc814147336 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java @@ -73,28 +73,6 @@ public class ModelBackedDocumentsAdapterTest extends AndroidTestCase { assertEquals(mModel.getItemCount() - 2, mAdapter.getItemCount()); } - // Tests that the items can be hidden and unhidden. - public void testUnhide_ItemCount() { - List<String> ids = mModel.getModelIds(); - SparseArray<String> hidden = mAdapter.hide(ids.toArray(new String[ids.size()])); - mAdapter.unhide(hidden); - assertEquals(mModel.getItemCount(), mAdapter.getItemCount()); - } - - // Tests that the items can be hidden and unhidden. - public void testUnhide_PreservesOrder() { - List<String> ids = mModel.getModelIds(); - SparseArray<String> hidden = mAdapter.hide( - ids.get(0), ids.get(1), ids.get(5), ids.get(9)); - mAdapter.unhide(hidden); - - // Finally ensure the restored items are in the original order - // by checking them against the model. - for (int i = 0; i < mAdapter.getItemCount(); i++) { - assertEquals(mModel.idForPosition(i), mAdapter.getModelId(i)); - } - } - private final class TestEnvironment implements DocumentsAdapter.Environment { private final Context testContext; diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestDocumentsAdapter.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestDocumentsAdapter.java index 267f47d80d3f..e170dbb55181 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestDocumentsAdapter.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestDocumentsAdapter.java @@ -61,11 +61,6 @@ public class TestDocumentsAdapter extends DocumentsAdapter { } @Override - void unhide(SparseArray<String> ids) { - throw new UnsupportedOperationException(); - } - - @Override public DocumentHolder onCreateViewHolder(ViewGroup parent, int viewType) { throw new UnsupportedOperationException(); } diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 97dfd47aea9f..d31a121233e3 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -170,7 +170,6 @@ public class ExternalStorageProvider extends DocumentsProvider { if (volume.isPrimary()) { // save off the primary volume for subsequent "Home" dir initialization. primaryVolume = volume; - root.flags |= Root.FLAG_ADVANCED; } // Dunno when this would NOT be the case, but never hurts to be correct. if (volume.isMountedWritable()) { @@ -391,6 +390,10 @@ public class ExternalStorageProvider extends DocumentsProvider { if (mArchiveHelper.isArchivedDocument(docId)) { return mArchiveHelper.isChildDocument(parentDocId, docId); } + // Archives do not contain regular files. + if (mArchiveHelper.isArchivedDocument(parentDocId)) { + return false; + } final File parent = getFileForDocId(parentDocId).getCanonicalFile(); final File doc = getFileForDocId(docId).getCanonicalFile(); diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java index 63c4ef8bb8c4..c031f34a37da 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -404,6 +404,7 @@ public class MtpDocumentsProvider extends DocumentsProvider { for (final int id : keySet) { closeDeviceInternal(id); } + mRootScanner.pause(); } catch (InterruptedException|IOException e) { // It should fail unit tests by throwing runtime exception. throw new RuntimeException(e); diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java index 82ba21f659d1..2f66c5cf17d7 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java @@ -26,7 +26,6 @@ import java.io.FileNotFoundException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; final class RootScanner { @@ -56,7 +55,7 @@ final class RootScanner { final MtpDatabase mDatabase; ExecutorService mExecutor; - FutureTask<Void> mCurrentTask; + private UpdateRootsRunnable mCurrentTask; RootScanner( ContentResolver resolver, @@ -84,13 +83,12 @@ final class RootScanner { mExecutor = Executors.newSingleThreadExecutor(); } if (mCurrentTask != null) { - // Cancel previous task. - mCurrentTask.cancel(true); + // Stop previous task. + mCurrentTask.stop(); } - final UpdateRootsRunnable runnable = new UpdateRootsRunnable(); - mCurrentTask = new FutureTask<Void>(runnable, null); - mExecutor.submit(mCurrentTask); - return runnable.mFirstScanCompleted; + mCurrentTask = new UpdateRootsRunnable(); + mExecutor.execute(mCurrentTask); + return mCurrentTask.mFirstScanCompleted; } /** @@ -112,13 +110,21 @@ final class RootScanner { * Runnable to scan roots and update the database information. */ private final class UpdateRootsRunnable implements Runnable { + /** + * Count down latch that specifies the runnable is stopped. + */ + final CountDownLatch mStopped = new CountDownLatch(1); + + /** + * Count down latch that specifies the first scan is completed. + */ final CountDownLatch mFirstScanCompleted = new CountDownLatch(1); @Override public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); int pollingCount = 0; - while (true) { + while (mStopped.getCount() > 0) { boolean changed = false; // Update devices. @@ -171,12 +177,16 @@ final class RootScanner { // Use SHORT_POLLING_PERIOD for the first SHORT_POLLING_TIMES because it is // more likely to add new root just after the device is added. // TODO: Use short interval only for a device that is just added. - Thread.sleep(pollingCount > SHORT_POLLING_TIMES ? - LONG_POLLING_INTERVAL : SHORT_POLLING_INTERVAL); + mStopped.await(pollingCount > SHORT_POLLING_TIMES ? + LONG_POLLING_INTERVAL : SHORT_POLLING_INTERVAL, TimeUnit.MILLISECONDS); } catch (InterruptedException exp) { break; } } } + + void stop() { + mStopped.countDown(); + } } } diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 57a749d5c5b4..a01d2e99199b 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -278,7 +278,7 @@ <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"Ejecuta procesadores de WebView en un proceso aislado."</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Establecer implementación de WebView"</string> - <string name="select_webview_provider_toast_text" msgid="8168796505966635684">"La implementación de WebView seleccionada no es válida porque la lista de opciones de implementación no estaba activada. Esta ya debería estar actualizada."</string> + <string name="select_webview_provider_toast_text" msgid="8168796505966635684">"La implementación de WebView seleccionada no es válida porque la lista de opciones de implementación estaba inactiva. Esta ya debería estar actualizada."</string> <string name="convert_to_file_encryption" msgid="3060156730651061223">"Convertir a cifrado de archivo"</string> <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Convertir…"</string> <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Ya está cifrado"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index a683c5572b10..0a2d11184bbc 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -274,11 +274,11 @@ <string name="inactive_app_active_summary" msgid="4174921824958516106">"فعال. برای تغییر حالت ضربه بزنید."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"سرویسهای در حال اجرا"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"مشاهده و کنترل سرویسهای در حال اجرای فعلی"</string> - <string name="enable_webview_multiprocess" msgid="3405948012467585908">"فعال کردن WebView چند پردازشی"</string> - <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"اجرای تولیدکننده تصویر WebView در یک پردازش مجزا."</string> - <string name="select_webview_provider_title" msgid="4628592979751918907">"اجرای WebView"</string> - <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"تنظیم اجرای WebView"</string> - <string name="select_webview_provider_toast_text" msgid="8168796505966635684">"اجرای WebView انتخابی نامعتبر است چون فهرست گزینههای اجرای انتخابی قدیمی شده است. این فهرست اکنون باید بهروزرسانی شود."</string> + <string name="enable_webview_multiprocess" msgid="3405948012467585908">"فعال کردن وبنما چند پردازشی"</string> + <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"اجرای تولیدکننده تصویر وبنما در یک پردازش مجزا."</string> + <string name="select_webview_provider_title" msgid="4628592979751918907">"اجرای وبنما"</string> + <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"تنظیم اجرای وبنما"</string> + <string name="select_webview_provider_toast_text" msgid="8168796505966635684">"اجرای وبنما انتخابی نامعتبر است چون فهرست گزینههای اجرای انتخابی قدیمی شده است. این فهرست اکنون باید بهروزرسانی شود."</string> <string name="convert_to_file_encryption" msgid="3060156730651061223">"تبدیل به رمزگذاری برحسب فایل"</string> <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"تبدیل…"</string> <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"از قبل به رمزگذاری بر حسب فایل تبدیل شده است"</string> diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index e05d82e25f31..178d47ea55d2 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -278,7 +278,7 @@ <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"WebView рендерерлерин корголгон процессте иштетүү."</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView аткарылышы"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView аткарылышын коюу"</string> - <string name="select_webview_provider_toast_text" msgid="8168796505966635684">"Аткарууларды тандоо тизмеси эскирип кеткендиктен тандалган WebView аткарылышы жараксыз. Тизме азыр жаңыртылышы керек."</string> + <string name="select_webview_provider_toast_text" msgid="8168796505966635684">"Тандалган WebView кызматы колдоого алынбайт. Кызматтардын тизмеси эскирип калгандыктан ал азыр жаңыртылат."</string> <string name="convert_to_file_encryption" msgid="3060156730651061223">"Файл шифрлөөсүнө айландыруу"</string> <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Айландыруу…"</string> <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Файл мурунтан эле шифрленген"</string> diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index adc75e99e9d4..fac31dfbfbd6 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -102,7 +102,7 @@ <string name="tts_default_rate_title" msgid="6030550998379310088">"பேச்சு வீதம்"</string> <string name="tts_default_rate_summary" msgid="4061815292287182801">"பேசப்படும் உரையின் வேகம்"</string> <string name="tts_default_pitch_title" msgid="6135942113172488671">"ஒலித்திறன்"</string> - <string name="tts_default_pitch_summary" msgid="1944885882882650009">"தொகுக்கப்பட்ட உரையின் டோன் பாதிக்கப்படும்"</string> + <string name="tts_default_pitch_summary" msgid="1944885882882650009">"உருவாக்கப்படும் பேச்சின் டோன் பாதிக்கப்படும்"</string> <string name="tts_default_lang_title" msgid="8018087612299820556">"மொழி"</string> <string name="tts_lang_use_system" msgid="2679252467416513208">"முறைமையின் மொழியைப் பயன்படுத்து"</string> <string name="tts_lang_not_selected" msgid="7395787019276734765">"மொழி தேர்ந்தெடுக்கப்படவில்லை"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 53bd985436ee..4001d2c7f0a6 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -278,7 +278,7 @@ <string name="enable_webview_multiprocess_desc" msgid="852226124223847283">"在独立进程中运行 WebView 渲染程序。"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 实现"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"设置 WebView 实现"</string> - <string name="select_webview_provider_toast_text" msgid="8168796505966635684">"所选的 WebView 实现无效,因为相关的实现选项列表已过时。请立即更新这份列表。"</string> + <string name="select_webview_provider_toast_text" msgid="8168796505966635684">"所选的 WebView 实现无效,因为实现选项列表已过时。请立即更新列表。"</string> <string name="convert_to_file_encryption" msgid="3060156730651061223">"转换为文件加密"</string> <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"转换…"</string> <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"文件已加密"</string> diff --git a/packages/Shell/res/layout/dialog_bugreport_info.xml b/packages/Shell/res/layout/dialog_bugreport_info.xml index 5d1e9f994946..b6b8d6bcf2b2 100644 --- a/packages/Shell/res/layout/dialog_bugreport_info.xml +++ b/packages/Shell/res/layout/dialog_bugreport_info.xml @@ -16,28 +16,44 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" + android:paddingTop="15dp" + android:paddingStart="24dp" + android:paddingEnd="24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"> + <TextView + android:inputType="textNoSuggestions" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/bugreport_info_name"/> <EditText android:id="@+id/name" android:maxLength="30" android:singleLine="true" + android:selectAllOnFocus="true" android:inputType="textNoSuggestions" android:layout_width="match_parent" + android:layout_height="wrap_content"/> + <TextView + android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/bugreport_info_name"/> + android:text="@string/bugreport_info_title"/> <EditText android:id="@+id/title" android:maxLength="80" android:singleLine="true" + android:inputType="textAutoCorrect|textCapSentences" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + <TextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/bugreport_info_title"/> + android:editable="false" + android:text="@string/bugreport_info_description"/> <EditText android:id="@+id/description" android:singleLine="false" - android:inputType="textMultiLine" + android:inputType="textMultiLine|textAutoCorrect|textCapSentences" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/bugreport_info_description"/> + android:layout_height="wrap_content"/> </LinearLayout> diff --git a/packages/Shell/res/values-af/strings.xml b/packages/Shell/res/values-af/strings.xml index 9d399c193a31..f86b551f90e3 100644 --- a/packages/Shell/res/values-af/strings.xml +++ b/packages/Shell/res/values-af/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Kon nie skermkiekie neem nie."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Foutverslag <xliff:g id="ID">#%d</xliff:g> se besonderhede"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Lêernaam"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titel"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Gedetailleerde beskrywing"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Fouttitel"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Foutopsomming"</string> + <string name="save" msgid="4781509040564835759">"Stoor"</string> </resources> diff --git a/packages/Shell/res/values-am/strings.xml b/packages/Shell/res/values-am/strings.xml index 254522218678..55c5390cebf3 100644 --- a/packages/Shell/res/values-am/strings.xml +++ b/packages/Shell/res/values-am/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ቅጽበታዊ ገጽ እይታ ሊነሳ አይችልም"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"የሳንካ ሪፖርት <xliff:g id="ID">#%d</xliff:g> ዝርዝሮች"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"የፋይል ስም"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"ርዕስ"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"ዝርዝር መግለጫ"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"የሳንካ ርዕስ"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"የሳንካ ማጠቃለያ"</string> + <string name="save" msgid="4781509040564835759">"አስቀምጥ"</string> </resources> diff --git a/packages/Shell/res/values-ar/strings.xml b/packages/Shell/res/values-ar/strings.xml index 7593110a0d00..f0af8ce9dbfb 100644 --- a/packages/Shell/res/values-ar/strings.xml +++ b/packages/Shell/res/values-ar/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"تعذر التقاط لقطة الشاشة."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"تفاصيل تقرير الخطأ <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"اسم الملف"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"العنوان"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"وصف تفصيلي"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"عنوان الخطأ"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"ملخص الخطأ"</string> + <string name="save" msgid="4781509040564835759">"حفظ"</string> </resources> diff --git a/packages/Shell/res/values-az-rAZ/strings.xml b/packages/Shell/res/values-az-rAZ/strings.xml index 9130255fd18b..6d375fe78c67 100644 --- a/packages/Shell/res/values-az-rAZ/strings.xml +++ b/packages/Shell/res/values-az-rAZ/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Displey görüntüsü əlçatan deyil."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Baq hesabatı <xliff:g id="ID">#%d</xliff:g> detalları"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Fayl adı"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Başlıq"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Ətraflı təsvir"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Baq başlığı"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Baq xülasə"</string> + <string name="save" msgid="4781509040564835759">"Yadda saxlayın"</string> </resources> diff --git a/packages/Shell/res/values-b+sr+Latn/strings.xml b/packages/Shell/res/values-b+sr+Latn/strings.xml index 597e5457ce6c..ad8494100534 100644 --- a/packages/Shell/res/values-b+sr+Latn/strings.xml +++ b/packages/Shell/res/values-b+sr+Latn/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Snimanje ekrana nije uspelo."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalji izveštaja o grešci <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Naziv datoteke"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Naslov"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljni opis"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Naslov greške"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Rezime greške"</string> + <string name="save" msgid="4781509040564835759">"Sačuvaj"</string> </resources> diff --git a/packages/Shell/res/values-bg/strings.xml b/packages/Shell/res/values-bg/strings.xml index 6ca791409773..e5438395c487 100644 --- a/packages/Shell/res/values-bg/strings.xml +++ b/packages/Shell/res/values-bg/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Екранната снимка не можа да бъде направена."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Подробности за сигнала за програмна грешка „<xliff:g id="ID">#%d</xliff:g>“"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Име на файла"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Заглавие"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Подробно описание"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Заглавие на сигнала за програмна грешка"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Обобщена информация за сигнала за програмна грешка"</string> + <string name="save" msgid="4781509040564835759">"Запазване"</string> </resources> diff --git a/packages/Shell/res/values-bn-rBD/strings.xml b/packages/Shell/res/values-bn-rBD/strings.xml index 5390315737f5..bba778d6a0c0 100644 --- a/packages/Shell/res/values-bn-rBD/strings.xml +++ b/packages/Shell/res/values-bn-rBD/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"স্ক্রীনশট নেওয়া যায়নি৷"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ত্রুটির প্রতিবেদন <xliff:g id="ID">#%d</xliff:g> এর বিশদ বিবরণ"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ফাইলের নাম"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"শীর্ষক"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"বিস্তারিত বিবরণ"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"ত্রুটির শীর্ষক"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"ত্রুটির সারাংশ"</string> + <string name="save" msgid="4781509040564835759">"সংরক্ষণ করুন"</string> </resources> diff --git a/packages/Shell/res/values-bs-rBA/strings.xml b/packages/Shell/res/values-bs-rBA/strings.xml index 903c2ab05d72..54be9551195f 100644 --- a/packages/Shell/res/values-bs-rBA/strings.xml +++ b/packages/Shell/res/values-bs-rBA/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ekran nije moguće snimiti."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalji izvještaja o grešci <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Naziv fajla"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Naslov"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljan opis"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Naslov greške"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Sažetak greške"</string> + <string name="save" msgid="4781509040564835759">"Sačuvaj"</string> </resources> diff --git a/packages/Shell/res/values-ca/strings.xml b/packages/Shell/res/values-ca/strings.xml index 08369461eaa4..a92177e2b072 100644 --- a/packages/Shell/res/values-ca/strings.xml +++ b/packages/Shell/res/values-ca/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"No s\'ha pogut fer la captura de pantalla."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalls de l\'informe d\'errors <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nom del fitxer"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Títol"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descripció detallada"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Títol de l\'error"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Resum d\'errors"</string> + <string name="save" msgid="4781509040564835759">"Desa"</string> </resources> diff --git a/packages/Shell/res/values-cs/strings.xml b/packages/Shell/res/values-cs/strings.xml index 215ec87b09e2..6f7549ac817e 100644 --- a/packages/Shell/res/values-cs/strings.xml +++ b/packages/Shell/res/values-cs/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Snímek obrazovky se nepodařilo pořídit."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Podrobnosti zprávy o chybě <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Název souboru"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Název"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Podrobný popis"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Název chyby"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Přehled chyby"</string> + <string name="save" msgid="4781509040564835759">"Uložit"</string> </resources> diff --git a/packages/Shell/res/values-da/strings.xml b/packages/Shell/res/values-da/strings.xml index e956d3a177e6..72a9a99680ce 100644 --- a/packages/Shell/res/values-da/strings.xml +++ b/packages/Shell/res/values-da/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Der kunne ikke tages et skærmbillede."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Oplysninger om fejlrapporten <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Filnavn"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titel"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljeret beskrivelse"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Fejlrapportens titel"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Oversigt over fejl"</string> + <string name="save" msgid="4781509040564835759">"Gem"</string> </resources> diff --git a/packages/Shell/res/values-de/strings.xml b/packages/Shell/res/values-de/strings.xml index 07f889890ba5..f848c9d32a2a 100644 --- a/packages/Shell/res/values-de/strings.xml +++ b/packages/Shell/res/values-de/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot konnte nicht aufgenommen werden."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Details zum Fehlerbericht <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Dateiname"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titel"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detaillierte Beschreibung"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Titel des Programmfehlers"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Zusammenfassung des Programmfehlers"</string> + <string name="save" msgid="4781509040564835759">"Speichern"</string> </resources> diff --git a/packages/Shell/res/values-el/strings.xml b/packages/Shell/res/values-el/strings.xml index 674697685dd5..0c04809dc1e6 100644 --- a/packages/Shell/res/values-el/strings.xml +++ b/packages/Shell/res/values-el/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Δεν ήταν δυνατή η λήψη του στιγμιότυπου οθόνης."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Λεπτομέρειες της αναφοράς σφάλματος <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Όνομα αρχείου"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Τίτλος"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Αναλυτική περιγραφή"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Τίτλος σφάλματος"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Περίληψη σφάλματος"</string> + <string name="save" msgid="4781509040564835759">"Αποθήκευση"</string> </resources> diff --git a/packages/Shell/res/values-en-rAU/strings.xml b/packages/Shell/res/values-en-rAU/strings.xml index ac681e27bc94..ad637f530cba 100644 --- a/packages/Shell/res/values-en-rAU/strings.xml +++ b/packages/Shell/res/values-en-rAU/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot could not be taken."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Bug report <xliff:g id="ID">#%d</xliff:g> details"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Title"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detailed description"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Bug title"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Bug summary"</string> + <string name="save" msgid="4781509040564835759">"Save"</string> </resources> diff --git a/packages/Shell/res/values-en-rGB/strings.xml b/packages/Shell/res/values-en-rGB/strings.xml index ac681e27bc94..ad637f530cba 100644 --- a/packages/Shell/res/values-en-rGB/strings.xml +++ b/packages/Shell/res/values-en-rGB/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot could not be taken."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Bug report <xliff:g id="ID">#%d</xliff:g> details"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Title"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detailed description"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Bug title"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Bug summary"</string> + <string name="save" msgid="4781509040564835759">"Save"</string> </resources> diff --git a/packages/Shell/res/values-en-rIN/strings.xml b/packages/Shell/res/values-en-rIN/strings.xml index ac681e27bc94..ad637f530cba 100644 --- a/packages/Shell/res/values-en-rIN/strings.xml +++ b/packages/Shell/res/values-en-rIN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot could not be taken."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Bug report <xliff:g id="ID">#%d</xliff:g> details"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Title"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detailed description"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Bug title"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Bug summary"</string> + <string name="save" msgid="4781509040564835759">"Save"</string> </resources> diff --git a/packages/Shell/res/values-es-rUS/strings.xml b/packages/Shell/res/values-es-rUS/strings.xml index 96ca14c6ebce..a9a1e08c12b8 100644 --- a/packages/Shell/res/values-es-rUS/strings.xml +++ b/packages/Shell/res/values-es-rUS/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"No se pudo tomar la captura de pantalla."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalles del informe de errores <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nombre del archivo"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descripción completa"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Título del error"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Resumen del error"</string> + <string name="save" msgid="4781509040564835759">"Guardar"</string> </resources> diff --git a/packages/Shell/res/values-es/strings.xml b/packages/Shell/res/values-es/strings.xml index 00874c620583..b82d372f408a 100644 --- a/packages/Shell/res/values-es/strings.xml +++ b/packages/Shell/res/values-es/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"No se puede realizar la captura de pantalla."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalles del informe de errores <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nombre de archivo"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descripción completa"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Nombre del informe de errores"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Resumen del informe de errores"</string> + <string name="save" msgid="4781509040564835759">"Guardar"</string> </resources> diff --git a/packages/Shell/res/values-et-rEE/strings.xml b/packages/Shell/res/values-et-rEE/strings.xml index bc469bcd93ee..cdb774a04eaf 100644 --- a/packages/Shell/res/values-et-rEE/strings.xml +++ b/packages/Shell/res/values-et-rEE/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ekraanipilti ei saanud teha."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Veaaruande <xliff:g id="ID">#%d</xliff:g> üksikasjad"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Faili nimi"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Pealkiri"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Üksikasjalik kirjeldus"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Vea pealkiri"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Vea kokkuvõte"</string> + <string name="save" msgid="4781509040564835759">"Salvesta"</string> </resources> diff --git a/packages/Shell/res/values-eu-rES/strings.xml b/packages/Shell/res/values-eu-rES/strings.xml index 614f17ecda94..42dfe276640c 100644 --- a/packages/Shell/res/values-eu-rES/strings.xml +++ b/packages/Shell/res/values-eu-rES/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ezin izan da atera pantaila-argazkia."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Akatsen <xliff:g id="ID">#%d</xliff:g> txostenaren xehetasunak"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Fitxategi-izena"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Izena"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Azalpen xehatua"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Akatsaren izena"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Akatsaren laburpena"</string> + <string name="save" msgid="4781509040564835759">"Gorde"</string> </resources> diff --git a/packages/Shell/res/values-fa/strings.xml b/packages/Shell/res/values-fa/strings.xml index ab00562eaa75..e825f3a41916 100644 --- a/packages/Shell/res/values-fa/strings.xml +++ b/packages/Shell/res/values-fa/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"نمیتوان عکس صفحهنمایش گرفت."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"جزئیات گزارش اشکال <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"نام فایل"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"عنوان"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"جزئیات دقیق"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"عنوان اشکال"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"خلاصه اشکال"</string> + <string name="save" msgid="4781509040564835759">"ذخیره کردن"</string> </resources> diff --git a/packages/Shell/res/values-fi/strings.xml b/packages/Shell/res/values-fi/strings.xml index be7aabd5b882..8c67c664f90a 100644 --- a/packages/Shell/res/values-fi/strings.xml +++ b/packages/Shell/res/values-fi/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Kuvakaappauksen tallentaminen epäonnistui."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Virheraportin <xliff:g id="ID">#%d</xliff:g> tiedot"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Tiedostonimi"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Otsikko"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Yksityiskohtainen kuvaus"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Virheen nimi"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Virheen yhteenveto"</string> + <string name="save" msgid="4781509040564835759">"Tallenna"</string> </resources> diff --git a/packages/Shell/res/values-fr-rCA/strings.xml b/packages/Shell/res/values-fr-rCA/strings.xml index 7d9f97d5385c..3daa12034e9d 100644 --- a/packages/Shell/res/values-fr-rCA/strings.xml +++ b/packages/Shell/res/values-fr-rCA/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Une erreur s\'est produite lors de la saisie d\'écran."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Détails du rapport de bogue <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nom de fichier"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titre"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Description détaillée"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Titre du bogue"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Sommaire des bogues"</string> + <string name="save" msgid="4781509040564835759">"Enregistrer"</string> </resources> diff --git a/packages/Shell/res/values-fr/strings.xml b/packages/Shell/res/values-fr/strings.xml index 74025d90c5c5..c512aca85155 100644 --- a/packages/Shell/res/values-fr/strings.xml +++ b/packages/Shell/res/values-fr/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Impossible d\'effectuer une capture d\'écran."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Informations sur le rapport de bug \"<xliff:g id="ID">#%d</xliff:g>\""</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nom de fichier"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titre"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Description détaillée"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Titre du bug"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Résumé du bug"</string> + <string name="save" msgid="4781509040564835759">"Enregistrer"</string> </resources> diff --git a/packages/Shell/res/values-gl-rES/strings.xml b/packages/Shell/res/values-gl-rES/strings.xml index d3be7c5bacea..ea95c970b3c3 100644 --- a/packages/Shell/res/values-gl-rES/strings.xml +++ b/packages/Shell/res/values-gl-rES/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Non se puido realizar a captura de pantalla."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalles do informe de erros <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome do ficheiro"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descrición detallada"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Título do informe de erros"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Resumo do informe de erros"</string> + <string name="save" msgid="4781509040564835759">"Gardar"</string> </resources> diff --git a/packages/Shell/res/values-gu-rIN/strings.xml b/packages/Shell/res/values-gu-rIN/strings.xml index 45df7b35ebc8..1436c3d70399 100644 --- a/packages/Shell/res/values-gu-rIN/strings.xml +++ b/packages/Shell/res/values-gu-rIN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"સ્ક્રીનશોટ લઇ શકાયો નથી."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"બગ રિપોર્ટ <xliff:g id="ID">#%d</xliff:g> ની વિગતો"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ફાઇલનું નામ"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"શીર્ષક"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"વિગતવાર વર્ણન"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"બગનું શીર્ષક"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"બગનો સારાંશ"</string> + <string name="save" msgid="4781509040564835759">"સાચવો"</string> </resources> diff --git a/packages/Shell/res/values-hi/strings.xml b/packages/Shell/res/values-hi/strings.xml index 8858bc3202e4..9a735f2451b5 100644 --- a/packages/Shell/res/values-hi/strings.xml +++ b/packages/Shell/res/values-hi/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"स्क्रीनशॉट नहीं लिया जा सका."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"बग रिपोर्ट <xliff:g id="ID">#%d</xliff:g> के विवरण"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"फ़ाइल नाम"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"शीर्षक"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"विस्तृत वर्णन"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"बग शीर्षक"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"बग सारांश"</string> + <string name="save" msgid="4781509040564835759">"सहेजें"</string> </resources> diff --git a/packages/Shell/res/values-hr/strings.xml b/packages/Shell/res/values-hr/strings.xml index cb03f9cec314..71d50b8a5589 100644 --- a/packages/Shell/res/values-hr/strings.xml +++ b/packages/Shell/res/values-hr/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Snimanje zaslona nije uspjelo."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Pojedinosti izvješća o programskoj pogrešci <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Naziv datoteke"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Naslov"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljan opis"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Naslov izvješća o programskoj pogrešci"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Sažetak izvješća o programskoj pogrešci"</string> + <string name="save" msgid="4781509040564835759">"Spremi"</string> </resources> diff --git a/packages/Shell/res/values-hu/strings.xml b/packages/Shell/res/values-hu/strings.xml index 390cd2f3ca3a..cf1031569379 100644 --- a/packages/Shell/res/values-hu/strings.xml +++ b/packages/Shell/res/values-hu/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Nem sikerült elkészíteni a képernyőképet."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Hibajelentés (<xliff:g id="ID">#%d</xliff:g>) részletei"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Fájlnév"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Név"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Részletes leírás"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Hibajelentés címe"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Hibajelentés összefoglalója"</string> + <string name="save" msgid="4781509040564835759">"Mentés"</string> </resources> diff --git a/packages/Shell/res/values-hy-rAM/strings.xml b/packages/Shell/res/values-hy-rAM/strings.xml index 68478abffff4..1cf5c944ebe8 100644 --- a/packages/Shell/res/values-hy-rAM/strings.xml +++ b/packages/Shell/res/values-hy-rAM/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Չհաջողվեց ստանալ էկրանի պատկերը:"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"<xliff:g id="ID">#%d</xliff:g> վրիպակի զեկույցի մանրամասները"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Ֆայլի անունը"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Անվանումը"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Մանրամասն նկարագրություն"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Վրիպակի զեկույցի վերնագիրը"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Վրիպակի զեկույցի ամփոփագիրը"</string> + <string name="save" msgid="4781509040564835759">"Պահել"</string> </resources> diff --git a/packages/Shell/res/values-in/strings.xml b/packages/Shell/res/values-in/strings.xml index 4416fc725b0b..1e8fe872a2d5 100644 --- a/packages/Shell/res/values-in/strings.xml +++ b/packages/Shell/res/values-in/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Tangkapan layar tidak dapat diambil."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detail laporan bug <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nama file"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Judul"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Deskripsi detail"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Judul bug"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Ringkasan bug"</string> + <string name="save" msgid="4781509040564835759">"Simpan"</string> </resources> diff --git a/packages/Shell/res/values-is-rIS/strings.xml b/packages/Shell/res/values-is-rIS/strings.xml index 0d43719cd3c3..afcea592c24d 100644 --- a/packages/Shell/res/values-is-rIS/strings.xml +++ b/packages/Shell/res/values-is-rIS/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ekki tókst að taka skjámynd."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Upplýsingar villutilkynningar <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Skráarheiti"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titill"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Ítarleg lýsing"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Heiti villu"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Villusamantekt"</string> + <string name="save" msgid="4781509040564835759">"Vista"</string> </resources> diff --git a/packages/Shell/res/values-it/strings.xml b/packages/Shell/res/values-it/strings.xml index fc9383a2ca32..d7ac9a52fbf2 100644 --- a/packages/Shell/res/values-it/strings.xml +++ b/packages/Shell/res/values-it/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Impossibile acquisire lo screenshot."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Dettagli sulla segnalazione di bug <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome file"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titolo"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descrizione dettagliata"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Titolo bug"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Riepilogo bug"</string> + <string name="save" msgid="4781509040564835759">"Salva"</string> </resources> diff --git a/packages/Shell/res/values-iw/strings.xml b/packages/Shell/res/values-iw/strings.xml index 335a2e80d882..fd64ee1991a2 100644 --- a/packages/Shell/res/values-iw/strings.xml +++ b/packages/Shell/res/values-iw/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"לא ניתן היה לצלם מסך."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"פרטי הדוח על הבאג <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"שם קובץ"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"כותרת"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"תיאור מפורט"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"כותרת הבאג"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"סיכום הבאג"</string> + <string name="save" msgid="4781509040564835759">"שמור"</string> </resources> diff --git a/packages/Shell/res/values-ja/strings.xml b/packages/Shell/res/values-ja/strings.xml index b98b05fa1f19..050c5dfa093a 100644 --- a/packages/Shell/res/values-ja/strings.xml +++ b/packages/Shell/res/values-ja/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"スクリーンショットを撮影できませんでした。"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"バグレポート <xliff:g id="ID">#%d</xliff:g> の詳細"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ファイル名"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"タイトル"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"詳細説明"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"バグのタイトル"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"バグの概要"</string> + <string name="save" msgid="4781509040564835759">"保存"</string> </resources> diff --git a/packages/Shell/res/values-ka-rGE/strings.xml b/packages/Shell/res/values-ka-rGE/strings.xml index 24d83a4b6230..8c5c6fbcb2aa 100644 --- a/packages/Shell/res/values-ka-rGE/strings.xml +++ b/packages/Shell/res/values-ka-rGE/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ეკრანის ანაბეჭდის გადაღება ვერ მოხერხდა."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ხარვეზების შესახებ ანგარიში <xliff:g id="ID">#%d</xliff:g>-ის დეტალები"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ფაილის სახელი"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"სათაური"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"დეტალური აღწერა"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"შეცდომის სათაური"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"შეცდომის რეზიუმე"</string> + <string name="save" msgid="4781509040564835759">"შენახვა"</string> </resources> diff --git a/packages/Shell/res/values-kk-rKZ/strings.xml b/packages/Shell/res/values-kk-rKZ/strings.xml index 5878b17a7a5a..edb2dd0107f6 100644 --- a/packages/Shell/res/values-kk-rKZ/strings.xml +++ b/packages/Shell/res/values-kk-rKZ/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Скриншот түсіру мүмкін болмады."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"<xliff:g id="ID">#%d</xliff:g> қате туралы есебі туралы мәліметтер"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Файл атауы"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Атауы"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Егжей-тегжейлі сипаттама"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Қатенің атауы"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Қате туралы жиынтық мәліметтер"</string> + <string name="save" msgid="4781509040564835759">"Сақтау"</string> </resources> diff --git a/packages/Shell/res/values-km-rKH/strings.xml b/packages/Shell/res/values-km-rKH/strings.xml index 9c95e9849efc..ba0de9f4e097 100644 --- a/packages/Shell/res/values-km-rKH/strings.xml +++ b/packages/Shell/res/values-km-rKH/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"មិនអាចថតរូបថតអេក្រង់បានទេ"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ព័ត៌មានលម្អិតពី <xliff:g id="ID">#%d</xliff:g> របាយការណ៍កំហុស"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ឈ្មោះឯកសារ"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"ចំណងជើង"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"ការពិពណ៌នាលម្អិត"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"ចំណងជើងកំហុស"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"សង្ខេបកំហុស"</string> + <string name="save" msgid="4781509040564835759">"រក្សាទុក"</string> </resources> diff --git a/packages/Shell/res/values-kn-rIN/strings.xml b/packages/Shell/res/values-kn-rIN/strings.xml index ce6f3c05f4c4..b041f3534d85 100644 --- a/packages/Shell/res/values-kn-rIN/strings.xml +++ b/packages/Shell/res/values-kn-rIN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ದೋಷ ವರದಿಯ <xliff:g id="ID">#%d</xliff:g> ವಿವರಗಳು"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ಫೈಲ್ಹೆಸರು"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"ಶೀರ್ಷಿಕೆ"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"ವಿವರವಾದ ವಿವರಣೆ"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"ಬಗ್ ಶೀರ್ಷಿಕೆ"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"ಬಗ್ ಸಾರಾಂಶ"</string> + <string name="save" msgid="4781509040564835759">"ಉಳಿಸು"</string> </resources> diff --git a/packages/Shell/res/values-ko/strings.xml b/packages/Shell/res/values-ko/strings.xml index 70df8e2efb36..2a863608e2fd 100644 --- a/packages/Shell/res/values-ko/strings.xml +++ b/packages/Shell/res/values-ko/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"스크린샷을 찍을 수 없습니다."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"버그 신고 <xliff:g id="ID">#%d</xliff:g> 세부정보"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"파일 이름"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"제목"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"자세한 설명"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"버그 제목"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"버그 요약"</string> + <string name="save" msgid="4781509040564835759">"저장"</string> </resources> diff --git a/packages/Shell/res/values-ky-rKG/strings.xml b/packages/Shell/res/values-ky-rKG/strings.xml index 49d8d8df0074..1903109d300f 100644 --- a/packages/Shell/res/values-ky-rKG/strings.xml +++ b/packages/Shell/res/values-ky-rKG/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Скриншот тартылбай койду."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Мүчүлүштүк тууралуу билдирүүнүн <xliff:g id="ID">#%d</xliff:g> чоо-жайы"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Файлдын аталышы"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Аталышы"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Кененирээк маалымат"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Мүчүлүштүктүн аталышы"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Мүчүлүштүктүн корутундусу"</string> + <string name="save" msgid="4781509040564835759">"Сактоо"</string> </resources> diff --git a/packages/Shell/res/values-lo-rLA/strings.xml b/packages/Shell/res/values-lo-rLA/strings.xml index 61b06c891a3a..43482502ea2b 100644 --- a/packages/Shell/res/values-lo-rLA/strings.xml +++ b/packages/Shell/res/values-lo-rLA/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ບໍ່ສາມາດຖ່າຍພາບໜ້າຈໍໄດ້."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ລາຍລະອຽດຂອງລາຍງານຂໍ້ຜິດພາດ <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ຊື່ໄຟລ໌"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"ຊື່"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"ຄຳອະທິບາຍແບບລະອຽດ"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"ຊື່ຂໍ້ຜິດພາດ"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"ສະຫຼຸບຂໍ້ຜິດພາດ"</string> + <string name="save" msgid="4781509040564835759">"ບັນທຶກ"</string> </resources> diff --git a/packages/Shell/res/values-lt/strings.xml b/packages/Shell/res/values-lt/strings.xml index 34182131f7a1..a714efc30f3e 100644 --- a/packages/Shell/res/values-lt/strings.xml +++ b/packages/Shell/res/values-lt/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Nepavyko padaryti ekrano kopijos."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Išsami informacija apie pranešimą apie riktą (<xliff:g id="ID">#%d</xliff:g>)"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Failo pavadinimas"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Pavadinimas"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Išsamus aprašas"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Rikto pavadinimas"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Rikto suvestinė"</string> + <string name="save" msgid="4781509040564835759">"Išsaugoti"</string> </resources> diff --git a/packages/Shell/res/values-lv/strings.xml b/packages/Shell/res/values-lv/strings.xml index 61087164b577..880d65195f24 100644 --- a/packages/Shell/res/values-lv/strings.xml +++ b/packages/Shell/res/values-lv/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Nevarēja veikt ekrānuzņēmumu."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Kļūdas pārskats <xliff:g id="ID">#%d</xliff:g>: detalizēta informācija"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Faila nosaukums"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Nosaukums"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detalizēts apraksts"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Kļūdas nosaukums"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Kļūdas kopsavilkums"</string> + <string name="save" msgid="4781509040564835759">"Saglabāt"</string> </resources> diff --git a/packages/Shell/res/values-mk-rMK/strings.xml b/packages/Shell/res/values-mk-rMK/strings.xml index 500196d10ff8..478c189ee4dd 100644 --- a/packages/Shell/res/values-mk-rMK/strings.xml +++ b/packages/Shell/res/values-mk-rMK/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Не може да се направи слика од екранот."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Детали за извештајот за грешки <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Име на датотека"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Наслов"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Детален опис"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Наслов на грешката"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Преглед на грешката"</string> + <string name="save" msgid="4781509040564835759">"Зачувај"</string> </resources> diff --git a/packages/Shell/res/values-ml-rIN/strings.xml b/packages/Shell/res/values-ml-rIN/strings.xml index 696aab2ca79c..70e63332a4d4 100644 --- a/packages/Shell/res/values-ml-rIN/strings.xml +++ b/packages/Shell/res/values-ml-rIN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"സ്ക്രീൻഷോട്ട് എടുക്കാൻ കഴിഞ്ഞില്ല."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ബഗ് റിപ്പോർട്ട് <xliff:g id="ID">#%d</xliff:g> വിശദാംശങ്ങൾ"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ഫയല്നാമം"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"പേര്"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"വിശദമായ വിവരണം"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"ബഗിന്റെ പേര്"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"ബഗ് സംഗ്രഹം"</string> + <string name="save" msgid="4781509040564835759">"സംരക്ഷിക്കുക"</string> </resources> diff --git a/packages/Shell/res/values-mn-rMN/strings.xml b/packages/Shell/res/values-mn-rMN/strings.xml index 62d83cb67d3c..49196a286a57 100644 --- a/packages/Shell/res/values-mn-rMN/strings.xml +++ b/packages/Shell/res/values-mn-rMN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Дэлгэцийн зураг авах боломжгүй."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Програмд гарсан алдааны мэдээллийн <xliff:g id="ID">#%d</xliff:g>-ны дэлгэрэнгүй"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Файлын нэр"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Гарчиг"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Дэлгэрэнгүй тайлбар"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Алдааны нэр"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Алдааны хураангуй"</string> + <string name="save" msgid="4781509040564835759">"Хадгалах"</string> </resources> diff --git a/packages/Shell/res/values-mr-rIN/strings.xml b/packages/Shell/res/values-mr-rIN/strings.xml index e6b2b045b950..19a8706d77e4 100644 --- a/packages/Shell/res/values-mr-rIN/strings.xml +++ b/packages/Shell/res/values-mr-rIN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"स्क्रीनशॉट घेणे शक्य झाले नाही."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"दोष अहवाल <xliff:g id="ID">#%d</xliff:g> तपशील"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"फाईलनाव"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"शीर्षक"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"तपशीलवार वर्णन"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"दोष शीर्षक"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"दोष सारांश"</string> + <string name="save" msgid="4781509040564835759">"जतन करा"</string> </resources> diff --git a/packages/Shell/res/values-ms-rMY/strings.xml b/packages/Shell/res/values-ms-rMY/strings.xml index 1d04253e9522..c9f53753325f 100644 --- a/packages/Shell/res/values-ms-rMY/strings.xml +++ b/packages/Shell/res/values-ms-rMY/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Tangkapan skrin tidak dapat diambil."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Butiran laporan pepijat <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nama fail"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Tajuk"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Perihalan terperinci"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Tajuk pepijat"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Ringkasan pepijat"</string> + <string name="save" msgid="4781509040564835759">"Simpan"</string> </resources> diff --git a/packages/Shell/res/values-my-rMM/strings.xml b/packages/Shell/res/values-my-rMM/strings.xml index f63c8c592dbe..4250edae8579 100644 --- a/packages/Shell/res/values-my-rMM/strings.xml +++ b/packages/Shell/res/values-my-rMM/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"မျက်နှာပြင် လျှပ်တစ်ပြက်ပုံ မရိုက်နိုင်ပါ"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ချွတ်ယွင်းမှုအစီရင်ခံချက် <xliff:g id="ID">#%d</xliff:g> အသေးစိတ်များ"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ဖိုင်အမည်"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"ခေါင်းစဉ်"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"အသေးစိတ် ဖော်ပြချက်"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"ချွတ်ယွင်းချက် ခေါင်းစဉ်"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"ချွတ်ယွင်းချက် အကျဉ်းချုပ်"</string> + <string name="save" msgid="4781509040564835759">"သိမ်းဆည်းပါ"</string> </resources> diff --git a/packages/Shell/res/values-nb/strings.xml b/packages/Shell/res/values-nb/strings.xml index 328e8aef4928..aa86ae4de5a5 100644 --- a/packages/Shell/res/values-nb/strings.xml +++ b/packages/Shell/res/values-nb/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Skjermdumpen kunne ikke tas."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detaljer om feilrapporten <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Filnavn"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Tittel"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljert beskrivelse"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Navn på feil"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Oppsummering av feil"</string> + <string name="save" msgid="4781509040564835759">"Lagre"</string> </resources> diff --git a/packages/Shell/res/values-ne-rNP/strings.xml b/packages/Shell/res/values-ne-rNP/strings.xml index 62bfeadef9ff..43c2a5ca37fc 100644 --- a/packages/Shell/res/values-ne-rNP/strings.xml +++ b/packages/Shell/res/values-ne-rNP/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"स्क्रिनशट लिन सकिएन।"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"बग रिपोर्ट <xliff:g id="ID">#%d</xliff:g>का विवरणहरू"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"फाइलको नाम"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"शीर्षक"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"विस्तृत विवरण"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"बगको शीर्षक"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"बगको सारांश"</string> + <string name="save" msgid="4781509040564835759">"सुरक्षित गर्नुहोस्"</string> </resources> diff --git a/packages/Shell/res/values-nl/strings.xml b/packages/Shell/res/values-nl/strings.xml index 2f4b215f7a76..01fd57700e62 100644 --- a/packages/Shell/res/values-nl/strings.xml +++ b/packages/Shell/res/values-nl/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot kan niet worden gemaakt."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Details van bugrapport <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Bestandsnaam"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titel"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Gedetailleerde beschrijving"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Titel van bug"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Overzicht van bug"</string> + <string name="save" msgid="4781509040564835759">"Opslaan"</string> </resources> diff --git a/packages/Shell/res/values-pa-rIN/strings.xml b/packages/Shell/res/values-pa-rIN/strings.xml index dc2277f58c79..34941999a1a5 100644 --- a/packages/Shell/res/values-pa-rIN/strings.xml +++ b/packages/Shell/res/values-pa-rIN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਨਹੀਂ ਲਿਆ ਜਾ ਸਕਿਆ।"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ਬੱਗ ਰਿਪੋਰਟ <xliff:g id="ID">#%d</xliff:g> ਵੇਰਵੇ"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ਫ਼ਾਈਲ ਨਾਮ"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"ਸਿਰਲੇਖ"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"ਵਿਸਥਾਰ ਸਹਿਤ ਵਰਣਨ"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"ਬੱਗ ਸਿਰਲੇਖ"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"ਬੱਗ ਸਾਰਾਂਸ਼"</string> + <string name="save" msgid="4781509040564835759">"ਰੱਖਿਅਤ ਕਰੋ"</string> </resources> diff --git a/packages/Shell/res/values-pl/strings.xml b/packages/Shell/res/values-pl/strings.xml index c58556803847..91934c9689fa 100644 --- a/packages/Shell/res/values-pl/strings.xml +++ b/packages/Shell/res/values-pl/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Nie udało się zrobić zrzutu ekranu."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Szczegóły raportu o błędzie <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nazwa pliku"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Tytuł"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Szczegółowy opis"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Tytuł raportu o błędzie"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Podsumowanie raportu o błędzie"</string> + <string name="save" msgid="4781509040564835759">"Zapisz"</string> </resources> diff --git a/packages/Shell/res/values-pt-rBR/strings.xml b/packages/Shell/res/values-pt-rBR/strings.xml index fc6e21c28cb0..41f4e249445b 100644 --- a/packages/Shell/res/values-pt-rBR/strings.xml +++ b/packages/Shell/res/values-pt-rBR/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Não foi possível fazer a captura de tela."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalhes do relatório de bugs <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome do arquivo"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descrição detalhada"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Título do bug"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Resumo do bug"</string> + <string name="save" msgid="4781509040564835759">"Salvar"</string> </resources> diff --git a/packages/Shell/res/values-pt-rPT/strings.xml b/packages/Shell/res/values-pt-rPT/strings.xml index 252edb180cd5..416db8086f09 100644 --- a/packages/Shell/res/values-pt-rPT/strings.xml +++ b/packages/Shell/res/values-pt-rPT/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Não foi possível tirar a captura de ecrã."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalhes do relatório de erro <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome do ficheiro"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descrição detalhada"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Título do erro"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Resumo de erros"</string> + <string name="save" msgid="4781509040564835759">"Guardar"</string> </resources> diff --git a/packages/Shell/res/values-pt/strings.xml b/packages/Shell/res/values-pt/strings.xml index fc6e21c28cb0..41f4e249445b 100644 --- a/packages/Shell/res/values-pt/strings.xml +++ b/packages/Shell/res/values-pt/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Não foi possível fazer a captura de tela."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalhes do relatório de bugs <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome do arquivo"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descrição detalhada"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Título do bug"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Resumo do bug"</string> + <string name="save" msgid="4781509040564835759">"Salvar"</string> </resources> diff --git a/packages/Shell/res/values-ro/strings.xml b/packages/Shell/res/values-ro/strings.xml index d720417788a9..4112e6071c79 100644 --- a/packages/Shell/res/values-ro/strings.xml +++ b/packages/Shell/res/values-ro/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Captura de ecran nu a putut fi făcută."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detaliile raportului de eroare <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Numele fișierului"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titlu"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Descriere detaliată"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Titlul erorii"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Rezumat privind eroarea"</string> + <string name="save" msgid="4781509040564835759">"Salvați"</string> </resources> diff --git a/packages/Shell/res/values-ru/strings.xml b/packages/Shell/res/values-ru/strings.xml index ed5ecafd09ee..ffd2e66349d9 100644 --- a/packages/Shell/res/values-ru/strings.xml +++ b/packages/Shell/res/values-ru/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Не удалось сделать скриншот"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Данные отчета об ошибке <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Название файла"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Название"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Подробное описание"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Название ошибки"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Описание ошибки"</string> + <string name="save" msgid="4781509040564835759">"Сохранить"</string> </resources> diff --git a/packages/Shell/res/values-si-rLK/strings.xml b/packages/Shell/res/values-si-rLK/strings.xml index cd8fba36e692..807ebb14ac62 100644 --- a/packages/Shell/res/values-si-rLK/strings.xml +++ b/packages/Shell/res/values-si-rLK/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"තිර රුවක් ගත නොහැකි විය."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"දෝෂ වාර්තා <xliff:g id="ID">#%d</xliff:g> විස්තර"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ගොනුවේ නම"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"මාතෘකාව"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"සවිස්තර විස්තරය"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"දෝෂ මාතෘකාව"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"දෝෂ සාරාංශය"</string> + <string name="save" msgid="4781509040564835759">"සුරකින්න"</string> </resources> diff --git a/packages/Shell/res/values-sk/strings.xml b/packages/Shell/res/values-sk/strings.xml index 23e67f5a1fab..a62a6eb23019 100644 --- a/packages/Shell/res/values-sk/strings.xml +++ b/packages/Shell/res/values-sk/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Snímku obrazovky sa nepodarilo zaznamenať."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Podrobnosti hlásenia chyby <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Názov súboru"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Názov"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Podrobný popis"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Názov chyby"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Súhrn chyby"</string> + <string name="save" msgid="4781509040564835759">"Uložiť"</string> </resources> diff --git a/packages/Shell/res/values-sl/strings.xml b/packages/Shell/res/values-sl/strings.xml index 519f3f22a721..6d1be5ad3b88 100644 --- a/packages/Shell/res/values-sl/strings.xml +++ b/packages/Shell/res/values-sl/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Posnetka zaslon ni bilo mogoče ustvariti."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Podrobnosti poročila o napaki <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Ime datoteke"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Naslov"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Podroben opis"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Naslov poročila o napakah"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Povzetek poročila o napakah"</string> + <string name="save" msgid="4781509040564835759">"Shrani"</string> </resources> diff --git a/packages/Shell/res/values-sq-rAL/strings.xml b/packages/Shell/res/values-sq-rAL/strings.xml index 5e3c70695900..ce990e949b45 100644 --- a/packages/Shell/res/values-sq-rAL/strings.xml +++ b/packages/Shell/res/values-sq-rAL/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Pamja e ekranit nuk mund të realizohej."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detajet e raportit të defekteve në kod <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Emri i skedarit"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Titulli"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Përshkrimi i detajuar"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Titulli i defektit në kod"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Përmbledhja e defekteve në kod"</string> + <string name="save" msgid="4781509040564835759">"Ruaj"</string> </resources> diff --git a/packages/Shell/res/values-sr/strings.xml b/packages/Shell/res/values-sr/strings.xml index 55119b633080..0157a252e2c9 100644 --- a/packages/Shell/res/values-sr/strings.xml +++ b/packages/Shell/res/values-sr/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Снимање екрана није успело."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Детаљи извештаја о грешци <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Назив датотеке"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Наслов"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Детаљни опис"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Наслов грешке"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Резиме грешке"</string> + <string name="save" msgid="4781509040564835759">"Сачувај"</string> </resources> diff --git a/packages/Shell/res/values-sv/strings.xml b/packages/Shell/res/values-sv/strings.xml index 085f57e72817..88af0db1836c 100644 --- a/packages/Shell/res/values-sv/strings.xml +++ b/packages/Shell/res/values-sv/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Det gick inte att ta skrämdump."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Information för felrapporten <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Filnamn"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Namn"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljerad beskrivning"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Felets titel"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Sammanfattning av felet"</string> + <string name="save" msgid="4781509040564835759">"Spara"</string> </resources> diff --git a/packages/Shell/res/values-sw/strings.xml b/packages/Shell/res/values-sw/strings.xml index c5a8ef1f6b5e..01df55ec63df 100644 --- a/packages/Shell/res/values-sw/strings.xml +++ b/packages/Shell/res/values-sw/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Haikupiga picha ya skrini."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Maelezo ya ripoti ya hitilafu ya <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Jina la faili"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Kichwa"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Maelezo ya kina"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Jina la hitilafu"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Muhtasari wa hitilafu"</string> + <string name="save" msgid="4781509040564835759">"Hifadhi"</string> </resources> diff --git a/packages/Shell/res/values-ta-rIN/strings.xml b/packages/Shell/res/values-ta-rIN/strings.xml index 7ef89e27cf03..8238d251edaa 100644 --- a/packages/Shell/res/values-ta-rIN/strings.xml +++ b/packages/Shell/res/values-ta-rIN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ஸ்கிரீன் ஷாட்டை எடுக்க முடியவில்லை."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"பிழை அறிக்கை <xliff:g id="ID">#%d</xliff:g> இன் விவரங்கள்"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"கோப்புப்பெயர்"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"தலைப்பு"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"விரிவான விளக்கம்"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"பிழைத் தலைப்பு"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"பிழை குறித்த சுருக்க விவரம்"</string> + <string name="save" msgid="4781509040564835759">"சேமி"</string> </resources> diff --git a/packages/Shell/res/values-te-rIN/strings.xml b/packages/Shell/res/values-te-rIN/strings.xml index 6ba816b19646..3ed1f9595360 100644 --- a/packages/Shell/res/values-te-rIN/strings.xml +++ b/packages/Shell/res/values-te-rIN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"స్క్రీన్షాట్ను తీయడం సాధ్యపడలేదు."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"బగ్ నివేదిక <xliff:g id="ID">#%d</xliff:g> వివరాలు"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ఫైల్ పేరు"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"శీర్షిక"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"సమగ్ర వివరణ"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"బగ్ శీర్షిక"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"బగ్ సారాంశం"</string> + <string name="save" msgid="4781509040564835759">"సేవ్ చేయి"</string> </resources> diff --git a/packages/Shell/res/values-th/strings.xml b/packages/Shell/res/values-th/strings.xml index d68ca2665718..f28bac6287d8 100644 --- a/packages/Shell/res/values-th/strings.xml +++ b/packages/Shell/res/values-th/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ไม่สามารถจับภาพหน้าจอได้"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"รายละเอียดรายงานข้อบกพร่อง <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ชื่อไฟล์"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"ชื่อ"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"คำอธิบายโดยละเอียด"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"ชื่อข้อบกพร่อง"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"สรุปข้อบกพร่อง"</string> + <string name="save" msgid="4781509040564835759">"บันทึก"</string> </resources> diff --git a/packages/Shell/res/values-tl/strings.xml b/packages/Shell/res/values-tl/strings.xml index 432eb9053806..d27040154f40 100644 --- a/packages/Shell/res/values-tl/strings.xml +++ b/packages/Shell/res/values-tl/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Hindi makunan ng screenshot."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Mga detalye ng ulat ng bug na <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Pamagat"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Detalyadong paglalarawan"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Pamagat ng bug"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Buod ng bug"</string> + <string name="save" msgid="4781509040564835759">"I-save"</string> </resources> diff --git a/packages/Shell/res/values-tr/strings.xml b/packages/Shell/res/values-tr/strings.xml index dae377f0b297..6da3490e1b5f 100644 --- a/packages/Shell/res/values-tr/strings.xml +++ b/packages/Shell/res/values-tr/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ekran görüntüsü alınamadı."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Hata raporu (<xliff:g id="ID">#%d</xliff:g>) ayrıntıları"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Dosya adı"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Başlık"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Ayrıntılı açıklama"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Hata başlığı"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Hata özeti"</string> + <string name="save" msgid="4781509040564835759">"Kaydet"</string> </resources> diff --git a/packages/Shell/res/values-uk/strings.xml b/packages/Shell/res/values-uk/strings.xml index 02eeb2f8a286..00a77938b840 100644 --- a/packages/Shell/res/values-uk/strings.xml +++ b/packages/Shell/res/values-uk/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Не вдалося зробити знімок екрана."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Деталі повідомлення про помилку <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Назва файлу"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Назва"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Детальний опис"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Назва помилки"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Опис помилки"</string> + <string name="save" msgid="4781509040564835759">"Зберегти"</string> </resources> diff --git a/packages/Shell/res/values-ur-rPK/strings.xml b/packages/Shell/res/values-ur-rPK/strings.xml index 23cada628b8c..abf6940934a4 100644 --- a/packages/Shell/res/values-ur-rPK/strings.xml +++ b/packages/Shell/res/values-ur-rPK/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"سکرین شاٹ نہیں لیا جا سکا۔"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"بگ رپورٹ <xliff:g id="ID">#%d</xliff:g> کی تفصیلات"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"فائل کا نام"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"عنوان"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"تفصیلی وضاحت"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"بَگ کا عنوان"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"بَگ کا خلاصہ"</string> + <string name="save" msgid="4781509040564835759">"محفوظ کریں"</string> </resources> diff --git a/packages/Shell/res/values-uz-rUZ/strings.xml b/packages/Shell/res/values-uz-rUZ/strings.xml index 39703a20bcf7..7782b420e7cc 100644 --- a/packages/Shell/res/values-uz-rUZ/strings.xml +++ b/packages/Shell/res/values-uz-rUZ/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Skrinshot olib bo‘lmadi."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Xatoliklar hisoboti (<xliff:g id="ID">#%d</xliff:g>) tafsilotlari"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Fayl nomi"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Nomi"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Batafsil ta’rif"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Xatolik nomi"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Xatolik ta’rifi"</string> + <string name="save" msgid="4781509040564835759">"Saqlash"</string> </resources> diff --git a/packages/Shell/res/values-vi/strings.xml b/packages/Shell/res/values-vi/strings.xml index 16ffaffdf1cb..27a9c7f6da3b 100644 --- a/packages/Shell/res/values-vi/strings.xml +++ b/packages/Shell/res/values-vi/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Không thể chụp ảnh màn hình."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Chi tiết báo cáo lỗi <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Tên tệp"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Tiêu đề"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Mô tả chi tiết"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Tiêu đề lỗi"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Tóm tắt lỗi"</string> + <string name="save" msgid="4781509040564835759">"Lưu"</string> </resources> diff --git a/packages/Shell/res/values-zh-rCN/strings.xml b/packages/Shell/res/values-zh-rCN/strings.xml index 382478eaf3e4..65cfbbcc51de 100644 --- a/packages/Shell/res/values-zh-rCN/strings.xml +++ b/packages/Shell/res/values-zh-rCN/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"无法截图。"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"错误报告 <xliff:g id="ID">#%d</xliff:g> 详情"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"文件名"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"标题"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"详细说明"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"错误标题"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"错误摘要"</string> + <string name="save" msgid="4781509040564835759">"保存"</string> </resources> diff --git a/packages/Shell/res/values-zh-rHK/strings.xml b/packages/Shell/res/values-zh-rHK/strings.xml index 04b5e4854de3..34a849e7610d 100644 --- a/packages/Shell/res/values-zh-rHK/strings.xml +++ b/packages/Shell/res/values-zh-rHK/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"無法擷取螢幕畫面。"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"錯誤報告 <xliff:g id="ID">#%d</xliff:g> 的詳情"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"檔案名稱"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"標題"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"詳細說明"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"錯誤標題"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"錯誤摘要"</string> + <string name="save" msgid="4781509040564835759">"儲存"</string> </resources> diff --git a/packages/Shell/res/values-zh-rTW/strings.xml b/packages/Shell/res/values-zh-rTW/strings.xml index 7a1ab77622a7..fff73bbc1471 100644 --- a/packages/Shell/res/values-zh-rTW/strings.xml +++ b/packages/Shell/res/values-zh-rTW/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"無法拍攝螢幕擷取畫面。"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"錯誤報告 <xliff:g id="ID">#%d</xliff:g> 的詳細資料"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"檔案名稱"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"標題"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"詳細說明"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"錯誤標題"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"錯誤摘要"</string> + <string name="save" msgid="4781509040564835759">"儲存"</string> </resources> diff --git a/packages/Shell/res/values-zu/strings.xml b/packages/Shell/res/values-zu/strings.xml index 29b7dd8329bc..868de3eefe8f 100644 --- a/packages/Shell/res/values-zu/strings.xml +++ b/packages/Shell/res/values-zu/strings.xml @@ -34,6 +34,7 @@ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Isithombe-skrini asikwazanga ukuthathwa."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Imininingwane yombiko wesiphazamisi ongu-<xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Igama lefayela"</string> - <string name="bugreport_info_title" msgid="5599558206004371052">"Isihloko"</string> - <string name="bugreport_info_description" msgid="4117088998733546784">"Incazelo enemininingwane"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Isihloko sesiphazamisi"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Isifinyezo sesiphazamisi"</string> + <string name="save" msgid="4781509040564835759">"Londoloza"</string> </resources> diff --git a/packages/Shell/res/values/strings.xml b/packages/Shell/res/values/strings.xml index c26b54978e1d..38ea8804a2d8 100644 --- a/packages/Shell/res/values/strings.xml +++ b/packages/Shell/res/values/strings.xml @@ -59,13 +59,16 @@ <!-- Title of the dialog asking for user-defined bug report details like name, title, and description. --> <string name="bugreport_info_dialog_title">Bug report <xliff:g id="id">#%d</xliff:g> details</string> - <!-- Text of the hint asking for the bug report name, which when set will define a suffix in the + <!-- Text of the label identifying the bug report name, which when set will define a suffix in the bug report file names. [CHAR LIMIT=30] --> <string name="bugreport_info_name">Filename</string> - <!-- Text of hint asking for the bug report title, which when set will define the + <!-- Text of the label identifying the bug report title, which when set will define the Subject of the email message. [CHAR LIMIT=60] --> - <string name="bugreport_info_title">Title</string> - <!-- Text of hint asking for the bug report description, which when set will describe + <string name="bugreport_info_title">Bug title</string> + <!-- Text of the label identifying the bug report description, which when set will describe what the bug report is about. [CHAR LIMIT=NONE] --> - <string name="bugreport_info_description">Detailed description</string> + <string name="bugreport_info_description">Bug summary</string> + + <!-- Label of button that save bugreport details. --> + <string name="save">Save</string> </resources> diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 36097a124ff9..0b5258895775 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -601,7 +601,8 @@ public class BugreportProgressService extends Service { // Most likely am killed Shell before user tapped the notification. Since system might // be too busy anwyays, it's better to ignore the notification and switch back to the // non-interactive mode (where the bugerport will be shared upon completion). - Log.d(TAG, "launchBugreportInfoDialog(" + id + "): cancel notification"); + Log.w(TAG, "launchBugreportInfoDialog(): canceling notification because id " + id + + " was not found"); // TODO: add test case to make sure notification is canceled. NotificationManager.from(mContext).cancel(TAG, id); return; @@ -627,7 +628,8 @@ public class BugreportProgressService extends Service { // Most likely am killed Shell before user tapped the notification. Since system might // be too busy anwyays, it's better to ignore the notification and switch back to the // non-interactive mode (where the bugerport will be shared upon completion). - Log.d(TAG, "takeScreenshot(" + id + ", " + delayed + "): cancel notification"); + Log.w(TAG, "takeScreenshot(): canceling notification because id " + id + + " was not found"); // TODO: add test case to make sure notification is canceled. NotificationManager.from(mContext).cancel(TAG, id); return; @@ -1268,6 +1270,9 @@ public class BugreportProgressService extends Service { if (hasFocus) { return; } + // Select-all is useful just initially, since the date-based filename is + // full of hyphens. + mInfoName.setSelectAllOnFocus(false); sanitizeName(); } }); @@ -1276,7 +1281,7 @@ public class BugreportProgressService extends Service { .setView(view) .setTitle(dialogTitle) .setCancelable(false) - .setPositiveButton(context.getString(com.android.internal.R.string.ok), + .setPositiveButton(context.getString(R.string.save), null) .setNegativeButton(context.getString(com.android.internal.R.string.cancel), new DialogInterface.OnClickListener() diff --git a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java index 814aa8cb8c06..49759c5f6ee1 100644 --- a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java +++ b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java @@ -56,7 +56,7 @@ public class BugreportStorageProvider extends DocumentsProvider { final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection)); final RowBuilder row = result.newRow(); row.add(Root.COLUMN_ROOT_ID, DOC_ID_ROOT); - row.add(Root.COLUMN_FLAGS, Root.FLAG_LOCAL_ONLY | Root.FLAG_ADVANCED); + row.add(Root.COLUMN_FLAGS, Root.FLAG_LOCAL_ONLY); row.add(Root.COLUMN_ICON, android.R.mipmap.sym_def_app_icon); row.add(Root.COLUMN_TITLE, getContext().getString(R.string.bugreport_storage_title)); row.add(Root.COLUMN_DOCUMENT_ID, DOC_ID_ROOT); diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java index d0499a5e3946..a629aac33d25 100644 --- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java +++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java @@ -400,8 +400,8 @@ public class BugreportReceiverTest extends InstrumentationTestCase { DetailsUi detailsUi = new DetailsUi(mUiBot, ID); detailsUi.assertName(NAME); - detailsUi.assertTitle(mContext.getString(R.string.bugreport_info_title)); - detailsUi.assertDescription(mContext.getString(R.string.bugreport_info_description)); + detailsUi.assertTitle(""); + detailsUi.assertDescription(""); detailsUi.nameField.setText(NEW_NAME); detailsUi.titleField.setText(TITLE); detailsUi.descField.setText(DESCRIPTION); @@ -415,8 +415,8 @@ public class BugreportReceiverTest extends InstrumentationTestCase { detailsUi = new DetailsUi(mUiBot, ID2); detailsUi.assertName(NAME2); - detailsUi.assertTitle(mContext.getString(R.string.bugreport_info_title)); - detailsUi.assertDescription(mContext.getString(R.string.bugreport_info_description)); + detailsUi.assertTitle(""); + detailsUi.assertDescription(""); detailsUi.nameField.setText(NEW_NAME2); detailsUi.titleField.setText(TITLE2); detailsUi.descField.setText(DESCRIPTION2); diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index c590ec7a97dd..b5b7bcd743d5 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -82,6 +82,7 @@ <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" /> <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" /> <uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS" /> + <uses-permission android:name="android.permission.GET_INTENT_SENDER_INTENT" /> <!-- WindowManager --> <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" /> diff --git a/packages/SystemUI/res/drawable/qs_btn_borderless_rect.xml b/packages/SystemUI/res/drawable/qs_btn_borderless_rect.xml new file mode 100644 index 000000000000..03bfd1a3ba6c --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_btn_borderless_rect.xml @@ -0,0 +1,32 @@ +<!-- + Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<inset + xmlns:android="http://schemas.android.com/apk/res/android" + android:insetTop="4dp" + android:insetBottom="4dp"> + <ripple + android:color="?android:attr/colorControlHighlight" > + + <item android:id="@android:id/mask"> + <shape> + <corners android:radius="@dimen/borderless_button_radius" /> + + <solid android:color="@android:color/white" /> + </shape> + </item> + + </ripple> +</inset> diff --git a/packages/SystemUI/res/drawable/qs_customizer_background.xml b/packages/SystemUI/res/drawable/qs_customizer_background.xml index 6bb27cc2a517..d90f820f5d4d 100644 --- a/packages/SystemUI/res/drawable/qs_customizer_background.xml +++ b/packages/SystemUI/res/drawable/qs_customizer_background.xml @@ -15,5 +15,5 @@ --> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/qs_detail_transition" /> - <item android:drawable="?android:attr/windowBackground" /> + <item android:drawable="@color/system_primary_color" /> </transition> diff --git a/packages/SystemUI/res/layout/notification_guts.xml b/packages/SystemUI/res/layout/notification_guts.xml index 62f2b479cde9..4b0c834d8415 100644 --- a/packages/SystemUI/res/layout/notification_guts.xml +++ b/packages/SystemUI/res/layout/notification_guts.xml @@ -39,7 +39,7 @@ android:layout_gravity="center_vertical|start"> <ImageView - android:id="@android:id/icon" + android:id="@+id/app_icon" android:layout_width="18dp" android:layout_height="18dp" android:layout_marginEnd="6dp" diff --git a/packages/SystemUI/res/layout/notification_settings_icon_row.xml b/packages/SystemUI/res/layout/notification_settings_icon_row.xml index 52d07fcc5cb7..f47083af4902 100644 --- a/packages/SystemUI/res/layout/notification_settings_icon_row.xml +++ b/packages/SystemUI/res/layout/notification_settings_icon_row.xml @@ -19,6 +19,7 @@ xmlns:systemui="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:visibility="invisible" > <com.android.systemui.statusbar.AlphaOptimizedImageView @@ -31,7 +32,6 @@ android:paddingBottom="@dimen/notification_gear_padding" android:src="@drawable/ic_settings" android:tint="@color/notification_gear_color" - android:visibility="invisible" android:alpha="0" android:background="?android:attr/selectableItemBackgroundBorderless" /> diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index 289b1d9db32c..656941f8b725 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -39,8 +39,9 @@ android:clipToPadding="false" android:clipChildren="false"> - <include - layout="@layout/qs_panel" + <com.android.systemui.DensityContainer + android:id="@+id/qs_density_container" + android:layout="@layout/qs_panel" android:layout_width="@dimen/notification_panel_width" android:layout_height="wrap_content" android:layout_gravity="@integer/notification_panel_layout_gravity" /> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 61d4f14c6068..30d9ed7ff201 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Meer tyd."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Minder tyd."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Flitslig af."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Flitslig is nie beskikbaar nie."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Flitslig aan."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Flitslig afgeskakel."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Flitslig aangeskakel."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Skakel Bluetooth aan?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Jy moet Bluetooth aanskakel om jou sleutelbord aan jou tablet te koppel."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Skakel aan"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Wys kennisgewings sonder klank"</string> + <string name="block" msgid="2734508760962682611">"Blokkeer alle kennisgewings"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Moenie stilmaak nie"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Moenie stilmaak of blokkeer nie"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Wys volledige belangrikheidinstellings"</string> <string name="blocked_importance" msgid="5198578988978234161">"Geblokkeer"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Onbelangrik"</string> <string name="low_importance" msgid="4109929986107147930">"Min belang"</string> <string name="default_importance" msgid="8192107689995742653">"Normale belang"</string> <string name="high_importance" msgid="1527066195614050263">"Groot belang"</string> <string name="max_importance" msgid="5089005872719563894">"Dringende belang"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Moet nooit hierdie kennisgewings wys nie"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Wys sonder klank aan die onderkant van die kennisgewinglys"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Wys hierdie kennisgewings sonder klank"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Laat hierdie kennisgewing toe om geluide te maak"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Verskyn vlugtig op die skerm en laat klank toe"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Wys boaan die kennisgewingslys, verskyn vlugtig op die skerm en laat klank toe"</string> <string name="notification_more_settings" msgid="816306283396553571">"Meer instellings"</string> <string name="notification_done" msgid="5279426047273930175">"Klaar"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Kleur en voorkoms"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Wys persentasie wanneer gelaai word (verstek)"</item> <item msgid="3327323682209964956">"Moenie hierdie ikoon wys nie"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Ander"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Skermverdeler"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Skuif af"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Skuif op"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 6d70c8a1a8ec..9692ae8a73db 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"ተጨማሪ ጊዜ።"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"ያነሰ ጊዜ።"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"የባትሪ ብርሃን ጠፍቷል።"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"የባትሪ ብርሃን አይገኝም።"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"የባትሪ ብርሃን በርቷል።"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"የባትሪ ብርሃን ጠፍቷል።"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"የባትሪ ብርሃን በርቷል።"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"ብሉቱዝ ይብራ?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"የቁልፍ ሰሌዳዎን ከእርስዎ ጡባዊ ጋር ለማገናኘት በመጀመሪያ ብሉቱዝን ማብራት አለብዎት።"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"አብራ"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"ማሳወቂያዎችን በጸጥታ አሳይ"</string> + <string name="block" msgid="2734508760962682611">"ሁሉንም ማሳወቂያዎች አግድ"</string> + <string name="do_not_silence" msgid="6878060322594892441">"ድምፅ አትዝጋ"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"ድምፅ አትዝጋ ወይም አታግድ"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"ሙሉ የአስፈላጊነት ቅንብሮችን አሳይ"</string> <string name="blocked_importance" msgid="5198578988978234161">"የታገዱ"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"አነስተኛ አስፈላጊነት"</string> <string name="low_importance" msgid="4109929986107147930">"ዝቅተኛ አስፈላጊነት"</string> <string name="default_importance" msgid="8192107689995742653">"መደበኛ አስፈላጊነት"</string> <string name="high_importance" msgid="1527066195614050263">"ከፍተኛ አስፈላጊነት"</string> <string name="max_importance" msgid="5089005872719563894">"አስቸኳይ አስፈላጊነት"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"እነዚህን ማሳወቂያዎች በጭራሽ አታሳይ"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"በማሳወቂያ ዝርዝሩ ታችኛውን ክፍል ላይ በጸጥታ አሳይ"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"እነዚህን ማሳወቂያዎች በጸጥታ አሳይ"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"እነዚህ ማሳወቂያዎች ድምፆችን እንዲፈጥሩ ፍቀድ"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"ወደ ማያ ገጹ አስገባና ድምፅ ፍቀድ"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"በማሳወቂያዎች ዝርዝር አናት ላይ አሳይ፣ ወደ ማያ ገጹ አሳይና ድምፅ ፍቀድ"</string> <string name="notification_more_settings" msgid="816306283396553571">"ተጨማሪ ቅንብሮች"</string> <string name="notification_done" msgid="5279426047273930175">"ተከናውኗል"</string> <string name="color_and_appearance" msgid="1254323855964993144">"ቀለም እና መልክ"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"የባትሪ ኃይል በሚሞላበት ጊዜ መቶኛ አሳይ (ነባሪ)"</item> <item msgid="3327323682209964956">"ይህን አዶ አታሳይ"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"ሌላ"</string> <string name="accessibility_divider" msgid="5903423481953635044">"የተከፈለ የማያ ገጽ ከፋይ"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"ወደ ታች ሂድ"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"ወደ ላይ ሂድ"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 2e4724b1a4c7..3edc8057a9f4 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -208,8 +208,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Više vremena."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Manje vremena."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Baterijska lampa je isključena."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lampa nije dostupna."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Baterijska lampa je uključena."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Baterijska lampa je isključena."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Baterijska lampa je uključena."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Želite li da uključite Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Da biste povezali tastaturu sa tabletom, prvo morate da uključite Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Uključi"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Prikazuj obaveštenja bez zvuka"</string> + <string name="block" msgid="2734508760962682611">"Blokiraj sva obaveštenja"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ne isključuj zvuk"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Ne isključuju zvuk niti blokiraj"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Prikaži kompletna podešavanja važnosti"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blokirana"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Veoma mala važnost"</string> <string name="low_importance" msgid="4109929986107147930">"Mala važnost"</string> <string name="default_importance" msgid="8192107689995742653">"Uobičajena važnost"</string> <string name="high_importance" msgid="1527066195614050263">"Velika važnost"</string> <string name="max_importance" msgid="5089005872719563894">"Važnost: hitno"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Ova obaveštenja se nikada ne prikazuju"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Prikazuju se u dnu liste obaveštenja bez zvuka"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Ova obaveštenja se prikazuju bez zvuka"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Dozvolite da ova obaveštenja emituju zvuk"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Nakratko se prikazuju na ekranu i emituju zvuk"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Prikazuju se u vrhu liste obaveštenja, nakratko se prikazuju na ekranu i emituju zvuk"</string> <string name="notification_more_settings" msgid="816306283396553571">"Još podešavanja"</string> <string name="notification_done" msgid="5279426047273930175">"Gotovo"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Boja i izgled"</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Prikaži procenat tokom punjenja (podrazumevano)"</item> <item msgid="3327323682209964956">"Ne prikazuj ovu ikonu"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Drugo"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Razdelnik podeljenog ekrana"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Pomeri nadole"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Pomeri nagore"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index c97a6a52b288..84757b7f36cf 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Повече време."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"По-малко време."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Фенерчето е изключено."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Няма достъп до фенерчето."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Фенерчето е включено."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Фенерчето е изключено."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Фенерчето е включено."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Да се включи ли Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"За да свържете клавиатурата с таблета си, първо трябва да включите Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Включване"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Показване на известията без звуков сигнал"</string> + <string name="block" msgid="2734508760962682611">"Блокиране на всички известия"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Без заглушаване на звуковите сигнали"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Без заглушаване на звуковите сигнали или блокиране"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Показване на пълните настройки за важността"</string> <string name="blocked_importance" msgid="5198578988978234161">"Блокирано"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Минимална важност"</string> <string name="low_importance" msgid="4109929986107147930">"Малка важност"</string> <string name="default_importance" msgid="8192107689995742653">"Нормална важност"</string> <string name="high_importance" msgid="1527066195614050263">"Голяма важност"</string> <string name="max_importance" msgid="5089005872719563894">"Неотложна важност"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Тези известия не се показват"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Показване без звуков сигнал най-долу в списъка с известия"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Показване на тези известия без звуков сигнал"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Разрешаване при тези известия да се издава звуков сигнал"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Показване на екрана и разрешаване на звуков сигнал"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Показване най-горе в списъка с известия, както и на екрана и разрешаване на звуков сигнал"</string> <string name="notification_more_settings" msgid="816306283396553571">"Още настройки"</string> <string name="notification_done" msgid="5279426047273930175">"Готово"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Цвят и облик"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Процентът да се показва при зареждане (по подразбиране)"</item> <item msgid="3327323682209964956">"Тази икона да не се показва"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Друго"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Разделител в режима за разделен екран"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Преместване надолу"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Преместване нагоре"</string> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index f59f3cab2567..18f37e6321de 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -548,6 +548,6 @@ <string name="accessibility_divider" msgid="5903423481953635044">"বিভক্ত-স্ক্রীন বিভাজক"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"নীচে সরান"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"উপরে সরান"</string> - <string name="accessibility_action_divider_move_left" msgid="9218189832115847253">"বামে সরান"</string> + <string name="accessibility_action_divider_move_left" msgid="9218189832115847253">"বাঁয়ে সরান"</string> <string name="accessibility_action_divider_move_right" msgid="4671522715182567972">"ডানে সরান"</string> </resources> diff --git a/packages/SystemUI/res/values-bs-rBA/strings.xml b/packages/SystemUI/res/values-bs-rBA/strings.xml index 865b1adc1f4e..5666c5f0fb87 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings.xml @@ -208,8 +208,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Više vremena."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Manje vremena."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Svjetiljka isključena."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Svjetiljka nije dostupna."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Svjetiljka uključena."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Svjetiljka je isključena."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Svjetiljka je uključena."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Želiti li uključiti Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Da povežete tastaturu sa tabletom, prvo morate uključiti Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Uključi"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Nečujno pokaži obavijesti"</string> + <string name="block" msgid="2734508760962682611">"Blokiraj sva obavještenja"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Nemoj utišati"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Nemoj utišati ili blokirati"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Pokaži kompletne postavke za određivanje značaja"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blokirano"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Minimalni značaj"</string> <string name="low_importance" msgid="4109929986107147930">"Mali značaj"</string> <string name="default_importance" msgid="8192107689995742653">"Normalan značaj"</string> <string name="high_importance" msgid="1527066195614050263">"Visok značaj"</string> <string name="max_importance" msgid="5089005872719563894">"Hitan značaj"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Nikada ne prikazuj ova obavještenja"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Nečujno pokaži na dnu spiska obavještenja"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Nečujno prikaži ova obavještenja"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Dozvolite zvuk na ovim obavještenjima"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Kratko prikaži na ekranu i dozvoli zvuk i dozvoli zvuk"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Pokaži na vrhu liste obaveštenja, kratko prikaži na ekranu i dozvoli zvuk"</string> <string name="notification_more_settings" msgid="816306283396553571">"Više postavki"</string> <string name="notification_done" msgid="5279426047273930175">"Gotovo"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Boja i izgled"</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Pokaži postotak u toku punjenja (zadano)"</item> <item msgid="3327323682209964956">"Ne prikazuj ovu ikonu"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Ostalo"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Razdjelnik ekrana"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Pomjeri dolje"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Pomjeri gore"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 3243f7423f71..3747be0064c5 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Més temps"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Menys temps"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Llanterna desactivada"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"La llanterna no està disponible."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Llanterna activada"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Llanterna desactivada."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Llanterna activada."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vols activar el Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Per connectar el teclat amb la tauleta, primer has d\'activar el Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Activa"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Mostra les notificacions de manera silenciosa"</string> + <string name="block" msgid="2734508760962682611">"Bloqueja totes les notificacions"</string> + <string name="do_not_silence" msgid="6878060322594892441">"No silenciïs"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"No silenciïs ni bloquegis"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Mostra la configuració de la importància completa"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloquejades"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importància mínima"</string> <string name="low_importance" msgid="4109929986107147930">"Importància baixa"</string> <string name="default_importance" msgid="8192107689995742653">"Importància normal"</string> <string name="high_importance" msgid="1527066195614050263">"Importància alta"</string> <string name="max_importance" msgid="5089005872719563894">"Importància urgent"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"No mostris mai aquestes notificacions"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Les notificacions es mostren de manera silenciosa al capdavall de la llista"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Mostra aquestes notificacions de manera silenciosa"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Permet que aquestes notificacions emetin sons"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Les notificacions apareixen a la pantalla i poden emetre sons"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Les notificacions es mostren al capdamunt de la llista, apareixen a la pantalla i poden emetre sons"</string> <string name="notification_more_settings" msgid="816306283396553571">"Més opcions"</string> <string name="notification_done" msgid="5279426047273930175">"Fet"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Color i aparença"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Mostra el percentatge quan es carregui (opció predeterminada)"</item> <item msgid="3327323682209964956">"No mostris aquesta icona"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Altres"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Divisor de pantalles"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Mou avall"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Mou amunt"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index b5b40373803f..48c9c550c307 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -209,8 +209,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Delší doba"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kratší doba"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Svítilna je vypnutá."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Svítilna není k dispozici."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Svítilna je zapnutá."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Svítilna je vypnutá."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Svítilna je zapnutá."</string> @@ -458,34 +457,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Zapnout Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Chcete-li klávesnici připojit k tabletu, nejdříve musíte zapnout Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Zapnout"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Zobrazovat oznámení tiše"</string> + <string name="block" msgid="2734508760962682611">"Blokovat všechna oznámení"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Bez ztlumení"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Bez ztlumení a blokování"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Zobrazit všechna nastavení důležitosti"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blokováno"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Minimální důležitost"</string> <string name="low_importance" msgid="4109929986107147930">"Nízká důležitost"</string> <string name="default_importance" msgid="8192107689995742653">"Normální důležitost"</string> <string name="high_importance" msgid="1527066195614050263">"Vysoká důležitost"</string> <string name="max_importance" msgid="5089005872719563894">"Urgentní důležitost"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Tato oznámení nikdy nezobrazovat"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Tato oznámení zobrazovat na konci seznamu bez zvukového upozornění"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Tato oznámení zobrazovat bez zvukového upozornění"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Povolit těmto oznámením vydávat zvuky"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Tato oznámení zobrazovat přímo na obrazovce a upozornit na ně zvukem"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Tato oznámení zobrazovat na začátku seznamu, zobrazit přímo na obrazovce a upozornit na ně zvukem"</string> <string name="notification_more_settings" msgid="816306283396553571">"Další nastavení"</string> <string name="notification_done" msgid="5279426047273930175">"Hotovo"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Barva a vzhled"</string> @@ -558,8 +546,7 @@ <item msgid="2139628951880142927">"Zobrazovat procento při nabíjení (výchozí nastavení)"</item> <item msgid="3327323682209964956">"Tuto ikonu nezobrazovat"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Jiné"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Čára rozdělující obrazovku"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Přesunout dolů"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Přesunout nahoru"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index f4987d7f4852..50d01ea58938 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mere tid."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Mindre tid."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lommelygten er slået fra."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lommelygten er ikke tilgængelig."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lommelygten er slået til."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Lommelygten er slået fra."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Lommelygten er slået til."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vil du slå Bluetooth til?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Bluetooth skal være slået til, før du kan knytte dit tastatur til din tablet."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Slå til"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Vis underretninger lydløst"</string> + <string name="block" msgid="2734508760962682611">"Bloker alle underretninger"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Skal ikke sættes på lydløs"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Skal ikke sættes på lydløs eller blokeres"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Vis alle indstillinger for vigtighed"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blokeret"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Min vigtighed"</string> <string name="low_importance" msgid="4109929986107147930">"Lille vigtighed"</string> <string name="default_importance" msgid="8192107689995742653">"Normal vigtighed"</string> <string name="high_importance" msgid="1527066195614050263">"Stor vigtighed"</string> <string name="max_importance" msgid="5089005872719563894">"Presserende vigtighed"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Vis aldrig disse underretninger"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Vis lydløst nederst på listen over underretninger"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Vis disse underretninger lydløst"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Giv disse underretninger tilladelse til at give lyd"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Vis på skærmen, og tillad lyd"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Vis øverst på listen over underretninger, vis på skærmen, og tillad lyd"</string> <string name="notification_more_settings" msgid="816306283396553571">"Flere indstillinger"</string> <string name="notification_done" msgid="5279426047273930175">"Færdig"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Farve og udseende"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Vis procent ved opladning (standard)"</item> <item msgid="3327323682209964956">"Vis ikke dette ikon"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Andet"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Adskiller til delt skærm"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Flyt ned"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Flyt op"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index ac0adbb4259b..fd8cf89e1132 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mehr Zeit"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Weniger Zeit"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Taschenlampe deaktiviert"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Taschenlampe nicht verfügbar."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Taschenlampe aktiviert"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Die Taschenlampe ist deaktiviert."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Die Taschenlampe ist aktiviert."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth aktivieren?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Zum Verbinden von Tastatur und Tablet muss Bluetooth aktiviert sein."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Aktivieren"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Benachrichtigungen ohne Ton anzeigen"</string> + <string name="block" msgid="2734508760962682611">"Alle Benachrichtigungen blockieren"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Nicht stummschalten"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Nicht stummschalten oder blockieren"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Vollständige Wichtigkeitseinstellungen anzeigen"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blockiert"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Minimum-Wichtigkeit"</string> <string name="low_importance" msgid="4109929986107147930">"Geringe Wichtigkeit"</string> <string name="default_importance" msgid="8192107689995742653">"Reguläre Wichtigkeit"</string> <string name="high_importance" msgid="1527066195614050263">"Hohe Wichtigkeit"</string> <string name="max_importance" msgid="5089005872719563894">"Sehr hohe Wichtigkeit"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Diese Benachrichtigungen niemals anzeigen"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Ohne Ton am Ende der Benachrichtigungsliste anzeigen"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Diese Benachrichtigungen ohne Ton anzeigen"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Für diese Benachrichtigungen Ton zulassen"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Auf dem Display einblenden und Ton zulassen"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Ganz oben in der Benachrichtigungsliste anzeigen, auf dem Display einblenden und Ton zulassen"</string> <string name="notification_more_settings" msgid="816306283396553571">"Weitere Einstellungen"</string> <string name="notification_done" msgid="5279426047273930175">"Fertig"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Farbe und Darstellung"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Prozentwert beim Laden anzeigen (Standardeinstellung)"</item> <item msgid="3327323682209964956">"Dieses Symbol nicht anzeigen"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Sonstiges"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Bildschirmteiler"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Nach unten verschieben"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Nach oben verschieben"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 754c92e240c9..b5f55d9a0912 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Περισσότερη ώρα."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Λιγότερη ώρα."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Ανενεργός φακός."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Ο φακός δεν είναι διαθέσιμος."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Ενεργός φακός."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Ο φακός απενεργοποιήθηκε."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Ο φακός ενεργοποιήθηκε."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Ενεργοποίηση Bluetooth;"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Για να συνδέσετε το πληκτρολόγιο με το tablet σας, θα πρέπει πρώτα να ενεργοποιήσετε το Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Ενεργοποίηση"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Εμφάνιση ειδοποιήσεων χωρίς ήχο"</string> + <string name="block" msgid="2734508760962682611">"Αποκλεισμός όλων των ειδοποιήσεων"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Χωρίς σίγαση"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Χωρίς σίγαση ή αποκλεισμό"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Εμφάνιση όλων των ρυθμίσεων βαρύτητας"</string> <string name="blocked_importance" msgid="5198578988978234161">"Αποκλεισμένες"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Ελάχιστη βαρύτητα"</string> <string name="low_importance" msgid="4109929986107147930">"Μικρής βαρύτητας"</string> <string name="default_importance" msgid="8192107689995742653">"Κανονικής βαρύτητας"</string> <string name="high_importance" msgid="1527066195614050263">"Μεγάλης βαρύτητας"</string> <string name="max_importance" msgid="5089005872719563894">"Επείγουσες"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Να μην εμφανίζονται ποτέ αυτές οι ειδοποιήσεις"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Να εμφανίζονται στο κάτω μέρος της λίστας ειδοποιήσεων χωρίς ήχο"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Να εμφανίζονται αυτές οι ειδοποιήσεις χωρίς ήχο"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Να επιτρέπονται οι ήχοι από αυτές τις ειδοποιήσεις"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Να προβάλλονται στην οθόνη και να επιτρέπεται ο ήχος"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Να εμφανίζονται στην κορυφή της λίστας ειδοποιήσεων, να προβάλλονται στην οθόνη και να επιτρέπεται ο ήχος"</string> <string name="notification_more_settings" msgid="816306283396553571">"Περισσότερες ρυθμίσεις"</string> <string name="notification_done" msgid="5279426047273930175">"Τέλος"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Χρώμα και εμφάνιση"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Να εμφανίζεται ποσοστό κατά τη φόρτιση (προεπιλογή)"</item> <item msgid="3327323682209964956">"Να μην εμφανίζεται αυτό το εικονίδιο"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Άλλο"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Διαχωριστικό οθόνης"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Μετακίνηση προς τα κάτω"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Μετακίνηση προς τα επάνω"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index f3c21df871ae..856c1c15f965 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Más tiempo"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Menos tiempo"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Linterna desactivada"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"La linterna no está disponible."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Linterna activada"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Linterna desactivada"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Linterna activada"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"¿Activar Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para conectar el teclado con la tablet, primero debes activar Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Activar"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Mostrar notificaciones de manera silenciosa"</string> + <string name="block" msgid="2734508760962682611">"Bloquear todas las notificaciones"</string> + <string name="do_not_silence" msgid="6878060322594892441">"No silenciar"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"No silenciar ni bloquear"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Mostrar configuración de importancia"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloqueada"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importancia mínima"</string> <string name="low_importance" msgid="4109929986107147930">"Poca importancia"</string> <string name="default_importance" msgid="8192107689995742653">"Importancia normal"</string> <string name="high_importance" msgid="1527066195614050263">"Importancia alta"</string> <string name="max_importance" msgid="5089005872719563894">"Urgente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"No mostrar nunca estas notificaciones"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Mostrar en la parte inferior de la lista de notificaciones sin emitir sonido"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Mostrar estas notificaciones de manera silenciosa"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Permitir que estas notificaciones emitan sonidos"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Ver en la pantalla y permitir sonidos"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Mostrar en la parte superior de la lista de notificaciones, ver en la pantalla y permitir sonidos"</string> <string name="notification_more_settings" msgid="816306283396553571">"Más opciones de configuración"</string> <string name="notification_done" msgid="5279426047273930175">"Listo"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Color y apariencia"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Mostrar el porcentaje durante la carga (predeterminado)"</item> <item msgid="3327323682209964956">"No mostrar este ícono"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Otros"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Divisor de pantalla dividida"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Mover hacia abajo"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Mover hacia arriba"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index bd9cc000e948..b3eda73b16c6 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Más tiempo."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Menos tiempo."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Linterna desactivada."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"La linterna no está disponible."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Linterna activada."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Linterna desactivada."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Linterna activada."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"¿Activar Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para poder conectar tu teclado a tu tablet, debes activar el Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Activar"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Mostrar notificaciones de forma silenciosa"</string> + <string name="block" msgid="2734508760962682611">"Bloquear todas las notificaciones"</string> + <string name="do_not_silence" msgid="6878060322594892441">"No silenciar"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"No silenciar ni bloquear"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Mostrar ajustes de importancia por completo"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloqueado"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importancia mínima"</string> <string name="low_importance" msgid="4109929986107147930">"Poco importante"</string> <string name="default_importance" msgid="8192107689995742653">"Importancia normal"</string> <string name="high_importance" msgid="1527066195614050263">"Muy importante"</string> <string name="max_importance" msgid="5089005872719563894">"Urgente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"No mostrar estas notificaciones"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Mostrar en la parte inferior de la lista de notificaciones de forma silenciosa"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Mostrar estas notificaciones de forma silenciosa"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Permitir que estas notificaciones reproduzcan sonidos"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Mostrar en la pantalla y permitir sonido"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Mostrar en la parte superior de la lista de notificaciones, mostrar en la pantalla y permitir sonido"</string> <string name="notification_more_settings" msgid="816306283396553571">"Más ajustes"</string> <string name="notification_done" msgid="5279426047273930175">"Listo"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Color y aspecto"</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Mostrar porcentaje durante la carga (predeterminado)"</item> <item msgid="3327323682209964956">"No mostrar este icono"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Otros"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Dividir la pantalla"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Bajar"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Subir"</string> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index a245bf7d3b75..3f8e844a0777 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Denbora gehiago."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Denbora gutxiago."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Flasha desaktibatuta dago."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Linterna ez dago erabilgarri."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Flasha aktibatuta dago."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Flasha desaktibatu egin da."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Flasha aktibatu egin da."</string> @@ -309,9 +308,9 @@ <string name="recents_history_clear_all_button_label" msgid="5905258334958006953">"Garbitu"</string> <string name="recents_drag_non_dockable_task_message" msgid="2935843902795166158">"Aplikazioak ez du onartzen leiho bat baino gehiago erabiltzea"</string> <string name="recents_launch_non_dockable_task_label" msgid="7862379814938391888">"Aplikazioak ez du onartzen leiho bat baino gehiago erabiltzea"</string> - <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Banaketa horizontala"</string> - <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Banaketa bertikala"</string> - <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Banaketa pertsonalizatua"</string> + <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Zatitze horizontala"</string> + <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Zatitze bertikala"</string> + <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Zatitze pertsonalizatua"</string> <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kargatuta"</string> <string name="expanded_header_battery_charging" msgid="205623198487189724">"Kargatzen"</string> <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> falta zaizkio guztiz kargatzeko"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth eginbidea aktibatu nahi duzu?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Teklatua tabletara konektatzeko, Bluetooth eginbidea aktibatu behar duzu."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Aktibatu"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Erakutsi jakinarazpenak soinurik egin gabe"</string> + <string name="block" msgid="2734508760962682611">"Blokeatu jakinarazpen guztiak"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ez isilarazi"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Ez isilarazi edo blokeatu"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Erakutsi garrantzia handiko jakinarazpenen ezarpenak"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blokeatuta"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Gutxieneko garrantzia"</string> <string name="low_importance" msgid="4109929986107147930">"Garrantzi txikia"</string> <string name="default_importance" msgid="8192107689995742653">"Garrantzi normala"</string> <string name="high_importance" msgid="1527066195614050263">"Garrantzi handia"</string> <string name="max_importance" msgid="5089005872719563894">"Premiazkoa"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Ez erakutsi jakinarazpen hauek inoiz"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Erakutsi jakinarazpen hauek zerrendaren behealdean, baina soinurik egin gabe"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Erakutsi jakinarazpen hauek, baina soinurik egin gabe"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Egin soinua jakinarazpen hauek jasotzean"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Agerrarazi jakinarazpen hauek pantailan eta egin soinua"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Erakutsi jakinarazpen hauek zerrendaren goialdean, agerrarazi pantailan eta egin soinua"</string> <string name="notification_more_settings" msgid="816306283396553571">"Ezarpen gehiago"</string> <string name="notification_done" msgid="5279426047273930175">"Eginda"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Kolorea eta itxura"</string> @@ -497,7 +485,7 @@ <string name="use_dark_theme" msgid="2900938704964299312">"Erabili gai iluna Android sistema eragilean"</string> <string name="adjust_tint" msgid="3398569573231409878">"Doitu kolorea"</string> <string name="adjust_brightness" msgid="980039329808178246">"Doitu distira"</string> - <string name="night_mode_disclaimer" msgid="598914896926759578">"Gai iluna Android sistema eragileko eremu nagusietan aplikatzen da. Normalean gai argian bistaratzen dira eremu horiek, adibidez, Ezarpenak atala."</string> + <string name="night_mode_disclaimer" msgid="598914896926759578">"Gai iluna Android sistema eragileko eremu nagusietan aplikatzen da. Normalean gai argian bistaratzen dira eremu horiek, adibidez, Ezarpenak atalean."</string> <string name="color_apply" msgid="9212602012641034283">"Aplikatu"</string> <string name="color_revert_title" msgid="4746666545480534663">"Berretsi ezarpenak"</string> <string name="color_revert_message" msgid="9116001069397996691">"Baliteke gailua kolore-ezarpen batzuekin ezin erabili izatea. Kolore-ezarpenak berresteko, sakatu Ados. Bestela, hamar segundoren buruan berrezarriko dira ezarpenak."</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Erakutsi ehunekoa kargatu bitartean (balio lehenetsia)"</item> <item msgid="3327323682209964956">"Ez erakutsi ikonoa"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Beste bat"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Pantaila-zatitzailea"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Eraman behera"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Eraman gora"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 22431916583b..8b3fb5ea7675 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Lisää aikaa."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Vähennä aikaa."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Taskulamppu on pois päältä."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Taskulamppu ei ole käytettävissä."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Taskulamppu on päällä."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Taskulamppu poistettiin käytöstä."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Taskulamppu otettiin käyttöön."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Otetaanko Bluetooth käyttöön?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Jotta voit yhdistää näppäimistön tablettiisi, sinun on ensin otettava Bluetooth käyttöön."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Ota käyttöön"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Näytä ilmoitukset hiljennettyinä"</string> + <string name="block" msgid="2734508760962682611">"Estä kaikki ilmoitukset"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Älä hiljennä"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Älä hiljennä tai estä"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Näytä kaikki tärkeysasetukset"</string> <string name="blocked_importance" msgid="5198578988978234161">"Estetyt"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Pienin tärkeys"</string> <string name="low_importance" msgid="4109929986107147930">"Ei kovin tärkeä"</string> <string name="default_importance" msgid="8192107689995742653">"Tärkeä"</string> <string name="high_importance" msgid="1527066195614050263">"Hyvin tärkeä"</string> <string name="max_importance" msgid="5089005872719563894">"Kiireellinen"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Älä koskaan näytä näitä ilmoituksia"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Hiljennä ilmoitukset ja näytä ne ilmoitusluettelon alaosassa."</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Näytä nämä ilmoitukset hiljennettyinä."</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Salli näiden ilmoitusten äänet."</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Näytä ilmoitukset näytöllä ja salli niiden äänet."</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Näytä ilmoitukset näytöllä ja ilmoitusluettelon yläosassa ja salli niiden äänet."</string> <string name="notification_more_settings" msgid="816306283396553571">"Lisäasetukset"</string> <string name="notification_done" msgid="5279426047273930175">"Valmis"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Väri ja ulkoasu"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Näytä prosenttiluku latauksen aikana (oletus)"</item> <item msgid="3327323682209964956">"Älä näytä tätä kuvaketta"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Muu"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Näytön jakaja"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Siirrä alaspäin"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Siirrä ylöspäin"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index b957dbaa694d..e0beecaa60d3 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Plus longtemps"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Moins longtemps."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lampe de poche désactivée."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lampe de poche indisponible."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lampe de poche activée."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Lampe de poche désactivée."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Lampe de poche activée."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Activer Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Pour connecter votre clavier à votre tablette, vous devez d\'abord activer la connectivité Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Activer"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Afficher les notifications en mode silencieux"</string> + <string name="block" msgid="2734508760962682611">"Bloquer toutes les notifications"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ne pas activer le mode silencieux"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Ne pas activer le mode silencieux ni bloquer"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Afficher les paramètres d\'importance complets"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloquée"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importance minimale"</string> <string name="low_importance" msgid="4109929986107147930">"Importance faible"</string> <string name="default_importance" msgid="8192107689995742653">"Importance normale"</string> <string name="high_importance" msgid="1527066195614050263">"Importance élevée"</string> <string name="max_importance" msgid="5089005872719563894">"Importance urgente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Ne jamais afficher ces notifications"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Afficher en mode silencieux au bas de la liste de notifications"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Afficher ces notifications en mode silencieux"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Autoriser ces notifications à émettre des sons"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Afficher sur l\'écran et émettre un son"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Afficher en haut de la liste des notifications, afficher sur l\'écran et émettre un son"</string> <string name="notification_more_settings" msgid="816306283396553571">"Plus de paramètres"</string> <string name="notification_done" msgid="5279426047273930175">"Terminé"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Couleur et apparence"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Montrer le pourcentage durant la charge (par défaut)"</item> <item msgid="3327323682209964956">"Ne pas afficher cette icône"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Autre"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Séparateur d\'écran partagé"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Déplacer vers le bas"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Déplacer vers le haut"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index a7bf20b79dfb..9ef639239b23 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Plus longtemps"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Moins longtemps"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lampe de poche désactivée."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lampe de poche indisponible."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lampe de poche activée."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Lampe de poche désactivée."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Lampe de poche activée."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Activer le Bluetooth ?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Pour connecter un clavier à votre tablette, vous devez avoir activé le Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Activer"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Afficher les notifications en mode silencieux"</string> + <string name="block" msgid="2734508760962682611">"Bloquer toutes les notifications"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ne pas activer le mode silencieux"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Ne pas activer le mode silencieux ni bloquer"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Afficher les paramètres d\'importance complets"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloquées"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importance minimale"</string> <string name="low_importance" msgid="4109929986107147930">"Importance faible"</string> <string name="default_importance" msgid="8192107689995742653">"Importance normale"</string> <string name="high_importance" msgid="1527066195614050263">"Importance élevée"</string> <string name="max_importance" msgid="5089005872719563894">"Urgent"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Ne jamais afficher ces notifications"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Afficher au bas de la liste des notifications en mode silencieux"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Afficher ces notifications en mode silencieux"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Autoriser ces notifications à émettre des sons"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Afficher sur l\'écran et émettre un son"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Afficher en haut de la liste des notifications, afficher sur l\'écran et émettre un son"</string> <string name="notification_more_settings" msgid="816306283396553571">"Plus de paramètres"</string> <string name="notification_done" msgid="5279426047273930175">"Terminé"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Couleur et apparence"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Afficher le pourcentage lorsque l\'appareil est en charge (option par défaut)"</item> <item msgid="3327323682209964956">"Ne plus afficher cette icône"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Autre"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Séparateur d\'écran partagé"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Déplacer vers le bas"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Déplacer vers le haut"</string> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index d24c424e0383..bb85708d554c 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Máis tempo."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Menos tempo."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lanterna desactivada."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"A lanterna non está dispoñible."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lanterna activada."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Desactivouse a lanterna."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Activouse a lanterna."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Queres activar o Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para conectar o teu teclado co tablet, primeiro tes que activar o Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Activar"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Mostrar notificacións de forma silenciosa"</string> + <string name="block" msgid="2734508760962682611">"Bloquear todas as notificacións"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Non silenciar"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Non silenciar nin bloquear"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Mostrar a configuración completa da importancia"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloqueada"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importancia mínima"</string> <string name="low_importance" msgid="4109929986107147930">"Importancia baixa"</string> <string name="default_importance" msgid="8192107689995742653">"Importancia normal"</string> <string name="high_importance" msgid="1527066195614050263">"Importancia alta"</string> <string name="max_importance" msgid="5089005872719563894">"Importancia urxente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Non mostrar nunca estas notificacións"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Mostrar de forma silenciosa na parte inferior da lista de notificacións"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Mostrar estas notificacións de forma silenciosa"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Permitir que esta notificación emita son"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Mostrar na pantalla e permitir que emita son"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Mostrar na parte superior da lista de notificacións, amosar na pantalla e permitir que emita son"</string> <string name="notification_more_settings" msgid="816306283396553571">"Máis opcións"</string> <string name="notification_done" msgid="5279426047273930175">"Feito"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Cor e aspecto"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Mostrar porcentaxe durante a carga (predeterminado)"</item> <item msgid="3327323682209964956">"Non mostrar esta icona"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Outros"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Divisor de pantalla dividida"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Baixar"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Subir"</string> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 08dfb23cc08d..09e7f70be10e 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Ավելացնել ժամանակը:"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Պակասեցնել ժամանակը:"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Լապտերն անջատված է:"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Լապտերն անհասանելի է:"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Լապտերը միացված է:"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Լապտերն անջատվեց:"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Լապտերը միացավ:"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Միացնե՞լ Bluetooth-ը:"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Ստեղնաշարը ձեր պլանշետին միացնելու համար նախ անհրաժեշտ է միացնել Bluetooth-ը:"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Միացնել"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Ցույց տալ ծանուցումներն առանց ձայնային ազդանշանի"</string> + <string name="block" msgid="2734508760962682611">"Արգելափակել բոլոր ծանուցումները"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ձայնը չանջատել"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Ձայնը չանջատել և չարգելափակել"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Ցույց տալ կարևորության բոլոր կարգավորումները"</string> <string name="blocked_importance" msgid="5198578988978234161">"Արգելափակված"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Նվազագույն կարևորություն"</string> <string name="low_importance" msgid="4109929986107147930">"Ցածր կարևորություն"</string> <string name="default_importance" msgid="8192107689995742653">"Սովորական կարևորություն"</string> <string name="high_importance" msgid="1527066195614050263">"Բարձր կարևորություն"</string> <string name="max_importance" msgid="5089005872719563894">"Հրատապ կարևորություն"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Երբեք չցուցադրել այս ծանուցումները"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Ցուցադրել ծանուցումների ցանկի ներքևում առանց ձայնային ազդանշանի"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Ցուցադրել այս ծանուցումներն առանց ձայնային ազդանշանի"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Թույլ տալ այս ծանուցումներին ձայնային ազդանշան հնչեցնել"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Թռուցիկ ցուցադրել էկրանին և թույլատրել ձայնային ազդանշանը"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Ցույց տալ ծանուցումների ցանկի վերևում, թռուցիկ ցուցադրել էկրանին և թույլատրել ձայնային ազդանշանը"</string> <string name="notification_more_settings" msgid="816306283396553571">"Այլ կարգավորումներ"</string> <string name="notification_done" msgid="5279426047273930175">"Պատրաստ է"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Գույնը և արտաքին տեսքը"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Ցույց տալ տոկոսը լիցքավորելու ժամանակ (կանխադրված է)"</item> <item msgid="3327323682209964956">"Ցույց չտալ այս պատկերակը"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Այլ"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Տրոհված էկրանի բաժանիչ"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Տեղափոխել ներքև"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Տեղափոխել վերև"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 3fa41be87cb2..46340a773006 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Lebih lama."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Lebih cepat."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Senter nonaktif."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Senter tidak tersedia."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Senter aktif."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Senter dinonaktifkan."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Senter diaktifkan."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Aktifkan Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Untuk menghubungkan keyboard dengan tablet, terlebih dahulu aktifkan Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Aktifkan"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Tampilkan notifikasi tanpa suara"</string> + <string name="block" msgid="2734508760962682611">"Blokir semua notifikasi"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Jangan bisukan"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Jangan bisukan atau blokir"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Tampilkan setelan lengkap nilai penting"</string> <string name="blocked_importance" msgid="5198578988978234161">"Diblokir"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Nilai penting min"</string> <string name="low_importance" msgid="4109929986107147930">"Tingkat kepentingan: rendah"</string> <string name="default_importance" msgid="8192107689995742653">"Tingkat kepentingan: normal"</string> <string name="high_importance" msgid="1527066195614050263">"Tingkat kepentingan: tinggi"</string> <string name="max_importance" msgid="5089005872719563894">"Tingkat kepentingan: darurat"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Jangan pernah tunjukkan notifikasi ini"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Tampilkan di bagian bawah daftar notifikasi tanpa suara"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Tampilkan notifikasi ini tanpa suara"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Izinkan notifikasi ini bersuara"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Muncul di layar dan izinkan suara"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Tampilkan di bagian atas daftar notifikasi, muncul di layar, dan izinkan suara"</string> <string name="notification_more_settings" msgid="816306283396553571">"Setelan lainnya"</string> <string name="notification_done" msgid="5279426047273930175">"Selesai"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Warna dan tampilan"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Tampilkan persentase saat mengisi daya (default)"</item> <item msgid="3327323682209964956">"Jangan tampilkan ikon ini"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Lainnya"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Pembagi layar terpisah"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Turunkan"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Naikkan"</string> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index e3c3aa85fa01..89708de2d20c 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Meiri tími."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Minni tími."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Slökkt á vasaljósi."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Vasaljós ekki tiltækt"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Kveikt á vasaljósi."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Slökkt á vasaljósi."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Kveikt á vasaljósi."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Kveikja á Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Til að geta tengt lyklaborðið við spjaldtölvuna þarftu fyrst að kveikja á Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Kveikja"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Sýna tilkynningar án hljóðs"</string> + <string name="block" msgid="2734508760962682611">"Loka á allar tilkynningar"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ekki þagga"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Hvorki þagga né útiloka"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Sýna stillingar fyrir mikilvægi"</string> <string name="blocked_importance" msgid="5198578988978234161">"Útilokuð"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Lítill forgangur"</string> <string name="low_importance" msgid="4109929986107147930">"Ekki svo mikilvægt"</string> <string name="default_importance" msgid="8192107689995742653">"Venjulegt mikilvægi"</string> <string name="high_importance" msgid="1527066195614050263">"Mjög mikilvægt"</string> <string name="max_importance" msgid="5089005872719563894">"Afar áríðandi"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Aldrei sýna þessar tilkynningar"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Sýna neðst á tilkynningalistanum án hljóðs"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Sýna þessar tilkynningar án hljóðs"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Leyfa þessum tilkynningum að spila hljóð"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Birta á skjánum og leyfa hljóð"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Sýna efst á tilkynningalistanum, birta á skjánum og leyfa hljóð"</string> <string name="notification_more_settings" msgid="816306283396553571">"Fleiri stillingar"</string> <string name="notification_done" msgid="5279426047273930175">"Lokið"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Litur og útlit"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Sýna hlutfall meðan á hleðslu stendur (sjálfgefið)"</item> <item msgid="3327323682209964956">"Ekki sýna þetta tákn"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Annað"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Skjáskipting"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Færa niður"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Færa upp"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 5266ba881c69..d6622e368fce 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Più tempo."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Meno tempo."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Torcia spenta."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Torcia non disponibile."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Torcia accesa."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Torcia disattivata."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Torcia attivata."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Attivare il Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Per connettere la tastiera al tablet, devi prima attivare il Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Attiva"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Mostra silenziosamente le notifiche"</string> + <string name="block" msgid="2734508760962682611">"Blocca tutte le notifiche"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Non disattivare i suoni"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Non disattivare i suoni e non bloccare"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Mostra impostazioni importanza complete"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloccata"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importanza min"</string> <string name="low_importance" msgid="4109929986107147930">"Importanza scarsa"</string> <string name="default_importance" msgid="8192107689995742653">"Importanza normale"</string> <string name="high_importance" msgid="1527066195614050263">"Importanza elevata"</string> <string name="max_importance" msgid="5089005872719563894">"Importanza urgente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Non mostrare mai queste notifiche"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Mostra silenziosamente nella parte inferiore dell\'elenco delle notifiche"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Mostra silenziosamente queste notifiche"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Attiva i suoni per queste notifiche"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Apri sullo schermo e attiva l\'audio"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Mostra in cima all\'elenco delle notifiche, apri sullo schermo e attiva l\'audio"</string> <string name="notification_more_settings" msgid="816306283396553571">"Altre impostazioni"</string> <string name="notification_done" msgid="5279426047273930175">"Fine"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Colore e aspetto"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Mostra la percentuale quando in carica (opzione predefinita)"</item> <item msgid="3327323682209964956">"Non mostrare questa icona"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Altro"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Strumento per schermo diviso"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Sposta giù"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Sposta su"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index a13f975f4c34..ed446245b934 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -209,8 +209,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"יותר זמן."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"פחות זמן."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"הפנס כבוי."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"פנס אינו זמין."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"הפנס מופעל."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"הפנס נכבה."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"הפנס הופעל."</string> @@ -458,34 +457,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"האם להפעיל את ה-Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"כדי לחבר את המקלדת לטאבלט, תחילה עליך להפעיל את ה-Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"הפעל"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"הצג הודעות בלי להשמיע צליל"</string> + <string name="block" msgid="2734508760962682611">"חסום את כל ההודעות"</string> + <string name="do_not_silence" msgid="6878060322594892441">"לא להשתיק"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"לא להשתיק או לחסום"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"הצג את הגדרות החשיבות במלואן"</string> <string name="blocked_importance" msgid="5198578988978234161">"חסום"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"חשיבות מינימלית"</string> <string name="low_importance" msgid="4109929986107147930">"חשיבות נמוכה"</string> <string name="default_importance" msgid="8192107689995742653">"חשיבות רגילה"</string> <string name="high_importance" msgid="1527066195614050263">"חשיבות גבוהה"</string> <string name="max_importance" msgid="5089005872719563894">"חשיבות דחופה"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"לעולם אל תציג את ההודעות האלה"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"הצג בסוף רשימת ההודעות בלי להשמיע צליל"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"הצג את ההודעות האלה בלי להשמיע צליל"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"אשר להודעות אלה להשמיע צליל"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"הצג לרגע על גבי המסך ואשר השמעת צליל"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"הצג בראש רשימת ההודעות, הצג לרגע על גבי המסך ואשר השמעת צליל"</string> <string name="notification_more_settings" msgid="816306283396553571">"הגדרות נוספות"</string> <string name="notification_done" msgid="5279426047273930175">"סיום"</string> <string name="color_and_appearance" msgid="1254323855964993144">"צבע ומראה"</string> @@ -499,7 +487,7 @@ <string name="use_dark_theme" msgid="2900938704964299312">"השתמש בעיצוב כהה למערכת ההפעלה של Android."</string> <string name="adjust_tint" msgid="3398569573231409878">"התאמת גוון"</string> <string name="adjust_brightness" msgid="980039329808178246">"התאמת בהירות"</string> - <string name="night_mode_disclaimer" msgid="598914896926759578">"העיצוב הכהה מוחל על התחומים העיקריים במערכת ההפעלה של Android שמוצגים בדרך כלל בעיצוב בהיר, כמו \'הגדרות\'."</string> + <string name="night_mode_disclaimer" msgid="598914896926759578">"העיצוב הכהה מוחל על התחומים העיקריים במערכת ההפעלה Android שמוצגים בדרך כלל בעיצוב בהיר, כמו \'הגדרות\'."</string> <string name="color_apply" msgid="9212602012641034283">"החל"</string> <string name="color_revert_title" msgid="4746666545480534663">"אישור הגדרות"</string> <string name="color_revert_message" msgid="9116001069397996691">"הגדרות צבע מסוימות עלולות להפוך את המכשיר הזה לבלתי שמיש. לחץ על אישור כדי לאשר את הגדרות הצבע האלה, אחרת הגדרות אלה יתאפסו לאחר 10 שניות."</string> @@ -558,8 +546,7 @@ <item msgid="2139628951880142927">"הצג באחוזים בזמן טעינה (ברירת מחדל)"</item> <item msgid="3327323682209964956">"אל תציג את הסמל הזה"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"אחר"</string> <string name="accessibility_divider" msgid="5903423481953635044">"מחלק מסך מפוצל"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"הזז למטה"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"הזז למעלה"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index d3a8b2ce8839..f104703d61cc 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"長くします。"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"短くします。"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ライトがOFFです。"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"ライトを使用できません。"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ライトがONです。"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ライトをOFFにしました。"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ライトをONにしました。"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"BluetoothをONにしますか?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"タブレットでキーボードに接続するには、最初にBluetoothをONにする必要があります。"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ONにする"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"通知をマナーモードで表示する"</string> + <string name="block" msgid="2734508760962682611">"通知をすべてブロックする"</string> + <string name="do_not_silence" msgid="6878060322594892441">"音声で知らせる"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"音声で知らせる / ブロックしない"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"重要度の設定をすべて表示"</string> <string name="blocked_importance" msgid="5198578988978234161">"ブロック中"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"重要度: 最低"</string> <string name="low_importance" msgid="4109929986107147930">"重要度: 低"</string> <string name="default_importance" msgid="8192107689995742653">"重要度: 中"</string> <string name="high_importance" msgid="1527066195614050263">"重要度: 高"</string> <string name="max_importance" msgid="5089005872719563894">"重要度: 緊急"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"今後はこの通知を表示しない"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"通知リストの末尾にマナーモードで表示する"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"この通知をマナーモードで表示する"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"通知を音声で知らせる"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"画面に数秒間表示し、音声でも知らせる"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"通知リストの先頭に表示し、画面に数秒間表示し、音声でも知らせる"</string> <string name="notification_more_settings" msgid="816306283396553571">"詳細設定"</string> <string name="notification_done" msgid="5279426047273930175">"完了"</string> <string name="color_and_appearance" msgid="1254323855964993144">"色と表示"</string> @@ -559,8 +547,7 @@ <item msgid="2139628951880142927">"変更時に割合を表示(デフォルト)"</item> <item msgid="3327323682209964956">"このアイコンを表示しない"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"その他"</string> <string name="accessibility_divider" msgid="5903423481953635044">"分割画面の分割線"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"下に移動"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"上に移動"</string> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index d14a3c9fb7d4..b365eb32daca 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"მეტი დრო."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"ნაკლები დრო."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ფანარი გამორთულია."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"ფანარი მიუწვდომელია."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ფანარი ჩართულია."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ფანარი გამოირთო."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ფანარი ჩაირთო."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"გსურთ Bluetooth-ის ჩართვა?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"კლავიატურის ტაბლეტთან დასაკავშირებლად, ჯერ უნდა ჩართოთ Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ჩართვა"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"შეტყობინებების უხმოდ ჩვენება"</string> + <string name="block" msgid="2734508760962682611">"ყველა შეტყობინების დაბლოკვა"</string> + <string name="do_not_silence" msgid="6878060322594892441">"არ გაჩუმდეს"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"არ გაჩუმდეს ან დაიბლოკოს"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"მნიშვნელობის დონის სრული პარამეტრების ჩვენება"</string> <string name="blocked_importance" msgid="5198578988978234161">"დაბლოკილი"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"მინიმალური"</string> <string name="low_importance" msgid="4109929986107147930">"დაბალი პრიორიტეტი"</string> <string name="default_importance" msgid="8192107689995742653">"ჩვეულებრივი პრიორიტეტი"</string> <string name="high_importance" msgid="1527066195614050263">"მაღალი პრიორიტეტი"</string> <string name="max_importance" msgid="5089005872719563894">"გადაუდებელი"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"ამ შეტყობინებების ჩვენების შეწყვეტა"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"შეტყობინებების სიის ბოლოში, უხმოდ ჩვენება"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"ამ შეტყობინებების უხმოდ ჩვენება"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"ამ შეტყობინებებისთვის ხმის გამოცემის დაშვება"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"შეტყობინებების პირდაპირ ეკრანზე ჩვენება და ხმის დაშვება"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"შეტყობინებების სიის თავში ჩვენება, პირდაპირ ეკრანზე გამოჩენა და ხმის დაშვება"</string> <string name="notification_more_settings" msgid="816306283396553571">"დამატებითი პარამეტრები"</string> <string name="notification_done" msgid="5279426047273930175">"მზადაა"</string> <string name="color_and_appearance" msgid="1254323855964993144">"ფერი და იერსახე"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"პროცენტულობის დატენვისას ჩვენება (ნაგულისხმევი)"</item> <item msgid="3327323682209964956">"აღარ მაჩვენო ეს ხატულა"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"სხვა"</string> <string name="accessibility_divider" msgid="5903423481953635044">"გაყოფილი ეკრანის რეჟიმის გამყოფი"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"ქვემოთ გადატანა"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"ზემოთ გადატანა"</string> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index a2346b3adb54..f8c54b65120f 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Көбірек уақыт."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Азырақ уақыт."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Қол шам өшірулі."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Жарқыл қол жетімді емес."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Қол шам қосулы."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Қол шам өшірілді."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Қол шам қосылды."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth функциясын қосу керек пе?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Пернетақтаны планшетке қосу үшін алдымен Bluetooth функциясын қосу керек."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Қосу"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Хабарландыруларды үнсіз көрсету"</string> + <string name="block" msgid="2734508760962682611">"Барлық хабарландыруларды бұғаттау"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Үнін өшірмеу"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Үнін өшірмеу немесе бұғаттамау"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Толық маңыздылық параметрлерін көрсету"</string> <string name="blocked_importance" msgid="5198578988978234161">"Бөгелген"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Ең аз маңыздылық"</string> <string name="low_importance" msgid="4109929986107147930">"Төмен маңыздылық"</string> <string name="default_importance" msgid="8192107689995742653">"Қалыпты маңыздылық"</string> <string name="high_importance" msgid="1527066195614050263">"Жоғары маңыздылық"</string> <string name="max_importance" msgid="5089005872719563894">"Шұғыл маңыздылық"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Осы хабарландыруларды ешқашан көрсетпеу"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Хабарландырулар тізімнің төменгі жағында үнсіз көрсету"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Осы хабарландыруларды үнсіз көрсету"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Осы хабарландыруға дыбыстар шығаруға рұқсат ету"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Экранда көрсету және дыбыс шығаруға рұқсат ету"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Хабарландырулар тізімінің жоғарғы жағында көрсету, экранда көрсету және дыбысқа рұқсат ету"</string> <string name="notification_more_settings" msgid="816306283396553571">"Қосымша параметрлер"</string> <string name="notification_done" msgid="5279426047273930175">"Дайын"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Түс және сыртқы түрі"</string> @@ -498,7 +486,7 @@ <string name="use_dark_theme" msgid="2900938704964299312">"Android ОЖ үшін күңгірт тақырыпты пайдалану"</string> <string name="adjust_tint" msgid="3398569573231409878">"Реңкті реттеу"</string> <string name="adjust_brightness" msgid="980039329808178246">"Жарықтықты реттеу"</string> - <string name="night_mode_disclaimer" msgid="598914896926759578">"Күңгірт тақырып Android операциялық жүйесінің әдетте ашық тақырыпта көрсетілетін негізгі аумақтарына қолданылады, мысалы, \"Параметрлер\" тармағына."</string> + <string name="night_mode_disclaimer" msgid="598914896926759578">"Күңгірт тақырып Android операциялық жүйесінің әдетте \"Параметрлер\" сияқты ашық тақырыпта көрсетілетін негізгі аумақтарына қолданылады."</string> <string name="color_apply" msgid="9212602012641034283">"Қолдану"</string> <string name="color_revert_title" msgid="4746666545480534663">"Параметрлерді растау"</string> <string name="color_revert_message" msgid="9116001069397996691">"Кейбір түс параметрлері бұл құрылғыны пайдалану мүмкін емес етуі мүмкін. Бұл түс параметрлерін растау үшін OK түймесін басыңыз, әйтпесе параметрлер 10 секундтан кейін ысырылады."</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Зарядтау кезінде пайызды көрсету (әдепкі)"</item> <item msgid="3327323682209964956">"Бұл белгішені көрсетпеу"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Басқа"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Бөлінген экран бөлгіші"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Төмен қарай жылжыту"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Жоғары қарай жылжыту"</string> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index d5ac252389f7..66a34f00dffa 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -73,7 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Скриншот тартылды."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Тийип, скриншотту көрүңүз."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Скриншот кылынбай жатат."</string> - <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Эстутумда бош орун чектелүү болгондуктан скриншот сакталбай жатат."</string> + <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Сактагычта бош орун аз болгондуктан скриншот сакталбай жатат."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Скриншот тартууга колдонмо же ишканаңыз уруксат бербейт."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB менен файл өткөрүү мүмкүнчүлүктөрү"</string> <string name="use_mtp_button_title" msgid="4333504413563023626">"Медиа ойноткуч катары кошуу (MTP)"</string> @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Көбүрөөк убакыт."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Азыраак убакыт."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Колчырак өчүк."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Кол чырак жок."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Колчырак күйүк."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Колчырак өчүрүлдү."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Колчырак күйгүзүлдү."</string> @@ -307,8 +306,8 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> коопсуз режиминде өчүрүлдү."</string> <string name="recents_history_button_label" msgid="5153358867807604821">"Таржымал"</string> <string name="recents_history_clear_all_button_label" msgid="5905258334958006953">"Тазалоо"</string> - <string name="recents_drag_non_dockable_task_message" msgid="2935843902795166158">"Бул колдонмо мульти-терезени колдоого албайт"</string> - <string name="recents_launch_non_dockable_task_label" msgid="7862379814938391888">"Колдонмо мульти-терезени колдоого албайт"</string> + <string name="recents_drag_non_dockable_task_message" msgid="2935843902795166158">"Бул колдонмодо бир нече терезе режими колдоого алынбайт"</string> + <string name="recents_launch_non_dockable_task_label" msgid="7862379814938391888">"Колдонмодо бир нече терезе режими колдоого алынбайт"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Туурасынан бөлүү"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Тигинен бөлүү"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Ыңгайлаштырылган бөлүү"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth күйгүзүлсүнбү?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Баскычтобуңузду планшетиңизге туташтыруу үчүн, адегенде Bluetooth\'ту күйгүзүшүңүз керек."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Күйгүзүү"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Эскертмелер үнсүз көрсөтүлсүн"</string> + <string name="block" msgid="2734508760962682611">"Бардык эскертмелерди бөгөттөө"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Үнсүз кылынбасын"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Үнсүз кылынып же бөгөттөлбөсүн"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Маанилүүлүк жөндөөлөрү толук көрсөтүлсүн"</string> <string name="blocked_importance" msgid="5198578988978234161">"Бөгөттөлгөн"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Маанилүүлүгү эң төмөн"</string> <string name="low_importance" msgid="4109929986107147930">"Маанилүүлүгү төмөн"</string> <string name="default_importance" msgid="8192107689995742653">"Маанилүүлүгү орточо"</string> <string name="high_importance" msgid="1527066195614050263">"Маанилүүлүгү жогору"</string> <string name="max_importance" msgid="5089005872719563894">"Маанилүүлүгү шашылыш"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Бул эскертмелер эч качан көрсөтүлбөсүн"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Эскертмелер тизмесинин соңунда үнсүз көрсөтүлсүн"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Бул эскертмелер үнсүз көрсөтүлсүн"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Бул эскертмелер добуш чыгарышына уруксат берилсин"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Үн менен коштолуп, экранга чыгарылсын"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Эскертмелер тизмесинин эң башында көрсөтүлүп, үн менен коштолуп, экранга чыгарылсын"</string> <string name="notification_more_settings" msgid="816306283396553571">"Дагы жөндөөлөр"</string> <string name="notification_done" msgid="5279426047273930175">"Аткарылды"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Түсү жана көрүнүшү"</string> @@ -497,7 +485,7 @@ <string name="use_dark_theme" msgid="2900938704964299312">"Android OS үчүн караңгы тема колдонуу"</string> <string name="adjust_tint" msgid="3398569573231409878">"Кошумча түсүн тууралоо"</string> <string name="adjust_brightness" msgid="980039329808178246">"Жарыктыгын тууралоо"</string> - <string name="night_mode_disclaimer" msgid="598914896926759578">"Адатта жарык темада көрсөтүлгөн Android OS\'тин, Жөндөөлөр сыяктуу негизги аймактарына караңгы тема колдонулат."</string> + <string name="night_mode_disclaimer" msgid="598914896926759578">"Адатта жарык темада көрсөтүлүүчү Android тутумунун негизги элементтерине (Жөндөөлөр сыяктуу) колдонула турган караңгы тема."</string> <string name="color_apply" msgid="9212602012641034283">"Колдонуу"</string> <string name="color_revert_title" msgid="4746666545480534663">"Жөндөөлөрдү ырастоо"</string> <string name="color_revert_message" msgid="9116001069397996691">"Айрым түс жөндөөлөрү бул түзмөктү колдонулгус кылып коюшу мүмкүн. Бул түс жөндөөлөрүн ырастоо үчүн OK баскычын чыкылдатыңыз, болбосо бул жөндөөлөр 10 секунддан кийин баштапкы абалына келтирилет."</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Кубаттоо учурунда пайызы көрсөтүлсүн (демейки)"</item> <item msgid="3327323682209964956">"Бул сөлөкөт көрсөтүлбөсүн"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Башка"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Экранды бөлгүч"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Төмөн жылдыруу"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Жогору жылдыруу"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index a33c76f2a1e0..bb49c393b603 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -209,8 +209,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Daugiau laiko."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Mažiau laiko."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Blykstė išjungta."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Blykstė nepasiekiama."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Blykstė įjungta."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Blykstė išjungta."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Blykstė įjungta."</string> @@ -458,34 +457,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Įjungti „Bluetooth“?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Kad galėtumėte prijungti klaviatūrą prie planšetinio kompiuterio, pirmiausia turite įjungti „Bluetooth“."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Įjungti"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Tyliai rodyti pranešimus"</string> + <string name="block" msgid="2734508760962682611">"Blokuoti visus pranešimus"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Netylėti"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Netylėti arba blokuoti"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Rodyti visos svarbos nustatymus"</string> <string name="blocked_importance" msgid="5198578988978234161">"Užblokuota"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Min. svarba"</string> <string name="low_importance" msgid="4109929986107147930">"Maža svarba"</string> <string name="default_importance" msgid="8192107689995742653">"Įprasta svarba"</string> <string name="high_importance" msgid="1527066195614050263">"Didelė svarba"</string> <string name="max_importance" msgid="5089005872719563894">"Skubi svarba"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Niekada nerodyti šių pranešimų"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Tyliai rodyti pranešimų sąrašo apačioje"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Tyliai rodyti šiuos pranešimus"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Leisti šiems pranešimams skambėti"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Rodyti ekrane ir leisti skambėti"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Rodyti pranešimų sąrašo viršuje, rodyti ekrane ir leisti skambėti"</string> <string name="notification_more_settings" msgid="816306283396553571">"Daugiau nustatymų"</string> <string name="notification_done" msgid="5279426047273930175">"Atlikta"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Spalva ir išvaizda"</string> @@ -558,8 +546,7 @@ <item msgid="2139628951880142927">"Rodyti procentus kraunant (numatytasis nustatymas)"</item> <item msgid="3327323682209964956">"Nerodyti šios piktogramos"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Kita"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Skaidyto ekrano daliklis"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Perkelti žemyn"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Perkelti aukštyn"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 683e00a03eb6..574889eea686 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -208,8 +208,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Vairāk laika."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Mazāk laika."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Apgaismojums ir izslēgts."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Zibspuldze nav pieejama."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Apgaismojums ir ieslēgts."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Apgaismojums ir izslēgts."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Apgaismojums ir ieslēgts."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vai ieslēgt Bluetooth savienojumu?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Lai pievienotu tastatūru planšetdatoram, vispirms ir jāieslēdz Bluetooth savienojums."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Ieslēgt"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Rādīt paziņojumus bez skaņas signāla"</string> + <string name="block" msgid="2734508760962682611">"Bloķēt visus paziņojumus"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Neizslēgt skaņu"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Neizslēgt skaņu vai nebloķēt"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Rādīt ļoti svarīgu paziņojumu iestatījumus"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloķēts"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Minimāls svarīguma līmenis"</string> <string name="low_importance" msgid="4109929986107147930">"Nav svarīgs"</string> <string name="default_importance" msgid="8192107689995742653">"Parasts"</string> <string name="high_importance" msgid="1527066195614050263">"Ļoti svarīgs"</string> <string name="max_importance" msgid="5089005872719563894">"Steidzams"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Nekad nerādīt šos paziņojumus"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Rādīt paziņojumu saraksta apakšdaļā bez skaņas signāla"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Rādīt šos paziņojumus bez skaņas signāla"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Atļaut skaņas signālu šiem paziņojumiem"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Rādīt ekrānā un atļaut skaņas signālu"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Rādīt paziņojumu saraksta augšdaļā, rādīt ekrānā ar skaņas signālu"</string> <string name="notification_more_settings" msgid="816306283396553571">"Citi iestatījumi"</string> <string name="notification_done" msgid="5279426047273930175">"Gatavs"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Krāsas un izskats"</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Rādīt procentuālo vērtību uzlādes laikā (noklusējums)"</item> <item msgid="3327323682209964956">"Nerādīt šo ikonu"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Citi"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Ekrāna sadalītājs"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Pārvietot uz leju"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Pārvietot uz augšu"</string> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index fea38a9ee754..a69be1fe5b14 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -205,8 +205,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Хугацаа нэмэх."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Хугацаа хасах."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Флаш гэрэл унтарсан."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Гэрэлтүүлэгч боломжгүй байна."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Флаш гэрэл ассан."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Флаш гэрлийг унтраасан."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Флаш гэрлийг асаасан."</string> @@ -454,34 +453,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth-г асаах уу?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Компьютерийн гараа таблетад холбохын тулд эхлээд Bluetooth-г асаана уу."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Асаах"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Мэдэгдлийг чимээгүй харуулах"</string> + <string name="block" msgid="2734508760962682611">"Бүх мэдэгдлийг блоклох"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Дуугүй болгох хэрэггүй"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Дууг нь хаах эсвэл блоклох хэрэггүй"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Бүрэн ач холбогдлын тохиргоог харуулах"</string> <string name="blocked_importance" msgid="5198578988978234161">"Блоклосон"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Хамгийн бага ач холбогдол"</string> <string name="low_importance" msgid="4109929986107147930">"Бага ач холбогдолтой"</string> <string name="default_importance" msgid="8192107689995742653">"Энгийн ач холбогдолтой"</string> <string name="high_importance" msgid="1527066195614050263">"Өндөр ач холбогдолтой"</string> <string name="max_importance" msgid="5089005872719563894">"Яаралтай ач холбогдолтой"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Эдгээр мэдэгдлийг хэзээ ч харуулахгүй"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Мэдэгдлийг жагсаалтын доод хэсэгт дуугүй харуулах"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Эдгээр мэдэгдлийг дуугүй харуулах"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Эдгээр мэдэгдлийг дуу гаргахыг зөвшөөрөх"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Дэлгэцэд яаралтайгаар дуутай гаргах"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Мэдэгдлийг жагсаалтын эхэнд яаралтай дуутай харуулах"</string> <string name="notification_more_settings" msgid="816306283396553571">"Бусад тохиргоо"</string> <string name="notification_done" msgid="5279426047273930175">"Дууссан"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Өнгө, харагдах байдал"</string> @@ -554,8 +542,7 @@ <item msgid="2139628951880142927">"Цэнэглэх үед хувийг тогтмол харуулах (өгөгдмөл)"</item> <item msgid="3327323682209964956">"Энэ дүрс тэмдгийг бүү үзүүл"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Бусад"</string> <string name="accessibility_divider" msgid="5903423481953635044">"\"Дэлгэц хуваах\" хуваагч"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Доош зөөх"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Дээш зөөх"</string> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index acd9d4e833c9..d99678c52a77 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"अधिक वेळ."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"कमी वेळ."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"फ्लॅशलाइट बंद."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"फ्लॅशलाइट अनुपलब्ध आहे."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"फ्लॅशलाइट चालू."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"फ्लॅशलाइट बंद केला."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"फ्लॅशलाइट चालू केला."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"ब्लूटुथ सुरू करायचे?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"आपला कीबोर्ड आपल्या टॅब्लेटसह कनेक्ट करण्यासाठी, आपल्याला प्रथम ब्लूटुथ चालू करणे आवश्यक आहे."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"चालू करा"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"सूचना शांतपणे दर्शवा"</string> + <string name="block" msgid="2734508760962682611">"सर्व सूचना अवरोधित करा"</string> + <string name="do_not_silence" msgid="6878060322594892441">"शांत करू नका"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"शांत किंवा अवरोधित करू नका"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"पूर्ण महत्त्व सेटिंग्ज दर्शवा"</string> <string name="blocked_importance" msgid="5198578988978234161">"अवरोधित केले"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"किमान महत्त्व"</string> <string name="low_importance" msgid="4109929986107147930">"कमी महत्त्व"</string> <string name="default_importance" msgid="8192107689995742653">"सामान्य महत्त्व"</string> <string name="high_importance" msgid="1527066195614050263">"सर्वाधिक महत्व"</string> <string name="max_importance" msgid="5089005872719563894">"त्वरित महत्त्व"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"या सूचना कधीही दर्शवू नका"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"सूचना सूचीच्या तळाशी शांतपणे दर्शवा"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"या सूचना शांतपणे दर्शवा"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"या सूचनांना ध्वनी चालू करण्याची अनुमती द्या"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"स्क्रीनवर पहा आणि ध्वनीस अनुमती द्या ध्वनीस अनुमती द्या"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"सूचनांच्या शीर्षस्थानी दर्शवा, स्क्रीनवर पहा आणि ध्वनीस अनुमती द्या"</string> <string name="notification_more_settings" msgid="816306283396553571">"अधिक सेटिंग्ज"</string> <string name="notification_done" msgid="5279426047273930175">"पूर्ण झाले"</string> <string name="color_and_appearance" msgid="1254323855964993144">"रंग आणि स्वरूप"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"चार्ज करताना टक्केवारी दर्शवा (डीफॉल्ट)"</item> <item msgid="3327323682209964956">"हे चिन्ह दर्शवू नका"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"अन्य"</string> <string name="accessibility_divider" msgid="5903423481953635044">"विभाजित-स्क्रीन विभाजक"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"खाली हलवा"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"वर हलवा"</string> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index d2048300be52..a716eef62236 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Lagi masa."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kurang masa."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lampu suluh dimatikan."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lampu suluh tidak tersedia."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lampu suluh dihidupkan."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Lampu suluh dimatikan."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Lampu suluh dihidupkan."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Hidupkan Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Untuk menyambungkan papan kekunci anda dengan tablet, anda perlu menghidupkan Bluetooth terlebih dahulu."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Hidupkan"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Tunjukkan pemberitahuan secara senyap"</string> + <string name="block" msgid="2734508760962682611">"Sekat semua pemberitahuan"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Jangan senyapkan"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Jangan senyapkan atau sekat"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Tunjukkan tetapan kepentingan penuh"</string> <string name="blocked_importance" msgid="5198578988978234161">"Disekat"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Kurang penting"</string> <string name="low_importance" msgid="4109929986107147930">"Kepentingan rendah"</string> <string name="default_importance" msgid="8192107689995742653">"Kepentingan biasa"</string> <string name="high_importance" msgid="1527066195614050263">"Kepentingan tinggi"</string> <string name="max_importance" msgid="5089005872719563894">"Kepentingan segera"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Jangan sekali-kali tunjukkan pemberitahuan ini"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Tunjukkan pada bahagian bawah senarai pemberitahuan secara senyap"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Tunjukkan pemberitahuan ini secara senyap"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Benarkan pemberitahuan ini berbunyi"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Intai pada skrin dan benarkan bunyi"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Tunjukkan pada bahagian atas senarai pemberitahuan, intai pada skrin dan benarkan bunyi"</string> <string name="notification_more_settings" msgid="816306283396553571">"Lagi tetapan"</string> <string name="notification_done" msgid="5279426047273930175">"Selesai"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Warna dan penampilan"</string> @@ -556,9 +544,8 @@ <item msgid="2139628951880142927">"Tunjukkan peratusan semasa mengecas (lalai)"</item> <item msgid="3327323682209964956">"Jangan tunjukkan ikon ini"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> - <string name="accessibility_divider" msgid="5903423481953635044">"Pembahagi skrin terpisah"</string> + <string name="other" msgid="4060683095962566764">"Lain-lain"</string> + <string name="accessibility_divider" msgid="5903423481953635044">"Pembahagi skrin pisah"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Alih ke bawah"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Alih ke atas"</string> <string name="accessibility_action_divider_move_left" msgid="9218189832115847253">"Alih ke kiri"</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index c88eda2521fd..503b91f1134b 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -306,8 +306,8 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ကို ဘေးကင်းလုံခြုံသည့်မုဒ်တွင် ပိတ်ထားပါသည်။"</string> <string name="recents_history_button_label" msgid="5153358867807604821">"မှတ်တမ်း"</string> <string name="recents_history_clear_all_button_label" msgid="5905258334958006953">"ရှင်းလင်းပါ"</string> - <string name="recents_drag_non_dockable_task_message" msgid="2935843902795166158">"ဤအက်ပ်သည် ဝင်းဒိုးများစွာတွင်ဖွင့်ရန် မပံ့ပိုးထားပါ"</string> - <string name="recents_launch_non_dockable_task_label" msgid="7862379814938391888">"အက်ပ်သည် ဝင်းဒိုးများစွာတွင်ဖွင့်ရန် မပံ့ပိုးထားပါ"</string> + <string name="recents_drag_non_dockable_task_message" msgid="2935843902795166158">"ဤအက်ပ်သည် ဝင်းဒိုးများစွာဖွင့်ခြင်းကို ပံ့ပိုးမထားပါ"</string> + <string name="recents_launch_non_dockable_task_label" msgid="7862379814938391888">"အက်ပ်သည် ဝင်းဒိုးများစွာဖွင့်ခြင်းကို ပံ့ပိုးမထားပါ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ရေပြင်ညီ ပိုင်းမည်"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ဒေါင်လိုက်ပိုင်းမည်"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"စိတ်ကြိုက် ပိုင်းမည်"</string> @@ -545,7 +545,7 @@ <item msgid="3327323682209964956">"ဤသင်္ကေတပုံကို မပြပါနှင့်"</item> </string-array> <string name="other" msgid="4060683095962566764">"အခြား"</string> - <string name="accessibility_divider" msgid="5903423481953635044">"မျက်နှာပြင်ခွဲခြမ်းခြင်း ပိုင်းခြားပေးသည့်စနစ်"</string> + <string name="accessibility_divider" msgid="5903423481953635044">"မျက်နှာပြင်ခွဲခြမ်း ပိုင်းခြားပေးသည့်စနစ်"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"အောက်သို့ရွှေ့ပါ"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"အပေါ်သို့ရွှေ့ပါ"</string> <string name="accessibility_action_divider_move_left" msgid="9218189832115847253">"ဘယ်ဘက်သို့ရွှေ့ပါ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index ac8cc8ddf3c4..b3de2399fbfe 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mer tid."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Mindre tid."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lommelykten er av."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lommelykt er ikke tilgjengelig."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lommelykten er på."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Lommelykten er slått av."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Lommelykten er slått på."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vil du slå på Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"For å koble tastaturet til nettbrettet ditt må du først slå på Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Slå på"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Vis varsler uten lyd"</string> + <string name="block" msgid="2734508760962682611">"Blokkér alle varsler"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ikke slå av lyden"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Ikke slå av lyden eller blokkér anrop"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Vis alle viktighetsinnstillingene"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blokkert"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Laveste prioritet"</string> <string name="low_importance" msgid="4109929986107147930">"Lav viktighet"</string> <string name="default_importance" msgid="8192107689995742653">"Vanlig viktighet"</string> <string name="high_importance" msgid="1527066195614050263">"Høy viktighet"</string> <string name="max_importance" msgid="5089005872719563894">"Svært høy viktighet"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Aldri vis disse varslene"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Vis nederst på varsellisten uten lyd"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Vis disse varslene uten lyd"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Tillat at disse varslene vises med lyd"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Vis fort på skjermen og tillat lyd"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Vis øverst på varsellisten, vis fort på skjermen og tillat lyd"</string> <string name="notification_more_settings" msgid="816306283396553571">"Flere innstillinger"</string> <string name="notification_done" msgid="5279426047273930175">"Ferdig"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Farge og utseende"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Vis prosentandel under lading (standard)"</item> <item msgid="3327323682209964956">"Ikke vis dette ikonet"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Annet"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Skilleelement for delt skjerm"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Flytt ned"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Flytt opp"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index c9821eea5ed9..974685c80358 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -209,8 +209,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Więcej czasu."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Mniej czasu."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Latarka wyłączona."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Latarka niedostępna."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Latarka włączona."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Latarka została wyłączona."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Latarka została włączona."</string> @@ -458,34 +457,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Włączyć Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Aby połączyć klawiaturę z tabletem, musisz najpierw włączyć Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Włącz"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Pokazuj powiadomienia bez sygnału dźwiękowego"</string> + <string name="block" msgid="2734508760962682611">"Blokuj wszystkie powiadomienia"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Nie ignoruj"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Nie ignoruj ani nie blokuj"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Pokaż pełne ustawienia ważności"</string> <string name="blocked_importance" msgid="5198578988978234161">"Zablokowane"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Najmniejsza ważność"</string> <string name="low_importance" msgid="4109929986107147930">"Mało ważne"</string> <string name="default_importance" msgid="8192107689995742653">"Ważne"</string> <string name="high_importance" msgid="1527066195614050263">"Bardzo ważne"</string> <string name="max_importance" msgid="5089005872719563894">"Pilne"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Nigdy nie pokazuj tych powiadomień"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Pokazuj na końcu listy powiadomień bez sygnału dźwiękowego"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Pokazuj te powiadomienia bez sygnału dźwiękowego"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Zezwól na sygnalizowanie tych powiadomień dźwiękiem"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Wyświetlaj na ekranie i sygnalizuj dźwiękiem"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Pokazuj na początku listy powiadomień, wyświetlaj na ekranie i sygnalizuj dźwiękiem"</string> <string name="notification_more_settings" msgid="816306283396553571">"Więcej ustawień"</string> <string name="notification_done" msgid="5279426047273930175">"Gotowe"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Kolor i wygląd"</string> @@ -558,8 +546,7 @@ <item msgid="2139628951880142927">"Pokazuj procent podczas ładowania (domyślnie)"</item> <item msgid="3327323682209964956">"Nie pokazuj tej ikony"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Inne"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Linia dzielenia ekranu"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Przesuń w dół"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Przesuń w górę"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index a15a789cc00f..3797adcce447 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mais tempo."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Menos tempo."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lanterna desativada."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lanterna indisponível."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lanterna ativada."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"A lanterna foi desativada."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"A lanterna foi ativada."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Ativar o Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para conectar o teclado ao tablet, é preciso primeiro ativar o Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Ativar"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Mostrar notificações de forma silenciosa"</string> + <string name="block" msgid="2734508760962682611">"Bloquear todas as notificações"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Não silenciar"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Não silenciar ou bloquear"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Mostrar todas as configurações de importância"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloqueadas"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importância mínima"</string> <string name="low_importance" msgid="4109929986107147930">"Importância baixa"</string> <string name="default_importance" msgid="8192107689995742653">"Importância normal"</string> <string name="high_importance" msgid="1527066195614050263">"Importância elevada"</string> <string name="max_importance" msgid="5089005872719563894">"Importância urgente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Nunca mostrar essas notificações"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Mostrar na parte inferior da lista de notificações de forma silenciosa"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Mostrar essas notificações de forma silenciosa"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Permitir que essas notificações emitam sons"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Mostrar parcialmente na tela e permitir som"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Mostrar na parte superior da lista de notificações, mostrar parcialmente na tela e permitir sons"</string> <string name="notification_more_settings" msgid="816306283396553571">"Mais configurações"</string> <string name="notification_done" msgid="5279426047273930175">"Concluído"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Cor e aparência"</string> @@ -498,7 +486,7 @@ <string name="use_dark_theme" msgid="2900938704964299312">"Usar o tema escuro para o SO Android"</string> <string name="adjust_tint" msgid="3398569573231409878">"Ajustar tonalidade"</string> <string name="adjust_brightness" msgid="980039329808178246">"Ajustar brilho"</string> - <string name="night_mode_disclaimer" msgid="598914896926759578">"O tema escuro é aplicado a áreas centrais do sistema operacional Android que normalmente são exibidas em um tema claro, como asconfigurações."</string> + <string name="night_mode_disclaimer" msgid="598914896926759578">"O tema escuro é aplicado a áreas centrais do sistema operacional Android que normalmente são exibidas em um tema claro, como as configurações."</string> <string name="color_apply" msgid="9212602012641034283">"Aplicar"</string> <string name="color_revert_title" msgid="4746666545480534663">"Confirmar configurações"</string> <string name="color_revert_message" msgid="9116001069397996691">"Algumas configurações de cor podem tornar o dispositivo inutilizável. Clique em \"OK\" para confirmar essas configurações de cor; caso contrário, essas configurações serão redefinidas após 10 segundos."</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Mostrar porcentagem durante o carregamento (padrão)"</item> <item msgid="3327323682209964956">"Não mostrar este ícone"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Outros"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Divisor de tela"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Mover para baixo"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Mover para cima"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 85d4c7953398..7ee2554e8093 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mais tempo."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Menos tempo."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lanterna desligada."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lanterna indisponível."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lanterna ligada."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Lanterna desligada."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Lanterna ligada."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Pretende ativar o Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para ligar o teclado ao tablet, tem de ativar primeiro o Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Ativar"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Mostrar notificações sem som"</string> + <string name="block" msgid="2734508760962682611">"Bloquear todas as notificações"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Não silenciar"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Não silenciar nem bloquear"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Mostrar definições de importância completas"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloqueado"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importância mín."</string> <string name="low_importance" msgid="4109929986107147930">"Importância baixa"</string> <string name="default_importance" msgid="8192107689995742653">"Importância normal"</string> <string name="high_importance" msgid="1527066195614050263">"Importância alta"</string> <string name="max_importance" msgid="5089005872719563894">"Urgente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Nunca mostrar estas notificações"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Mostrar na parte inferior da lista de notificações sem som"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Mostrar estas notificações sem som"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Permitir que estas notificações emitam sons"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Mostrar no ecrã e permitir som"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Mostrar na parte superior da lista de notificações, mostrar no ecrã e permitir som"</string> <string name="notification_more_settings" msgid="816306283396553571">"Mais definições"</string> <string name="notification_done" msgid="5279426047273930175">"Concluído"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Cor e aspeto"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Mostrar a percentagem durante o carregamento (predefinição)"</item> <item msgid="3327323682209964956">"Não mostrar este ícone"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Outro"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Divisor do ecrã dividido"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Mover para baixo"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Mover para cima"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index a15a789cc00f..3797adcce447 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mais tempo."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Menos tempo."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lanterna desativada."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lanterna indisponível."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lanterna ativada."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"A lanterna foi desativada."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"A lanterna foi ativada."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Ativar o Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para conectar o teclado ao tablet, é preciso primeiro ativar o Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Ativar"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Mostrar notificações de forma silenciosa"</string> + <string name="block" msgid="2734508760962682611">"Bloquear todas as notificações"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Não silenciar"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Não silenciar ou bloquear"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Mostrar todas as configurações de importância"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloqueadas"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importância mínima"</string> <string name="low_importance" msgid="4109929986107147930">"Importância baixa"</string> <string name="default_importance" msgid="8192107689995742653">"Importância normal"</string> <string name="high_importance" msgid="1527066195614050263">"Importância elevada"</string> <string name="max_importance" msgid="5089005872719563894">"Importância urgente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Nunca mostrar essas notificações"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Mostrar na parte inferior da lista de notificações de forma silenciosa"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Mostrar essas notificações de forma silenciosa"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Permitir que essas notificações emitam sons"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Mostrar parcialmente na tela e permitir som"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Mostrar na parte superior da lista de notificações, mostrar parcialmente na tela e permitir sons"</string> <string name="notification_more_settings" msgid="816306283396553571">"Mais configurações"</string> <string name="notification_done" msgid="5279426047273930175">"Concluído"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Cor e aparência"</string> @@ -498,7 +486,7 @@ <string name="use_dark_theme" msgid="2900938704964299312">"Usar o tema escuro para o SO Android"</string> <string name="adjust_tint" msgid="3398569573231409878">"Ajustar tonalidade"</string> <string name="adjust_brightness" msgid="980039329808178246">"Ajustar brilho"</string> - <string name="night_mode_disclaimer" msgid="598914896926759578">"O tema escuro é aplicado a áreas centrais do sistema operacional Android que normalmente são exibidas em um tema claro, como asconfigurações."</string> + <string name="night_mode_disclaimer" msgid="598914896926759578">"O tema escuro é aplicado a áreas centrais do sistema operacional Android que normalmente são exibidas em um tema claro, como as configurações."</string> <string name="color_apply" msgid="9212602012641034283">"Aplicar"</string> <string name="color_revert_title" msgid="4746666545480534663">"Confirmar configurações"</string> <string name="color_revert_message" msgid="9116001069397996691">"Algumas configurações de cor podem tornar o dispositivo inutilizável. Clique em \"OK\" para confirmar essas configurações de cor; caso contrário, essas configurações serão redefinidas após 10 segundos."</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Mostrar porcentagem durante o carregamento (padrão)"</item> <item msgid="3327323682209964956">"Não mostrar este ícone"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Outros"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Divisor de tela"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Mover para baixo"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Mover para cima"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index fc1ed2f67ffc..c2bec081e7f4 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -208,8 +208,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mai mult timp."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Mai puțin timp."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Lanterna este dezactivată."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Lanterna nu este disponibilă."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Lanterna este activată."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Lanterna este dezactivată."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Lanterna este activată."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Activați Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Pentru a conecta tastatura la tabletă, mai întâi trebuie să activați Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Activați"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Notificările se afișează fără a se emite un sunet"</string> + <string name="block" msgid="2734508760962682611">"Blocați toate notificările"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Nu dezactivați sunetul"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Nu dezactivați sunetul și nu blocați"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Afișați toate setările privind importanța"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blocate"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Importanță minimă"</string> <string name="low_importance" msgid="4109929986107147930">"Importanță redusă"</string> <string name="default_importance" msgid="8192107689995742653">"Importanță normală"</string> <string name="high_importance" msgid="1527066195614050263">"Importanță ridicată"</string> <string name="max_importance" msgid="5089005872719563894">"Importanță: urgente"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Aceste notificări nu se afișează niciodată"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Se afișează în partea de jos a listei cu notificări fără a se emite un sunet"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Aceste notificări se afișează fără a se emite un sunet"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Permiteți acestor notificări să emită sunete"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Se afișează pentru o scurtă durată pe ecran și se permite un sunet"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Apar în partea de sus a listei cu notificări, se afișează pentru scurt timp pe ecran și se permite un sunet"</string> <string name="notification_more_settings" msgid="816306283396553571">"Mai multe setări"</string> <string name="notification_done" msgid="5279426047273930175">"Terminat"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Culoare și aspect"</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Afișează procentajul când se încarcă (prestabilit)"</item> <item msgid="3327323682209964956">"Nu afișa această pictogramă"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Altele"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Separator pentru ecranul împărțit"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Mutați în jos"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Mutați în sus"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 5340d95ded54..8ece7faed224 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -209,8 +209,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Увеличить время."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Уменьшить время."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Фонарик отключен."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Фонарик недоступен."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Фонарик включен."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Фонарик отключен."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Фонарик включен."</string> @@ -458,34 +457,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Подключение по Bluetooth"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Чтобы подключить клавиатуру к планшету, включите Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Включить"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Показывать без звука"</string> + <string name="block" msgid="2734508760962682611">"Блокировать все уведомления"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Показывать со звуком"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Не блокировать, показывать со звуком"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Показывать все настройки важности"</string> <string name="blocked_importance" msgid="5198578988978234161">"Блокировка"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Наименьшая важность"</string> <string name="low_importance" msgid="4109929986107147930">"Низкая важность"</string> <string name="default_importance" msgid="8192107689995742653">"Средняя важность"</string> <string name="high_importance" msgid="1527066195614050263">"Высокая важность"</string> <string name="max_importance" msgid="5089005872719563894">"Крайняя важность"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Не показывать эти уведомления."</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Показывать без звука в конце списка уведомлений"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Показывать без звука"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Показывать со звуком"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Показывать со звуком поверх всех окон"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Показывать со звуком в начале списка уведомлений и поверх всех окон"</string> <string name="notification_more_settings" msgid="816306283396553571">"Другие настройки"</string> <string name="notification_done" msgid="5279426047273930175">"Готово"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Цвета и стиль"</string> @@ -558,8 +546,7 @@ <item msgid="2139628951880142927">"Показывать процент во время зарядки (по умолчанию)"</item> <item msgid="3327323682209964956">"Не показывать этот значок"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Другое"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Разделитель экрана"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Опустить"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Поднять"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 446590f3b61c..40daf19e09d2 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -75,7 +75,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Snímka obrazovky bola zaznamenaná."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Snímku obrazovky zobrazíte dotykom."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Snímku obrazovky sa nepodarilo zachytiť."</string> - <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Snímku obrazovky nie je možné vytvoriť z dôvodu nedostatku miesta na úložisku."</string> + <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Snímku obrazovky nie je možné vytvoriť z dôvodu nedostatku miesta v úložisku."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Vytváranie snímok obrazovky je zakázané aplikáciou alebo vašou organizáciou."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Možnosti prenosu súborov USB"</string> <string name="use_mtp_button_title" msgid="4333504413563023626">"Pripojiť ako prehrávač médií (MTP)"</string> @@ -209,8 +209,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Dlhší čas"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kratší čas"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Svietidlo je vypnuté."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Svietidlo nie je k dispozícii."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Svietidlo je zapnuté."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Svietidlo je vypnuté."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Svietidlo je zapnuté."</string> @@ -458,34 +457,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Zapnúť Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Ak chcete klávesnicu pripojiť k tabletu, najprv musíte zapnúť Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Zapnúť"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Zobrazovať upozornenia bez zvukového signálu"</string> + <string name="block" msgid="2734508760962682611">"Blokovať všetky upozornenia"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Nestíšiť"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Nestíšiť ani neblokovať"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Zobraziť nastavenia vysokej dôležitosti"</string> <string name="blocked_importance" msgid="5198578988978234161">"Zablokované"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Minimálna dôležitosť"</string> <string name="low_importance" msgid="4109929986107147930">"Nízka dôležitosť"</string> <string name="default_importance" msgid="8192107689995742653">"Normálna dôležitosť"</string> <string name="high_importance" msgid="1527066195614050263">"Vysoká dôležitosť"</string> <string name="max_importance" msgid="5089005872719563894">"Neodkladná dôležitosť"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Tieto upozornenia nikdy nezobrazovať"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Zobrazovať v dolnej časti zoznamu upozornení bez zvukového signálu"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Tieto upozornenia zobrazovať bez zvukového signálu"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Umožniť týmto upozorneniam vydávať zvukové signály"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Zobrazovať cez obrazovku a povoliť zvukový signál"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Zobrazovať v hornej časti zoznamu upozornení, zobrazovať cez obrazovku a povoliť zvukový signál"</string> <string name="notification_more_settings" msgid="816306283396553571">"Ďalšie nastavenia"</string> <string name="notification_done" msgid="5279426047273930175">"Hotovo"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Farba a vzhľad"</string> @@ -499,7 +487,7 @@ <string name="use_dark_theme" msgid="2900938704964299312">"Použiť tmavý motív pre systém Android OS"</string> <string name="adjust_tint" msgid="3398569573231409878">"Upraviť tónovanie"</string> <string name="adjust_brightness" msgid="980039329808178246">"Upraviť jas"</string> - <string name="night_mode_disclaimer" msgid="598914896926759578">"V hlavných oblastiach systému Android OS (ako sú Nastavenia), ktoré sú obyčajne zobrazené v svetlom motíve, je použitý tmavý motív."</string> + <string name="night_mode_disclaimer" msgid="598914896926759578">"V hlavných oblastiach systému Android OS (ako sú Nastavenia), ktoré sú obyčajne zobrazené vo svetlom motíve, je použitý tmavý motív."</string> <string name="color_apply" msgid="9212602012641034283">"Použiť"</string> <string name="color_revert_title" msgid="4746666545480534663">"Potvrdenie nastavení"</string> <string name="color_revert_message" msgid="9116001069397996691">"Niektoré nastavenia farieb môžu toto zariadenie znefunkčniť. Tieto nastavenia farieb potvrdíte kliknutím na tlačidlo OK, ináč sa tieto nastavenia o 10 sekúnd obnovia."</string> @@ -558,8 +546,7 @@ <item msgid="2139628951880142927">"Zobrazovať percentá počas nabíjania (predvolené)"</item> <item msgid="3327323682209964956">"Nezobrazovať túto ikonu"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Ďalšie"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Rozdeľovač obrazovky"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Posunúť nadol"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Posunúť nahor"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 327e55336b8a..991e9e2718b2 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -208,8 +208,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Више времена."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Мање времена."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Батеријска лампа је искључена."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Лампа није доступна."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Батеријска лампа је укључена."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Батеријска лампа је искључена."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Батеријска лампа је укључена."</string> @@ -457,34 +456,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Желите ли да укључите Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Да бисте повезали тастатуру са таблетом, прво морате да укључите Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Укључи"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Приказуј обавештења без звука"</string> + <string name="block" msgid="2734508760962682611">"Блокирај сва обавештења"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Не искључуј звук"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Не искључују звук нити блокирај"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Прикажи комплетна подешавања важности"</string> <string name="blocked_importance" msgid="5198578988978234161">"Блокирана"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Веома мала важност"</string> <string name="low_importance" msgid="4109929986107147930">"Мала важност"</string> <string name="default_importance" msgid="8192107689995742653">"Уобичајена важност"</string> <string name="high_importance" msgid="1527066195614050263">"Велика важност"</string> <string name="max_importance" msgid="5089005872719563894">"Важност: хитно"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Ова обавештења се никада не приказују"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Приказују се у дну листе обавештења без звука"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Ова обавештења се приказују без звука"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Дозволите да ова обавештења емитују звук"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Накратко се приказују на екрану и емитују звук"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Приказују се у врху листе обавештења, накратко се приказују на екрану и емитују звук"</string> <string name="notification_more_settings" msgid="816306283396553571">"Још подешавања"</string> <string name="notification_done" msgid="5279426047273930175">"Готово"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Боја и изглед"</string> @@ -557,8 +545,7 @@ <item msgid="2139628951880142927">"Прикажи проценат током пуњења (подразумевано)"</item> <item msgid="3327323682209964956">"Не приказуј ову икону"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Друго"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Разделник подељеног екрана"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Помери надоле"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Помери нагоре"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index a23aba9074be..d35fad5770cf 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Längre tid."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kortare tid."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Ficklampa av."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Ficklampan är inte tillgänglig."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Ficklampa på."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Ficklampan har inaktiverats."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Ficklampan har aktiverats."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vill du aktivera Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Om du vill ansluta tangentbordet till surfplattan måste du först aktivera Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Aktivera"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Visa aviseringar utan ljud"</string> + <string name="block" msgid="2734508760962682611">"Blockera alla aviseringar"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Stäng inte av ljudet"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Stäng inte av ljudet och blockera inte"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Visa alla relevansinställningarna"</string> <string name="blocked_importance" msgid="5198578988978234161">"Blockerad"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Oviktig avisering"</string> <string name="low_importance" msgid="4109929986107147930">"Oviktig avisering"</string> <string name="default_importance" msgid="8192107689995742653">"Vanlig avisering"</string> <string name="high_importance" msgid="1527066195614050263">"Viktig avisering"</string> <string name="max_importance" msgid="5089005872719563894">"Brådskande avisering"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Visa aldrig de här aviseringarna"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Visa längst ned i listan, utan ljud"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Visa aviseringarna utan ljud"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Tillåt ljud för de här aviseringarna"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Visa med snabbtitt på skärmen och tillåt ljud"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Visa högst upp i aviseringslistan och med snabbtitt på skärmen samt tillåt ljud"</string> <string name="notification_more_settings" msgid="816306283396553571">"Fler inställningar"</string> <string name="notification_done" msgid="5279426047273930175">"Klar"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Färg och utseende"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Visa procent under laddning (standard)"</item> <item msgid="3327323682209964956">"Visa inte den här ikonen"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Annat"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Avdelare för delad skärm"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Flytta nedåt"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Flytta uppåt"</string> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 02a193a92e7a..66a14963a823 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -73,8 +73,8 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"ஸ்கிரீன் ஷாட் எடுக்கப்பட்டது."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"உங்கள் ஸ்க்ரீன் ஷாட்டைப் பார்க்க தொடவும்."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"ஸ்க்ரீன் ஷாட்டை எடுக்க முடியவில்லை."</string> - <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"போதுமான சேமிப்பிடம் இல்லாததால் ஸ்கிரீன் ஷாட்டைச் சேமிக்க முடியவில்லை."</string> - <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"பயன்பாடு அல்லது உங்கள் நிறுவனம் ஸ்கிரீன் ஷாட்டுகளை எடுக்க அனுமதிக்கவில்லை."</string> + <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"போதுமான சேமிப்பிடம் இல்லாததால் ஸ்கிரீன்ஷாட்டைச் சேமிக்க முடியவில்லை."</string> + <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"பயன்பாடு அல்லது உங்கள் நிறுவனம் ஸ்கிரீன்ஷாட்டுகளை எடுக்க அனுமதிக்கவில்லை."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB கோப்பு இடமாற்ற விருப்பங்கள்"</string> <string name="use_mtp_button_title" msgid="4333504413563023626">"(MTP) மீடியா பிளேயராக ஏற்று"</string> <string name="use_ptp_button_title" msgid="7517127540301625751">"(PTP) கேமராவாக ஏற்று"</string> @@ -306,7 +306,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"பாதுகாப்புப் பயன்முறையில் <xliff:g id="APP">%s</xliff:g> முடக்கப்பட்டது."</string> <string name="recents_history_button_label" msgid="5153358867807604821">"வரலாறு"</string> <string name="recents_history_clear_all_button_label" msgid="5905258334958006953">"அழி"</string> - <string name="recents_drag_non_dockable_task_message" msgid="2935843902795166158">"பயன்பாடு பல சாளர அம்சத்தை ஆதரிக்காது"</string> + <string name="recents_drag_non_dockable_task_message" msgid="2935843902795166158">"இந்தப் பயன்பாடு பல சாளர அம்சத்தை ஆதரிக்கவில்லை"</string> <string name="recents_launch_non_dockable_task_label" msgid="7862379814938391888">"பயன்பாடு பல சாளர அம்சத்தை ஆதரிக்காது"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"கிடைமட்டமாகப் பிரி"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"செங்குத்தாகப் பிரி"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 33a07ec86716..9b1ea748fca4 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"เวลามากขึ้น"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"เวลาน้อยลง"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ไฟฉายปิดอยู่"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"ไฟฉายไม่พร้อมใช้งาน"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ไฟฉายเปิดอยู่"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ปิดไฟฉายแล้ว"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"เปิดไฟฉายแล้ว"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"เปิดบลูทูธไหม"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"หากต้องการเชื่อมต่อแป้นพิมพ์กับแท็บเล็ต คุณต้องเปิดบลูทูธก่อน"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"เปิด"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"แสดงการแจ้งเตือนโดยไม่ส่งเสียง"</string> + <string name="block" msgid="2734508760962682611">"บล็อกการแจ้งเตือนทั้งหมด"</string> + <string name="do_not_silence" msgid="6878060322594892441">"ไม่ปิดเสียง"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"ไม่ปิดเสียงหรือบล็อก"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"แสดงการตั้งค่าความสำคัญแบบเต็ม"</string> <string name="blocked_importance" msgid="5198578988978234161">"บล็อกแล้ว"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"ความสำคัญน้อย"</string> <string name="low_importance" msgid="4109929986107147930">"ความสำคัญต่ำ"</string> <string name="default_importance" msgid="8192107689995742653">"ความสำคัญปกติ"</string> <string name="high_importance" msgid="1527066195614050263">"ความสำคัญสูง"</string> <string name="max_importance" msgid="5089005872719563894">"ความสำคัญเร่งด่วน"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"ไม่ต้องแสดงการแจ้งเตือนเหล่านี้"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"แสดงที่ด้านล่างของรายการแจ้งเตือนโดยไม่ส่งเสียง"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"แสดงการแจ้งเตือนเหล่านี้โดยไม่ส่งเสียง"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"ให้การแจ้งเตือนเหล่านี้ส่งเสียงได้"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"แสดงบนหน้าจอและให้ส่งเสียงได้"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"แสดงที่ด้านบนของรายการการแจ้งเตือน แสดงบนหน้าจอและให้ส่งเสียงได้"</string> <string name="notification_more_settings" msgid="816306283396553571">"การตั้งค่าเพิ่มเติม"</string> <string name="notification_done" msgid="5279426047273930175">"เสร็จสิ้น"</string> <string name="color_and_appearance" msgid="1254323855964993144">"สีและลักษณะที่ปรากฏ"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"แสดงเปอร์เซ็นต์เมื่อชาร์จ (ค่าเริ่มต้น)"</item> <item msgid="3327323682209964956">"อย่าแสดงไอคอนนี้"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"อื่นๆ"</string> <string name="accessibility_divider" msgid="5903423481953635044">"เส้นแบ่งหน้าจอ"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"เลื่อนลง"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"เลื่อนขึ้น"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 99fa7a2a9b5f..d131c84a8e61 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Higit pang oras."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Mas kaunting oras."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Naka-off ang flashlight."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Hindi available ang flashlight."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Naka-on ang flashlight."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Na-off ang flashlight."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Na-on ang flashlight."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"I-on ang Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Upang ikonekta ang iyong keyboard sa iyong tablet, kailangan mo munang i-on ang Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"I-on"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Tahimik na ipakita ang mga notification"</string> + <string name="block" msgid="2734508760962682611">"I-block ang lahat ng notification"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Huwag i-silent"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Huwag i-silent o i-block"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Ipakita ang kumpletong mga setting ng kahalagahan"</string> <string name="blocked_importance" msgid="5198578988978234161">"Na-block"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Hindi masyadong mahalaga"</string> <string name="low_importance" msgid="4109929986107147930">"Hindi masyadong mahalaga"</string> <string name="default_importance" msgid="8192107689995742653">"Mahalaga"</string> <string name="high_importance" msgid="1527066195614050263">"Napakahalaga"</string> <string name="max_importance" msgid="5089005872719563894">"Mahalagang-mahalaga"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Huwag kailanman ipakita ang mga notification na ito"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Tahimik na ipakita sa ibaba ng listahan ng notification"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Tahimik na ipakita ang mga notification na ito"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Payagan ang mga notification na ito na tumunog"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Palitawin sa screen at payagang tumunog"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Ipakita sa itaas ng listahan ng mga notification, palitawin sa screen at payagang tumunog"</string> <string name="notification_more_settings" msgid="816306283396553571">"Higit pang mga setting"</string> <string name="notification_done" msgid="5279426047273930175">"Tapos Na"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Kulay at hitsura"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Ipakita ang porsyento kapag nagcha-charge (default)"</item> <item msgid="3327323682209964956">"Huwag ipakita ang icon na ito"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Iba pa"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Divider ng split-screen"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Ilipat pababa"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Ilipat pataas"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 050f1f7bfa2a..fd9e14ce2fcb 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Daha uzun süre."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Daha kısa süre."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"El feneri kapalı."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"El feneri kullanılamıyor."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"El feneri açık."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"El feneri kapatıldı."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"El feneri açıldı."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth açılsın mı?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Klavyenizi tabletinize bağlamak için önce Bluetooth\'u açmanız gerekir."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Aç"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Bildirimleri sessizce göster"</string> + <string name="block" msgid="2734508760962682611">"Tüm bildirimleri engelle"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Sessiz moda alma"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Sessiz moda alma veya engelleme"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Tüm önem ayarlarını göster"</string> <string name="blocked_importance" msgid="5198578988978234161">"Engellendi"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Önemi en düşük"</string> <string name="low_importance" msgid="4109929986107147930">"Önem düzeyi düşük"</string> <string name="default_importance" msgid="8192107689995742653">"Önem düzeyi normal"</string> <string name="high_importance" msgid="1527066195614050263">"Önem düzeyi yüksek"</string> <string name="max_importance" msgid="5089005872719563894">"Önem düzeyi acil"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Bu bildirimleri hiçbir zaman gösterme"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Bildirim listesinin en altında sessizce göster"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Bu bildirimleri sessizce göster"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Bu bildirimlerin ses çıkarmasına izin ver"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Ekrana getir ve sesli bildirime izin ver"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Bildirim listesinin üstünde göster, ekrana getir ve sesli bildirime izin ver"</string> <string name="notification_more_settings" msgid="816306283396553571">"Diğer ayarlar"</string> <string name="notification_done" msgid="5279426047273930175">"Bitti"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Renk ve görünüm"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Şarj olurken yüzdeyi göster (varsayılan)"</item> <item msgid="3327323682209964956">"Bu simgeyi gösterme"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Diğer"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Bölünmüş ekran ayırıcı"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Aşağı taşı"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Yukarı taşı"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 485e2b201ebc..e5bf06dd880e 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -209,8 +209,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Більше часу."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Менше часу."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Ліхтарик вимк."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Ліхтарик недоступний."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Ліхтарик увімк."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Ліхтарик вимкнено."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Ліхтарик увімкнено."</string> @@ -458,34 +457,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Увімкнути Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Щоб під’єднати клавіатуру до планшета, спершу потрібно ввімкнути Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Увімкнути"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Показувати сповіщення без звукового сигналу"</string> + <string name="block" msgid="2734508760962682611">"Блокувати всі сповіщення"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Не вимикати звуковий сигнал"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Не вимикати звуковий сигнал і не блокувати"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Показати налаштування пріоритетності"</string> <string name="blocked_importance" msgid="5198578988978234161">"Заблоковано"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Низький пріоритет"</string> <string name="low_importance" msgid="4109929986107147930">"Низький пріоритет"</string> <string name="default_importance" msgid="8192107689995742653">"Стандартний пріоритет"</string> <string name="high_importance" msgid="1527066195614050263">"Високий пріоритет"</string> <string name="max_importance" msgid="5089005872719563894">"Терміново"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Ніколи не показувати ці сповіщення"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Показувати сповіщення внизу списку без звукового сигналу"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Показувати ці сповіщення без звукового сигналу"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Увімкнути звуковий сигнал для цих сповіщень"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Показувати сповіщення на екрані зі звуковим сигналом"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Показувати сповіщення вгорі списку, на екрані та зі звуковим сигналом"</string> <string name="notification_more_settings" msgid="816306283396553571">"Більше налаштувань"</string> <string name="notification_done" msgid="5279426047273930175">"Готово"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Колір і вигляд"</string> @@ -558,8 +546,7 @@ <item msgid="2139628951880142927">"Показувати відсотки під час заряджання (за умовчанням)"</item> <item msgid="3327323682209964956">"Не показувати цей значок"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Інше"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Розділювач екрана"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Перемістити вниз"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Перемістити вгору"</string> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index 20a2a6f5750b..7a10732d832d 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"مزید وقت۔"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"کم وقت۔"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"فلیش لائٹ آف ہے۔"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"فلیش لائٹ دستیاب نہیں ہے"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"فلیش لائٹ آن ہے۔"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"فلیش لائٹ کو آف کر دیا گیا۔"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"فلیش لائٹ کو آن کر دیا گیا۔"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"بلوٹوتھ آن کریں؟"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"اپنے کی بورڈ کو اپنے ٹیبلٹ کے ساتھ منسلک کرنے کیلئے پہلے آپ کو اپنا بلو ٹوتھ آن کرنا ہو گا۔"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"آن کریں"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"اطلاعات خاموشی سے دکھائیں"</string> + <string name="block" msgid="2734508760962682611">"تمام اطلاعات کو مسدود کریں"</string> + <string name="do_not_silence" msgid="6878060322594892441">"خاموش نہ کریں"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"خاموش یا مسدود نہ کریں"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"اہمیت کی پوری ترتیبات دکھائیں"</string> <string name="blocked_importance" msgid="5198578988978234161">"مسدود کردہ"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"کم سے کم اہمیت"</string> <string name="low_importance" msgid="4109929986107147930">"کم اہمیت"</string> <string name="default_importance" msgid="8192107689995742653">"عمومی اہمیت"</string> <string name="high_importance" msgid="1527066195614050263">"زیادہ اہمیت"</string> <string name="max_importance" msgid="5089005872719563894">"فوری اہمیت"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"یہ اطلاعات کبھی مت دکھائیں"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"اطلاعات کی فہرست کے سب سے نیچے خاموشی سے دکھائیں"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"خاموشی سے یہ اطلاعات دکھائیں"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"ان اطلاعات کو آواز نکالنے کی اجازت دیں"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"اسکرین پر دکھائیں اور آواز کی اجازت دیں"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"اطلاعات کی فہرست پر سب سے اوپر دکھائیں، اسکرین پر دکھائیں اور آواز کی اجازت دیں"</string> <string name="notification_more_settings" msgid="816306283396553571">"مزید ترتیبات"</string> <string name="notification_done" msgid="5279426047273930175">"ہوگیا"</string> <string name="color_and_appearance" msgid="1254323855964993144">"رنگ اور ظہور"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"چارج ہوتے وقت فیصد دکھائیں (ڈیفالٹ)"</item> <item msgid="3327323682209964956">"یہ آئیکن نہ دکھائیں"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"دیگر"</string> <string name="accessibility_divider" msgid="5903423481953635044">"سپلٹ اسکرین تقسیم کار"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"نیچے منتقل کریں"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"اوپر منتقل کریں"</string> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 3fc7aad034f9..79729dcf107e 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Ko‘proq vaqt."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kamroq vaqt."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Fonar o‘chirilgan."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Bu yerda fonar yo‘q."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Fonar yoqilgan."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Fonar o‘chirildi."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Fonar yoqildi."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth yoqilsinmi?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Klaviaturani planshetingizga ulash uchun Bluetooth xizmatini yoqishingiz kerak."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Yoqish"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Bildirishnomalar ovozsiz ko‘rsatilsin"</string> + <string name="block" msgid="2734508760962682611">"Barcha bildirishnomalar bloklansin"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ovozi o‘chirilmasin"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Ovozi o‘chirilmasin yoki bloklanmasin"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Barcha muhimlik sozlamalarini ko‘rsatish"</string> <string name="blocked_importance" msgid="5198578988978234161">"Bloklangan"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Kamroq muhim"</string> <string name="low_importance" msgid="4109929986107147930">"Kamroq muhim"</string> <string name="default_importance" msgid="8192107689995742653">"O‘rtacha muhim"</string> <string name="high_importance" msgid="1527066195614050263">"Juda muhim"</string> <string name="max_importance" msgid="5089005872719563894">"Favqulodda muhim"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Bu bildirishnomalar boshqa ko‘rsatilmasin"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Bildirishnomalar ro‘yxatining oxirida ovozsiz ko‘rsatilsin"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Bu bildirishnomalar ovozsiz ko‘rsatilsin"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Bu bildirishnomalar ovoz bilan ko‘rsatilsin"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Barcha oynalar ustida ovoz bilan ko‘rsatilsin"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Bildirishnomalar ro‘yxatining boshida va barcha oynalar ustida ovoz bilan ko‘rsatilsin"</string> <string name="notification_more_settings" msgid="816306283396553571">"Boshqa sozlamalar"</string> <string name="notification_done" msgid="5279426047273930175">"Tayyor"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Rang va ko‘rinishi"</string> @@ -497,7 +485,7 @@ <string name="use_dark_theme" msgid="2900938704964299312">"Android uchun to‘q rangli mavzudan foydalanish"</string> <string name="adjust_tint" msgid="3398569573231409878">"Rang tusini o‘zgartirish"</string> <string name="adjust_brightness" msgid="980039329808178246">"Yorqinlikni o‘zgartirish"</string> - <string name="night_mode_disclaimer" msgid="598914896926759578">"To‘q rangli mavzu Android OS’ning o‘zak sahifalariga ham qo‘llaniladi va bu Sozlamalar kabi och rangli mavzularda odatdagiday ko‘rsatiladi."</string> + <string name="night_mode_disclaimer" msgid="598914896926759578">"To‘q rangli mavzu Android tizimining odatda och rangda ko‘rsatiladigan o‘zak sahifalariga (masalan, Sozlamalar) nisbatan qo‘llaniladi."</string> <string name="color_apply" msgid="9212602012641034283">"Qo‘llash"</string> <string name="color_revert_title" msgid="4746666545480534663">"Sozlamalarni tasdiqlang"</string> <string name="color_revert_message" msgid="9116001069397996691">"Ba’zi rang sozlamalari qurilmadan foydalanishni qiyinlashtirish mumkin. Tanlgan parametrlarni tasdiqlash uchun “OK” tugmasini bosing. Aks holda, ular 10 soniyadan so‘ng qayta tiklanadi."</string> @@ -556,9 +544,8 @@ <item msgid="2139628951880142927">"Quvvat olayotganda foizda ko‘rsatilsin (birlamchi)"</item> <item msgid="3327323682209964956">"Bu belgi boshqa ko‘rsatilmasin"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> - <string name="accessibility_divider" msgid="5903423481953635044">"Ekranni ikkiga bo‘lgich"</string> + <string name="other" msgid="4060683095962566764">"Boshqa"</string> + <string name="accessibility_divider" msgid="5903423481953635044">"Ekranni ikkiga bo‘lish chizig‘i"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Pastga siljitish"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Tepaga siljitish"</string> <string name="accessibility_action_divider_move_left" msgid="9218189832115847253">"Chapga siljitish"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index d48a9e6e056d..f82830626740 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"延长时间。"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"缩短时间。"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"手电筒关闭。"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"无法使用手电筒。"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"手电筒打开。"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"手电筒已关闭。"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"手电筒已打开。"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"要开启蓝牙吗?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"要将您的键盘连接到平板电脑,您必须先开启蓝牙。"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"开启"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"显示通知,但不发出提示音"</string> + <string name="block" msgid="2734508760962682611">"屏蔽所有通知"</string> + <string name="do_not_silence" msgid="6878060322594892441">"不静音"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"不静音或不屏蔽"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"显示完整的重要性设置"</string> <string name="blocked_importance" msgid="5198578988978234161">"屏蔽"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"最低重要性"</string> <string name="low_importance" msgid="4109929986107147930">"重要性:低"</string> <string name="default_importance" msgid="8192107689995742653">"重要性:一般"</string> <string name="high_importance" msgid="1527066195614050263">"重要性:高"</string> <string name="max_importance" msgid="5089005872719563894">"重要性:紧急"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"一律不显示这些通知"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"在通知列表底部显示,但不发出提示音"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"显示这些通知,但不发出提示音"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"允许这些通知发出提示音"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"在屏幕上短暂显示,并发出提示音"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"在通知列表顶部显示,同时在屏幕上短暂显示,并发出提示音"</string> <string name="notification_more_settings" msgid="816306283396553571">"更多设置"</string> <string name="notification_done" msgid="5279426047273930175">"完成"</string> <string name="color_and_appearance" msgid="1254323855964993144">"颜色和外观"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"充电时显示百分比(默认)"</item> <item msgid="3327323682209964956">"不显示此图标"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"其他"</string> <string name="accessibility_divider" msgid="5903423481953635044">"分屏分隔线"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"下移"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"上移"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 609f94d2b7be..bd379b716a74 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"增加時間。"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"減少時間。"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"閃光燈已關閉。"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"無法使用手電筒。"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"閃光燈已開啟。"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"閃光燈已關閉。"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"閃光燈已開啟。"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"要開啟藍牙嗎?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"如要將鍵盤連接至平板電腦,請先開啟藍牙。"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"開啟"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"顯示通知,但不發出音效"</string> + <string name="block" msgid="2734508760962682611">"封鎖所有通知"</string> + <string name="do_not_silence" msgid="6878060322594892441">"不設為靜音"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"不設為靜音或封鎖"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"顯示所有重要性設定"</string> <string name="blocked_importance" msgid="5198578988978234161">"已封鎖"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"最低重要性"</string> <string name="low_importance" msgid="4109929986107147930">"低重要性"</string> <string name="default_importance" msgid="8192107689995742653">"一般重要性"</string> <string name="high_importance" msgid="1527066195614050263">"高重要性"</string> <string name="max_importance" msgid="5089005872719563894">"緊急重要性"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"永不顯示這些通知"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"在通知清單底部顯示但不發出音效"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"顯示這些通知但不發出音效"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"允許這些通知發出音效"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"不時於螢幕出現並發出音效"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"在通知清單頂部顯示,並不時於螢幕出現及發出音效"</string> <string name="notification_more_settings" msgid="816306283396553571">"更多設定"</string> <string name="notification_done" msgid="5279426047273930175">"完成"</string> <string name="color_and_appearance" msgid="1254323855964993144">"顏色和外觀"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"充電時顯示百分比 (預設)"</item> <item msgid="3327323682209964956">"不顯示這個圖示"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"其他"</string> <string name="accessibility_divider" msgid="5903423481953635044">"分割畫面分隔線"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"向下移"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"向上移"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 2188c3c2b920..d580b28d63f5 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"增加時間。"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"減少時間。"</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"閃光燈已關閉。"</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"無法使用手電筒。"</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"閃光燈已開啟。"</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"閃光燈已關閉。"</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"閃光燈已開啟。"</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"要開啟藍牙功能嗎?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"如要將鍵盤連線到平板電腦,您必須先開啟藍牙。"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"開啟"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"顯示通知,但不發出任何音效"</string> + <string name="block" msgid="2734508760962682611">"封鎖所有通知"</string> + <string name="do_not_silence" msgid="6878060322594892441">"不設定靜音"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"不設定靜音或封鎖"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"顯示完整的重要性設定"</string> <string name="blocked_importance" msgid="5198578988978234161">"封鎖"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"最低重要性"</string> <string name="low_importance" msgid="4109929986107147930">"低重要性"</string> <string name="default_importance" msgid="8192107689995742653">"一般重要性"</string> <string name="high_importance" msgid="1527066195614050263">"高重要性"</string> <string name="max_importance" msgid="5089005872719563894">"緊急重要性"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"一律不顯示這些通知"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"顯示在通知清單底端,但不發出任何音效"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"顯示這些通知,但不發出任何音效"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"允許這些通知發出音效"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"短暫顯示在畫面上並發出音效"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"顯示在通知清單頂端,同時短暫顯示在畫面上並發出音效"</string> <string name="notification_more_settings" msgid="816306283396553571">"更多設定"</string> <string name="notification_done" msgid="5279426047273930175">"完成"</string> <string name="color_and_appearance" msgid="1254323855964993144">"顏色和外觀"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"充電時顯示百分比 (預設)"</item> <item msgid="3327323682209964956">"不顯示這個圖示"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"其他"</string> <string name="accessibility_divider" msgid="5903423481953635044">"分割畫面分隔線"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"向下移"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"向上移"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 69c85ab94e6c..9382b260f1df 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -207,8 +207,7 @@ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Isikhathi esiningi."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Isikhathi esincane."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"I-Flashlight ivaliwe."</string> - <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> - <skip /> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"I-Flashlight ayitholakali."</string> <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"I-Flashlight ivuliwe."</string> <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"I-Flashlight ivaliwe."</string> <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"I-Flashlight ivuliwe."</string> @@ -456,34 +455,23 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vula i-Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Ukuze uxhume ikhibhodi yakho nethebhulethi yakho, kufanele uqale ngokuvula i-Bluetooth."</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"Vula"</string> - <!-- no translation found for show_silently (6841966539811264192) --> - <skip /> - <!-- no translation found for block (2734508760962682611) --> - <skip /> - <!-- no translation found for do_not_silence (6878060322594892441) --> - <skip /> - <!-- no translation found for do_not_silence_block (4070647971382232311) --> - <skip /> - <!-- no translation found for tuner_full_importance_settings (8103289238676424226) --> - <skip /> + <string name="show_silently" msgid="6841966539811264192">"Bonisa izaziso ngokuthulile"</string> + <string name="block" msgid="2734508760962682611">"Vimbela zonke izaziso"</string> + <string name="do_not_silence" msgid="6878060322594892441">"Ungathulisi"</string> + <string name="do_not_silence_block" msgid="4070647971382232311">"Ungathulisi noma uvimbele"</string> + <string name="tuner_full_importance_settings" msgid="8103289238676424226">"Bonisa izilungiselelo ezibalulekile ezigcwele"</string> <string name="blocked_importance" msgid="5198578988978234161">"Kuvinjelwe"</string> - <!-- no translation found for min_importance (1901894910809414782) --> - <skip /> + <string name="min_importance" msgid="1901894910809414782">"Okubaluleke kancane"</string> <string name="low_importance" msgid="4109929986107147930">"Ukubaluleka okuphansi"</string> <string name="default_importance" msgid="8192107689995742653">"Ukubaluleka okujwayelekile"</string> <string name="high_importance" msgid="1527066195614050263">"Ukubaluleka okuphezulu"</string> <string name="max_importance" msgid="5089005872719563894">"Ukubaluleka okusheshayo"</string> <string name="notification_importance_blocked" msgid="2397192642657872872">"Ungalokothi ubonise lezi zaziso"</string> - <!-- no translation found for notification_importance_min (1938190340516905748) --> - <skip /> - <!-- no translation found for notification_importance_low (3657252049508213048) --> - <skip /> - <!-- no translation found for notification_importance_default (4466466472622442175) --> - <skip /> - <!-- no translation found for notification_importance_high (2135428926525093825) --> - <skip /> - <!-- no translation found for notification_importance_max (5806278962376556491) --> - <skip /> + <string name="notification_importance_min" msgid="1938190340516905748">"Bonisa ngokuthulile ngaphansi kohlu lwesaziso"</string> + <string name="notification_importance_low" msgid="3657252049508213048">"Bonisa ngokuthulile lezi zaziso"</string> + <string name="notification_importance_default" msgid="4466466472622442175">"Vumela lezi zaziso ukwenza umsindo"</string> + <string name="notification_importance_high" msgid="2135428926525093825">"Beka kusikrini futhi uvumele umsindo"</string> + <string name="notification_importance_max" msgid="5806278962376556491">"Bonisa phezulu kohlu lwezaziso, beka phezu kwesikrini futhi uvumele umsindo"</string> <string name="notification_more_settings" msgid="816306283396553571">"Izilungiselelo eziningi"</string> <string name="notification_done" msgid="5279426047273930175">"Kwenziwe"</string> <string name="color_and_appearance" msgid="1254323855964993144">"Umbala nokubonakala"</string> @@ -556,8 +544,7 @@ <item msgid="2139628951880142927">"Bonisa iphesentheji uma ishaja (okuzenzakalelayo)"</item> <item msgid="3327323682209964956">"Ungabonisi lesi sithonjana"</item> </string-array> - <!-- no translation found for other (4060683095962566764) --> - <skip /> + <string name="other" msgid="4060683095962566764">"Okunye"</string> <string name="accessibility_divider" msgid="5903423481953635044">"Isihlukanisi sokuhlukanisa isikrini"</string> <string name="accessibility_action_divider_move_down" msgid="704893304141890042">"Iya phansi"</string> <string name="accessibility_action_divider_move_up" msgid="4580103171609248006">"Iya phezulu"</string> diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index 189eb3be302a..e040ab26f97a 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -93,5 +93,9 @@ <attr name="defValue" format="boolean" /> <attr name="metricsAction" format="integer" /> </declare-styleable> + + <declare-styleable name="DensityContainer"> + <attr name="android:layout" /> + </declare-styleable> </resources> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 8f69bbb16000..30acc72abae5 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -31,7 +31,7 @@ <color name="batterymeter_bolt_color">#FFFFFFFF</color> <color name="qs_batterymeter_frame_color">#FF404040</color> <color name="system_primary_color">#ff263238</color><!-- blue grey 900 --> - <color name="system_secondary_color">#ff384248</color> + <color name="system_secondary_color">#ff37474F</color><!-- blue grey 800 --> <color name="system_accent_color">#ff80CBC4</color><!-- deep teal 200 --> <color name="system_warning_color">#fff4511e</color><!-- deep orange 600 --> <color name="qs_text">#FFFFFFFF</color> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index a51b9317db6a..11df6817d7af 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -214,7 +214,7 @@ <style name="QSBorderlessButton"> <item name="android:padding">12dp</item> - <item name="android:background">@drawable/btn_borderless_rect</item> + <item name="android:background">@drawable/qs_btn_borderless_rect</item> <item name="android:gravity">center</item> </style> diff --git a/packages/SystemUI/src/com/android/systemui/DensityContainer.java b/packages/SystemUI/src/com/android/systemui/DensityContainer.java new file mode 100644 index 000000000000..2e3cb4977488 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/DensityContainer.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui; + +import android.annotation.Nullable; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; + +import java.util.ArrayList; +import java.util.List; + +public class DensityContainer extends FrameLayout { + + private final List<InflateListener> mInflateListeners = new ArrayList<>(); + private final int mLayout; + private int mDensity; + + public DensityContainer(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + + mDensity = context.getResources().getConfiguration().densityDpi; + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DensityContainer); + if (!a.hasValue(R.styleable.DensityContainer_android_layout)) { + throw new IllegalArgumentException("DensityContainer must contain a layout"); + } + mLayout = a.getResourceId(R.styleable.DensityContainer_android_layout, 0); + inflateLayout(); + } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + int density = newConfig.densityDpi; + if (density != mDensity) { + mDensity = density; + inflateLayout(); + } + } + + private void inflateLayout() { + removeAllViews(); + LayoutInflater.from(getContext()).inflate(mLayout, this); + final int N = mInflateListeners.size(); + for (int i = 0; i < N; i++) { + mInflateListeners.get(i).onInflated(getChildAt(0)); + } + } + + public void addInflateListener(InflateListener listener) { + mInflateListeners.add(listener); + listener.onInflated(getChildAt(0)); + } + + public interface InflateListener { + /** + * Called whenever a new view is inflated. + */ + void onInflated(View v); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java index ea7270ddb487..4b775a5a61e4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java +++ b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java @@ -38,7 +38,9 @@ import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings.Secure; import android.text.TextUtils; +import android.util.Pair; import android.util.Slog; +import android.widget.Toast; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.CachedBluetoothDevice; @@ -46,6 +48,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.LocalBluetoothAdapter; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; +import com.android.settingslib.bluetooth.Utils; import com.android.systemui.R; import com.android.systemui.SystemUI; @@ -76,8 +79,9 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha private static final int STATE_WAITING_FOR_BLUETOOTH = 4; private static final int STATE_PAIRING = 5; private static final int STATE_PAIRED = 6; - private static final int STATE_USER_CANCELLED = 7; - private static final int STATE_DEVICE_NOT_FOUND = 8; + private static final int STATE_PAIRING_FAILED = 7; + private static final int STATE_USER_CANCELLED = 8; + private static final int STATE_DEVICE_NOT_FOUND = 9; private static final int MSG_INIT = 0; private static final int MSG_ON_BOOT_COMPLETED = 1; @@ -90,6 +94,7 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha private static final int MSG_SHOW_BLUETOOTH_DIALOG = 8; private static final int MSG_DISMISS_BLUETOOTH_DIALOG = 9; private static final int MSG_BLE_ABORT_SCAN = 10; + private static final int MSG_SHOW_ERROR = 11; private volatile KeyboardHandler mHandler; private volatile KeyboardUIHandler mUIHandler; @@ -178,6 +183,7 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha mLocalBluetoothAdapter = bluetoothManager.getBluetoothAdapter(); mProfileManager = bluetoothManager.getProfileManager(); bluetoothManager.getEventManager().registerCallback(new BluetoothCallbackHandler()); + Utils.setErrorListener(new BluetoothErrorListener()); InputManager im = context.getSystemService(InputManager.class); im.registerOnTabletModeChangedListener(this, mHandler); @@ -204,13 +210,15 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha if (mInTabletMode != InputManager.SWITCH_STATE_OFF) { if (mState == STATE_WAITING_FOR_DEVICE_DISCOVERY) { stopScanning(); + } else if (mState == STATE_WAITING_FOR_BLUETOOTH) { + mUIHandler.sendEmptyMessage(MSG_DISMISS_BLUETOOTH_DIALOG); } mState = STATE_WAITING_FOR_TABLET_MODE_EXIT; return; } final int btState = mLocalBluetoothAdapter.getState(); - if (btState == BluetoothAdapter.STATE_TURNING_ON || btState == BluetoothAdapter.STATE_ON + if ((btState == BluetoothAdapter.STATE_TURNING_ON || btState == BluetoothAdapter.STATE_ON) && mState == STATE_WAITING_FOR_BLUETOOTH) { // If we're waiting for bluetooth but it has come on in the meantime, or is coming // on, just dismiss the dialog. This frequently happens during device startup. @@ -334,7 +342,10 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha private void stopScanning() { if (mScanCallback != null) { - mLocalBluetoothAdapter.getBluetoothLeScanner().stopScan(mScanCallback); + BluetoothLeScanner scanner = mLocalBluetoothAdapter.getBluetoothLeScanner(); + if (scanner != null) { + scanner.stopScan(mScanCallback); + } mScanCallback = null; } } @@ -370,10 +381,14 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha // Should only be called on the handler thread private void onDeviceBondStateChangedInternal(CachedBluetoothDevice d, int bondState) { - if (d.getName().equals(mKeyboardName) && bondState == BluetoothDevice.BOND_BONDED) { - // We don't need to manually connect to the device here because it will automatically - // try to connect after it has been paired. - mState = STATE_PAIRED; + if (mState == STATE_PAIRING && d.getName().equals(mKeyboardName)) { + if (bondState == BluetoothDevice.BOND_BONDED) { + // We don't need to manually connect to the device here because it will + // automatically try to connect after it has been paired. + mState = STATE_PAIRED; + } else if (bondState == BluetoothDevice.BOND_NONE) { + mState = STATE_PAIRING_FAILED; + } } } @@ -385,6 +400,17 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha } } + // Should only be called on the handler thread. We want to be careful not to show errors for + // pairings not initiated by this UI, so we only pop up the toast when we're at an appropriate + // point in our pairing flow and it's the expected device. + private void onShowErrorInternal(Context context, String name, int messageResId) { + if ((mState == STATE_PAIRING || mState == STATE_PAIRING_FAILED) + && mKeyboardName.equals(name)) { + String message = context.getString(messageResId, name); + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + } + } + private final class KeyboardUIHandler extends Handler { public KeyboardUIHandler() { super(Looper.getMainLooper(), null, true /*async*/); @@ -393,19 +419,27 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha public void handleMessage(Message msg) { switch(msg.what) { case MSG_SHOW_BLUETOOTH_DIALOG: { - DialogInterface.OnClickListener listener = new BluetoothDialogClickListener(); + if (mDialog != null) { + // Don't show another dialog if one is already present + break; + } + DialogInterface.OnClickListener clickListener = + new BluetoothDialogClickListener(); + DialogInterface.OnDismissListener dismissListener = + new BluetoothDialogDismissListener(); mDialog = new BluetoothDialog(mContext); mDialog.setTitle(R.string.enable_bluetooth_title); mDialog.setMessage(R.string.enable_bluetooth_message); - mDialog.setPositiveButton(R.string.enable_bluetooth_confirmation_ok, listener); - mDialog.setNegativeButton(android.R.string.cancel, listener); + mDialog.setPositiveButton( + R.string.enable_bluetooth_confirmation_ok, clickListener); + mDialog.setNegativeButton(android.R.string.cancel, clickListener); + mDialog.setOnDismissListener(dismissListener); mDialog.show(); break; } case MSG_DISMISS_BLUETOOTH_DIALOG: { if (mDialog != null) { mDialog.dismiss(); - mDialog = null; } break; } @@ -469,6 +503,10 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha onBleScanFailedInternal(); break; } + case MSG_SHOW_ERROR: { + Pair<Context, String> p = (Pair<Context, String>) msg.obj; + onShowErrorInternal(p.first, p.second, msg.arg1); + } } } } @@ -482,6 +520,14 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha } } + private final class BluetoothDialogDismissListener + implements DialogInterface.OnDismissListener { + @Override + public void onDismiss(DialogInterface dialog) { + mDialog = null; + } + } + private final class KeyboardScanCallback extends ScanCallback { private boolean isDeviceDiscoverable(ScanResult result) { @@ -564,6 +610,13 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) { } } + private final class BluetoothErrorListener implements Utils.ErrorListener { + public void onShowError(Context context, String name, int messageResId) { + mHandler.obtainMessage(MSG_SHOW_ERROR, messageResId, 0 /*unused*/, + new Pair<>(context, name)).sendToTarget(); + } + } + private static String stateToString(int state) { switch (state) { case STATE_NOT_ENABLED: @@ -580,13 +633,15 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha return "STATE_PAIRING"; case STATE_PAIRED: return "STATE_PAIRED"; + case STATE_PAIRING_FAILED: + return "STATE_PAIRING_FAILED"; case STATE_USER_CANCELLED: return "STATE_USER_CANCELLED"; case STATE_DEVICE_NOT_FOUND: return "STATE_DEVICE_NOT_FOUND"; case STATE_UNKNOWN: default: - return "STATE_UNKNOWN"; + return "STATE_UNKNOWN (" + state + ")"; } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 2c5cb89b3531..8ccf60d38650 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -77,7 +77,9 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { @Override public int getOffsetTop(TileRecord tile) { - return ((ViewGroup) tile.tileView.getParent()).getTop() + getTop(); + final ViewGroup parent = (ViewGroup) tile.tileView.getParent(); + if (parent == null) return 0; + return parent.getTop() + getTop(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSIconView.java b/packages/SystemUI/src/com/android/systemui/qs/QSIconView.java index 267ed16d2d07..546f8c3c95af 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSIconView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSIconView.java @@ -23,7 +23,6 @@ import android.graphics.drawable.Drawable; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; - import android.widget.ImageView.ScaleType; import com.android.systemui.R; @@ -34,6 +33,7 @@ public class QSIconView extends ViewGroup { private final View mIcon; private final int mIconSizePx; private final int mTilePaddingBelowIconPx; + private boolean mAnimationEnabled = true; public QSIconView(Context context) { super(context); @@ -46,6 +46,10 @@ public class QSIconView extends ViewGroup { addView(mIcon); } + public void disableAnimation() { + mAnimationEnabled = false; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int w = MeasureSpec.getSize(widthMeasureSpec); @@ -69,7 +73,9 @@ public class QSIconView extends ViewGroup { protected void setIcon(ImageView iv, QSTile.State state) { if (!Objects.equals(state.icon, iv.getTag(R.id.qs_icon_tag))) { - Drawable d = state.icon != null ? state.icon.getDrawable(mContext) : null; + Drawable d = state.icon != null + ? iv.isShown() && mAnimationEnabled ? state.icon.getDrawable(mContext) + : state.icon.getInvisibleDrawable(mContext) : null; int padding = state.icon != null ? state.icon.getPadding() : null; if (d != null && state.autoMirrorDrawable) { d.setAutoMirrored(true); @@ -77,7 +83,7 @@ public class QSIconView extends ViewGroup { iv.setImageDrawable(d); iv.setTag(R.id.qs_icon_tag, state.icon); iv.setPadding(0, padding, 0, padding); - if (d instanceof Animatable) { + if (d instanceof Animatable && iv.isShown()) { Animatable a = (Animatable) d; a.start(); if (!iv.isShown()) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 30a985052bc2..71c1913d94e6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -31,6 +31,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.R; import com.android.systemui.qs.QSTile.DetailAdapter; +import com.android.systemui.qs.QSTile.Host.Callback; import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.qs.external.CustomTile; import com.android.systemui.settings.BrightnessController; @@ -44,7 +45,7 @@ import java.util.ArrayList; import java.util.Collection; /** View that represents the quick settings tile panel. **/ -public class QSPanel extends LinearLayout implements Tunable { +public class QSPanel extends LinearLayout implements Tunable, Callback { public static final String QS_SHOW_BRIGHTNESS = "qs_show_brightness"; @@ -123,10 +124,16 @@ public class QSPanel extends LinearLayout implements Tunable { @Override protected void onDetachedFromWindow() { TunerService.get(mContext).removeTunable(this); + mHost.removeCallback(this); super.onDetachedFromWindow(); } @Override + public void onTilesChanged() { + setTiles(mHost.getTiles()); + } + + @Override public void onTuningChanged(String key, String newValue) { if (QS_SHOW_BRIGHTNESS.equals(key)) { mBrightnessView.setVisibility(newValue == null || Integer.parseInt(newValue) != 0 @@ -168,6 +175,8 @@ public class QSPanel extends LinearLayout implements Tunable { public void setHost(QSTileHost host) { mHost = host; + mHost.addCallback(this); + setTiles(mHost.getTiles()); mFooter.setHost(host); createCustomizePanel(); } @@ -272,7 +281,7 @@ public class QSPanel extends LinearLayout implements Tunable { } } - private void drawTile(TileRecord r, QSTile.State state) { + protected void drawTile(TileRecord r, QSTile.State state) { r.tileView.onStateChanged(state); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index df622b8f374c..42e98aa1ee01 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -390,6 +390,7 @@ public abstract class QSTile<TState extends State> implements Listenable { Context getContext(); Collection<QSTile<?>> getTiles(); void addCallback(Callback callback); + void removeCallback(Callback callback); BluetoothController getBluetoothController(); LocationController getLocationController(); RotationLockController getRotationLockController(); @@ -416,6 +417,10 @@ public abstract class QSTile<TState extends State> implements Listenable { public static abstract class Icon { abstract public Drawable getDrawable(Context context); + public Drawable getInvisibleDrawable(Context context) { + return getDrawable(context); + } + @Override public int hashCode() { return Icon.class.hashCode(); @@ -437,6 +442,11 @@ public abstract class QSTile<TState extends State> implements Listenable { public Drawable getDrawable(Context context) { return mDrawable; } + + @Override + public Drawable getInvisibleDrawable(Context context) { + return mDrawable; + } } public static class ResourceIcon extends Icon { @@ -463,6 +473,11 @@ public abstract class QSTile<TState extends State> implements Listenable { } @Override + public Drawable getInvisibleDrawable(Context context) { + return context.getDrawable(mResId); + } + + @Override public boolean equals(Object o) { return o instanceof ResourceIcon && ((ResourceIcon) o).mResId == mResId; } @@ -474,14 +489,17 @@ public abstract class QSTile<TState extends State> implements Listenable { } protected class AnimationIcon extends ResourceIcon { - public AnimationIcon(int resId) { - super(resId); + private final int mAnimatedResId; + + public AnimationIcon(int resId, int staticResId) { + super(staticResId); + mAnimatedResId = resId; } @Override public Drawable getDrawable(Context context) { // workaround: get a clean state for every new AVD - return context.getDrawable(mResId).getConstantState().newDrawable(); + return context.getDrawable(mAnimatedResId).getConstantState().newDrawable(); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java index f35aacf8f72d..9e40cfd91ebb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java @@ -48,7 +48,7 @@ public class QSTileBaseView extends LinearLayout { // Default to Quick Tile padding, and QSTileView will specify its own padding. int padding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding); - setPadding(padding, padding, padding, padding); + setPadding(0, padding, 0, padding); setClipChildren(false); setClipToPadding(false); } @@ -113,7 +113,7 @@ public class QSTileBaseView extends LinearLayout { setContentDescription(state.contentDescription); } - View getIcon() { + public QSIconView getIcon() { return mIcon; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 4408dbf236bf..8b826eea4285 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -24,6 +24,8 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.Space; import com.android.systemui.R; +import com.android.systemui.qs.QSTile.SignalState; +import com.android.systemui.qs.QSTile.State; import java.util.ArrayList; import java.util.Collection; @@ -60,6 +62,19 @@ public class QuickQSPanel extends QSPanel { } @Override + protected void drawTile(TileRecord r, State state) { + if (state instanceof SignalState) { + State copy = r.tile.newTileState(); + state.copyTo(copy); + // No activity shown in the quick panel. + ((SignalState) copy).activityIn = false; + ((SignalState) copy).activityOut = false; + state = copy; + } + super.drawTile(r, state); + } + + @Override protected void showDetail(boolean show, Record r) { // Do nothing, will be handled by the QSPanel. } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 67fe8e5e2c54..5e02428a3dc2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -77,17 +77,17 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene TypedValue value = new TypedValue(); mContext.getTheme().resolveAttribute(android.R.attr.homeAsUpIndicator, value, true); mToolbar.setNavigationIcon( - getResources().getDrawable(R.drawable.ic_close_white, mContext.getTheme())); + getResources().getDrawable(value.resourceId, mContext.getTheme())); mToolbar.setNavigationOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - save(); hide((int) v.getX() + v.getWidth() / 2, (int) v.getY() + v.getHeight() / 2); } }); mToolbar.setOnMenuItemClickListener(this); mToolbar.getMenu().add(Menu.NONE, MENU_RESET, 0, mContext.getString(com.android.internal.R.string.reset)); + mToolbar.setTitle(R.string.qs_edit); mRecyclerView = (RecyclerView) findViewById(android.R.id.list); mTileAdapter = new TileAdapter(getContext()); @@ -115,6 +115,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene public void hide(int x, int y) { if (isShown) { isShown = false; + save(); mClipper.animateCircularClip(x, y, false, mCollapseAnimationListener); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index c6c497ffde75..aba9251e4bb8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -27,7 +27,6 @@ import android.support.v7.widget.helper.ItemTouchHelper; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.systemui.R; @@ -159,13 +158,6 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta TileInfo info = mTiles.get(position); holder.mTileView.onStateChanged(info.state); - holder.mTileView.setOnTouchListener(new OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - mItemTouchHelper.startDrag(holder); - return true; - } - }); } public SpanSizeLookup getSizeLookup() { @@ -179,6 +171,8 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta super(itemView); if (itemView instanceof FrameLayout) { mTileView = (QSTileView) ((FrameLayout) itemView).getChildAt(0); + mTileView.setBackground(null); + mTileView.getIcon().disableAnimation(); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index f0860fe181d3..89f1985b3f75 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -33,9 +33,11 @@ import com.android.systemui.qs.QSTile; /** Quick settings tile: Airplane mode **/ public class AirplaneModeTile extends QSTile<QSTile.BooleanState> { private final AnimationIcon mEnable = - new AnimationIcon(R.drawable.ic_signal_airplane_enable_animation); + new AnimationIcon(R.drawable.ic_signal_airplane_enable_animation, + R.drawable.ic_signal_airplane_disable); private final AnimationIcon mDisable = - new AnimationIcon(R.drawable.ic_signal_airplane_disable_animation); + new AnimationIcon(R.drawable.ic_signal_airplane_disable_animation, + R.drawable.ic_signal_airplane_enable); private final GlobalSetting mSetting; private boolean mListening; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java index 39d14473b271..548bffd7af16 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java @@ -172,6 +172,7 @@ public class BatteryTile extends QSTile<QSTile.State> implements BatteryControll } private void postBindView() { + if (mCurrentView == null) return; mCurrentView.post(new Runnable() { @Override public void run() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java index 42ce69c57978..a608316f8f72 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java @@ -30,9 +30,11 @@ import com.android.systemui.qs.SecureSetting; public class ColorInversionTile extends QSTile<QSTile.BooleanState> { private final AnimationIcon mEnable - = new AnimationIcon(R.drawable.ic_invert_colors_enable_animation); + = new AnimationIcon(R.drawable.ic_invert_colors_enable_animation, + R.drawable.ic_invert_colors_disable); private final AnimationIcon mDisable - = new AnimationIcon(R.drawable.ic_invert_colors_disable_animation); + = new AnimationIcon(R.drawable.ic_invert_colors_disable_animation, + R.drawable.ic_invert_colors_enable); private final SecureSetting mSetting; private boolean mListening; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index 8982b3e1de13..8b2286842971 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -56,9 +56,11 @@ public class DndTile extends QSTile<QSTile.BooleanState> { ResourceIcon.get(R.drawable.ic_qs_dnd_on_total_silence); private final AnimationIcon mDisable = - new AnimationIcon(R.drawable.ic_dnd_disable_animation); + new AnimationIcon(R.drawable.ic_dnd_disable_animation, + R.drawable.ic_qs_dnd_off); private final AnimationIcon mDisableTotalSilence = - new AnimationIcon(R.drawable.ic_dnd_total_silence_disable_animation); + new AnimationIcon(R.drawable.ic_dnd_total_silence_disable_animation, + R.drawable.ic_qs_dnd_off); private final ZenModeController mController; private final DndDetailAdapter mDetailAdapter; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java index e4e379058399..a01a9a5f68cb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java @@ -33,9 +33,11 @@ public class FlashlightTile extends QSTile<QSTile.BooleanState> implements FlashlightController.FlashlightListener { private final AnimationIcon mEnable - = new AnimationIcon(R.drawable.ic_signal_flashlight_enable_animation); + = new AnimationIcon(R.drawable.ic_signal_flashlight_enable_animation, + R.drawable.ic_signal_flashlight_disable); private final AnimationIcon mDisable - = new AnimationIcon(R.drawable.ic_signal_flashlight_disable_animation); + = new AnimationIcon(R.drawable.ic_signal_flashlight_disable_animation, + R.drawable.ic_signal_flashlight_enable); private final FlashlightController mFlashlightController; public FlashlightTile(Host host) { @@ -69,6 +71,11 @@ public class FlashlightTile extends QSTile<QSTile.BooleanState> implements } @Override + public boolean isAvailable() { + return mFlashlightController.hasFlashlight(); + } + + @Override protected void handleClick() { if (ActivityManager.isUserAMonkey()) { return; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index ad1c7a0acf01..da931209dc19 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -29,9 +29,11 @@ import com.android.systemui.statusbar.policy.HotspotController; /** Quick settings tile: Hotspot **/ public class HotspotTile extends QSTile<QSTile.BooleanState> { private final AnimationIcon mEnable = - new AnimationIcon(R.drawable.ic_hotspot_enable_animation); + new AnimationIcon(R.drawable.ic_hotspot_enable_animation, + R.drawable.ic_hotspot_disable); private final AnimationIcon mDisable = - new AnimationIcon(R.drawable.ic_hotspot_disable_animation); + new AnimationIcon(R.drawable.ic_hotspot_disable_animation, + R.drawable.ic_hotspot_enable); private final HotspotController mController; private final Callback mCallback = new Callback(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java index 65332529d881..b1d1c77f9d09 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java @@ -32,9 +32,11 @@ import com.android.systemui.statusbar.policy.LocationController.LocationSettings public class LocationTile extends QSTile<QSTile.BooleanState> { private final AnimationIcon mEnable = - new AnimationIcon(R.drawable.ic_signal_location_enable_animation); + new AnimationIcon(R.drawable.ic_signal_location_enable_animation, + R.drawable.ic_signal_location_disable); private final AnimationIcon mDisable = - new AnimationIcon(R.drawable.ic_signal_location_disable_animation); + new AnimationIcon(R.drawable.ic_signal_location_disable_animation, + R.drawable.ic_signal_location_enable); private final LocationController mController; private final KeyguardMonitor mKeyguard; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java index b267ccd1ec46..d80ca104f59b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java @@ -31,14 +31,18 @@ import com.android.systemui.statusbar.policy.RotationLockController.RotationLock /** Quick settings tile: Rotation **/ public class RotationLockTile extends QSTile<QSTile.BooleanState> { private final AnimationIcon mPortraitToAuto - = new AnimationIcon(R.drawable.ic_portrait_to_auto_rotate_animation); + = new AnimationIcon(R.drawable.ic_portrait_to_auto_rotate_animation, + R.drawable.ic_portrait_from_auto_rotate); private final AnimationIcon mAutoToPortrait - = new AnimationIcon(R.drawable.ic_portrait_from_auto_rotate_animation); + = new AnimationIcon(R.drawable.ic_portrait_from_auto_rotate_animation, + R.drawable.ic_portrait_to_auto_rotate); private final AnimationIcon mLandscapeToAuto - = new AnimationIcon(R.drawable.ic_landscape_to_auto_rotate_animation); + = new AnimationIcon(R.drawable.ic_landscape_to_auto_rotate_animation, + R.drawable.ic_landscape_from_auto_rotate); private final AnimationIcon mAutoToLandscape - = new AnimationIcon(R.drawable.ic_landscape_from_auto_rotate_animation); + = new AnimationIcon(R.drawable.ic_landscape_from_auto_rotate_animation, + R.drawable.ic_landscape_to_auto_rotate); private final RotationLockController mController; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java index 003e9c15ad43..421a2cf9cc51 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java @@ -28,9 +28,11 @@ import com.android.systemui.statusbar.phone.ManagedProfileController; public class WorkModeTile extends QSTile<QSTile.BooleanState> implements ManagedProfileController.Callback { private final AnimationIcon mEnable = - new AnimationIcon(R.drawable.ic_signal_workmode_enable_animation); + new AnimationIcon(R.drawable.ic_signal_workmode_enable_animation, + R.drawable.ic_signal_workmode_disable); private final AnimationIcon mDisable = - new AnimationIcon(R.drawable.ic_signal_workmode_disable_animation); + new AnimationIcon(R.drawable.ic_signal_workmode_disable_animation, + R.drawable.ic_signal_workmode_enable); private final ManagedProfileController mProfileController; diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index c41098f3c0ee..d7c12ba329f3 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -636,7 +636,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD // Focus the next task EventBus.getDefault().send(new FocusNextTaskViewEvent(timerIndicatorDuration)); - MetricsLogger.action(this, MetricsEvent.OVERVIEW_PAGE); + MetricsLogger.action(this, MetricsEvent.ACTION_OVERVIEW_PAGE); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 28b2faed58fb..86b03c850da4 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -568,11 +568,14 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener // Make sure we inform DividerView before we actually start the activity so we can change // the resize mode already. - EventBus.getDefault().send(new DockingTopTaskEvent(dragMode)); - ssp.moveTaskToDockedStack(topTaskId, stackCreateMode, initialBounds); - showRecents(false /* triggeredFromAltTab */, - dragMode == NavigationBarGestureHelper.DRAG_MODE_RECENTS, false /* animate */, - true /* reloadTasks*/); + if (ssp.moveTaskToDockedStack(topTaskId, stackCreateMode, initialBounds)) { + EventBus.getDefault().send(new DockingTopTaskEvent(dragMode)); + showRecents( + false /* triggeredFromAltTab */, + dragMode == NavigationBarGestureHelper.DRAG_MODE_RECENTS, + false /* animate */, + true /* reloadTasks*/); + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java index d7b9b9e71d69..5eeda72637ea 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java @@ -161,7 +161,7 @@ public class RecentsHistoryAdapter extends RecyclerView.Adapter<RecentsHistoryAd ssp.startActivityFromRecents(v.getContext(), task.key.id, task.title, ActivityOptions.makeBasic()); - MetricsLogger.action(v.getContext(), MetricsEvent.OVERVIEW_SELECT, + MetricsLogger.action(v.getContext(), MetricsEvent.ACTION_OVERVIEW_SELECT, task.key.getComponent().toString()); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index 4b29c2986e4d..7c5a931eee09 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -338,15 +338,18 @@ public class SystemServicesProxy { } /** Docks an already resumed task to the side of the screen. */ - public void moveTaskToDockedStack(int taskId, int createMode, Rect initialBounds) { - if (mIam == null) return; + public boolean moveTaskToDockedStack(int taskId, int createMode, Rect initialBounds) { + if (mIam == null) { + return false; + } try { - mIam.moveTaskToDockedStack(taskId, createMode, true /* onTop */, false /* animate */, - initialBounds); + return mIam.moveTaskToDockedStack( + taskId, createMode, true /* onTop */, false /* animate */, initialBounds); } catch (RemoteException e) { e.printStackTrace(); } + return false; } /** Returns the focused stack id. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java index 6fef8a24fff3..abcb563339aa 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java @@ -133,7 +133,6 @@ public class RecentsTaskLoadPlan { SparseIntArray affiliatedTaskCounts = new SparseIntArray(); String dismissDescFormat = mContext.getString( R.string.accessibility_recents_item_will_be_dismissed); - Formatter dismissDescFormatter = new Formatter(); long lastStackActiveTime = Prefs.getLong(mContext, Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, 0); if (RecentsDebugFlags.Static.EnableMockTasks) { @@ -184,8 +183,7 @@ public class RecentsTaskLoadPlan { ActivityInfo info = loader.getAndUpdateActivityInfo(taskKey); String title = loader.getAndUpdateActivityTitle(taskKey, t.taskDescription); String contentDescription = loader.getAndUpdateContentDescription(taskKey, res); - String dismissDescription = dismissDescFormatter.format(dismissDescFormat, - contentDescription).toString(); + String dismissDescription = String.format(dismissDescFormat, contentDescription); Drawable icon = isStackTask ? loader.getAndUpdateActivityIcon(taskKey, t.taskDescription, res, false) : null; diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java index 2cd0c19a4352..d152010c71c8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java @@ -20,8 +20,8 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.content.res.Resources; -import android.graphics.Path; import android.graphics.RectF; +import android.util.Log; import android.view.View; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; @@ -441,11 +441,13 @@ public class TaskStackAnimationHelper { TaskStackViewScroller stackScroller = mStackView.getScroller(); TaskStack stack = mStackView.getStack(); + final float curScroll = stackScroller.getStackScroll(); final float newScroll = stackLayout.getStackScrollForTask(newFocusedTask); - boolean willScrollToFront = newScroll > stackScroller.getStackScroll(); - boolean willScroll = Float.compare(newScroll, stackScroller.getStackScroll()) != 0; + boolean willScrollToFront = newScroll > curScroll; + boolean willScroll = Float.compare(newScroll, curScroll) != 0; // Get the current set of task transforms + int taskViewCount = mStackView.getTaskViews().size(); ArrayList<Task> stackTasks = stack.getStackTasks(); mStackView.getCurrentTaskTransforms(stackTasks, mTmpCurrentTaskTransforms); @@ -463,6 +465,13 @@ public class TaskStackAnimationHelper { // Focus the task view TaskView newFocusedTaskView = mStackView.getChildViewForTask(newFocusedTask); + if (newFocusedTaskView == null) { + // Log the error if we have no task view, and skip the animation + Log.e("TaskStackAnimationHelper", "b/27389156 null-task-view prebind:" + taskViewCount + + " postbind:" + mStackView.getTaskViews().size() + " prescroll:" + curScroll + + " postscroll: " + newScroll); + return false; + } newFocusedTaskView.setFocusedState(true, requestViewFocus); // Setup the end listener to return all the hidden views to the view pool after the @@ -476,7 +485,7 @@ public class TaskStackAnimationHelper { }); List<TaskView> taskViews = mStackView.getTaskViews(); - int taskViewCount = taskViews.size(); + taskViewCount = taskViews.size(); int newFocusTaskViewIndex = taskViews.indexOf(newFocusedTaskView); for (int i = 0; i < taskViewCount; i++) { TaskView tv = taskViews.get(i); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java index 0c78e6aa0063..2e7c7f2e640c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -603,7 +603,7 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks EventBus.getDefault().send(new LaunchTaskEvent(this, mTask, null, INVALID_STACK_ID, screenPinningRequested)); - MetricsLogger.action(v.getContext(), MetricsEvent.OVERVIEW_SELECT, + MetricsLogger.action(v.getContext(), MetricsEvent.ACTION_OVERVIEW_SELECT, mTask.key.getComponent().toString()); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 9bd645d79240..178838ea939d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -959,7 +959,7 @@ public abstract class BaseStatusBar extends SystemUI implements }, false /* afterKeyguardGone */); } - private void bindGuts(ExpandableNotificationRow row) { + private void bindGuts(final ExpandableNotificationRow row) { row.inflateGuts(); final StatusBarNotification sbn = row.getStatusBarNotification(); PackageManager pmUser = getPackageManagerForUser(mContext, sbn.getUser().getIdentifier()); @@ -983,7 +983,7 @@ public abstract class BaseStatusBar extends SystemUI implements pkgicon = pmUser.getDefaultActivityIcon(); } - ((ImageView) row.findViewById(android.R.id.icon)).setImageDrawable(pkgicon); + ((ImageView) row.findViewById(R.id.app_icon)).setImageDrawable(pkgicon); ((TextView) row.findViewById(R.id.pkgname)).setText(appname); final View settingsButton = guts.findViewById(R.id.more_settings); @@ -1003,7 +1003,17 @@ public abstract class BaseStatusBar extends SystemUI implements @Override public void onClick(View v) { guts.saveImportance(sbn); - dismissPopups(); + + int[] rowLocation = new int[2]; + int[] doneLocation = new int[2]; + row.getLocationOnScreen(rowLocation); + v.getLocationOnScreen(doneLocation); + + final int centerX = v.getWidth() / 2; + final int centerY = v.getHeight() / 2; + final int x = doneLocation[0] - rowLocation[0] + centerX; + final int y = doneLocation[1] - rowLocation[1] + centerY; + dismissPopups(x, y); } }); @@ -1049,7 +1059,7 @@ public abstract class BaseStatusBar extends SystemUI implements // Post to ensure the the guts are properly laid out. guts.post(new Runnable() { public void run() { - dismissPopups(); + dismissPopups(-1 /* x */, -1 /* y */, false /* resetGear */); guts.setVisibility(View.VISIBLE); final double horz = Math.max(guts.getWidth() - x, x); final double vert = Math.max(guts.getHeight() - y, y); @@ -1083,10 +1093,14 @@ public abstract class BaseStatusBar extends SystemUI implements } public void dismissPopups() { - dismissPopups(-1, -1); + dismissPopups(-1 /* x */, -1 /* y */, true /* resetGear */); } private void dismissPopups(int x, int y) { + dismissPopups(x, y, true /* resetGear */); + } + + public void dismissPopups(int x, int y, boolean resetGear) { if (mNotificationGutsExposed != null) { final NotificationGuts v = mNotificationGutsExposed; mNotificationGutsExposed = null; @@ -1114,8 +1128,7 @@ public abstract class BaseStatusBar extends SystemUI implements v.setExposed(false); mStackScroller.onHeightChanged(null, true /* needsAnimation */); } - - if (mNotificationGearDisplayed != null) { + if (resetGear && mNotificationGearDisplayed != null) { mNotificationGearDisplayed.resetTranslation(); mNotificationGearDisplayed = null; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java index b3265524965f..7f87c3c687d8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java @@ -169,21 +169,23 @@ public class DragDownHelper implements Gefingerpoken { ? RUBBERBAND_FACTOR_EXPANDABLE : RUBBERBAND_FACTOR_STATIC; float rubberband = heightDelta * rubberbandFactor; - if (expandable && (rubberband + child.getMinHeight()) > child.getMaxContentHeight()) { - float overshoot = (rubberband + child.getMinHeight()) - child.getMaxContentHeight(); + if (expandable + && (rubberband + child.getMinExpandHeight()) > child.getMaxContentHeight()) { + float overshoot = + (rubberband + child.getMinExpandHeight()) - child.getMaxContentHeight(); overshoot *= (1 - RUBBERBAND_FACTOR_STATIC); rubberband -= overshoot; } - child.setActualHeight((int) (child.getMinHeight() + rubberband)); + child.setActualHeight((int) (child.getMinExpandHeight() + rubberband)); } private void cancelExpansion(final ExpandableView child) { - if (child.getActualHeight() == child.getMinHeight()) { + if (child.getActualHeight() == child.getMinExpandHeight()) { mCallback.setUserLockedChild(child, false); return; } ObjectAnimator anim = ObjectAnimator.ofInt(child, "actualHeight", - child.getActualHeight(), child.getMinHeight()); + child.getActualHeight(), child.getMinExpandHeight()); anim.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); anim.setDuration(SPRING_BACK_ANIMATION_LENGTH_MS); anim.addListener(new AnimatorListenerAdapter() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index da125d8f77a6..f446593e6cb4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -412,7 +412,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } public ExpandableNotificationRow getViewAtPosition(float y) { - if (!mIsSummaryWithChildren || !mChildrenExpanded) { + if (!mIsSummaryWithChildren || !mChildrenExpanded + || (getNotificationChildren().size() == 1 && isClearable())) { return this; } else { ExpandableNotificationRow view = mChildrenContainer.getViewAtPosition(y); @@ -656,7 +657,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { mGuts = (NotificationGuts) inflated; mGuts.setClipTopAmount(getClipTopAmount()); mGuts.setActualHeight(getActualHeight()); - mTranslateableViews.add(mGuts); mGutsStub = null; } }); @@ -1053,6 +1053,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { public void setHideSensitiveForIntrinsicHeight(boolean hideSensitive) { mHideSensitiveForIntrinsicHeight = hideSensitive; + if (mIsSummaryWithChildren) { + List<ExpandableNotificationRow> notificationChildren = + mChildrenContainer.getNotificationChildren(); + for (int i = 0; i < notificationChildren.size(); i++) { + ExpandableNotificationRow child = notificationChildren.get(i); + child.setHideSensitiveForIntrinsicHeight(hideSensitive); + } + } } public void setHideSensitive(boolean hideSensitive, boolean animated, long delay, @@ -1175,6 +1183,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { @Override public void setActualHeight(int height, boolean notifyListeners) { super.setActualHeight(height, notifyListeners); + if (mGuts != null && mGuts.areGutsExposed()) { + mGuts.setActualHeight(height); + return; + } int contentHeight = Math.max(getMinHeight(), height); mPrivateLayout.setContentHeight(contentHeight); mPublicLayout.setContentHeight(contentHeight); @@ -1184,7 +1196,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { if (mGuts != null) { mGuts.setActualHeight(height); } - invalidate(); } @Override @@ -1211,8 +1222,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { @Override public int getMinExpandHeight() { - if (mIsSummaryWithChildren && !mOnKeyguard) { - return mChildrenContainer.getMinExpandHeight(); + if (mIsSummaryWithChildren && !mShowingPublic) { + return mChildrenContainer.getMinExpandHeight(mOnKeyguard); } return getMinHeight(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSettingsIconRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSettingsIconRow.java index 4491ebde742b..375459f0f30c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSettingsIconRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSettingsIconRow.java @@ -33,7 +33,7 @@ public class NotificationSettingsIconRow extends FrameLayout implements View.OnC /** * Called when the gear behind a notification is touched. */ - public void onGearTouched(ExpandableNotificationRow row); + public void onGearTouched(ExpandableNotificationRow row, int x, int y); } private ExpandableNotificationRow mParent; @@ -45,6 +45,8 @@ public class NotificationSettingsIconRow extends FrameLayout implements View.OnC private boolean mSettingsFadedIn = false; private boolean mAnimating = false; private boolean mOnLeft = true; + private int[] mGearLocation = new int[2]; + private int[] mParentLocation = new int[2]; public NotificationSettingsIconRow(Context context) { this(context, null); @@ -74,6 +76,12 @@ public class NotificationSettingsIconRow extends FrameLayout implements View.OnC resetState(); } + public void resetState() { + setGearAlpha(0f); + mAnimating = false; + setIconLocation(true /* on left */); + } + public void setGearListener(SettingsIconRowListener listener) { mListener = listener; } @@ -86,21 +94,15 @@ public class NotificationSettingsIconRow extends FrameLayout implements View.OnC return mParent; } - public void resetState() { - setGearAlpha(0f); - mAnimating = false; - setIconLocation(true /* on left */); - } - private void setGearAlpha(float alpha) { if (alpha == 0) { mSettingsFadedIn = false; // Can fade in again once it's gone. - mGearIcon.setVisibility(View.INVISIBLE); + setVisibility(View.INVISIBLE); } else { if (alpha == 1) { mSettingsFadedIn = true; } - mGearIcon.setVisibility(View.VISIBLE); + setVisibility(View.VISIBLE); } mGearIcon.setAlpha(alpha); } @@ -200,7 +202,16 @@ public class NotificationSettingsIconRow extends FrameLayout implements View.OnC public void onClick(View v) { if (v.getId() == R.id.gear_icon) { if (mListener != null) { - mListener.onGearTouched(mParent); + mGearIcon.getLocationOnScreen(mGearLocation); + mParent.getLocationOnScreen(mParentLocation); + + final int centerX = (int) (mHorizSpaceForGear / 2); + // Top / bottom padding are not equal, need to subtract them to get center of gear. + final int centerY = (int) (mGearIcon.getHeight() - mGearIcon.getPaddingTop() + - mGearIcon.getPaddingBottom()) / 2 + mGearIcon.getPaddingTop(); + final int x = mGearLocation[0] - mParentLocation[0] + centerX; + final int y = mGearLocation[1] - mParentLocation[1] + centerY; + mListener.onGearTouched(mParent, x, y); } } else { // Do nothing when the background is touched. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index c892b11e33fa..960e4cf47001 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -227,6 +227,8 @@ public class SignalClusterView protected void onDetachedFromWindow() { mMobileSignalGroup.removeAllViews(); TunerService.get(mContext).removeTunable(this); + mSC.removeCallback(this); + mNC.removeSignalCallback(this); super.onDetachedFromWindow(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java index 5ab441dca6e8..d3393b330355 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.notification; +import android.text.Layout; import android.text.TextUtils; import android.util.Pools; import android.view.View; @@ -28,14 +29,13 @@ public class TextViewTransformState extends TransformState { private static Pools.SimplePool<TextViewTransformState> sInstancePool = new Pools.SimplePool<>(40); - private CharSequence mText; + private TextView mText; @Override public void initFrom(View view) { super.initFrom(view); if (view instanceof TextView) { - TextView txt = (TextView) view; - mText = txt.getText(); + mText = (TextView) view; } } @@ -43,11 +43,27 @@ public class TextViewTransformState extends TransformState { protected boolean sameAs(TransformState otherState) { if (otherState instanceof TextViewTransformState) { TextViewTransformState otherTvs = (TextViewTransformState) otherState; - return TextUtils.equals(otherTvs.mText, mText); + if(TextUtils.equals(otherTvs.mText.getText(), mText.getText())) { + int ownEllipsized = getEllipsisCount(); + int otherEllipsized = otherTvs.getEllipsisCount(); + return ownEllipsized == otherEllipsized; + } } return super.sameAs(otherState); } + private int getEllipsisCount() { + Layout l = mText.getLayout(); + if (l != null) { + int lines = l.getLineCount(); + if (lines > 0) { + // we only care about the first line + return l.getEllipsisCount(0); + } + } + return 0; + } + public static TextViewTransformState obtain() { TextViewTransformState instance = sInstancePool.acquire(); if (instance != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java index 5796edbeea61..ed71e5708ce1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java @@ -22,8 +22,12 @@ import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; +import android.graphics.Paint; import android.graphics.PixelFormat; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; +import android.graphics.PorterDuff.Mode; import android.graphics.drawable.Drawable; import android.os.SystemClock; import android.util.Log; @@ -55,6 +59,7 @@ public class BarTransitions { private final BarBackgroundDrawable mBarBackground; private int mMode; + private boolean mAlwaysOpaque = false; public BarTransitions(View view, int gradientResourceId) { mTag = "BarTransitions." + view.getClass().getSimpleName(); @@ -69,13 +74,25 @@ public class BarTransitions { return mMode; } + /** + * @param alwaysOpaque if {@code true}, the bar's background will always be opaque, regardless + * of what mode it is currently set to. + */ + public void setAlwaysOpaque(boolean alwaysOpaque) { + mAlwaysOpaque = alwaysOpaque; + } + + public boolean isAlwaysOpaque() { + // Low-end devices do not support translucent modes, fallback to opaque + return !HIGH_END || mAlwaysOpaque; + } + public void transitionTo(int mode, boolean animate) { - // low-end devices do not support translucent modes, fallback to opaque - if (!HIGH_END && (mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT + if (isAlwaysOpaque() && (mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT || mode == MODE_TRANSPARENT)) { mode = MODE_OPAQUE; } - if (!HIGH_END && (mode == MODE_LIGHTS_OUT_TRANSPARENT)) { + if (isAlwaysOpaque() && (mode == MODE_LIGHTS_OUT_TRANSPARENT)) { mode = MODE_LIGHTS_OUT; } if (mMode == mode) return; @@ -131,10 +148,13 @@ public class BarTransitions { private int mGradientAlpha; private int mColor; + private PorterDuffColorFilter mTintFilter; + private Paint mPaint = new Paint(); private int mGradientAlphaStart; private int mColorStart; + public BarBackgroundDrawable(Context context, int gradientResourceId) { final Resources res = context.getResources(); if (DEBUG_COLORS) { @@ -163,6 +183,26 @@ public class BarTransitions { } @Override + public void setTint(int color) { + if (mTintFilter == null) { + mTintFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN); + } else { + mTintFilter.setColor(color); + } + invalidateSelf(); + } + + @Override + public void setTintMode(Mode tintMode) { + if (mTintFilter == null) { + mTintFilter = new PorterDuffColorFilter(0, tintMode); + } else { + mTintFilter.setMode(tintMode); + } + invalidateSelf(); + } + + @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); mGradient.setBounds(bounds); @@ -208,6 +248,7 @@ public class BarTransitions { } else { targetColor = mOpaque; } + if (!mAnimating) { mColor = targetColor; mGradientAlpha = targetGradientAlpha; @@ -234,7 +275,11 @@ public class BarTransitions { mGradient.draw(canvas); } if (Color.alpha(mColor) > 0) { - canvas.drawColor(mColor); + mPaint.setColor(mColor); + if (mTintFilter != null) { + mPaint.setColorFilter(mTintFilter); + } + canvas.drawPaint(mPaint); } if (mAnimating) { invalidateSelf(); // keep going diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java index eade2a89447d..6e1c862ebd73 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.phone; import android.content.Context; import android.util.AttributeSet; import android.widget.RelativeLayout; - import com.android.systemui.qs.QSPanel; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.NetworkControllerImpl; 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 05ae41be33d4..127febae5ee8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -42,6 +42,8 @@ import android.widget.TextView; import com.android.internal.logging.MetricsLogger; import com.android.keyguard.KeyguardStatusView; import com.android.systemui.DejankUtils; +import com.android.systemui.DensityContainer; +import com.android.systemui.DensityContainer.InflateListener; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; import com.android.systemui.Interpolators; @@ -215,8 +217,14 @@ public class NotificationPanelView extends PanelView implements super.onFinishInflate(); mKeyguardStatusBar = (KeyguardStatusBarView) findViewById(R.id.keyguard_header); mKeyguardStatusView = (KeyguardStatusView) findViewById(R.id.keyguard_status_view); - mQsContainer = (QSContainer) findViewById(R.id.quick_settings_container); - mQsContainer.getHeader().setOnClickListener(this); + DensityContainer container = (DensityContainer) findViewById(R.id.qs_density_container); + container.addInflateListener(new InflateListener() { + @Override + public void onInflated(View v) { + mQsContainer = (QSContainer) v.findViewById(R.id.quick_settings_container); + mQsContainer.getHeader().setOnClickListener(NotificationPanelView.this); + } + }); mClockView = (TextView) findViewById(R.id.clock_view); mNotificationContainerParent = (NotificationsQuickSettingsContainer) findViewById(R.id.notification_container_parent); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java index 7cc720df1c27..6d90e5cf416f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java @@ -47,7 +47,7 @@ public class NotificationsQuickSettingsContainer extends FrameLayout @Override protected void onFinishInflate() { super.onFinishInflate(); - mQsContainer = findViewById(R.id.quick_settings_container); + mQsContainer = findViewById(R.id.qs_density_container); mStackScroller = findViewById(R.id.notification_stack_scroller); mKeyguardStatusBar = findViewById(R.id.keyguard_header); ViewStub userSwitcher = (ViewStub) findViewById(R.id.keyguard_user_switcher); 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 9b87a8adbeb6..e73994443491 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -23,7 +23,6 @@ import android.annotation.NonNull; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.IActivityManager; -import android.app.IWallpaperManagerCallback; import android.app.Notification; import android.app.PendingIntent; import android.app.StatusBarManager; @@ -104,6 +103,8 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.BatteryMeterView; import com.android.systemui.DemoMode; +import com.android.systemui.DensityContainer; +import com.android.systemui.DensityContainer.InflateListener; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; import com.android.systemui.Interpolators; @@ -778,8 +779,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mStatusBarView.setScrimController(mScrimController); mDozeScrimController = new DozeScrimController(mScrimController, context); - mHeader = (BaseStatusBarHeader) mStatusBarWindow.findViewById(R.id.header); - mHeader.setActivityStarter(this); mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindow.findViewById(R.id.keyguard_header); mKeyguardStatusView = mStatusBarWindow.findViewById(R.id.keyguard_status_view); mKeyguardBottomArea = @@ -839,12 +838,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, initSignalCluster(mStatusBarView); initSignalCluster(mKeyguardStatusBar); - initSignalCluster(mHeader); - - final boolean isAPhone = mNetworkController.hasVoiceCallingFeature(); - if (isAPhone) { - mNetworkController.addEmergencyListener(mHeader); - } mFlashlightController = new FlashlightController(mContext); mKeyguardBottomArea.setFlashlightController(mFlashlightController); @@ -863,39 +856,40 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } // Set up the quick settings tile panel - mQSPanel = (QSPanel) mStatusBarWindow.findViewById(R.id.quick_settings_panel); - if (mQSPanel != null) { + DensityContainer container = (DensityContainer) mStatusBarWindow.findViewById( + R.id.qs_density_container); + if (container != null) { final QSTileHost qsh = new QSTileHost(mContext, this, mBluetoothController, mLocationController, mRotationLockController, mNetworkController, mZenModeController, mHotspotController, mCastController, mFlashlightController, mUserSwitcherController, mUserInfoController, mKeyguardMonitor, - mSecurityController, mBatteryController, mIconController); - mQSPanel.setTiles(qsh.getTiles()); + mSecurityController, mBatteryController, mIconController, + mNextAlarmController); mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindow); - mQSPanel.setBrightnessMirror(mBrightnessMirrorController); - QSContainer qsContainer = (QSContainer) mStatusBarWindow.findViewById( - R.id.quick_settings_container); - qsContainer.setHost(qsh); - qsh.addCallback(new QSTileHost.Callback() { + container.addInflateListener(new InflateListener() { @Override - public void onTilesChanged() { - mQSPanel.setTiles(qsh.getTiles()); + public void onInflated(View v) { + QSContainer qsContainer = (QSContainer) v.findViewById( + R.id.quick_settings_container); + qsContainer.setHost(qsh); + mQSPanel = qsContainer.getQsPanel(); + mQSPanel.setBrightnessMirror(mBrightnessMirrorController); + mHeader = qsContainer.getHeader(); + initSignalCluster(mHeader); + mHeader.setActivityStarter(PhoneStatusBar.this); } }); } // User info. Trigger first load. - mHeader.setUserInfoController(mUserInfoController); mKeyguardStatusBar.setUserInfoController(mUserInfoController); mKeyguardStatusBar.setUserSwitcherController(mUserSwitcherController); mUserInfoController.reloadUserInfo(); - mHeader.setBatteryController(mBatteryController); ((BatteryMeterView) mStatusBarView.findViewById(R.id.battery)).setBatteryController( mBatteryController); mKeyguardStatusBar.setBatteryController(mBatteryController); - mHeader.setNextAlarmController(mNextAlarmController); PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mBroadcastReceiver.onReceive(mContext, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index 80afb9a3c705..f894a22d4acb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -57,6 +57,7 @@ import com.android.systemui.qs.tiles.WorkModeTile; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BluetoothController; import com.android.systemui.statusbar.policy.CastController; +import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NightModeController; import com.android.systemui.statusbar.policy.FlashlightController; import com.android.systemui.statusbar.policy.HotspotController; @@ -111,16 +112,18 @@ public final class QSTileHost implements QSTile.Host, Tunable { private final NightModeController mNightModeController; private final AutoTileManager mAutoTiles; private final ManagedProfileController mProfileController; + private final NextAlarmController mNextAlarmController; private View mHeader; public QSTileHost(Context context, PhoneStatusBar statusBar, - BluetoothController bluetooth, LocationController location, - RotationLockController rotation, NetworkController network, - ZenModeController zen, HotspotController hotspot, - CastController cast, FlashlightController flashlight, - UserSwitcherController userSwitcher, UserInfoController userInfo, - KeyguardMonitor keyguard, SecurityController security, - BatteryController battery, StatusBarIconController iconController) { + BluetoothController bluetooth, LocationController location, + RotationLockController rotation, NetworkController network, + ZenModeController zen, HotspotController hotspot, + CastController cast, FlashlightController flashlight, + UserSwitcherController userSwitcher, UserInfoController userInfo, + KeyguardMonitor keyguard, SecurityController security, + BatteryController battery, StatusBarIconController iconController, + NextAlarmController nextAlarmController) { mContext = context; mStatusBar = statusBar; mBluetooth = bluetooth; @@ -137,6 +140,7 @@ public final class QSTileHost implements QSTile.Host, Tunable { mSecurity = security; mBattery = battery; mIconController = iconController; + mNextAlarmController = nextAlarmController; mNightModeController = new NightModeController(mContext, true); mProfileController = new ManagedProfileController(this); @@ -152,6 +156,10 @@ public final class QSTileHost implements QSTile.Host, Tunable { mAutoTiles = new AutoTileManager(context, this); } + public NextAlarmController getNextAlarmController() { + return mNextAlarmController; + } + public void setHeaderView(View view) { mHeader = view; } @@ -171,6 +179,11 @@ public final class QSTileHost implements QSTile.Host, Tunable { } @Override + public void removeCallback(Callback callback) { + mCallbacks.remove(callback); + } + + @Override public Collection<QSTile<?>> getTiles() { return mTiles.values(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java index b549d5912117..256cc6b6ae3f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java @@ -35,13 +35,13 @@ import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.qs.QSAnimator; import com.android.systemui.qs.QSPanel; -import com.android.systemui.qs.QSTile; import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.TouchAnimator; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback; import com.android.systemui.statusbar.policy.UserInfoController; +import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; import com.android.systemui.tuner.TunerService; public class QuickStatusBarHeader extends BaseStatusBarHeader implements @@ -90,6 +90,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements private TouchAnimator mAlarmTranslation; private TouchAnimator mSettingsAlpha; private float mExpansionAmount; + private QSTileHost mHost; public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); @@ -222,6 +223,14 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements mExpandIndicator.setExpanded(headerExpansionFraction > EXPAND_INDICATOR_THRESHOLD); } + @Override + protected void onDetachedFromWindow() { + setListening(false); + mHost.getUserInfoController().remListener(mUserListener); + mHost.getNetworkController().removeEmergencyListener(this); + super.onDetachedFromWindow(); + } + private void updateAlarmVisibilities() { mAlarmStatus.setVisibility(mAlarmShowing ? View.VISIBLE : View.INVISIBLE); mAlarmStatusCollapsed.setVisibility(mAlarmShowing ? View.VISIBLE : View.INVISIBLE); @@ -284,17 +293,19 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements } public void setupHost(final QSTileHost host) { + mHost = host; host.setHeaderView(this); mHeaderQsPanel.setQSPanelAndHeader(mQsPanel, this); - mHeaderQsPanel.setHost(host); mHeaderQsPanel.setMaxTiles(5); - mHeaderQsPanel.setTiles(host.getTiles()); - host.addCallback(new QSTile.Host.Callback() { - @Override - public void onTilesChanged() { - mHeaderQsPanel.setTiles(host.getTiles()); - } - }); + mHeaderQsPanel.setHost(host); + setUserInfoController(host.getUserInfoController()); + setBatteryController(host.getBatteryController()); + setNextAlarmController(host.getNextAlarmController()); + + final boolean isAPhone = mHost.getNetworkController().hasVoiceCallingFeature(); + if (isAPhone) { + mHost.getNetworkController().addEmergencyListener(this); + } } @Override @@ -340,12 +351,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements @Override public void setUserInfoController(UserInfoController userInfoController) { - userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() { - @Override - public void onUserInfoChanged(String name, Drawable picture) { - mMultiUserAvatar.setImageDrawable(picture); - } - }); + userInfoController.addListener(mUserListener); } @Override @@ -358,4 +364,11 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements } } } + + private final OnUserInfoChangedListener mUserListener = new OnUserInfoChangedListener() { + @Override + public void onUserInfoChanged(String name, Drawable picture) { + mMultiUserAvatar.setImageDrawable(picture); + } + }; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java index 3e3b16922f7a..a051973efdda 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java @@ -39,7 +39,6 @@ import android.widget.RelativeLayout; import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; - import com.android.keyguard.KeyguardStatusView; import com.android.systemui.BatteryMeterView; import com.android.systemui.FontSizeUtils; @@ -48,7 +47,7 @@ import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTile; import com.android.systemui.qs.QSTile.DetailAdapter; import com.android.systemui.statusbar.policy.BatteryController; -import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener; +import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.tuner.TunerService; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index e618cb87887d..3142ddfe9fb7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -19,11 +19,10 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.telephony.SubscriptionInfo; - import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; -import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener; import java.util.ArrayList; import java.util.List; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java index 29a8f67e4cfe..9a21a1e378e6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java @@ -93,6 +93,10 @@ public class FlashlightController { } } + public boolean hasFlashlight() { + return mCameraId != null; + } + public synchronized boolean isEnabled() { return mFlashlightEnabled; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 93c73228265e..348e0b003997 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.policy; import android.content.Context; import android.content.Intent; import android.telephony.SubscriptionInfo; - import com.android.settingslib.net.DataUsageController; import com.android.settingslib.wifi.AccessPoint; @@ -36,6 +35,11 @@ public interface NetworkController { DataUsageController getMobileDataController(); DataSaverController getDataSaverController(); + boolean hasVoiceCallingFeature(); + + void addEmergencyListener(EmergencyListener listener); + void removeEmergencyListener(EmergencyListener listener); + public interface SignalCallback { void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, boolean activityIn, boolean activityOut, String description); @@ -53,6 +57,10 @@ public interface NetworkController { void setMobileDataEnabled(boolean enabled); } + public interface EmergencyListener { + void setEmergencyCallsOnly(boolean emergencyOnly); + } + public static class IconState { public final boolean visible; public final int icon; 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 eecf8c2ea39e..8193b52b569c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -252,6 +252,10 @@ public class NetworkControllerImpl extends BroadcastReceiver mCallbackHandler.setEmergencyCallsOnly(isEmergencyOnly()); } + public void removeEmergencyListener(EmergencyListener listener) { + mCallbackHandler.setListening(listener, false); + } + public boolean hasMobileDataFeature() { return mHasMobileDataFeature; } @@ -812,10 +816,6 @@ public class NetworkControllerImpl extends BroadcastReceiver } }; - public interface EmergencyListener { - void setEmergencyCallsOnly(boolean emergencyOnly); - } - public static class SubscriptionDefaults { public int getDefaultVoiceSubId() { return SubscriptionManager.getDefaultVoiceSubscriptionId(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NightModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NightModeController.java index 0b1911bb15fc..4611ef9f31db 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NightModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NightModeController.java @@ -14,17 +14,13 @@ package com.android.systemui.statusbar.policy; -import libcore.util.Objects; - import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.opengl.Matrix; -import android.provider.Settings; import android.provider.Settings.Secure; import android.util.MathUtils; - import com.android.systemui.tuner.TunerService; import java.util.ArrayList; @@ -189,8 +185,8 @@ public class NightModeController implements TunerService.Tunable { } private void updateNightMode(Intent intent) { - mIsNight = intent.getBooleanExtra(EXTRA_IS_NIGHT, false); - mAmount = intent.getFloatExtra(EXTRA_AMOUNT, 0); + mIsNight = intent != null && intent.getBooleanExtra(EXTRA_IS_NIGHT, false); + mAmount = intent != null ? intent.getFloatExtra(EXTRA_AMOUNT, 0) : 0; } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 53fd446b2444..cedc3c7eef2f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -37,6 +37,8 @@ import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.telephony.PhoneStateListener; +import android.telephony.TelephonyManager; import android.util.Log; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -99,7 +101,6 @@ public class UserSwitcherController { private boolean mSimpleUserSwitcher; private boolean mAddUsersWhenLocked; private boolean mPauseRefreshUsers; - private boolean mAllowUserSwitchingWhenSystemUserLocked; private SparseBooleanArray mForcePictureLoadForUserId = new SparseBooleanArray(2); public UserSwitcherController(Context context, KeyguardMonitor keyguardMonitor, @@ -140,6 +141,7 @@ public class UserSwitcherController { mSettingsObserver.onChange(false); keyguardMonitor.addCallback(mCallback); + listenForCallState(); refreshUsers(UserHandle.USER_NULL); } @@ -186,8 +188,7 @@ public class UserSwitcherController { } ArrayList<UserRecord> records = new ArrayList<>(infos.size()); int currentId = ActivityManager.getCurrentUser(); - boolean allowUserSwitching = mAllowUserSwitchingWhenSystemUserLocked - || mUserManager.isUserUnlocked(UserHandle.SYSTEM); + boolean canSwitchUsers = mUserManager.canSwitchUsers(); UserInfo currentUserInfo = null; UserRecord guestRecord = null; int avatarSize = mContext.getResources() @@ -198,12 +199,14 @@ public class UserSwitcherController { if (isCurrent) { currentUserInfo = info; } - boolean switchToEnabled = allowUserSwitching || isCurrent; + boolean switchToEnabled = canSwitchUsers || isCurrent; if (info.isEnabled()) { if (info.isGuest()) { + // Tapping guest icon triggers remove and a user switch therefore + // the icon shouldn't be enabled even if the user is current guestRecord = new UserRecord(info, null /* picture */, true /* isGuest */, isCurrent, false /* isAddUser */, - false /* isRestricted */, switchToEnabled); + false /* isRestricted */, canSwitchUsers); } else if (info.supportsSwitchToByUser()) { Bitmap picture = bitmaps.get(info.id); if (picture == null) { @@ -240,7 +243,7 @@ public class UserSwitcherController { if (canCreateGuest) { guestRecord = new UserRecord(null /* info */, null /* picture */, true /* isGuest */, false /* isCurrent */, - false /* isAddUser */, createIsRestricted, allowUserSwitching); + false /* isAddUser */, createIsRestricted, canSwitchUsers); checkIfAddUserDisallowedByAdminOnly(guestRecord); records.add(guestRecord); } @@ -253,7 +256,7 @@ public class UserSwitcherController { if (!mSimpleUserSwitcher && canCreateUser) { UserRecord addUserRecord = new UserRecord(null /* info */, null /* picture */, false /* isGuest */, false /* isCurrent */, true /* isAddUser */, - createIsRestricted, allowUserSwitching); + createIsRestricted, canSwitchUsers); checkIfAddUserDisallowedByAdminOnly(addUserRecord); records.add(addUserRecord); } @@ -417,6 +420,24 @@ public class UserSwitcherController { mUserManager.removeUser(id); } + private void listenForCallState() { + TelephonyManager.from(mContext).listen(new PhoneStateListener() { + private int mCallState; + @Override + public void onCallStateChanged(int state, String incomingNumber) { + if (mCallState == state) return; + if (DEBUG) Log.v(TAG, "Call state changed: " + state); + mCallState = state; + int currentUserId = ActivityManager.getCurrentUser(); + UserInfo userInfo = mUserManager.getUserInfo(currentUserId); + if (userInfo != null && userInfo.isGuest()) { + showGuestNotification(currentUserId); + } + refreshUsers(UserHandle.USER_NULL); + } + }, PhoneStateListener.LISTEN_CALL_STATE); + } + private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -488,25 +509,6 @@ public class UserSwitcherController { } } - private void showGuestNotification(int guestUserId) { - PendingIntent removeGuestPI = PendingIntent.getBroadcastAsUser(mContext, - 0, new Intent(ACTION_REMOVE_GUEST), 0, UserHandle.SYSTEM); - Notification notification = new Notification.Builder(mContext) - .setVisibility(Notification.VISIBILITY_SECRET) - .setPriority(Notification.PRIORITY_MIN) - .setSmallIcon(R.drawable.ic_person) - .setContentTitle(mContext.getString(R.string.guest_notification_title)) - .setContentText(mContext.getString(R.string.guest_notification_text)) - .setContentIntent(removeGuestPI) - .setShowWhen(false) - .addAction(R.drawable.ic_delete, - mContext.getString(R.string.guest_notification_remove_action), - removeGuestPI) - .build(); - NotificationManager.from(mContext).notifyAsUser(TAG_REMOVE_GUEST, ID_REMOVE_GUEST, - notification, new UserHandle(guestUserId)); - } - private void showLogoutNotification(int userId) { PendingIntent logoutPI = PendingIntent.getBroadcastAsUser(mContext, 0, new Intent(ACTION_LOGOUT_USER), 0, UserHandle.SYSTEM); @@ -528,6 +530,28 @@ public class UserSwitcherController { } }; + private void showGuestNotification(int guestUserId) { + boolean canSwitchUsers = mUserManager.canSwitchUsers(); + // Disable 'Remove guest' action if cannot switch users right now + PendingIntent removeGuestPI = canSwitchUsers ? PendingIntent.getBroadcastAsUser(mContext, + 0, new Intent(ACTION_REMOVE_GUEST), 0, UserHandle.SYSTEM) : null; + + Notification notification = new Notification.Builder(mContext) + .setVisibility(Notification.VISIBILITY_SECRET) + .setPriority(Notification.PRIORITY_MIN) + .setSmallIcon(R.drawable.ic_person) + .setContentTitle(mContext.getString(R.string.guest_notification_title)) + .setContentText(mContext.getString(R.string.guest_notification_text)) + .setContentIntent(removeGuestPI) + .setShowWhen(false) + .addAction(R.drawable.ic_delete, + mContext.getString(R.string.guest_notification_remove_action), + removeGuestPI) + .build(); + NotificationManager.from(mContext).notifyAsUser(TAG_REMOVE_GUEST, ID_REMOVE_GUEST, + notification, new UserHandle(guestUserId)); + } + private final Runnable mUnpauseRefreshUsers = new Runnable() { @Override public void run() { @@ -543,9 +567,6 @@ public class UserSwitcherController { SIMPLE_USER_SWITCHER_GLOBAL_SETTING, 0) != 0; mAddUsersWhenLocked = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ADD_USERS_WHEN_LOCKED, 0) != 0; - mAllowUserSwitchingWhenSystemUserLocked = Settings.Global.getInt( - mContext.getContentResolver(), - Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED, 0) != 0; refreshUsers(UserHandle.USER_NULL); }; }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java index 030c8b737e84..795573352ba8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java @@ -167,6 +167,7 @@ public class NotificationChildrenContainer extends ViewGroup { int newIndex = childIndex < 0 ? mChildren.size() : childIndex; mChildren.add(newIndex, row); addView(row); + row.setUserLocked(mUserLocked); View divider = inflateDivider(); addView(divider); @@ -191,6 +192,7 @@ public class NotificationChildrenContainer extends ViewGroup { }); row.setSystemChildExpanded(false); + row.setUserLocked(false); updateGroupOverflow(); } @@ -262,10 +264,14 @@ public class NotificationChildrenContainer extends ViewGroup { } private void updateExpansionStates() { - // Let's make the first child expanded if the parent is - for (int i = 0; i < mChildren.size(); i++) { + if (mChildrenExpanded || mUserLocked) { + // we don't modify it the group is expanded or if we are expanding it + return; + } + int size = mChildren.size(); + for (int i = 0; i < size; i++) { ExpandableNotificationRow child = mChildren.get(i); - child.setSystemChildExpanded(false); + child.setSystemChildExpanded(i == 0 && size == 1); } } @@ -489,6 +495,7 @@ public class NotificationChildrenContainer extends ViewGroup { public void setChildrenExpanded(boolean childrenExpanded) { mChildrenExpanded = childrenExpanded; + updateExpansionStates(); } public void setNotificationParent(ExpandableNotificationRow parent) { @@ -566,8 +573,28 @@ public class NotificationChildrenContainer extends ViewGroup { return getIntrinsicHeight(NUMBER_OF_CHILDREN_WHEN_COLLAPSED); } - public int getMinExpandHeight() { - return getIntrinsicHeight(getMaxAllowedVisibleChildren(true /* forceCollapsed */)); + public int getMinExpandHeight(boolean onKeyguard) { + int maxAllowedVisibleChildren = onKeyguard ? NUMBER_OF_CHILDREN_WHEN_COLLAPSED + : getMaxAllowedVisibleChildren(true /* forceCollapsed */); + int minExpandHeight = mNotificationHeaderHeight; + int visibleChildren = 0; + boolean firstChild = true; + int childCount = mChildren.size(); + for (int i = 0; i < childCount; i++) { + if (visibleChildren >= maxAllowedVisibleChildren) { + break; + } + if (!firstChild) { + minExpandHeight += mChildPadding; + } else { + firstChild = false; + } + ExpandableNotificationRow child = mChildren.get(i); + minExpandHeight += child.getMinHeight(); + visibleChildren++; + } + minExpandHeight += mCollapsedBottompadding; + return minExpandHeight; } public void setDark(boolean dark, boolean fade, long delay) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 340ebb444a86..85b14264837d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -361,9 +361,9 @@ public class NotificationStackScrollLayout extends ViewGroup } @Override - public void onGearTouched(ExpandableNotificationRow row) { + public void onGearTouched(ExpandableNotificationRow row, int x, int y) { if (mLongPressListener != null) { - mLongPressListener.onLongPress(row, 0, 0); + mLongPressListener.onLongPress(row, x, y); } } diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipMenuActivity.java index fb7fa4de088f..fd753e9a7044 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipMenuActivity.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipMenuActivity.java @@ -25,6 +25,9 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.systemui.R; +import com.android.systemui.SystemUI; +import com.android.systemui.SystemUIApplication; +import com.android.systemui.recents.Recents; import static android.content.pm.PackageManager.FEATURE_LEANBACK; import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; @@ -214,4 +217,18 @@ public class PipMenuActivity extends Activity implements PipManager.Listener { mPipManager.suspendPipResizing( PipManager.SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_MENU_ACTIVITY_FINISH); } + + @Override + public void finish() { + super.finish(); + if (mPipManager.isRecentsShown()) { + SystemUI[] services = ((SystemUIApplication) getApplication()).getServices(); + for (int i = services.length - 1; i >= 0; i--) { + if (services[i] instanceof Recents) { + ((Recents) services[i]).showRecents(false, null); + break; + } + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java index c06b63bd8f66..005767f7a09e 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java @@ -131,7 +131,7 @@ public class ZenFooter extends LinearLayout { final boolean isForever = mConfig != null && mConfig.manualRule != null && mConfig.manualRule.conditionId == null; - final String line2 = + final CharSequence line2 = isForever ? mContext.getString(com.android.internal.R.string.zen_mode_forever_dnd) : ZenModeConfig.getConditionSummary(mContext, mConfig, mController.getCurrentUser(), true /*shortVersion*/); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTests.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTests.java index 18412519af50..01514646b66e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTests.java @@ -43,7 +43,7 @@ public class TileServicesTests extends SysuiTestCase { QSTileHost host = new QSTileHost(mContext, null, null, null, null, networkController, null, Mockito.mock(HotspotController.class), null, - null, null, null, null, null, null, null); + null, null, null, null, null, null, null, null); mTileService = new TestTileServices(host, Looper.myLooper()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index 00b8de237347..19cb24322095 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -19,12 +19,10 @@ import android.os.HandlerThread; import android.telephony.SubscriptionInfo; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; - import com.android.systemui.R; +import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; -import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener; - import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 471feef15e6c..5d693c988fd0 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -24,334 +24,1734 @@ message MetricsEvent { // Known visual elements: views or controls. enum View { + // Unknown view VIEW_UNKNOWN = 0; + + // OBSOLETE MAIN_SETTINGS = 1; + + // OPEN: Settings > Accessibility + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCESSIBILITY = 2; + + // OPEN: Settings > Accessibility > Captions + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCESSIBILITY_CAPTION_PROPERTIES = 3; + + // OPEN: Settings > Accessibility > [Service] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCESSIBILITY_SERVICE = 4; + + // OPEN: Settings > Accessibility > Color correction + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCESSIBILITY_TOGGLE_DALTONIZER = 5; + + // OPEN: Settings > Accessibility > Accessibility shortcut + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCESSIBILITY_TOGGLE_GLOBAL_GESTURE = 6; + + // OPEN: Settings > Accessibility > Magnification gestures + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION = 7; + + // OPEN: Settings > Accounts + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCOUNT = 8; + + // OPEN: Settings > Accounts > [Single Account Sync Settings] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCOUNTS_ACCOUNT_SYNC = 9; + + // OPEN: Settings > Accounts > Add an account + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCOUNTS_CHOOSE_ACCOUNT_ACTIVITY = 10; + + // OPEN: Settings > Accounts > [List of accounts when more than one] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACCOUNTS_MANAGE_ACCOUNTS = 11; + + // OPEN: Settings > Cellular network settings > APNs + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APN = 12; + + // OPEN: Settings > More > Cellular network settings > APNs > [Edit APN] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APN_EDITOR = 13; + + // OBSOLETE APP_OPS_DETAILS = 14; + + // OBSOLETE APP_OPS_SUMMARY = 15; + + // OBSOLETE APPLICATION = 16; + + // OPEN: Settings > Apps > Configure apps > App links > [App] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_APP_LAUNCH = 17; + + // OBSOLETE APPLICATIONS_APP_PERMISSION = 18; + + // OPEN: Settings > Internal storage > Apps storage > [App] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_APP_STORAGE = 19; + + // OPEN: Settings > Apps > [App info] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_INSTALLED_APP_DETAILS = 20; + + // OPEN: Settings > Memory > App usage > [App Memory usage] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_PROCESS_STATS_DETAIL = 21; + + // OBSOLETE APPLICATIONS_PROCESS_STATS_MEM_DETAIL = 22; + + // OPEN: Settings > Memory > App usage + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_PROCESS_STATS_UI = 23; + + // OPEN: Settings > Bluetooth + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 BLUETOOTH = 24; + + // OPEN: Choose Bluetooth device (ex: when sharing) + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 BLUETOOTH_DEVICE_PICKER = 25; + + // OBSOLETE BLUETOOTH_DEVICE_PROFILES = 26; + + // OPEN: Settings > Security > Choose screen lock + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 CHOOSE_LOCK_GENERIC = 27; + + // OPEN: Settings > Security > Choose screen lock > Choose your password + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 CHOOSE_LOCK_PASSWORD = 28; + + // OPEN: Settings > Security > Choose screen lock > Choose your pattern + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 CHOOSE_LOCK_PATTERN = 29; + + // OPEN: Settings > Security > Choose screen lock > Confirm your password + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 CONFIRM_LOCK_PASSWORD = 30; + + // OPEN: Settings > Security > Choose screen lock > Confirm your pattern + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 CONFIRM_LOCK_PATTERN = 31; + + // OPEN: Settings > Security > Encrypt phone + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 CRYPT_KEEPER = 32; + + // OPEN: Settings > Security > Encrypt phone > Confirm + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 CRYPT_KEEPER_CONFIRM = 33; + + // OPEN: Settings > Search results + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DASHBOARD_SEARCH_RESULTS = 34; + + // OPEN: Settings (Root page) + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DASHBOARD_SUMMARY = 35; + + // OBSOLETE DATA_USAGE = 36; + + // OPEN: Settings > Data usage + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DATA_USAGE_SUMMARY = 37; + + // OPEN: Settings > Date & time + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DATE_TIME = 38; + + // OPEN: Settings > Developer options + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DEVELOPMENT = 39; + + // OPEN: Settings > About phone + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DEVICEINFO = 40; + + // OPEN: Settings > About phone > Status > IMEI information + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DEVICEINFO_IMEI_INFORMATION = 41; + + // OPEN: Settings > Internal storage + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DEVICEINFO_STORAGE = 42; + + // OPEN: Settings > About phone > Status > SIM status + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DEVICEINFO_SIM_STATUS = 43; + + // OPEN: Settings > About phone > Status + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DEVICEINFO_STATUS = 44; + + // OBSOLETE DEVICEINFO_USB = 45; + + // OPEN: Settings > Display + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DISPLAY = 46; + + // OPEN: Settings > Display > Daydream + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 DREAM = 47; + + // OPEN: Settings > Security > Screen lock > Secure start-up + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ENCRYPTION = 48; + + // OPEN: Settings > Security > Nexus Imprint + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 FINGERPRINT = 49; + + // OBSOLETE FINGERPRINT_ENROLL = 50; + + // OPEN: Settings > Battery > History details + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 FUELGAUGE_BATTERY_HISTORY_DETAIL = 51; + + // OPEN: Settings > Battery > Battery saver + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 FUELGAUGE_BATTERY_SAVER = 52; + + // OPEN: Settings > Battery > [App Use details] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 FUELGAUGE_POWER_USAGE_DETAIL = 53; + + // OPEN: Settings > Battery + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 FUELGAUGE_POWER_USAGE_SUMMARY = 54; + + // OPEN: Settings > Home + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 HOME = 55; + + // OPEN: Settings > Security > SIM card lock settings + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ICC_LOCK = 56; + + // OPEN: Settings > Language & input + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 INPUTMETHOD_LANGUAGE = 57; + + // OPEN: Settings > Language & input > Physical keyboard + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 INPUTMETHOD_KEYBOARD = 58; + + // OPEN: Settings > Language & input > Spell checker + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 INPUTMETHOD_SPELL_CHECKERS = 59; + + // OBSOLETE INPUTMETHOD_SUBTYPE_ENABLER = 60; + + // OPEN: Settings > Language & input > Personal dictionary + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 INPUTMETHOD_USER_DICTIONARY = 61; + + // OPEN: Settings > Language & input > Add word + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 INPUTMETHOD_USER_DICTIONARY_ADD_WORD = 62; + + // OPEN: Settings > Location + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 LOCATION = 63; + + // OPEN: Settings > Location > Location mode + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 LOCATION_MODE = 64; + + // OPEN: Settings > Apps + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 MANAGE_APPLICATIONS = 65; + + // OPEN: Settings > Backup & reset > Factory data reset + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 MASTER_CLEAR = 66; + + // OPEN: Settings > Backup & reset > Factory data reset > Confirm + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 MASTER_CLEAR_CONFIRM = 67; + + // OPEN: Settings > Data usage > Network restrictions + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NET_DATA_USAGE_METERED = 68; + + // OPEN: Settings > More > Android Beam + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NFC_BEAM = 69; + + // OPEN: Settings > Tap & pay + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NFC_PAYMENT = 70; + + // OPEN: Settings > Sound & notification + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION = 71; + + // OPEN: Settings > Sound & notification > App notifications > [App] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_APP_NOTIFICATION = 72; + + // OPEN: Settings > Sound & notification > Other sounds + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_OTHER_SOUND = 73; + + // OBSOLETE NOTIFICATION_REDACTION = 74; + + // OPEN: Settings Widget > Notification log + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_STATION = 75; + + // OPEN: Settings > Sound & notification > Do not disturb + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_ZEN_MODE = 76; + + // OPEN: OBSOLETE OWNER_INFO = 77; + + // OPEN: Print job notification > Print job settings + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 PRINT_JOB_SETTINGS = 78; + + // OPEN: Settings > Printing > [Print Service] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 PRINT_SERVICE_SETTINGS = 79; + + // OPEN: Settings > Printing + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 PRINT_SETTINGS = 80; + + // OPEN: Settings > Backup & reset + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 PRIVACY = 81; + + //OBSOLETE PROXY_SELECTOR = 82; + + // OPEN: Settings > Backup & reset > Network settings reset + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 RESET_NETWORK = 83; + + // OPEN: Settings > Backup & reset > Network settings reset > Confirm + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 RESET_NETWORK_CONFIRM = 84; + + // OPEN: Settings > Developer Options > Running Services + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 RUNNING_SERVICE_DETAILS = 85; + + // OPEN: Settings > Security > Screen pinning + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 SCREEN_PINNING = 86; + + // OPEN: Settings > Security + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 SECURITY = 87; + + // OPEN: Settings > SIM cards + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 SIM = 88; + + // OBSOLETE TESTING = 89; + + // OPEN: Settings > More > Tethering & portable hotspot + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TETHER = 90; + + // OPEN: Settings > Security > Trust agents + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TRUST_AGENT = 91; + + // OPEN: Settings > Security > Trusted credentials + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TRUSTED_CREDENTIALS = 92; + + // OPEN: Settings > Language & input > TTS output > [Engine] > Settings + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TTS_ENGINE_SETTINGS = 93; + + // OPEN: Settings > Language & input > Text-to-speech output + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TTS_TEXT_TO_SPEECH = 94; + + // OPEN: Settings > Security > Apps with usage access + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 USAGE_ACCESS = 95; + + // OPEN: Settings > Users + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 USER = 96; + + // OPEN: Settings > Users > [Restricted profile app & content access] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 USERS_APP_RESTRICTIONS = 97; + + // OPEN: Settings > Users > [User settings] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 USER_DETAILS = 98; + + // OBSOLETE VOICE_INPUT = 99; + + // OPEN: Settings > More > VPN + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 VPN = 100; + + // OPEN: Settings > Display > Choose wallpaper from + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 WALLPAPER_TYPE = 101; + + // OPEN: Settings > Display > Cast + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 WFD_WIFI_DISPLAY = 102; + + // OPEN: Settings > Wi-Fi + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 WIFI = 103; + + // OPEN: Settings > Wi-Fi > Advanced Wi-Fi + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 WIFI_ADVANCED = 104; + + // OPEN: Settings > More > Wi-Fi Calling + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 WIFI_CALLING = 105; + + // OPEN: Settings > Wi-Fi > Saved networks + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 WIFI_SAVED_ACCESS_POINTS = 106; + + // OBSOLETE WIFI_APITEST = 107; + + // OBSOLETE WIFI_INFO = 108; + + // OPEN: Settings > Wi-Fi > Advanced Wi-Fi > Wi-Fi Direct + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 WIFI_P2P = 109; + + // OPEN: Settings > More + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 WIRELESS = 110; + + // OPEN: Quick Settings Panel + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_PANEL = 111; + + // OPEN: QS Airplane mode tile shown + // ACTION: QS Airplane mode tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_AIRPLANEMODE = 112; + + // OPEN: QS Bluetooth tile shown + // ACTION: QS Bluetooth tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_BLUETOOTH = 113; + + // OPEN: QS Cast tile shown + // ACTION: QS Cast tile tapped + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_CAST = 114; + + // OPEN: QS Cellular tile shown + // ACTION: QS Cellular tile tapped + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_CELLULAR = 115; + + // OPEN: QS Color inversion tile shown + // ACTION: QS Color inversion tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_COLORINVERSION = 116; + + // OPEN: QS Cellular tile > Cellular detail panel + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_DATAUSAGEDETAIL = 117; + + // OPEN: QS Do not disturb tile shown + // ACTION: QS Do not disturb tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_DND = 118; + + // OPEN: QS Flashlight tile shown + // ACTION: QS Flashlight tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_FLASHLIGHT = 119; + + // OPEN: QS Hotspot tile shown + // ACTION: QS Hotspot tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_HOTSPOT = 120; + + // OPEN: QS 3P tile shown + // ACTION: QS 3P tile tapped + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_INTENT = 121; + + // OPEN: QS Location tile shown + // ACTION: QS Location tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_LOCATION = 122; + + // OPEN: QS Rotation tile shown + // ACTION: QS Rotation tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_ROTATIONLOCK = 123; + + // OBSOLETE QS_USERDETAILITE = 124; + + // OPEN: QS User list panel + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_USERDETAIL = 125; + + // OPEN: QS WiFi tile shown + // ACTION: QS WiFi tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.46 QS_WIFI = 126; + + // OPEN: Notification Panel (including lockscreen) + // CATEGORY: NOTIFICATION + // OS: 5.1.1 + // GMS: 7.5.26 NOTIFICATION_PANEL = 127; + + // OPEN: Notification in panel became visible. + // PACKAGE: App that posted the notification. + // ACTION: Notification is tapped. + // PACKAGE: App that posted the notification + // DETAIL: Notification is expanded by user. + // PACKAGE: App that posted the notification + // DISMISS: Notification is dismissed. + // PACKAGE: App that posted the notification + // SUBTYPE: Dismiss reason from NotificationManagerService.java + // CATEGORY: NOTIFICATION + // OS: 5.1.1 + // GMS: 7.5.26 NOTIFICATION_ITEM = 128; + + // ACTION: User tapped notification action + // PACKAGE: App that posted the notification + // SUBTYPE: Index of action on notification + // CATEGORY: NOTIFICATION + // OS: 5.0 + // GMS: 7.5.26 NOTIFICATION_ITEM_ACTION = 129; + + // OPEN: Settings > Apps > Configure apps > App permissions + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_ADVANCED = 130; + + // OPEN: Settings > Location > Scanning + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 LOCATION_SCANNING = 131; + + // OBSOLETE MANAGE_APPLICATIONS_ALL = 132; + + // OPEN: Settings > Sound & notification > App notifications + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 MANAGE_APPLICATIONS_NOTIFICATIONS = 133; + + // ACTION: Settings > Wi-Fi > Overflow > Add Network + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_WIFI_ADD_NETWORK = 134; + + // ACTION: Settings > Wi-Fi > [Long press network] > Connect to network + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_WIFI_CONNECT = 135; + + // ACTION: Settings > Wi-Fi > Overflow > Refresh + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_WIFI_FORCE_SCAN = 136; + + // ACTION: Settings > Wi-Fi > [Long press network] > Forget network + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_WIFI_FORGET = 137; + + // ACTION: Settings > Wi-Fi > Toggle off + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_WIFI_OFF = 138; + + // ACTION: Settings > Wi-Fi > Toggle on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_WIFI_ON = 139; + + // OBSOLETE MANAGE_PERMISSIONS = 140; + + // OPEN: Settings > Sound & notification > DND > Priority only allows + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_ZEN_MODE_PRIORITY = 141; + + // OPEN: Settings > Sound & notification > DND > Automatic rules + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_ZEN_MODE_AUTOMATION = 142; + + // OPEN: Settings > Apps > Configure apps > App links + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 MANAGE_DOMAIN_URLS = 143; + + // OPEN: Settings > Sound & notification > DND > [Time based rule] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_ZEN_MODE_SCHEDULE_RULE = 144; + + // OPEN: Settings > Sound & notification > DND > [External rule] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_ZEN_MODE_EXTERNAL_RULE = 145; + + // OPEN: Settings > Sound & notification > DND > [Event rule] + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_ZEN_MODE_EVENT_RULE = 146; + + // ACTION: App notification settings > Block Notifications + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_BAN_APP_NOTES = 147; + + // ACTION: Notification shade > Dismiss all button + // CATEGORY: NOTIFICATION + // OS: 6.0 + // GMS: 7.5.26 ACTION_DISMISS_ALL_NOTES = 148; + + // OPEN: QS Do Not Disturb detail panel + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_DND_DETAILS = 149; + + // OPEN: QS Bluetooth detail panel + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_BLUETOOTH_DETAILS = 150; + + // OPEN: QS Cast detail panel + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_CAST_DETAILS = 151; + + // OPEN: QS Wi-Fi detail panel + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_WIFI_DETAILS = 152; + + // ACTION: QS Wi-Fi detail panel > Wi-Fi toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_WIFI_TOGGLE = 153; + + // ACTION: QS Bluetooth detail panel > Bluetooth toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_BLUETOOTH_TOGGLE = 154; + + // ACTION: QS Cellular detail panel > Cellular toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_CELLULAR_TOGGLE = 155; + + // ACTION: QS User list panel > Select different user + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_SWITCH_USER = 156; + + // ACTION: QS Cast detail panel > Select cast device + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_CAST_SELECT = 157; + + // ACTION: QS Cast detail panel > Disconnect cast device + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_CAST_DISCONNECT = 158; + + // ACTION: Settings > Bluetooth > Toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_BLUETOOTH_TOGGLE = 159; + + // ACTION: Settings > Bluetooth > Overflow > Refresh + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_BLUETOOTH_SCAN = 160; + + // ACTION: Settings > Bluetooth > Overflow > Rename this device + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_BLUETOOTH_RENAME = 161; + + // ACTION: Settings > Bluetooth > Overflow > Show received files + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_BLUETOOTH_FILES = 162; + + // ACTION: QS DND details panel > Increase / Decrease exit time + // SUBTYPE: true is increase, false is decrease + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_DND_TIME = 163; + + // ACTION: QS DND details panel > [Exit condition] + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_DND_CONDITION_SELECT = 164; + + // ACTION: QS DND details panel > [DND mode] + // SUBTYPE: 1 is priority, 2 is silence, 3 is alarms only + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_DND_ZEN_SELECT = 165; + + // ACTION: QS DND detail panel > DND toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 QS_DND_TOGGLE = 166; + + // ACTION: DND Settings > Priority only allows > Reminder toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_ALLOW_REMINDERS = 167; + + // ACTION: DND Settings > Priority only allows > Event toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_ALLOW_EVENTS = 168; + + // ACTION: DND Settings > Priority only allows > Messages + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_ALLOW_MESSAGES = 169; + + // ACTION: DND Settings > Priority only allows > Calls + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_ALLOW_CALLS = 170; + + // ACTION: DND Settings > Priority only allows > Repeat callers toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_ALLOW_REPEAT_CALLS = 171; + + // ACTION: DND Settings > Automatic rules > Add rule + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_ADD_RULE = 172; + + // ACTION: DND Settings > Automatic rules > Add rule > OK + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_ADD_RULE_OK = 173; + + // ACTION: DND Settings > Automatic rules > [Rule] > Delete rule + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_DELETE_RULE = 174; + + // ACTION: DND Settings > Automatic rules > [Rule] > Delete rule > Delete + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_DELETE_RULE_OK = 175; + + // ACTION: DND Settings > Automatic rules > [Rule] > Toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ZEN_ENABLE_RULE = 176; + + // ACTION: Settings > More > Airplane mode toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_AIRPLANE_TOGGLE = 177; + + // ACTION: Settings > Data usage > Cellular data toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_CELL_DATA_TOGGLE = 178; + + // OPEN: Settings > Sound & notification > Notification access + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_ACCESS = 179; + + // OPEN: Settings > Sound & notification > Do Not Disturb access + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 NOTIFICATION_ZEN_MODE_ACCESS = 180; + + // OPEN: Settings > Apps > Configure apps > Default Apps + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_DEFAULT_APPS = 181; + + // OPEN: Settings > Internal storage > Apps storage + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_STORAGE_APPS = 182; + + // OPEN: Settings > Security > Usage access + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_USAGE_ACCESS_DETAIL = 183; + + // OPEN: Settings > Battery > Battery optimization + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_HIGH_POWER_APPS = 184; + + // OBSOLETE FUELGAUGE_HIGH_POWER_DETAILS = 185; + + // ACTION: Lockscreen > Unlock gesture + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 ACTION_LS_UNLOCK = 186; + + // ACTION: Lockscreen > Pull shade open + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 ACTION_LS_SHADE = 187; + + // ACTION: Lockscreen > Tap on lock, shows hint + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 ACTION_LS_HINT = 188; + + // ACTION: Lockscreen > Camera + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 ACTION_LS_CAMERA = 189; + + // ACTION: Lockscreen > Dialer + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 ACTION_LS_DIALER = 190; + + // ACTION: Lockscreen > Tap on lock, locks phone + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 ACTION_LS_LOCK = 191; + + // ACTION: Lockscreen > Tap on notification, false touch rejection + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 ACTION_LS_NOTE = 192; + + // ACTION: Lockscreen > Swipe down to open quick settings + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.8.22 ACTION_LS_QS = 193; + + // ACTION: Swipe down to open quick settings when unlocked + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.8.22 ACTION_SHADE_QS_PULL = 194; + + // ACTION: Notification shade > Tap to open quick settings + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.8.22 ACTION_SHADE_QS_TAP = 195; + + // OPEN: Lockscreen + // SUBTYPE: 0 is unsecure, 1 is secured by password / pattern / PIN + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 LOCKSCREEN = 196; + + // OPEN: Lockscreen > Screen to enter password / pattern / PIN + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 BOUNCER = 197; + + // OPEN: Screen turned on + // SUBTYPE: 2 is user action + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.8.22 SCREEN = 198; + + // OPEN: Notification caused sound, vibration, and/or LED blink + // SUBTYPE: 1 is buzz, 2 is beep, blink is 4, or'd together + // CATEGORY: NOTIFICATION + // OS: 5.1.1 + // GMS: 7.8.53 NOTIFICATION_ALERT = 199; + + // ACTION: Lockscreen > Emergency Call button + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 5.1.1 + // GMS: 7.5.26 ACTION_EMERGENCY_CALL = 200; + + // OPEN: Settings > Apps > Configure > Default apps > Assist & voice input + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 APPLICATIONS_MANAGE_ASSIST = 201; + + // OPEN: Settings > Memory + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 PROCESS_STATS_SUMMARY = 202; + + // ACTION: Settings > Display > When device is rotated + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_ROTATION_LOCK = 203; + + // ACTION: Long press on notification to view controls + // CATEGORY: NOTIFICATION + // OS: 6.0 + // GMS: 7.5.26 ACTION_NOTE_CONTROLS = 204; + + // ACTION: Notificatoin controls > Info button + // CATEGORY: NOTIFICATION + // OS: 6.0 + // GMS: 7.5.26 ACTION_NOTE_INFO = 205; + + // ACTION: Notification controls > Settings button + // CATEGORY: NOTIFICATION + // OS: 6.0 + // GMS: 7.5.26 ACTION_APP_NOTE_SETTINGS = 206; + + // OPEN: Volume Dialog (with hardware buttons) + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 VOLUME_DIALOG = 207; + + // OPEN: Volume dialog > Expanded volume dialog (multiple sliders) + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 VOLUME_DIALOG_DETAILS = 208; + + // ACTION: Volume dialog > Adjust volume slider + // SUBTYPE: volume level (0-7) + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_VOLUME_SLIDER = 209; + + // ACTION: Volume dialog > Select non-active stream + // SUBTYPE: stream (defined in AudioSystem.java) + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_VOLUME_STREAM = 210; + + // ACTION: Adjust volume with hardware key + // SUBTYPE: volume level (0-7) + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_VOLUME_KEY = 211; + + // ACTION: Volume dialog > Mute a stream by tapping icon + // SUBTYPE: mute is 1, audible is 2 + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_VOLUME_ICON = 212; + + // ACTION: Volume dialog > Change ringer mode by tapping icon + // SUBTYPE: 2 is audible, 3 is vibrate + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_RINGER_MODE = 213; + + // ACTION: Chooser shown (share target, file open, etc.) + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_ACTIVITY_CHOOSER_SHOWN = 214; + + // ACTION: Chooser > User taps an app target + // SUBTYPE: Index of target + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_ACTIVITY_CHOOSER_PICKED_APP_TARGET = 215; + + // ACTION: Chooser > User taps a service target + // SUBTYPE: Index of target + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_ACTIVITY_CHOOSER_PICKED_SERVICE_TARGET = 216; + + // ACTION: Chooser > User taps a standard target + // SUBTYPE: Index of target + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_ACTIVITY_CHOOSER_PICKED_STANDARD_TARGET = 217; + + // ACTION: QS Brightness Slider (with auto brightness disabled) + // SUBTYPE: slider value + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_BRIGHTNESS = 218; + + // ACTION: QS Brightness Slider (with auto brightness enabled) + // SUBTYPE: slider value + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_BRIGHTNESS_AUTO = 219; + + // OPEN: Settings > Display > Brightness Slider + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 BRIGHTNESS_DIALOG = 220; + + // OPEN: Settings > Apps > Configure Apps > Draw over other apps + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 SYSTEM_ALERT_WINDOW_APPS = 221; + + // OPEN: Display has entered dream mode + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 DREAMING = 222; + + // OPEN: Display has entered ambient notification mode + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 DOZING = 223; + + // OPEN: Overview + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 OVERVIEW_ACTIVITY = 224; + + // OPEN: Settings > About phone > Legal information + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ABOUT_LEGAL_SETTINGS = 225; + + // OPEN: Settings > Search > Perform search + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 ACTION_SEARCH_RESULTS = 226; + + // OPEN: Settings > System UI Tuner + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER = 227; + + // OPEN: Settings > System UI Tuner > Quick Settings + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_QS = 228; + + // OPEN: Settings > System UI Tuner > Demo mode + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_DEMO_MODE = 229; + + // ACTION: Settings > System UI Tuner > Quick Settings > Move tile + // PACKAGE: Tile + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_QS_REORDER = 230; + + // ACTION: Settings > System UI Tuner > Quick Settings > Add tile + // PACKAGE: Tile + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_QS_ADD = 231; + + // ACTION: Settings > System UI Tuner > Quick Settings > Remove tile + // PACKAGE: Tile + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_QS_REMOVE = 232; + + // ACTION: Settings > System UI Tuner > Status bar > Enable icon + // PACKAGE: Icon + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_STATUS_BAR_ENABLE = 233; + + // ACTION: Settings > System UI Tuner > Status bar > Disable icon + // PACKAGE: Icon + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_STATUS_BAR_DISABLE = 234; + + // ACTION: Settings > System UI Tuner > Demo mode > Enable demo mode + // SUBTYPE: false is disabled, true is enabled + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_DEMO_MODE_ENABLED = 235; + + // ACTION: Settings > System UI Tuner > Demo mode > Show demo mode + // SUBTYPE: false is disabled, true is enabled + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_DEMO_MODE_ON = 236; + + // ACTION: Settings > System UI Tuner > Show embedded battery percentage + // SUBTYPE: 0 is disabled, 1 is enabled + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 TUNER_BATTERY_PERCENTAGE = 237; + + // OPEN: Settings > Developer options > Inactive apps + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.5.26 FUELGAUGE_INACTIVE_APPS = 238; + + // ACTION: Long press home to bring up assistant + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.5.26 ACTION_ASSIST_LONG_PRESS = 239; + + // OPEN: Settings > Security > Nexus Imprint > Add Fingerprint + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLLING = 240; + + // OPEN: Fingerprint Enroll > Find Sensor + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_FIND_SENSOR = 241; + + // OPEN: Fingerprint Enroll > Fingerprint Enrolled! + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLL_FINISH = 242; + + // OPEN: Fingerprint Enroll introduction + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLL_INTRO = 243; + + // OPEN: Fingerprint Enroll onboarding + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLL_ONBOARD = 244; + + // OPEN: Fingerprint Enroll > Let's Start! + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLL_SIDECAR = 245; + + // OPEN: Fingerprint Enroll SUW > Let's Start! + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLLING_SETUP = 246; + + // OPEN: Fingerprint Enroll SUW > Find Sensor + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_FIND_SENSOR_SETUP = 247; + + // OPEN: Fingerprint Enroll SUW > Fingerprint Enrolled! + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLL_FINISH_SETUP = 248; + + // OPEN: Fingerprint Enroll SUW introduction + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLL_INTRO_SETUP = 249; + + // OPEN: Fingerprint Enroll SUW onboarding + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 FINGERPRINT_ENROLL_ONBOARD_SETUP = 250; + + // ACTION: Add fingerprint > Enroll fingerprint + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 ACTION_FINGERPRINT_ENROLL = 251; + + // ACTION: Authenticate using fingerprint + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 ACTION_FINGERPRINT_AUTH = 252; + + // ACTION: Settings > Security > Nexus Imprint > [Fingerprint] > Delete + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 ACTION_FINGERPRINT_DELETE = 253; + + // ACTION: Settings > Security > Nexus Imprint > [Fingerprint] > Rename + // CATEGORY: SETTINGS + // OS: 6.0 + // GMS: 7.8.99 ACTION_FINGERPRINT_RENAME = 254; + + // ACTION: Double tap camera shortcut + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.8.99 ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE = 255; + + // ACTION: Double twist camera shortcut + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: 6.0 + // GMS: 7.8.99 ACTION_WIGGLE_CAMERA_GESTURE = 256; + + // OPEN: QS Work Mode tile shown + // ACTION: QS Work Mode tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: N + // GMS: 7.8.99 QS_WORKMODE = 257; + + // OPEN: Settings > Developer Options > Background Check + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 BACKGROUND_CHECK_SUMMARY = 258; + + // OPEN: QS Lock tile shown + // ACTION: QS Lock tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: N + // GMS: 7.8.99 QS_LOCK_TILE = 259; + + // OPEN: QS User Tile shown + // CATEGORY: QUICK_SETTINGS + // OS: N + // GMS: 7.8.99 QS_USER_TILE = 260; + + // OPEN: QS Battery tile shown + // CATEGORY: QUICK_SETTINGS + // OS: N + // GMS: 7.8.99 QS_BATTERY_TILE = 261; + + // OPEN: Settings > Sound > Do not disturb > Visual interruptions + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 NOTIFICATION_ZEN_MODE_VISUAL_INTERRUPTIONS = 262; + + // ACTION: Visual interruptions > No screen interuptions toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_ZEN_ALLOW_WHEN_SCREEN_OFF = 263; - // Dead + + // ACTION: Visual interruptions > No notification light toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_ZEN_ALLOW_LIGHTS = 264; + + // OPEN: Settings > Notifications > [App] > Topic Notifications + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 NOTIFICATION_TOPIC_NOTIFICATION = 265; + + // ACTION: Settings > Apps > Default Apps > Select different SMS app + // PACKAGE: Selected SMS app + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_DEFAULT_SMS_APP_CHANGED = 266; + + // OPEN: QS Color modification tile shown + // ACTION: QS Color modification tile tapped + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: QUICK_SETTINGS + // OS: N + // GMS: 7.8.99 QS_COLOR_MATRIX = 267; + + // OPEN: QS Custom tile shown + // ACTION: QS Work Mode tile tapped + // CATEGORY: QUICK_SETTINGS + // OS: N + // GMS: 7.8.99 QS_CUSTOM = 268; + + // ACTION: Visual interruptions > Never turn off the screen toggle + // SUBTYPE: 0 is off, 1 is on + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_ZEN_ALLOW_WHEN_SCREEN_ON = 269; - // Logged when the user docks a window from recents by - // longpressing a task and dragging it to the dock area. + // ACTION: Overview > Long-press task, drag to enter split-screen + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 ACTION_WINDOW_DOCK_DRAG_DROP = 270; - // Logged when the user docks a fullscreen window by long pressing - // recents which also opens recents on the lower/right side. + // ACTION: In App > Long-press Overview button to enter split-screen + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 ACTION_WINDOW_DOCK_LONGPRESS = 271; - // Logged when the user docks a window by dragging from the navbar - // which also opens recents on the lower/right side. + // ACTION: In App > Swipe Overview button to enter split-screen + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 ACTION_WINDOW_DOCK_SWIPE = 272; - // Logged when the user launches a profile-specific app and we - // intercept it with the confirm credentials UI. + // ACTION: Launch profile-specific app > Confirm credentials + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 PROFILE_CHALLENGE = 273; + // OPEN: QS Battery detail panel + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 QS_BATTERY_DETAIL = 274; - // Logged when the user goes into the overview history. + // OPEN: Overview > History + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 OVERVIEW_HISTORY = 275; - // Logged when the user pages through overview. - OVERVIEW_PAGE = 276; + // ACTION: Overview > Page by tapping Overview button + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 + ACTION_OVERVIEW_PAGE = 276; - // Logged when the user launches a task from overview. - OVERVIEW_SELECT = 277; + // ACTION: Overview > Select app + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 + ACTION_OVERVIEW_SELECT = 277; - // Logged when the user views the emergency info. + // ACTION: View emergency info + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 ACTION_VIEW_EMERGENCY_INFO = 278; - // Logged when the user views the edit emergency info activity. + // ACTION: Edit emergency info activity + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_EDIT_EMERGENCY_INFO = 279; - // Logged when the user edits an emergency info field. + // ACTION: Edit emergency info field + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_EDIT_EMERGENCY_INFO_FIELD = 280; - // Logged when the user adds a new emergency contact. + // ACTION: Add emergency contact + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_ADD_EMERGENCY_CONTACT = 281; - // Logged when the user deletes an emergency contact. + // ACTION: Delete emergency contact + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_DELETE_EMERGENCY_CONTACT = 282; - // Logged when the user calls an emergency contact. + // ACTION: Call emergency contact + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 ACTION_CALL_EMERGENCY_CONTACT = 283; - // QS Tile for Data Saver. + // OPEN: QS Data Saver tile shown + // ACTION: QS Data Saver tile tapped + // CATEGORY: QUICK_SETTINGS QS_DATA_SAVER = 284; // OPEN: Settings > Security > User credentials // CATEGORY: Settings - // OS: 6.1 + // OS: N // GMS: 7.8.99 USER_CREDENTIALS = 285; - // Logged when the user undocks a previously docked window by long pressing recents while in - // docked mode. + // ACTION: In App (splitscreen) > Long-press Overview to exit split-screen + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 ACTION_WINDOW_UNDOCK_LONGPRESS = 286; // Logged when the user scrolls through overview manually @@ -370,43 +1770,66 @@ message MetricsEvent { // indicate the user lowered the importance; positive means they increased it. ACTION_SAVE_IMPORTANCE = 291; - // Interactive bug report initiated from power menu. + // ACTION: Long-press power button, then tap "Take bug report" option. + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 ACTION_BUGREPORT_FROM_POWER_MENU_INTERACTIVE = 292; - // Full bug report initiated from power menu. + // ACTION: Long-press power button, then long-press "Take bug report" option. + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N + // GMS: 7.8.99 ACTION_BUGREPORT_FROM_POWER_MENU_FULL = 293; + // ACTION: Settings -> Developer Options -> Take bug report -> Interactive report + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 // Interactive bug report initiated from Settings. ACTION_BUGREPORT_FROM_SETTINGS_INTERACTIVE = 294; - // Full bug report initiated from Settings. + // ACTION: Settings -> Developer Options -> Take bug report -> Full report + // CATEGORY: SETTINGS + // OS: N + // GMS: 7.8.99 + // Interactive bug report initiated from Settings. ACTION_BUGREPORT_FROM_SETTINGS_FULL = 295; - // Bug report canceled using system notification. + // ACTION: User tapped notification action to cancel a bug report + // CATEGORY: NOTIFICATION ACTION_BUGREPORT_NOTIFICATION_ACTION_CANCEL = 296; - // Bug report details screen open using system notification. + // ACTION: User tapped notification action to launch bug report details screen + // CATEGORY: NOTIFICATION ACTION_BUGREPORT_NOTIFICATION_ACTION_DETAILS = 297; - // Additional Bug report screen shot taken using system notification. + // ACTION: User tapped notification action to take adition screenshot on bug report + // CATEGORY: NOTIFICATION ACTION_BUGREPORT_NOTIFICATION_ACTION_SCREENSHOT = 298; - // Bug report shared by user using system notification. + // ACTION: User tapped notification to share bug report + // CATEGORY: NOTIFICATION ACTION_BUGREPORT_NOTIFICATION_ACTION_SHARE = 299; - // User changed bug report name using the details screen. + // ACTION: User changed bug report name using the details screen + // CATEGORY: GLOBAL_SYSTEM_UI ACTION_BUGREPORT_DETAILS_NAME_CHANGED = 300; - // User changed bug report title using the details screen. + // ACTION: User changed bug report title using the details screen + // CATEGORY: GLOBAL_SYSTEM_UI ACTION_BUGREPORT_DETAILS_TITLE_CHANGED = 301; - // User changed bug report description using the details screen. + // ACTION: User changed bug report description using the details screen + // CATEGORY: GLOBAL_SYSTEM_UI ACTION_BUGREPORT_DETAILS_DESCRIPTION_CHANGED = 302; - // Changes made on bug report details screen were saved by user. + // ACTION: User tapped Save in the bug report details screen. + // CATEGORY: GLOBAL_SYSTEM_UI ACTION_BUGREPORT_DETAILS_SAVED = 303; - // Changes made on bug report details screen were canceled by user. + // ACTION: User tapped Cancel in the bug report details screen. + // CATEGORY: GLOBAL_SYSTEM_UI ACTION_BUGREPORT_DETAILS_CANCELED = 304; // Tuner: Open/close calibrate dialog. @@ -478,5 +1901,34 @@ message MetricsEvent { // Logged when we execute an app transition. This indicates the device uptime in seconds when // the transition was executed. APP_TRANSITION_DEVICE_UPTIME_SECONDS = 325; + + // User granted access to the request folder; action takes an integer + // representing the folder's index on Environment.STANDARD_DIRECTORIES + ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_FOLDER = 326; + + // User denied access to the request folder; action takes an integer + // representing the folder's index on Environment.STANDARD_DIRECTORIES + ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_FOLDER = 327; + + // User granted access to the request folder; action pass package name + // of calling package. + ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_PACKAGE = 328; + + // User denied access to the request folder; action pass package name + // of calling package. + ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_PACKAGE = 329; + + // App requested access to a directory it has already been granted + // access before; action takes an integer representing the folder's + // index on Environment.STANDARD_DIRECTORIES + ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_FOLDER = 330; + + // App requested access to a directory it has already been granted + // access before; action pass package name of calling package. + ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_PACKAGE = 331; + + // Add new aosp constants above this line. + // END OF AOSP CONSTANTS + } } diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index f537d182035e..8603981ec88a 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -16,9 +16,14 @@ package com.android.server.appwidget; +import static android.content.Context.KEYGUARD_SERVICE; +import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; + import android.app.AlarmManager; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.KeyguardManager; import android.app.PendingIntent; import android.app.admin.DevicePolicyManagerInternal; import android.app.admin.DevicePolicyManagerInternal.OnCrossProfileWidgetProvidersChangeListener; @@ -72,10 +77,12 @@ import android.util.SparseIntArray; import android.util.TypedValue; import android.util.Xml; import android.view.Display; +import android.view.View; import android.view.WindowManager; import android.widget.RemoteViews; import com.android.internal.R; +import com.android.internal.app.UnlaunchableAppActivity; import com.android.internal.appwidget.IAppWidgetHost; import com.android.internal.appwidget.IAppWidgetService; import com.android.internal.os.BackgroundThread; @@ -146,7 +153,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); if (DEBUG) { - Slog.i(TAG, "Received broadcast: " + action); + Slog.i(TAG, "Received broadcast: " + action + " on user " + userId); } if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { @@ -156,10 +163,10 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } else if (Intent.ACTION_USER_STOPPED.equals(action)) { onUserStopped(userId); } else if (Intent.ACTION_USER_SWITCHED.equals(action)) { - reloadWidgetsMaskedStateForUser(userId); + reloadWidgetsMaskedStateForGroup(userId); } else if (Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED.equals(action)) { synchronized (mLock) { - reloadWidgetProfileUnavailableMaskedStateLocked(userId); + reloadWidgetsMaskedState(userId); } } else if (Intent.ACTION_PACKAGES_SUSPENDED.equals(action)) { String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); @@ -202,6 +209,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku private final AlarmManager mAlarmManager; private final UserManager mUserManager; private final AppOpsManager mAppOpsManager; + private final KeyguardManager mKeyguardManager; private final SecurityPolicy mSecurityPolicy; @@ -223,6 +231,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); + mKeyguardManager = (KeyguardManager) mContext.getSystemService(KEYGUARD_SERVICE); mSaveStateHandler = BackgroundThread.getHandler(); mCallbackHandler = new CallbackHandler(mContext.getMainLooper()); mBackupRestoreController = new BackupRestoreController(); @@ -436,48 +445,51 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku /** * Reload all widgets' masked state for the given user and its associated profiles, including * due to user not being available and package suspension. + * userId must be the group parent. */ - private void reloadWidgetsMaskedStateForUser(int userId) { - if (!mUserManager.isUserUnlocked(userId) || - isProfileWithLockedParent(userId)) { + private void reloadWidgetsMaskedStateForGroup(int userId) { + if (!mUserManager.isUserUnlocked(userId)) { return; } synchronized (mLock) { - reloadWidgetPackageSuspensionMaskedStateLocked(userId); + reloadWidgetsMaskedState(userId); List<UserInfo> profiles = mUserManager.getEnabledProfiles(userId); if (profiles != null) { for (int i = 0; i < profiles.size(); i++) { UserInfo user = profiles.get(i); - reloadWidgetProfileUnavailableMaskedStateLocked(user.id); - reloadWidgetPackageSuspensionMaskedStateLocked(user.id); + reloadWidgetsMaskedState(user.id); } } } } - /** - * Mask/unmask widgets in the given profile, depending on the quiet state - * or locked state of the profile. - */ - private void reloadWidgetProfileUnavailableMaskedStateLocked(int profileId) { + private void reloadWidgetsMaskedState(int userId) { final long identity = Binder.clearCallingIdentity(); try { - if (!isProfileWithUnlockedParent(profileId)) { - return; - } - UserInfo user = mUserManager.getUserInfo(profileId); - boolean shouldMask = user.isQuietModeEnabled() || - !mUserManager.isUserUnlocked(user.getUserHandle()); + UserInfo user = mUserManager.getUserInfo(userId); + + boolean lockedProfile = !mUserManager.isUserUnlocked(userId); + boolean quietProfile = user.isQuietModeEnabled(); final int N = mProviders.size(); for (int i = 0; i < N; i++) { Provider provider = mProviders.get(i); int providerUserId = provider.getUserId(); - if (providerUserId != profileId) { + if (providerUserId != userId) { continue; } - if (provider.setMaskedByProfileUnavailabledLocked(shouldMask)) { + + boolean changed = provider.setMaskedByLockedProfileLocked(lockedProfile); + changed |= provider.setMaskedByQuietProfileLocked(quietProfile); + try { + boolean suspended = mPackageManager.isPackageSuspendedForUser( + provider.info.provider.getPackageName(), provider.getUserId()); + changed |= provider.setMaskedBySuspendedPackageLocked(suspended); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to query application info", e); + } + if (changed) { if (provider.isMaskedLocked()) { - maskWidgetsViewsLocked(provider); + maskWidgetsViewsLocked(provider, null); } else { unmaskWidgetsViewsLocked(provider); } @@ -489,33 +501,6 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } /** - * Reload widget's masked state due to package suspension state. - */ - private void reloadWidgetPackageSuspensionMaskedStateLocked(int profileId) { - final int N = mProviders.size(); - for (int i = 0; i < N; i++) { - Provider provider = mProviders.get(i); - int providerUserId = provider.getUserId(); - if (providerUserId != profileId) { - continue; - } - try { - boolean suspended = mPackageManager.isPackageSuspendedForUser( - provider.info.provider.getPackageName(), provider.getUserId()); - if (provider.setMaskedBySuspendedPackageLocked(suspended)) { - if (provider.isMaskedLocked()) { - maskWidgetsViewsLocked(provider); - } else { - unmaskWidgetsViewsLocked(provider); - } - } - } catch (RemoteException e) { - Slog.e(TAG, "Failed to query application info", e); - } - } - } - - /** * Incrementally update the masked state due to package suspension state. */ private void updateWidgetPackageSuspensionMaskedState(String[] packagesArray, boolean suspended, @@ -535,7 +520,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } if (provider.setMaskedBySuspendedPackageLocked(suspended)) { if (provider.isMaskedLocked()) { - maskWidgetsViewsLocked(provider); + maskWidgetsViewsLocked(provider, null); } else { unmaskWidgetsViewsLocked(provider); } @@ -544,14 +529,13 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } - private Bitmap createMaskedWidgetBitmap(Provider provider) { + private Bitmap createMaskedWidgetBitmap(String providerPackage, int providerUserId) { final long identity = Binder.clearCallingIdentity(); try { // Load the unbadged application icon and pass it to the widget to appear on // the masked view. - final String providerPackage = provider.info.provider.getPackageName(); Context userContext = mContext.createPackageContextAsUser(providerPackage, 0, - UserHandle.of(provider.getUserId())); + UserHandle.of(providerUserId)); PackageManager pm = userContext.getPackageManager(); Drawable icon = pm.getApplicationInfo(providerPackage, 0).loadUnbadgedIcon(pm); // Create a bitmap of the icon which is what the widget's remoteview requires. @@ -566,18 +550,73 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } - private void maskWidgetsViewsLocked(Provider provider) { - Bitmap iconBitmap = createMaskedWidgetBitmap(provider); + private RemoteViews createMaskedWidgetRemoteViews(Bitmap icon, boolean showBadge, + PendingIntent onClickIntent) { + RemoteViews views = new RemoteViews(mContext.getPackageName(), + R.layout.work_widget_mask_view); + if (icon != null) { + views.setImageViewBitmap(R.id.work_widget_app_icon, icon); + } + if (!showBadge) { + views.setViewVisibility(R.id.work_widget_badge_icon, View.INVISIBLE); + } + if (onClickIntent != null) { + views.setOnClickPendingIntent(R.id.work_widget_mask_frame, onClickIntent); + } + return views; + } + + /** + * Mask the target widget belonging to the specified provider, or all active widgets + * of the provider if target widget == null. + */ + private void maskWidgetsViewsLocked(Provider provider, Widget targetWidget) { + final int widgetCount = provider.widgets.size(); + if (widgetCount == 0) { + return; + } + final String providerPackage = provider.info.provider.getPackageName(); + final int providerUserId = provider.getUserId(); + Bitmap iconBitmap = createMaskedWidgetBitmap(providerPackage, providerUserId); if (iconBitmap == null) { return; } + final boolean showBadge; + final Intent onClickIntent; + if (provider.maskedBySuspendedPackage) { + final long identity = Binder.clearCallingIdentity(); + try { + UserInfo userInfo = mUserManager.getUserInfo(providerUserId); + showBadge = userInfo.isManagedProfile(); + onClickIntent = UnlaunchableAppActivity.createPackageSuspendedDialogIntent( + providerPackage, providerUserId); + } finally { + Binder.restoreCallingIdentity(identity); + } + } else if (provider.maskedByQuietProfile) { + showBadge = true; + onClickIntent = UnlaunchableAppActivity.createInQuietModeDialogIntent( + providerUserId); + } else /* provider.maskedByLockedProfile */ { + showBadge = true; + onClickIntent = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null, + providerUserId); + if (onClickIntent != null) { + onClickIntent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + } + } - final int widgetCount = provider.widgets.size(); for (int j = 0; j < widgetCount; j++) { Widget widget = provider.widgets.get(j); - if (widget.replaceWithMaskedViewsLocked(mContext, iconBitmap)) { - scheduleNotifyUpdateAppWidgetLocked(widget, - widget.getEffectiveViewsLocked()); + if (targetWidget != null && targetWidget != widget) continue; + PendingIntent intent = null; + if (onClickIntent != null) { + intent = PendingIntent.getActivity(mContext, widget.appWidgetId, + onClickIntent, PendingIntent.FLAG_UPDATE_CURRENT); + } + RemoteViews views = createMaskedWidgetRemoteViews(iconBitmap, showBadge, intent); + if (widget.replaceWithMaskedViewsLocked(views)) { + scheduleNotifyUpdateAppWidgetLocked(widget, widget.getEffectiveViewsLocked()); } } } @@ -587,8 +626,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku for (int j = 0; j < widgetCount; j++) { Widget widget = provider.widgets.get(j); if (widget.clearMaskedViewsLocked()) { - scheduleNotifyUpdateAppWidgetLocked(widget, - widget.getEffectiveViewsLocked()); + scheduleNotifyUpdateAppWidgetLocked(widget, widget.getEffectiveViewsLocked()); } } } @@ -2472,7 +2510,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } synchronized (mLock) { ensureGroupStateLoadedLocked(userId); - reloadWidgetsMaskedStateForUser(userId); + reloadWidgetsMaskedStateForGroup(mSecurityPolicy.getGroupParent(userId)); final int N = mProviders.size(); for (int i = 0; i < N; i++) { @@ -2614,10 +2652,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku // If we are adding a widget it might be for a provider that // is currently masked, if so mask the widget. if (widget.provider.isMaskedLocked()) { - Bitmap bitmap = createMaskedWidgetBitmap(widget.provider); - if (bitmap != null) { - widget.replaceWithMaskedViewsLocked(mContext, bitmap); - } + maskWidgetsViewsLocked(widget.provider, widget); } else { widget.clearMaskedViewsLocked(); } @@ -3014,7 +3049,6 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku private void onUserStopped(int userId) { synchronized (mLock) { - boolean providersChanged = false; boolean crossProfileWidgetsChanged = false; // Remove widgets that have both host and provider in the user. @@ -3050,16 +3084,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } - // Remove the providers and notify hosts in other profiles. - final int providerCount = mProviders.size(); - for (int i = providerCount - 1; i >= 0; i--) { - Provider provider = mProviders.get(i); - if (provider.getUserId() == userId) { - crossProfileWidgetsChanged |= !provider.widgets.isEmpty(); - providersChanged = true; - deleteProviderLocked(provider); - } - } + // Leave the providers present as hosts will show the widgets + // masked while the user is stopped. // Remove grants for this user. final int grantCount = mPackagesWithBindWidgetPermission.size(); @@ -3082,11 +3108,6 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku mNextAppWidgetIds.removeAt(nextIdIndex); } - // Announce removed provider changes to all hosts in the group. - if (providersChanged) { - scheduleNotifyGroupHostsForProvidersChangedLocked(userId); - } - // Save state if removing a profile changed the group state. // Nothing will be saved if the group parent was removed. if (crossProfileWidgetsChanged) { @@ -3624,7 +3645,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku PendingIntent broadcast; boolean zombie; // if we're in safe mode, don't prune this just because nobody references it - boolean maskedByProfileUnavailable; + boolean maskedByLockedProfile; + boolean maskedByQuietProfile; boolean maskedBySuspendedPackage; int tag = TAG_UNDEFINED; // for use while saving state (the index) @@ -3656,22 +3678,29 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku return "Provider{" + id + (zombie ? " Z" : "") + '}'; } - // returns true if the provider's masked state is changed as a result - public boolean setMaskedByProfileUnavailabledLocked(boolean masked) { - boolean oldMaskedState = isMaskedLocked(); - maskedByProfileUnavailable = masked; - return isMaskedLocked() != oldMaskedState; + // returns true if it's different from previous state. + public boolean setMaskedByQuietProfileLocked(boolean masked) { + boolean oldState = maskedByQuietProfile; + maskedByQuietProfile = masked; + return masked != oldState; + } + + // returns true if it's different from previous state. + public boolean setMaskedByLockedProfileLocked(boolean masked) { + boolean oldState = maskedByLockedProfile; + maskedByLockedProfile = masked; + return masked != oldState; } - // returns true if the provider's masked state is changed as a result + // returns true if it's different from previous state. public boolean setMaskedBySuspendedPackageLocked(boolean masked) { - boolean oldMaskedState = isMaskedLocked(); + boolean oldState = maskedBySuspendedPackage; maskedBySuspendedPackage = masked; - return isMaskedLocked() != oldMaskedState; + return masked != oldState; } public boolean isMaskedLocked() { - return maskedByProfileUnavailable || maskedBySuspendedPackage; + return maskedByQuietProfile || maskedByLockedProfile || maskedBySuspendedPackage; } } @@ -3828,14 +3857,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku return "AppWidgetId{" + appWidgetId + ':' + host + ':' + provider + '}'; } - private boolean replaceWithMaskedViewsLocked(Context context, Bitmap icon) { - if (maskedViews != null) { - return false; - } - maskedViews = new RemoteViews(context.getPackageName(), R.layout.work_widget_mask_view); - if (icon != null) { - maskedViews.setImageViewBitmap(R.id.work_widget_app_icon, icon); - } + private boolean replaceWithMaskedViewsLocked(RemoteViews views) { + maskedViews = views; return true; } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 430092071d90..25b6fdd4c350 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -750,7 +750,7 @@ public class ConnectivityService extends IConnectivityManager.Stub intentFilter.addAction(Intent.ACTION_USER_STOPPING); intentFilter.addAction(Intent.ACTION_USER_ADDED); intentFilter.addAction(Intent.ACTION_USER_REMOVED); - intentFilter.addAction(Intent.ACTION_USER_PRESENT); + intentFilter.addAction(Intent.ACTION_USER_UNLOCKED); mContext.registerReceiverAsUser( mUserIntentReceiver, UserHandle.ALL, intentFilter, null, null); @@ -3633,7 +3633,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } } - private void onUserPresent(int userId) { + private void onUserUnlocked(int userId) { // User present may be sent because of an unlock, which might mean an unlocked keystore. if (mUserManager.getUserInfo(userId).isPrimary() && LockdownVpnTracker.isEnabled()) { updateLockdownVpn(); @@ -3657,8 +3657,8 @@ public class ConnectivityService extends IConnectivityManager.Stub onUserAdded(userId); } else if (Intent.ACTION_USER_REMOVED.equals(action)) { onUserRemoved(userId); - } else if (Intent.ACTION_USER_PRESENT.equals(action)) { - onUserPresent(userId); + } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) { + onUserUnlocked(userId); } } }; diff --git a/services/core/java/com/android/server/LockGuard.java b/services/core/java/com/android/server/LockGuard.java new file mode 100644 index 000000000000..3a381ae8bf7c --- /dev/null +++ b/services/core/java/com/android/server/LockGuard.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server; + +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.Slog; + +import java.io.FileDescriptor; +import java.io.PrintWriter; + +/** + * LockGuard is a mechanism to help detect lock inversions inside the system + * server. It works by requiring each lock acquisition site to follow this + * pattern: + * + * <pre> + * synchronized (LockGuard.guard(lock)) { + * } + * </pre> + * + * <pre> + * $ find services/ -name "*.java" -exec sed -i -r \ + * 's/synchronized.?\((.+?)\)/synchronized \(com.android.server.LockGuard.guard\(\1\)\)/' {} \; + * </pre> + * + * The {@link #guard(Object)} method internally verifies that all locking is + * done in a consistent order, and will log if any inversion is detected. For + * example, if the calling thread is trying to acquire the + * {@code ActivityManager} lock while holding the {@code PackageManager} lock, + * it will yell. + * <p> + * This class requires no prior knowledge of locks or their ordering; it derives + * all of this data at runtime. However, this means the overhead is + * <em>substantial</em> and it should not be enabled by default. For example, + * here are some benchmarked timings: + * <ul> + * <li>An unguarded synchronized block takes 40ns. + * <li>A guarded synchronized block takes 50ns when disabled. + * <li>A guarded synchronized block takes 460ns per lock checked when enabled. + * </ul> + */ +public class LockGuard { + private static final String TAG = "LockGuard"; + + private static ArrayMap<Object, LockInfo> sKnown = new ArrayMap<>(0, true); + + private static class LockInfo { + /** Friendly label to describe this lock */ + public String label; + + /** Child locks that can be acquired while this lock is already held */ + public ArraySet<Object> children = new ArraySet<>(0, true); + } + + private static LockInfo findOrCreateLockInfo(Object lock) { + LockInfo info = sKnown.get(lock); + if (info == null) { + info = new LockInfo(); + info.label = "0x" + Integer.toHexString(System.identityHashCode(lock)) + " [" + + new Throwable().getStackTrace()[2].toString() + "]"; + sKnown.put(lock, info); + } + return info; + } + + /** + * Check if the calling thread is holding any locks in an inverted order. + * + * @param lock The lock the calling thread is attempting to acquire. + */ + public static Object guard(Object lock) { + // If we already hold this lock, ignore + if (lock == null || Thread.holdsLock(lock)) return lock; + + // Check to see if we're already holding any child locks + boolean triggered = false; + final LockInfo info = findOrCreateLockInfo(lock); + for (int i = 0; i < info.children.size(); i++) { + final Object child = info.children.valueAt(i); + if (child == null) continue; + + if (Thread.holdsLock(child)) { + Slog.w(TAG, "Calling thread " + Thread.currentThread().getName() + " is holding " + + lockToString(child) + " while trying to acquire " + + lockToString(lock), new Throwable()); + triggered = true; + } + } + + if (!triggered) { + // If no trouble found above, record this lock as being a valid + // child of all locks currently being held + for (int i = 0; i < sKnown.size(); i++) { + final Object test = sKnown.keyAt(i); + if (test == null || test == lock) continue; + + if (Thread.holdsLock(test)) { + sKnown.valueAt(i).children.add(lock); + } + } + } + + return lock; + } + + /** + * Report the given lock with a well-known label. + */ + public static void installLock(Object lock, String label) { + final LockInfo info = findOrCreateLockInfo(lock); + info.label = label; + } + + private static String lockToString(Object lock) { + final LockInfo info = sKnown.get(lock); + if (info != null) { + return info.label; + } else { + return "0x" + Integer.toHexString(System.identityHashCode(lock)); + } + } + + public static void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + for (int i = 0; i < sKnown.size(); i++) { + final Object lock = sKnown.keyAt(i); + final LockInfo info = sKnown.valueAt(i); + pw.println("Lock " + lockToString(lock) + ":"); + for (int j = 0; j < info.children.size(); j++) { + pw.println(" Child " + lockToString(info.children.valueAt(j))); + } + pw.println(); + } + } +} diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index c318140ae7e8..ba2a2e05d3d8 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -545,9 +545,23 @@ public class LockSettingsService extends ILockSettings.Stub { final UserManager um = (UserManager) mContext.getSystemService(USER_SERVICE); final KeyStore ks = KeyStore.getInstance(); - final List<UserInfo> profiles = um.getProfiles(userHandle); - for (UserInfo pi : profiles) { - ks.onUserPasswordChanged(pi.id, password); + if (um.getUserInfo(userHandle).isManagedProfile()) { + if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userHandle)) { + ks.onUserPasswordChanged(userHandle, password); + } else { + throw new RuntimeException("Can't set keystore password on a profile that " + + "doesn't have a profile challenge."); + } + } else { + final List<UserInfo> profiles = um.getProfiles(userHandle); + for (UserInfo pi : profiles) { + // Change password on the given user and all its profiles that don't have + // their own profile challenge enabled. + if (pi.id == userHandle || (pi.isManagedProfile() + && !mLockPatternUtils.isSeparateProfileChallengeEnabled(pi.id))) { + ks.onUserPasswordChanged(pi.id, password); + } + } } } @@ -555,9 +569,23 @@ public class LockSettingsService extends ILockSettings.Stub { final UserManager um = (UserManager) mContext.getSystemService(USER_SERVICE); final KeyStore ks = KeyStore.getInstance(); - final List<UserInfo> profiles = um.getProfiles(userHandle); - for (UserInfo pi : profiles) { - ks.unlock(pi.id, password); + if (um.getUserInfo(userHandle).isManagedProfile()) { + if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userHandle)) { + ks.unlock(userHandle, password); + } else { + throw new RuntimeException("Can't unlock a profile explicitly if it " + + "doesn't have a profile challenge."); + } + } else { + final List<UserInfo> profiles = um.getProfiles(userHandle); + for (UserInfo pi : profiles) { + // Unlock the given user and all its profiles that don't have + // their own profile challenge enabled. + if (pi.id == userHandle || (pi.isManagedProfile() + && !mLockPatternUtils.isSeparateProfileChallengeEnabled(pi.id))) { + ks.unlock(pi.id, password); + } + } } } diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 53923ba972c7..a3322fc99677 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -1945,11 +1945,16 @@ class MountService extends IMountService.Stub "Emulation not available on device with native FBE"); } - final boolean emulateFbe = (flags & StorageManager.DEBUG_EMULATE_FBE) != 0; - SystemProperties.set(StorageManager.PROP_EMULATE_FBE, Boolean.toString(emulateFbe)); + final long token = Binder.clearCallingIdentity(); + try { + final boolean emulateFbe = (flags & StorageManager.DEBUG_EMULATE_FBE) != 0; + SystemProperties.set(StorageManager.PROP_EMULATE_FBE, Boolean.toString(emulateFbe)); - // Perform hard reboot to kick policy into place - mContext.getSystemService(PowerManager.class).reboot(null); + // Perform hard reboot to kick policy into place + mContext.getSystemService(PowerManager.class).reboot(null); + } finally { + Binder.restoreCallingIdentity(token); + } } if ((mask & StorageManager.DEBUG_FORCE_ADOPTABLE) != 0) { diff --git a/services/core/java/com/android/server/NetworkTimeUpdateService.java b/services/core/java/com/android/server/NetworkTimeUpdateService.java index 3f0664defbf9..b64c65dd5827 100644 --- a/services/core/java/com/android/server/NetworkTimeUpdateService.java +++ b/services/core/java/com/android/server/NetworkTimeUpdateService.java @@ -23,8 +23,10 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.database.ContentObserver; import android.net.ConnectivityManager; +import android.os.Binder; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; @@ -34,10 +36,14 @@ import android.os.PowerManager; import android.provider.Settings; import android.util.Log; import android.util.NtpTrustedTime; +import android.util.TimeUtils; import android.util.TrustedTime; import com.android.internal.telephony.TelephonyIntents; +import java.io.FileDescriptor; +import java.io.PrintWriter; + /** * Monitors the network time and updates the system time if it is out of sync * and there hasn't been any NITZ update from the carrier recently. @@ -48,7 +54,7 @@ import com.android.internal.telephony.TelephonyIntents; * available. * </p> */ -public class NetworkTimeUpdateService { +public class NetworkTimeUpdateService extends Binder { private static final String TAG = "NetworkTimeUpdateService"; private static final boolean DBG = false; @@ -59,6 +65,8 @@ public class NetworkTimeUpdateService { private static final String ACTION_POLL = "com.android.server.NetworkTimeUpdateService.action.POLL"; + + private static final int NETWORK_CHANGE_EVENT_DELAY_MS = 1000; private static int POLL_REQUEST = 0; private static final long NOT_SET = -1; @@ -245,6 +253,7 @@ public class NetworkTimeUpdateService { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); + if (DBG) Log.d(TAG, "Received " + action); if (TelephonyIntents.ACTION_NETWORK_SET_TIME.equals(action)) { mNitzTimeSetTime = SystemClock.elapsedRealtime(); } else if (TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE.equals(action)) { @@ -260,8 +269,11 @@ public class NetworkTimeUpdateService { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { + if (DBG) Log.d(TAG, "Received CONNECTIVITY_ACTION "); // Don't bother checking if we have connectivity, NtpTrustedTime does that for us. - mHandler.obtainMessage(EVENT_NETWORK_CHANGED).sendToTarget(); + Message message = mHandler.obtainMessage(EVENT_NETWORK_CHANGED); + // Send with a short delay to make sure the network is ready for use + mHandler.sendMessageDelayed(message, NETWORK_CHANGE_EVENT_DELAY_MS); } } }; @@ -308,4 +320,28 @@ public class NetworkTimeUpdateService { mHandler.obtainMessage(mMsg).sendToTarget(); } } + + @Override + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) + != PackageManager.PERMISSION_GRANTED) { + pw.println("Permission Denial: can't dump NetworkTimeUpdateService from from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid() + + " without permission " + + android.Manifest.permission.DUMP); + return; + } + pw.print("PollingIntervalMs: "); + TimeUtils.formatDuration(mPollingIntervalMs, pw); + pw.print("\nPollingIntervalShorterMs: "); + TimeUtils.formatDuration(mPollingIntervalShorterMs, pw); + pw.println("\nTryAgainTimesMax: " + mTryAgainTimesMax); + pw.print("TimeErrorThresholdMs: "); + TimeUtils.formatDuration(mTimeErrorThresholdMs, pw); + pw.println("\nTryAgainCounter: " + mTryAgainCounter); + pw.print("LastNtpFetchTime: "); + TimeUtils.formatDuration(mLastNtpFetchTime, pw); + pw.println(); + } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5f40e5c38085..7f297a875bcf 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -45,6 +45,7 @@ import com.android.server.AttributeCache; import com.android.server.DeviceIdleController; import com.android.server.IntentResolver; import com.android.server.LocalServices; +import com.android.server.LockGuard; import com.android.server.ServiceThread; import com.android.server.SystemService; import com.android.server.SystemServiceManager; @@ -1297,6 +1298,7 @@ public final class ActivityManagerService extends ActivityManagerNative boolean mSupportsPictureInPicture; Rect mDefaultPinnedStackBounds; IActivityController mController = null; + boolean mControllerIsAMonkey = false; String mProfileApp = null; ProcessRecord mProfileProc = null; String mProfileFile; @@ -1894,6 +1896,9 @@ public final class ActivityManagerService extends ActivityManagerNative final int userId = msg.arg1; mSystemServiceManager.unlockUser(userId); mRecentTasks.loadUserRecentsLocked(userId); + if (userId == UserHandle.USER_SYSTEM) { + startPersistentApps(PackageManager.MATCH_ENCRYPTION_UNAWARE); + } installEncryptionUnawareProviders(userId); break; } @@ -5354,17 +5359,6 @@ public final class ActivityManagerService extends ActivityManagerNative @Override public void killAllBackgroundProcesses() { - killAllBackgroundProcesses(-1); - } - - /** - * Kills all background processes with targetSdkVersion below the specified - * target SDK version. - * - * @param targetSdkVersion the target SDK version below which to kill - * processes, or {@code -1} to kill all processes - */ - private void killAllBackgroundProcesses(int targetSdkVersion) { if (checkCallingPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES) != PackageManager.PERMISSION_GRANTED) { final String msg = "Permission Denial: killAllBackgroundProcesses() from pid=" @@ -5388,10 +5382,6 @@ public final class ActivityManagerService extends ActivityManagerNative // We don't kill persistent processes. continue; } - if (targetSdkVersion > 0 - && app.info.targetSdkVersion >= targetSdkVersion) { - continue; - } if (app.removed) { procs.add(app); } else if (app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { @@ -5416,6 +5406,55 @@ public final class ActivityManagerService extends ActivityManagerNative } } + /** + * Kills all background processes, except those matching any of the + * specified properties. + * + * @param minTargetSdk the target SDK version at or above which to preserve + * processes, or {@code -1} to ignore the target SDK + * @param maxProcState the process state at or below which to preserve + * processes, or {@code -1} to ignore the process state + */ + private void killAllBackgroundProcessesExcept(int minTargetSdk, int maxProcState) { + if (checkCallingPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES) + != PackageManager.PERMISSION_GRANTED) { + final String msg = "Permission Denial: killAllBackgroundProcessesExcept() from pid=" + + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() + + " requires " + android.Manifest.permission.KILL_BACKGROUND_PROCESSES; + Slog.w(TAG, msg); + throw new SecurityException(msg); + } + + final long callingId = Binder.clearCallingIdentity(); + try { + synchronized (this) { + final ArrayList<ProcessRecord> procs = new ArrayList<>(); + final int NP = mProcessNames.getMap().size(); + for (int ip = 0; ip < NP; ip++) { + final SparseArray<ProcessRecord> apps = mProcessNames.getMap().valueAt(ip); + final int NA = apps.size(); + for (int ia = 0; ia < NA; ia++) { + final ProcessRecord app = apps.valueAt(ia); + if (app.removed) { + procs.add(app); + } else if ((minTargetSdk < 0 || app.info.targetSdkVersion < minTargetSdk) + && (maxProcState < 0 || app.setProcState > maxProcState)) { + app.removed = true; + procs.add(app); + } + } + } + + final int N = procs.size(); + for (int i = 0; i < N; i++) { + removeProcessLocked(procs.get(i), false, true, "kill all background except"); + } + } + } finally { + Binder.restoreCallingIdentity(callingId); + } + } + @Override public void forceStopPackage(final String packageName, int userId) { if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) @@ -6983,6 +7022,8 @@ public final class ActivityManagerService extends ActivityManagerNative @Override public Intent getIntentForIntentSender(IIntentSender pendingResult) { + enforceCallingPermission(Manifest.permission.GET_INTENT_SENDER_INTENT, + "getIntentForIntentSender()"); if (!(pendingResult instanceof PendingIntentRecord)) { return null; } @@ -9486,7 +9527,7 @@ public final class ActivityManagerService extends ActivityManagerNative * docked stack. Pass {@code null} to use default bounds. */ @Override - public void moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate, + public boolean moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate, Rect initialBounds) { enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "moveTaskToDockedStack()"); synchronized (this) { @@ -9495,7 +9536,8 @@ public final class ActivityManagerService extends ActivityManagerNative if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToDockedStack: moving task=" + taskId + " to createMode=" + createMode + " toTop=" + toTop); mWindowManager.setDockedStackCreateState(createMode, initialBounds); - mStackSupervisor.moveTaskToStackLocked(taskId, DOCKED_STACK_ID, toTop, !FORCE_FOCUS, + return mStackSupervisor.moveTaskToStackLocked( + taskId, DOCKED_STACK_ID, toTop, !FORCE_FOCUS, "moveTaskToDockedStack", animate); } finally { Binder.restoreCallingIdentity(ident); @@ -10775,6 +10817,23 @@ public final class ActivityManagerService extends ActivityManagerNative //mUsageStatsService.monitorPackages(); } + private void startPersistentApps(int matchFlags) { + if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) return; + + synchronized (this) { + try { + final List<ApplicationInfo> apps = AppGlobals.getPackageManager() + .getPersistentApplications(STOCK_PM_FLAGS | matchFlags); + for (ApplicationInfo app : apps) { + if (!"android".equals(app.packageName)) { + addAppLocked(app, false, null /* ABI override */); + } + } + } catch (RemoteException ex) { + } + } + } + /** * When a user is unlocked, we need to install encryption-unaware providers * belonging to any running apps. @@ -10791,8 +10850,7 @@ public final class ActivityManagerService extends ActivityManagerNative // We're only interested in providers that are encryption unaware, and // we don't care about uninstalled apps, since there's no way they're // running at this point. - final int matchFlags = GET_PROVIDERS | MATCH_ENCRYPTION_UNAWARE - | MATCH_DEBUG_TRIAGED_MISSING; + final int matchFlags = GET_PROVIDERS | MATCH_ENCRYPTION_UNAWARE; synchronized (this) { final int NP = mProcessNames.getMap().size(); @@ -11423,11 +11481,12 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override - public void setActivityController(IActivityController controller) { + public void setActivityController(IActivityController controller, boolean imAMonkey) { enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER, "setActivityController()"); synchronized (this) { mController = controller; + mControllerIsAMonkey = imAMonkey; Watchdog.getInstance().setActivityController(controller); } } @@ -11454,7 +11513,7 @@ public final class ActivityManagerService extends ActivityManagerNative public boolean isUserAMonkey() { synchronized (this) { // If there is a controller also implies the user is a monkey. - return (mUserIsMonkey || mController != null); + return (mUserIsMonkey || (mController != null && mControllerIsAMonkey)); } } @@ -12677,26 +12736,9 @@ public final class ActivityManagerService extends ActivityManagerNative mSystemServiceManager.startUser(currentUserId); synchronized (this) { - if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) { - try { - List apps = AppGlobals.getPackageManager(). - getPersistentApplications(STOCK_PM_FLAGS); - if (apps != null) { - int N = apps.size(); - int i; - for (i=0; i<N; i++) { - ApplicationInfo info - = (ApplicationInfo)apps.get(i); - if (info != null && - !info.packageName.equals("android")) { - addAppLocked(info, false, null /* ABI override */); - } - } - } - } catch (RemoteException ex) { - // pm is in same process, this will never happen. - } - } + // Only start up encryption-aware persistent apps; once user is + // unlocked we'll come back around and start unaware apps + startPersistentApps(PackageManager.MATCH_ENCRYPTION_AWARE); // Start up initial activity. mBooting = true; @@ -13581,6 +13623,8 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized (this) { mServices.dumpServicesLocked(fd, pw, args, opti, true, dumpClient, dumpPackage); } + } else if ("locks".equals(cmd)) { + LockGuard.dump(fd, pw, args); } else { // Dumping a single activity? if (!dumpActivity(fd, pw, cmd, args, opti, dumpAll)) { @@ -14123,10 +14167,13 @@ public final class ActivityManagerService extends ActivityManagerNative } } if (dumpPackage == null) { - if (mAlwaysFinishActivities || mLenientBackgroundCheck || mController != null) { + if (mAlwaysFinishActivities || mLenientBackgroundCheck) { pw.println(" mAlwaysFinishActivities=" + mAlwaysFinishActivities - + " mLenientBackgroundCheck=" + mLenientBackgroundCheck - + " mController=" + mController); + + " mLenientBackgroundCheck=" + mLenientBackgroundCheck); + } + if (mController != null) { + pw.println(" mController=" + mController + + " mControllerIsAMonkey=" + mControllerIsAMonkey); } if (dumpAll) { pw.println(" Total persistent processes: " + numPers); @@ -15150,6 +15197,7 @@ public final class ActivityManagerService extends ActivityManagerNative boolean dumpFullDetails = false; boolean dumpDalvik = false; boolean dumpSummaryOnly = false; + boolean dumpUnreachable = false; boolean oomOnly = false; boolean isCompact = false; boolean localOnly = false; @@ -15178,6 +15226,8 @@ public final class ActivityManagerService extends ActivityManagerNative dumpSummaryOnly = true; } else if ("-S".equals(opt)) { dumpSwapPss = true; + } else if ("--unreachable".equals(opt)) { + dumpUnreachable = true; } else if ("--oom".equals(opt)) { oomOnly = true; } else if ("--local".equals(opt)) { @@ -15339,7 +15389,7 @@ public final class ActivityManagerService extends ActivityManagerNative try { pw.flush(); thread.dumpMemInfo(fd, mi, isCheckinRequest, dumpFullDetails, - dumpDalvik, dumpSummaryOnly, innerArgs); + dumpDalvik, dumpSummaryOnly, dumpUnreachable, innerArgs); } catch (RemoteException e) { if (!isCheckinRequest) { pw.println("Got RemoteException!"); @@ -18040,7 +18090,8 @@ public final class ActivityManagerService extends ActivityManagerNative final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0; if (isDensityChange) { - killAllBackgroundProcesses(Build.VERSION_CODES.N); + killAllBackgroundProcessesExcept(Build.VERSION_CODES.N, + ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); } for (int i=mLruProcesses.size()-1; i>=0; i--) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 5491b4f9021b..769bee4cff6e 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -3005,6 +3005,8 @@ final class ActivityStack { if (!r.visible) { mWindowManager.setAppVisibility(r.appToken, false); } + EventLogTags.writeAmStopActivity( + r.userId, System.identityHashCode(r), r.shortComponentName); r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags); if (mService.isSleepingOrShuttingDown()) { r.setSleeping(true); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 20f8285cfee7..c68136040fb6 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2186,7 +2186,7 @@ public final class ActivityStackSupervisor implements DisplayListener { final int resizeMode = task.mResizeMode; - if (stackId == DOCKED_STACK_ID && resizeMode == RESIZE_MODE_UNRESIZEABLE) { + if (stackId == DOCKED_STACK_ID && !task.isResizeable()) { // We don't allow moving a unresizeable task to the docked stack since the docked // stack is used for split-screen mode and will cause things like the docked divider to // show up. We instead leave the task in its current stack or move it to the fullscreen @@ -2213,18 +2213,18 @@ public final class ActivityStackSupervisor implements DisplayListener { return stack; } - void moveTaskToStackLocked(int taskId, int stackId, boolean toTop, boolean forceFocus, + boolean moveTaskToStackLocked(int taskId, int stackId, boolean toTop, boolean forceFocus, String reason, boolean animate) { final TaskRecord task = anyTaskForIdLocked(taskId); if (task == null) { Slog.w(TAG, "moveTaskToStack: no task for id=" + taskId); - return; + return false; } if (task.stack != null && task.stack.mStackId == stackId) { // You are already in the right stack silly... Slog.i(TAG, "moveTaskToStack: taskId=" + taskId + " already in stackId=" + stackId); - return; + return true; } if (stackId == FREEFORM_WORKSPACE_STACK_ID && !mService.mSupportsFreeformWindowManagement) { @@ -2293,6 +2293,8 @@ public final class ActivityStackSupervisor implements DisplayListener { resumeFocusedStackTopActivityLocked(); showNonResizeableDockToastIfNeeded(task, preferredLaunchStackId, stackId); + + return (preferredLaunchStackId == stackId); } boolean moveTopStackActivityToPinnedStackLocked(int stackId, Rect bounds) { diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 018164028fd0..bcdc800c5857 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1416,7 +1416,7 @@ class ActivityStarter { } intentActivity.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); - } else if (!mStartActivity.intent.filterEquals(intentActivity.intent)) { + } else if (!intentActivity.task.isSameIntentResolution(mStartActivity)) { // In this case we are launching the root activity of the task, but with a // different intent. We should start a new instance on top. mAddingToTask = true; diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index f2e8d090d85d..2329b2f82bb7 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -54,9 +54,9 @@ option java_package com.android.server.am # An activity has been relaunched: 30020 am_relaunch_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3) # The activity's onPause has been called. -30021 am_on_paused_called (User|1|5),(Component Name|3) +30021 am_on_paused_called (User|1|5),(Component Name|3),(Reason|3) # The activity's onResume has been called. -30022 am_on_resume_called (User|1|5),(Component Name|3) +30022 am_on_resume_called (User|1|5),(Component Name|3),(Reason|3) # Kill a process to reclaim memory. 30023 am_kill (User|1|5),(PID|1|5),(Process Name|3),(OomAdj|1|5),(Reason|3) # Discard an undelivered serialized broadcast (timeout/ANR/crash) @@ -103,3 +103,8 @@ option java_package com.android.server.am 30046 am_meminfo (Cached|2|2),(Free|2|2),(Zram|2|2),(Kernel|2|2),(Native|2|2) # Report collection of memory used by a process 30047 am_pss (Pid|1|5),(UID|1|5),(Process Name|3),(Pss|2|2),(Uss|2|2),(SwapPss|2|2) + +# Attempting to stop an activity +30048 am_stop_activity (User|1|5),(Token|1|5),(Component Name|3) +# The activity's onStop has been called. +30049 am_on_stop_called (User|1|5),(Component Name|3),(Reason|3) diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 37a549a960a7..62275a98aba1 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -469,6 +469,19 @@ final class TaskRecord { setLockTaskAuth(); } + /** + * Return true if the input activity has the same intent resolution as the intent this task + * record is based on (normally the root activity intent). + */ + boolean isSameIntentResolution(ActivityRecord r) { + final Intent intent = new Intent(r.intent); + // Correct the activity intent for aliasing. The task record intent will always be based on + // the real activity that will be launched not the alias, so we need to use an intent with + // the component name pointing to the real activity not the alias in the activity record. + intent.setComponent(r.realActivity); + return this.intent.filterEquals(intent); + } + void setTaskToReturnTo(int taskToReturnTo) { mTaskToReturnTo = (taskToReturnTo == RECENTS_ACTIVITY_TYPE) ? HOME_ACTIVITY_TYPE : taskToReturnTo; diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index a3100c820d99..5a3639a972fc 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -849,6 +849,7 @@ public class AudioService extends IAudioService.Stub { AudioSystem.setForceUse(AudioSystem.FOR_DOCK, mDockAudioMediaEnabled ? AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_NONE); + readEncodedSurroundMode(mContentResolver); } if (mHdmiManager != null) { synchronized (mHdmiManager) { @@ -1011,6 +1012,7 @@ public class AudioService extends IAudioService.Stub { 0); } + private void updateMasterMono(ContentResolver cr) { final boolean masterMono = System.getIntForUser( @@ -1021,6 +1023,44 @@ public class AudioService extends IAudioService.Stub { AudioSystem.setMasterMono(masterMono); } + private void readEncodedSurroundMode(ContentResolver cr) + { + int encodedSurroundMode = Settings.Global.getInt( + cr, Settings.Global.ENCODED_SURROUND_OUTPUT, + Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); + sendEncodedSurroundMode(encodedSurroundMode); + } + + private void sendEncodedSurroundMode(int encodedSurroundMode) + { + // initialize to guaranteed bad value + int forceSetting = AudioSystem.NUM_FORCE_CONFIG; + switch (encodedSurroundMode) { + case Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO: + forceSetting = AudioSystem.FORCE_NONE; + break; + case Settings.Global.ENCODED_SURROUND_OUTPUT_NEVER: + forceSetting = AudioSystem.FORCE_ENCODED_SURROUND_NEVER; + break; + case Settings.Global.ENCODED_SURROUND_OUTPUT_ALWAYS: + forceSetting = AudioSystem.FORCE_ENCODED_SURROUND_ALWAYS; + break; + default: + Log.e(TAG, "updateSurroundSoundSettings: illegal value " + + encodedSurroundMode); + break; + } + if (forceSetting != AudioSystem.NUM_FORCE_CONFIG) { + sendMsg(mAudioHandler, + MSG_SET_FORCE_USE, + SENDMSG_QUEUE, + AudioSystem.FOR_ENCODED_SURROUND, + forceSetting, + null, + 0); + } + } + private void readPersistedSettings() { final ContentResolver cr = mContentResolver; @@ -1062,6 +1102,7 @@ public class AudioService extends IAudioService.Stub { updateRingerModeAffectedStreams(); readDockAudioSettings(cr); + readEncodedSurroundMode(cr); } mMuteAffectedStreams = System.getIntForUser(cr, @@ -4628,6 +4669,7 @@ public class AudioService extends IAudioService.Stub { } readDockAudioSettings(mContentResolver); updateMasterMono(mContentResolver); + readEncodedSurroundMode(mContentResolver); } } } @@ -6315,4 +6357,4 @@ public class AudioService extends IAudioService.Stub { if (DEBUG_VOL) Log.d(TAG, "Reloaded controller service: " + this); } } -}
\ No newline at end of file +} diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 4504bdb08945..fb8b110fbcab 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -566,7 +566,7 @@ public class NetworkMonitor extends StateMachine { @Override public void enter() { final String cmdName = ACTION_LINGER_EXPIRED + "." + mNetworkAgentInfo.network.netId; - mWakeupMessage = new WakeupMessage(mContext, getHandler(), cmdName, CMD_LINGER_EXPIRED); + mWakeupMessage = makeWakeupMessage(mContext, getHandler(), cmdName, CMD_LINGER_EXPIRED); long wakeupTime = SystemClock.elapsedRealtime() + mLingerDelayMs; mWakeupMessage.schedule(wakeupTime); } @@ -823,4 +823,9 @@ public class NetworkMonitor extends StateMachine { } DEFAULT_LINGER_DELAY_MS = time_ms; } + + @VisibleForTesting + protected WakeupMessage makeWakeupMessage(Context c, Handler h, String s, int i) { + return new WakeupMessage(c, h, s, i); + } } diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index 5d81daeccc6b..7b134cab2b95 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -905,13 +905,15 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe // Group ID is arbitrarily set to parent profile user ID. It just represents // the default fingerprints for the user. - final int effectiveGroupId = getEffectiveUserId(groupId); + if (!isCurrentUserOrProfile(groupId)) { + return; + } final boolean restricted = isRestricted(); mHandler.post(new Runnable() { @Override public void run() { - startEnrollment(token, cryptoClone, effectiveGroupId, receiver, flags, restricted); + startEnrollment(token, cryptoClone, groupId, receiver, flags, restricted); } }); } @@ -1011,15 +1013,14 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe @Override // Binder call public void rename(final int fingerId, final int groupId, final String name) { checkPermission(MANAGE_FINGERPRINT); - - // Group ID is arbitrarily set to parent profile user ID. It just represents - // the default fingerprints for the user. - final int effectiveGroupId = getEffectiveUserId(groupId); + if (!isCurrentUserOrProfile(groupId)) { + return; + } mHandler.post(new Runnable() { @Override public void run() { mFingerprintUtils.renameFingerprintForUser(mContext, fingerId, - effectiveGroupId, name); + groupId, name); } }); } @@ -1029,9 +1030,11 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe if (!canUseFingerprint(opPackageName, false /* foregroundOnly */)) { return Collections.emptyList(); } - int effectiveUserId = getEffectiveUserId(userId); + if (!isCurrentUserOrProfile(userId)) { + return Collections.emptyList(); + } - return FingerprintService.this.getEnrolledFingerprints(effectiveUserId); + return FingerprintService.this.getEnrolledFingerprints(userId); } @Override // Binder call @@ -1040,8 +1043,10 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe return false; } - int effectiveUserId = getEffectiveUserId(userId); - return FingerprintService.this.hasEnrolledFingerprints(effectiveUserId); + if (!isCurrentUserOrProfile(userId)) { + return false; + } + return FingerprintService.this.hasEnrolledFingerprints(userId); } @Override // Binder call diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index bd888d809d78..fba7e7d76ac3 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -92,7 +92,7 @@ public final class JobSchedulerService extends com.android.server.SystemService /** The maximum number of concurrent jobs we run at one time. */ private static final int MAX_JOB_CONTEXTS_COUNT = 8; /** Enforce a per-app limit on scheduled jobs? */ - private static final boolean ENFORCE_MAX_JOBS = false; + private static final boolean ENFORCE_MAX_JOBS = true; /** The maximum number of jobs that we allow an unprivileged app to schedule */ private static final int MAX_JOBS_PER_APP = 100; diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java index 4268dab01a92..9837a566eb2d 100644 --- a/services/core/java/com/android/server/job/JobStore.java +++ b/services/core/java/com/android/server/job/JobStore.java @@ -543,7 +543,7 @@ public class JobStore { return null; } - final String sourcePackageName = parser.getAttributeValue(null, "sourcePackageName"); + String sourcePackageName = parser.getAttributeValue(null, "sourcePackageName"); final String sourceTag = parser.getAttributeValue(null, "sourceTag"); @@ -660,6 +660,18 @@ public class JobStore { jobBuilder.setExtras(extras); parser.nextTag(); // Consume </extras> + // Migrate sync jobs forward from earlier, incomplete representation + if ("android".equals(sourcePackageName) + && extras != null + && extras.getBoolean("SyncManagerJob", false)) { + sourcePackageName = extras.getString("owningPackage", sourcePackageName); + if (DEBUG) { + Slog.i(TAG, "Fixing up sync job source package name from 'android' to '" + + sourcePackageName + "'"); + } + } + + // And now we're done JobStatus js = new JobStatus( jobBuilder.build(), uid, sourcePackageName, sourceUserId, sourceTag, elapsedRuntimes.first, elapsedRuntimes.second); diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java index a5dc008d4e6c..a626b5b33012 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java @@ -16,6 +16,8 @@ package com.android.server.net; +import static android.net.NetworkPolicyManager.POLICY_NONE; +import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; import static android.net.wifi.WifiInfo.removeDoubleQuotes; import static com.android.server.net.NetworkPolicyManagerService.newWifiPolicy; import static com.android.server.net.NetworkPolicyManagerService.TAG; @@ -83,6 +85,8 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { pw.println(""); pw.println(" add restrict-background-whitelist UID"); pw.println(" Adds a UID to the whitelist for restrict background usage."); + pw.println(" add restrict-background-blacklist UID"); + pw.println(" Adds a UID to the blacklist for restrict background usage."); pw.println(" get metered-network ID"); pw.println(" Checks whether the given non-mobile network is metered or not."); pw.println(" get restrict-background"); @@ -93,8 +97,12 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { pw.println(" networks."); pw.println(" list restrict-background-whitelist"); pw.println(" Lists UIDs that are whitelisted for restrict background usage."); + pw.println(" list restrict-background-blacklist"); + pw.println(" Lists UIDs that are blacklisted for restrict background usage."); pw.println(" remove restrict-background-whitelist UID"); pw.println(" Removes a UID from the whitelist for restrict background usage."); + pw.println(" remove restrict-background-blacklist UID"); + pw.println(" Removes a UID from the blacklist for restrict background usage."); pw.println(" set metered-network ID BOOLEAN"); pw.println(" Toggles whether the given non-mobile network is metered."); pw.println(" set restrict-background BOOLEAN"); @@ -147,6 +155,8 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return listMeteredWifiNetworks(); case "restrict-background-whitelist": return listRestrictBackgroundWhitelist(); + case "restrict-background-blacklist": + return listRestrictBackgroundBlacklist(); } pw.println("Error: unknown list type '" + type + "'"); return -1; @@ -162,6 +172,8 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { switch(type) { case "restrict-background-whitelist": return addRestrictBackgroundWhitelist(); + case "restrict-background-blacklist": + return addRestrictBackgroundBlacklist(); } pw.println("Error: unknown add type '" + type + "'"); return -1; @@ -177,6 +189,8 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { switch(type) { case "restrict-background-whitelist": return removeRestrictBackgroundWhitelist(); + case "restrict-background-blacklist": + return removeRestrictBackgroundBlacklist(); } pw.println("Error: unknown remove type '" + type + "'"); return -1; @@ -199,6 +213,24 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return 0; } + private int listRestrictBackgroundBlacklist() throws RemoteException { + final PrintWriter pw = getOutPrintWriter(); + + final int[] uids = mInterface.getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND); + pw.print("Restrict background blacklisted UIDs: "); + if (uids.length == 0) { + pw.println("none"); + } else { + for (int i = 0; i < uids.length; i++) { + int uid = uids[i]; + pw.print(uid); + pw.print(' '); + } + } + pw.println(); + return 0; + } + private int getRestrictBackground() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); pw.print("Restrict background status: "); @@ -233,6 +265,24 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return 0; } + private int addRestrictBackgroundBlacklist() throws RemoteException { + final int uid = getUidFromNextArg(); + if (uid < 0) { + return uid; + } + mInterface.setUidPolicy(uid, POLICY_REJECT_METERED_BACKGROUND); + return 0; + } + + private int removeRestrictBackgroundBlacklist() throws RemoteException { + final int uid = getUidFromNextArg(); + if (uid < 0) { + return uid; + } + mInterface.setUidPolicy(uid, POLICY_NONE); + return 0; + } + private int listMeteredWifiNetworks() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); final String arg = getNextArg(); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index e4c3c1432167..e8d27dbb80f3 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1698,9 +1698,9 @@ public class NotificationManagerService extends SystemService { } @Override - public List<AutomaticZenRule> getAutomaticZenRules() throws RemoteException { + public List<ZenModeConfig.ZenRule> getZenRules() throws RemoteException { enforcePolicyAccess(Binder.getCallingUid(), "getAutomaticZenRules"); - return mZenModeHelper.getAutomaticZenRules(); + return mZenModeHelper.getZenRules(); } @Override @@ -1711,7 +1711,7 @@ public class NotificationManagerService extends SystemService { } @Override - public AutomaticZenRule addAutomaticZenRule(AutomaticZenRule automaticZenRule) + public String addAutomaticZenRule(AutomaticZenRule automaticZenRule) throws RemoteException { Preconditions.checkNotNull(automaticZenRule, "automaticZenRule is null"); Preconditions.checkNotNull(automaticZenRule.getName(), "Name is null"); @@ -1724,7 +1724,7 @@ public class NotificationManagerService extends SystemService { } @Override - public boolean updateAutomaticZenRule(AutomaticZenRule automaticZenRule) + public boolean updateAutomaticZenRule(String id, AutomaticZenRule automaticZenRule) throws RemoteException { Preconditions.checkNotNull(automaticZenRule, "automaticZenRule is null"); Preconditions.checkNotNull(automaticZenRule.getName(), "Name is null"); @@ -1732,7 +1732,7 @@ public class NotificationManagerService extends SystemService { Preconditions.checkNotNull(automaticZenRule.getConditionId(), "ConditionId is null"); enforcePolicyAccess(Binder.getCallingUid(), "updateAutomaticZenRule"); - return mZenModeHelper.updateAutomaticZenRule(automaticZenRule, + return mZenModeHelper.updateAutomaticZenRule(id, automaticZenRule, "updateAutomaticZenRule"); } diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 383c1ab5ebef..5c5c8f854105 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -238,13 +238,13 @@ public class ZenModeHelper { return mZenMode; } - public List<AutomaticZenRule> getAutomaticZenRules() { - List<AutomaticZenRule> rules = new ArrayList<>(); + public List<ZenRule> getZenRules() { + List<ZenRule> rules = new ArrayList<>(); synchronized (mConfig) { if (mConfig == null) return rules; for (ZenRule rule : mConfig.automaticRules.values()) { if (canManageAutomaticZenRule(rule)) { - rules.add(createAutomaticZenRule(rule)); + rules.add(rule); } } } @@ -264,18 +264,18 @@ public class ZenModeHelper { return null; } - public AutomaticZenRule addAutomaticZenRule(AutomaticZenRule automaticZenRule, String reason) { - if (!TextUtils.isEmpty(automaticZenRule.getId())) { - throw new IllegalArgumentException("Rule already exists"); - } + public String addAutomaticZenRule(AutomaticZenRule automaticZenRule, String reason) { if (!isSystemRule(automaticZenRule)) { ServiceInfo owner = getServiceInfo(automaticZenRule.getOwner()); if (owner == null) { throw new IllegalArgumentException("Owner is not a condition provider service"); } - final int ruleInstanceLimit = owner.metaData.getInt( - ConditionProviderService.META_DATA_RULE_INSTANCE_LIMIT, -1); + int ruleInstanceLimit = -1; + if (owner.metaData != null) { + ruleInstanceLimit = owner.metaData.getInt( + ConditionProviderService.META_DATA_RULE_INSTANCE_LIMIT, -1); + } if (ruleInstanceLimit > 0 && ruleInstanceLimit < (getCurrentInstanceCount(automaticZenRule.getOwner()) + 1)) { throw new IllegalArgumentException("Rule instance limit exceeded"); @@ -293,14 +293,15 @@ public class ZenModeHelper { populateZenRule(automaticZenRule, rule, true); newConfig.automaticRules.put(rule.id, rule); if (setConfigLocked(newConfig, reason, true)) { - return createAutomaticZenRule(rule); + return rule.id; } else { return null; } } } - public boolean updateAutomaticZenRule(AutomaticZenRule automaticZenRule, String reason) { + public boolean updateAutomaticZenRule(String ruleId, AutomaticZenRule automaticZenRule, + String reason) { ZenModeConfig newConfig; synchronized (mConfig) { if (mConfig == null) return false; @@ -309,7 +310,6 @@ public class ZenModeHelper { + " reason=" + reason); } newConfig = mConfig.copy(); - final String ruleId = automaticZenRule.getId(); ZenModeConfig.ZenRule rule; if (ruleId == null) { throw new IllegalArgumentException("Rule doesn't exist"); @@ -437,7 +437,7 @@ public class ZenModeHelper { private AutomaticZenRule createAutomaticZenRule(ZenRule rule) { return new AutomaticZenRule(rule.name, rule.component, rule.conditionId, NotificationManager.zenModeToInterruptionFilter(rule.zenMode), rule.enabled, - rule.id, rule.creationTime); + rule.creationTime); } public void setManualZenMode(int zenMode, Uri conditionId, String reason) { diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java index 9a5a183233e2..d6b59f9ab35a 100644 --- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java @@ -788,7 +788,7 @@ final class DefaultPermissionGrantPolicy { } private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions, - boolean systemFixed, boolean overrideUserChoice, int userId) { + boolean systemFixed, boolean isDefaultPhoneOrSms, int userId) { if (pkg.requestedPermissions.isEmpty()) { return; } @@ -796,7 +796,13 @@ final class DefaultPermissionGrantPolicy { List<String> requestedPermissions = pkg.requestedPermissions; Set<String> grantablePermissions = null; - if (pkg.isUpdatedSystemApp()) { + // If this is the default Phone or SMS app we grant permissions regardless + // whether the version on the system image declares the permission as used since + // selecting the app as the default Phone or SMS the user makes a deliberate + // choice to grant this app the permissions needed to function. For all other + // apps, (default grants on first boot and user creation) we don't grant default + // permissions if the version on the system image does not declare them. + if (!isDefaultPhoneOrSms && pkg.isUpdatedSystemApp()) { PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName); if (sysPs != null) { if (sysPs.pkg.requestedPermissions.isEmpty()) { @@ -828,7 +834,7 @@ final class DefaultPermissionGrantPolicy { // Unless the caller wants to override user choices. The override is // to make sure we can grant the needed permission to the default // sms and phone apps after the user chooses this in the UI. - if (flags == 0 || overrideUserChoice) { + if (flags == 0 || isDefaultPhoneOrSms) { // Never clobber policy or system. final int fixedFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED | PackageManager.FLAG_PERMISSION_POLICY_FIXED; diff --git a/services/core/java/com/android/server/pm/EphemeralApplicationRegistry.java b/services/core/java/com/android/server/pm/EphemeralApplicationRegistry.java index 878635083b3a..389e0a15bfb9 100644 --- a/services/core/java/com/android/server/pm/EphemeralApplicationRegistry.java +++ b/services/core/java/com/android/server/pm/EphemeralApplicationRegistry.java @@ -210,6 +210,9 @@ class EphemeralApplicationRegistry { } public void onPackageUninstalledLPw(PackageParser.Package pkg) { + if (pkg == null) { + return; + } PackageSetting ps = (PackageSetting) pkg.mExtras; if (ps == null) { return; diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index a3af561bf44f..a084d866ec64 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageParser; import android.content.pm.PackageParser.Package; +import android.os.Environment; import android.os.PowerManager; import android.os.UserHandle; import android.os.WorkSource; @@ -164,6 +165,10 @@ class PackageDexOptimizer { } for (String path : paths) { + if (useProfiles && isUsedByOtherApps(path)) { + // We cannot use profile guided compilation if the apk was used by another app. + useProfiles = false; + } int dexoptNeeded; try { @@ -204,8 +209,10 @@ class PackageDexOptimizer { + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable + " extractOnly=" + extractOnly + " oatDir = " + oatDir); final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid); + // Profile guide compiled oat files should not be public. + final boolean isPublic = !pkg.isForwardLocked() && !useProfiles; final int dexFlags = adjustDexoptFlags( - (!pkg.isForwardLocked() ? DEXOPT_PUBLIC : 0) + ( isPublic ? DEXOPT_PUBLIC : 0) | (vmSafeMode ? DEXOPT_SAFEMODE : 0) | (debuggable ? DEXOPT_DEBUGGABLE : 0) | (extractOnly ? DEXOPT_EXTRACTONLY : 0) @@ -275,6 +282,25 @@ class PackageDexOptimizer { mSystemReady = true; } + private boolean isUsedByOtherApps(String apkPath) { + try { + apkPath = new File(apkPath).getCanonicalPath(); + } catch (IOException e) { + // Log an error but continue without it. + Slog.w(TAG, "Failed to get canonical path", e); + } + String useMarker = apkPath.replace('/', '@'); + final int[] currentUserIds = UserManagerService.getInstance().getUserIds(); + for (int i = 0; i < currentUserIds.length; i++) { + File profileDir = Environment.getDataProfilesDeForeignDexDirectory(currentUserIds[i]); + File foreignUseMark = new File(profileDir, useMarker); + if (foreignUseMark.exists()) { + return true; + } + } + return false; + } + /** * A specialized PackageDexOptimizer that overrides already-installed checks, forcing a * dexopt path. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index aa0db995f7c4..bafcb64318f9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -62,7 +62,9 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO import static android.content.pm.PackageManager.MATCH_ALL; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; +import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE; import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE; +import static android.content.pm.PackageManager.MATCH_ENCRYPTION_UNAWARE; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.content.pm.PackageManager.MOVE_FAILED_DEVICE_ADMIN; @@ -153,7 +155,6 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.Signature; import android.content.pm.UserInfo; -import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VerifierInfo; import android.content.res.Resources; @@ -173,6 +174,7 @@ import android.os.Looper; import android.os.Message; import android.os.Parcel; import android.os.ParcelFileDescriptor; +import android.os.Parcelable; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -2449,33 +2451,6 @@ public class PackageManagerService extends IPackageManager.Stub { reconcileAppsData(StorageManager.UUID_PRIVATE_INTERNAL, UserHandle.USER_SYSTEM, storageFlags); - if (!StorageManager.isFileBasedEncryptionEnabled() - && PackageManager.APPLY_FORCE_DEVICE_ENCRYPTED) { - // When upgrading a non-FBE device, we might need to shuffle - // around the default storage location of system apps - final List<UserInfo> users = sUserManager.getUsers(true); - for (PackageSetting ps : mSettings.mPackages.values()) { - if (ps.pkg == null || !ps.isSystem()) continue; - final int storageTarget = ps.pkg.applicationInfo.isForceDeviceEncrypted() - ? StorageManager.FLAG_STORAGE_DE : StorageManager.FLAG_STORAGE_CE; - for (UserInfo user : users) { - if (ps.getInstalled(user.id)) { - try { - mInstaller.migrateAppData(StorageManager.UUID_PRIVATE_INTERNAL, - ps.name, user.id, storageTarget); - } catch (InstallerException e) { - logCriticalInfo(Log.WARN, - "Failed to migrate " + ps.name + ": " + e.getMessage()); - } - // We may have just shuffled around app data - // directories, so prepare it one more time - prepareAppData(StorageManager.UUID_PRIVATE_INTERNAL, user.id, - storageFlags, ps.pkg, false); - } - } - } - } - // If this is first boot after an OTA, and a normal boot, then // we need to clear code cache directories. if (mIsUpgrade && !onlyCore) { @@ -2915,7 +2890,8 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public boolean isPackageAvailable(String packageName, int userId) { if (!sUserManager.exists(userId)) return false; - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "is package available"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "is package available"); synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); if (p != null) { @@ -2935,7 +2911,8 @@ public class PackageManagerService extends IPackageManager.Stub { public PackageInfo getPackageInfo(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForPackage(flags, userId, packageName); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get package info"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "get package info"); // reader synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); @@ -2981,7 +2958,8 @@ public class PackageManagerService extends IPackageManager.Stub { public int getPackageUid(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return -1; flags = updateFlagsForPackage(flags, userId, packageName); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get package uid"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "get package uid"); // reader synchronized (mPackages) { @@ -3004,7 +2982,8 @@ public class PackageManagerService extends IPackageManager.Stub { public int[] getPackageGids(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForPackage(flags, userId, packageName); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "getPackageGids"); // reader @@ -3144,7 +3123,8 @@ public class PackageManagerService extends IPackageManager.Stub { public ApplicationInfo getApplicationInfo(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForApplication(flags, userId, packageName); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get application info"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "get application info"); // writer synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); @@ -3359,7 +3339,8 @@ public class PackageManagerService extends IPackageManager.Stub { public ActivityInfo getActivityInfo(ComponentName component, int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForComponent(flags, userId, component); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get activity info"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "get activity info"); synchronized (mPackages) { PackageParser.Activity a = mActivities.mActivities.get(component); @@ -3404,7 +3385,8 @@ public class PackageManagerService extends IPackageManager.Stub { public ActivityInfo getReceiverInfo(ComponentName component, int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForComponent(flags, userId, component); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get receiver info"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "get receiver info"); synchronized (mPackages) { PackageParser.Activity a = mReceivers.mActivities.get(component); if (DEBUG_PACKAGE_INFO) Log.v( @@ -3423,7 +3405,8 @@ public class PackageManagerService extends IPackageManager.Stub { public ServiceInfo getServiceInfo(ComponentName component, int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForComponent(flags, userId, component); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get service info"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "get service info"); synchronized (mPackages) { PackageParser.Service s = mServices.mServices.get(component); if (DEBUG_PACKAGE_INFO) Log.v( @@ -3442,7 +3425,8 @@ public class PackageManagerService extends IPackageManager.Stub { public ProviderInfo getProviderInfo(ComponentName component, int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForComponent(flags, userId, component); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get provider info"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "get provider info"); synchronized (mPackages) { PackageParser.Provider p = mProviders.mProviders.get(component); if (DEBUG_PACKAGE_INFO) Log.v( @@ -3834,7 +3818,8 @@ public class PackageManagerService extends IPackageManager.Stub { android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, "grantRuntimePermission"); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, true /* checkShell */, "grantRuntimePermission"); final int uid; @@ -3945,7 +3930,8 @@ public class PackageManagerService extends IPackageManager.Stub { android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, "revokeRuntimePermission"); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, true /* checkShell */, "revokeRuntimePermission"); final int appId; @@ -4049,7 +4035,8 @@ public class PackageManagerService extends IPackageManager.Stub { enforceGrantRevokeRuntimePermissionPermissions("getPermissionFlags"); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, "getPermissionFlags"); synchronized (mPackages) { @@ -4082,7 +4069,8 @@ public class PackageManagerService extends IPackageManager.Stub { enforceGrantRevokeRuntimePermissionPermissions("updatePermissionFlags"); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, true /* checkShell */, "updatePermissionFlags"); // Only the system can change these flags and nothing else. @@ -4139,7 +4127,8 @@ public class PackageManagerService extends IPackageManager.Stub { enforceGrantRevokeRuntimePermissionPermissions("updatePermissionFlagsForAllApps"); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, true /* checkShell */, "updatePermissionFlagsForAllApps"); // Only the system can change system fixed flags. @@ -4572,7 +4561,8 @@ public class PackageManagerService extends IPackageManager.Stub { int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForResolve(flags, userId, intent); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "resolve intent"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, "resolve intent"); List<ResolveInfo> query = queryIntentActivities(intent, resolvedType, flags, userId); final ResolveInfo bestChoice = chooseBestActivity(intent, resolvedType, flags, query, userId); @@ -5033,7 +5023,9 @@ public class PackageManagerService extends IPackageManager.Stub { String resolvedType, int flags, int userId) { if (!sUserManager.exists(userId)) return Collections.emptyList(); flags = updateFlagsForResolve(flags, userId, intent); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "query intent activities"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, + "query intent activities"); ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { @@ -5523,8 +5515,9 @@ public class PackageManagerService extends IPackageManager.Stub { String resolvedType, int flags, int userId) { if (!sUserManager.exists(userId)) return Collections.emptyList(); flags = updateFlagsForResolve(flags, userId, intent); - enforceCrossUserPermission(Binder.getCallingUid(), userId, false, - false, "query intent activity options"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + false /* requireFullPermission */, false /* checkShell */, + "query intent activity options"); final String resultsAction = intent.getAction(); List<ResolveInfo> results = queryIntentActivities(intent, resolvedType, flags @@ -5825,7 +5818,9 @@ public class PackageManagerService extends IPackageManager.Stub { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForPackage(flags, userId, null); final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "get installed packages"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, + "get installed packages"); // writer synchronized (mPackages) { @@ -5977,7 +5972,8 @@ public class PackageManagerService extends IPackageManager.Stub { mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_EPHEMERAL_APPS, "getEphemeralApplications"); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, "getEphemeralApplications"); synchronized (mPackages) { List<EphemeralApplicationInfo> ephemeralApps = mEphemeralApplicationRegistry @@ -5991,7 +5987,8 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public boolean isEphemeralApplication(String packageName, int userId) { - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, "isEphemeral"); if (DISABLE_EPHEMERAL_APPS) { return false; @@ -6015,7 +6012,8 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, "getCookie"); if (!isCallerSameApp(packageName)) { return null; @@ -6032,7 +6030,8 @@ public class PackageManagerService extends IPackageManager.Stub { return true; } - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, true /* checkShell */, "setCookie"); if (!isCallerSameApp(packageName)) { return false; @@ -6051,7 +6050,8 @@ public class PackageManagerService extends IPackageManager.Stub { mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_EPHEMERAL_APPS, "getEphemeralApplicationIcon"); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, "getEphemeralApplicationIcon"); synchronized (mPackages) { return mEphemeralApplicationRegistry.getEphemeralApplicationIconLPw( @@ -6074,9 +6074,16 @@ public class PackageManagerService extends IPackageManager.Stub { final int userId = UserHandle.getCallingUserId(); while (i.hasNext()) { final PackageParser.Package p = i.next(); - if (p.applicationInfo != null - && (p.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) != 0 - && (!mSafeMode || isSystemApp(p))) { + if (p.applicationInfo == null) continue; + + final boolean matchesUnaware = ((flags & MATCH_ENCRYPTION_UNAWARE) != 0) + && !p.applicationInfo.isEncryptionAware(); + final boolean matchesAware = ((flags & MATCH_ENCRYPTION_AWARE) != 0) + && p.applicationInfo.isEncryptionAware(); + + if ((p.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) != 0 + && (!mSafeMode || isSystemApp(p)) + && (matchesUnaware || matchesAware)) { PackageSetting ps = mSettings.mPackages.get(p.packageName); if (ps != null) { ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags, @@ -10403,21 +10410,13 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override - public void installPackage(String originPath, IPackageInstallObserver2 observer, - int installFlags, String installerPackageName, VerificationParams verificationParams, - String packageAbiOverride) { - installPackageAsUser(originPath, observer, installFlags, installerPackageName, - verificationParams, packageAbiOverride, UserHandle.getCallingUserId()); - } - - @Override public void installPackageAsUser(String originPath, IPackageInstallObserver2 observer, - int installFlags, String installerPackageName, VerificationParams verificationParams, - String packageAbiOverride, int userId) { + int installFlags, String installerPackageName, int userId) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null); final int callingUid = Binder.getCallingUid(); - enforceCrossUserPermission(callingUid, userId, true, true, "installPackageAsUser"); + enforceCrossUserPermission(callingUid, userId, + true /* requireFullPermission */, true /* checkShell */, "installPackageAsUser"); if (isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) { try { @@ -10456,14 +10455,15 @@ public class PackageManagerService extends IPackageManager.Stub { + "to use the PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS flag"); } - verificationParams.setInstallerUid(callingUid); - final File originFile = new File(originPath); final OriginInfo origin = OriginInfo.fromUntrustedFile(originFile); final Message msg = mHandler.obtainMessage(INIT_COPY); - final InstallParams params = new InstallParams(origin, null, observer, installFlags, - installerPackageName, null, verificationParams, user, packageAbiOverride, null); + final VerificationInfo verificationInfo = new VerificationInfo( + null /*originatingUri*/, null /*referrer*/, -1 /*originatingUid*/, callingUid); + final InstallParams params = new InstallParams(origin, null /*moveInfo*/, observer, + installFlags, installerPackageName, null /*volumeUuid*/, verificationInfo, user, + null /*packageAbiOverride*/, null /*grantedPermissions*/); params.setTraceMethod("installAsUser").setTraceCookie(System.identityHashCode(params)); msg.obj = params; @@ -10483,10 +10483,9 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.d(TAG, "Ephemeral install of " + packageName); } } - final VerificationParams verifParams = new VerificationParams( - null, sessionParams.originatingUri, sessionParams.referrerUri, - sessionParams.originatingUid); - verifParams.setInstallerUid(installerUid); + final VerificationInfo verificationInfo = new VerificationInfo( + sessionParams.originatingUri, sessionParams.referrerUri, + sessionParams.originatingUid, installerUid); final OriginInfo origin; if (stagedDir != null) { @@ -10498,7 +10497,7 @@ public class PackageManagerService extends IPackageManager.Stub { final Message msg = mHandler.obtainMessage(INIT_COPY); final InstallParams params = new InstallParams(origin, null, observer, sessionParams.installFlags, installerPackageName, sessionParams.volumeUuid, - verifParams, user, sessionParams.abiOverride, + verificationInfo, user, sessionParams.abiOverride, sessionParams.grantedRuntimePermissions); params.setTraceMethod("installStage").setTraceCookie(System.identityHashCode(params)); msg.obj = params; @@ -10548,7 +10547,8 @@ public class PackageManagerService extends IPackageManager.Stub { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null); PackageSetting pkgSetting; final int uid = Binder.getCallingUid(); - enforceCrossUserPermission(uid, userId, true, true, + enforceCrossUserPermission(uid, userId, + true /* requireFullPermission */, true /* checkShell */, "setApplicationHiddenSetting for user " + userId); if (hidden && isPackageDeviceAdmin(packageName, userId)) { @@ -10621,8 +10621,9 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public boolean getApplicationHiddenSettingAsUser(String packageName, int userId) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, - false, "getApplicationHidden for user " + userId); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, + "getApplicationHidden for user " + userId); PackageSetting pkgSetting; long callingId = Binder.clearCallingIdentity(); try { @@ -10648,8 +10649,9 @@ public class PackageManagerService extends IPackageManager.Stub { null); PackageSetting pkgSetting; final int uid = Binder.getCallingUid(); - enforceCrossUserPermission(uid, userId, true, true, "installExistingPackage for user " - + userId); + enforceCrossUserPermission(uid, userId, + true /* requireFullPermission */, true /* checkShell */, + "installExistingPackage for user " + userId); if (isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) { return PackageManager.INSTALL_FAILED_USER_RESTRICTED; } @@ -10698,7 +10700,8 @@ public class PackageManagerService extends IPackageManager.Stub { public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended, int userId) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, true, + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, true /* checkShell */, "setPackagesSuspended for user " + userId); if (ArrayUtils.isEmpty(packageNames)) { @@ -10756,8 +10759,9 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public boolean isPackageSuspendedForUser(String packageName, int userId) { - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, - false, "isPackageSuspendedForUser for user " + userId); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, + "isPackageSuspendedForUser for user " + userId); synchronized (mPackages) { final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); return pkgSetting != null && pkgSetting.getSuspended(userId); @@ -11533,6 +11537,30 @@ public class PackageManagerService extends IPackageManager.Stub { } } + static class VerificationInfo { + /** A constant used to indicate that a uid value is not present. */ + public static final int NO_UID = -1; + + /** URI referencing where the package was downloaded from. */ + final Uri originatingUri; + + /** HTTP referrer URI associated with the originatingURI. */ + final Uri referrer; + + /** UID of the application that the install request originated from. */ + final int originatingUid; + + /** UID of application requesting the install */ + final int installerUid; + + VerificationInfo(Uri originatingUri, Uri referrer, int originatingUid, int installerUid) { + this.originatingUri = originatingUri; + this.referrer = referrer; + this.originatingUid = originatingUid; + this.installerUid = installerUid; + } + } + class InstallParams extends HandlerParams { final OriginInfo origin; final MoveInfo move; @@ -11540,15 +11568,15 @@ public class PackageManagerService extends IPackageManager.Stub { int installFlags; final String installerPackageName; final String volumeUuid; - final VerificationParams verificationParams; private InstallArgs mArgs; private int mRet; final String packageAbiOverride; final String[] grantedRuntimePermissions; + final VerificationInfo verificationInfo; InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer, int installFlags, String installerPackageName, String volumeUuid, - VerificationParams verificationParams, UserHandle user, String packageAbiOverride, + VerificationInfo verificationInfo, UserHandle user, String packageAbiOverride, String[] grantedPermissions) { super(user); this.origin = origin; @@ -11557,7 +11585,7 @@ public class PackageManagerService extends IPackageManager.Stub { this.installFlags = installFlags; this.installerPackageName = installerPackageName; this.volumeUuid = volumeUuid; - this.verificationParams = verificationParams; + this.verificationInfo = verificationInfo; this.packageAbiOverride = packageAbiOverride; this.grantedRuntimePermissions = grantedPermissions; } @@ -11821,26 +11849,22 @@ public class PackageManagerService extends IPackageManager.Stub { verification.putExtra(PackageManager.EXTRA_VERIFICATION_VERSION_CODE, pkgLite.versionCode); - if (verificationParams != null) { - if (verificationParams.getVerificationURI() != null) { - verification.putExtra(PackageManager.EXTRA_VERIFICATION_URI, - verificationParams.getVerificationURI()); - } - if (verificationParams.getOriginatingURI() != null) { + if (verificationInfo != null) { + if (verificationInfo.originatingUri != null) { verification.putExtra(Intent.EXTRA_ORIGINATING_URI, - verificationParams.getOriginatingURI()); + verificationInfo.originatingUri); } - if (verificationParams.getReferrer() != null) { + if (verificationInfo.referrer != null) { verification.putExtra(Intent.EXTRA_REFERRER, - verificationParams.getReferrer()); + verificationInfo.referrer); } - if (verificationParams.getOriginatingUid() >= 0) { + if (verificationInfo.originatingUid >= 0) { verification.putExtra(Intent.EXTRA_ORIGINATING_UID, - verificationParams.getOriginatingUid()); + verificationInfo.originatingUid); } - if (verificationParams.getInstallerUid() >= 0) { + if (verificationInfo.installerUid >= 0) { verification.putExtra(PackageManager.EXTRA_VERIFICATION_INSTALLER_UID, - verificationParams.getInstallerUid()); + verificationInfo.installerUid); } } @@ -13330,18 +13354,21 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } - private void removeNativeBinariesLI(PackageParser.Package pkg) { + private void removeNativeBinariesLI(PackageSetting ps) { // Remove the lib path for the parent package - PackageSetting ps = (PackageSetting) pkg.mExtras; if (ps != null) { NativeLibraryHelper.removeNativeBinariesLI(ps.legacyNativeLibraryPathString); - } - // Remove the lib path for the child packages - final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; - for (int i = 0; i < childCount; i++) { - ps = (PackageSetting) pkg.childPackages.get(i).mExtras; - if (ps != null) { - NativeLibraryHelper.removeNativeBinariesLI(ps.legacyNativeLibraryPathString); + // Remove the lib path for the child packages + final int childCount = (ps.childPackageNames != null) ? ps.childPackageNames.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageSetting childPs = null; + synchronized (mPackages) { + childPs = mSettings.peekPackageLPr(ps.childPackageNames.get(i)); + } + if (childPs != null) { + NativeLibraryHelper.removeNativeBinariesLI(childPs + .legacyNativeLibraryPathString); + } } } } @@ -14126,25 +14153,48 @@ public class PackageManagerService extends IPackageManager.Stub { return; } - for (int currentUserId : users) { - if (getBlockUninstallForUser(packageName, currentUserId)) { - try { - observer.onPackageDeleted(packageName, - PackageManager.DELETE_FAILED_OWNER_BLOCKED, null); - } catch (RemoteException re) { - } - return; + if (!deleteAllUsers && getBlockUninstallForUser(packageName, userId)) { + try { + observer.onPackageDeleted(packageName, + PackageManager.DELETE_FAILED_OWNER_BLOCKED, null); + } catch (RemoteException re) { } + return; } if (DEBUG_REMOVE) { - Slog.d(TAG, "deletePackageAsUser: pkg=" + packageName + " user=" + userId); + Slog.d(TAG, "deletePackageAsUser: pkg=" + packageName + " user=" + userId + + " deleteAllUsers: " + deleteAllUsers ); } // Queue up an async operation since the package deletion may take a little while. mHandler.post(new Runnable() { public void run() { mHandler.removeCallbacks(this); - final int returnCode = deletePackageX(packageName, userId, flags); + int returnCode; + if (!deleteAllUsers) { + returnCode = deletePackageX(packageName, userId, flags); + } else { + int[] blockUninstallUserIds = getBlockUninstallForUsers(packageName, users); + // If nobody is blocking uninstall, proceed with delete for all users + if (ArrayUtils.isEmpty(blockUninstallUserIds)) { + returnCode = deletePackageX(packageName, userId, flags); + } else { + // Otherwise uninstall individually for users with blockUninstalls=false + final int userFlags = flags & ~PackageManager.DELETE_ALL_USERS; + for (int userId : users) { + if (!ArrayUtils.contains(blockUninstallUserIds, userId)) { + returnCode = deletePackageX(packageName, userId, userFlags); + if (returnCode != PackageManager.DELETE_SUCCEEDED) { + Slog.w(TAG, "Package delete failed for user " + userId + + ", returnCode " + returnCode); + } + } + } + // The app has only been marked uninstalled for certain users. + // We still need to report that delete was blocked + returnCode = PackageManager.DELETE_FAILED_OWNER_BLOCKED; + } + } try { observer.onPackageDeleted(packageName, returnCode, null); } catch (RemoteException e) { @@ -14154,6 +14204,16 @@ public class PackageManagerService extends IPackageManager.Stub { }); } + private int[] getBlockUninstallForUsers(String packageName, int[] userIds) { + int[] result = EMPTY_INT_ARRAY; + for (int userId : userIds) { + if (getBlockUninstallForUser(packageName, userId)) { + result = ArrayUtils.appendInt(result, userId); + } + } + return result; + } + @Override public boolean isPackageDeviceAdminOnAnyUser(String packageName) { return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL); @@ -14464,7 +14524,7 @@ public class PackageManagerService extends IPackageManager.Stub { private boolean deleteSystemPackageLI(PackageParser.Package deletedPkg, PackageSetting deletedPs, int[] allUserHandles, int flags, PackageRemovedInfo outInfo, boolean writeSettings) { - if (deletedPkg.parentPackage != null) { + if (deletedPs.parentPackageName != null) { Slog.w(TAG, "Attempt to delete child system package " + deletedPkg.packageName); return false; } @@ -14477,7 +14537,7 @@ public class PackageManagerService extends IPackageManager.Stub { // the system pkg from system partition // reader synchronized (mPackages) { - disabledPs = mSettings.getDisabledSystemPkgLPr(deletedPkg.packageName); + disabledPs = mSettings.getDisabledSystemPkgLPr(deletedPs.name); } if (DEBUG_REMOVE) Slog.d(TAG, "deleteSystemPackageLI: newPs=" + deletedPkg.packageName @@ -14503,10 +14563,10 @@ public class PackageManagerService extends IPackageManager.Stub { // Delete the updated package outInfo.isRemovedPackageSystemUpdate = true; if (outInfo.removedChildPackages != null) { - final int childCount = (deletedPkg.childPackages != null) - ? deletedPkg.childPackages.size() : 0; + final int childCount = (deletedPs.childPackageNames != null) + ? deletedPs.childPackageNames.size() : 0; for (int i = 0; i < childCount; i++) { - String childPackageName = deletedPkg.childPackages.get(i).packageName; + String childPackageName = deletedPs.childPackageNames.get(i); if (disabledPs.childPackageNames != null && disabledPs.childPackageNames .contains(childPackageName)) { PackageRemovedInfo childInfo = outInfo.removedChildPackages.get( @@ -14526,7 +14586,7 @@ public class PackageManagerService extends IPackageManager.Stub { flags |= PackageManager.DELETE_KEEP_DATA; } - boolean ret = deleteInstalledPackageLI(deletedPkg, true, flags, allUserHandles, + boolean ret = deleteInstalledPackageLI(deletedPs, true, flags, allUserHandles, outInfo, writeSettings, disabledPs.pkg); if (!ret) { return false; @@ -14537,7 +14597,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Reinstate the old system package enableSystemPackageLPw(disabledPs.pkg); // Remove any native libraries from the upgraded package. - removeNativeBinariesLI(deletedPkg); + removeNativeBinariesLI(deletedPs); } // Install the system package @@ -14594,29 +14654,18 @@ public class PackageManagerService extends IPackageManager.Stub { return true; } - private boolean deleteInstalledPackageLI(PackageParser.Package pkg, + private boolean deleteInstalledPackageLI(PackageSetting ps, boolean deleteCodeAndResources, int flags, int[] allUserHandles, PackageRemovedInfo outInfo, boolean writeSettings, PackageParser.Package replacingPackage) { - PackageSetting ps = null; - synchronized (mPackages) { - pkg = mPackages.get(pkg.packageName); - if (pkg == null) { - return false; - } - - ps = mSettings.mPackages.get(pkg.packageName); - if (ps == null) { - return false; - } - if (outInfo != null) { outInfo.uid = ps.appId; } if (outInfo != null && outInfo.removedChildPackages != null) { - final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + final int childCount = (ps.childPackageNames != null) + ? ps.childPackageNames.size() : 0; for (int i = 0; i < childCount; i++) { String childPackageName = ps.childPackageNames.get(i); PackageSetting childPs = mSettings.mPackages.get(childPackageName); @@ -14636,11 +14685,11 @@ public class PackageManagerService extends IPackageManager.Stub { removePackageDataLI(ps, allUserHandles, outInfo, flags, writeSettings); // Delete the child packages data - final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + final int childCount = (ps.childPackageNames != null) ? ps.childPackageNames.size() : 0; for (int i = 0; i < childCount; i++) { PackageSetting childPs; synchronized (mPackages) { - childPs = mSettings.peekPackageLPr(pkg.childPackages.get(i).packageName); + childPs = mSettings.peekPackageLPr(ps.childPackageNames.get(i)); } if (childPs != null) { PackageRemovedInfo childOutInfo = (outInfo != null @@ -14656,7 +14705,7 @@ public class PackageManagerService extends IPackageManager.Stub { } // Delete application code and resources only for parent packages - if (ps.pkg.parentPackage == null) { + if (ps.parentPackageName == null) { if (deleteCodeAndResources && (outInfo != null)) { outInfo.args = createInstallArgsForExisting(packageFlagsToInstallFlags(ps), ps.codePathString, ps.resourcePathString, getAppDexInstructionSets(ps)); @@ -14747,7 +14796,7 @@ public class PackageManagerService extends IPackageManager.Stub { return false; } - if (ps.pkg != null && ps.pkg.parentPackage != null && (!isSystemApp(ps) + if (ps.parentPackageName != null && (!isSystemApp(ps) || (flags & PackageManager.DELETE_SYSTEM_APP) != 0)) { if (DEBUG_REMOVE) { Slog.d(TAG, "Uninstalled child package:" + packageName + " for user:" @@ -14835,7 +14884,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package: " + ps.name); // Kill application pre-emptively especially for apps on sd. killApplication(packageName, ps.appId, "uninstall pkg"); - ret = deleteInstalledPackageLI(ps.pkg, deleteCodeAndResources, flags, allUserHandles, + ret = deleteInstalledPackageLI(ps, deleteCodeAndResources, flags, allUserHandles, outInfo, writeSettings, replacingPackage); } @@ -15016,7 +15065,8 @@ public class PackageManagerService extends IPackageManager.Stub { final IPackageDataObserver observer, final int userId) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.CLEAR_APP_USER_DATA, null); - enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "clear application data"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, + true /* requireFullPermission */, false /* checkShell */, "clear application data"); // Queue up an async operation since the package deletion may take a little while. mHandler.post(new Runnable() { public void run() { @@ -15479,7 +15529,8 @@ public class PackageManagerService extends IPackageManager.Stub { String opname) { // writer int callingUid = Binder.getCallingUid(); - enforceCrossUserPermission(callingUid, userId, true, false, "add preferred activity"); + enforceCrossUserPermission(callingUid, userId, + true /* requireFullPermission */, false /* checkShell */, "add preferred activity"); if (filter.countActions() == 0) { Slog.w(TAG, "Cannot set a preferred activity with no filter actions"); return; @@ -15524,7 +15575,9 @@ public class PackageManagerService extends IPackageManager.Stub { } final int callingUid = Binder.getCallingUid(); - enforceCrossUserPermission(callingUid, userId, true, false, "replace preferred activity"); + enforceCrossUserPermission(callingUid, userId, + true /* requireFullPermission */, false /* checkShell */, + "replace preferred activity"); synchronized (mPackages) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) @@ -16342,7 +16395,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); final int uid = Binder.getCallingUid(); final int permission = mContext.checkCallingOrSelfPermission( android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); - enforceCrossUserPermission(uid, userId, false, true, "set enabled"); + enforceCrossUserPermission(uid, userId, + false /* requireFullPermission */, true /* checkShell */, "set enabled"); final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); boolean sendNow = false; boolean isApp = (className == null); @@ -16481,7 +16535,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); final int permission = mContext.checkCallingOrSelfPermission( android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); - enforceCrossUserPermission(uid, userId, true, true, "stop package"); + enforceCrossUserPermission(uid, userId, + true /* requireFullPermission */, true /* checkShell */, "stop package"); // writer synchronized (mPackages) { if (mSettings.setPackageStoppedStateLPw(this, packageName, stopped, @@ -16503,7 +16558,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); public int getApplicationEnabledSetting(String packageName, int userId) { if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED; int uid = Binder.getCallingUid(); - enforceCrossUserPermission(uid, userId, false, false, "get enabled"); + enforceCrossUserPermission(uid, userId, + false /* requireFullPermission */, false /* checkShell */, "get enabled"); // reader synchronized (mPackages) { return mSettings.getApplicationEnabledSettingLPr(packageName, userId); @@ -16514,7 +16570,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); public int getComponentEnabledSetting(ComponentName componentName, int userId) { if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED; int uid = Binder.getCallingUid(); - enforceCrossUserPermission(uid, userId, false, false, "get component enabled"); + enforceCrossUserPermission(uid, userId, + false /* requireFullPermission */, false /* checkShell */, "get component enabled"); // reader synchronized (mPackages) { return mSettings.getComponentEnabledSettingLPr(componentName, userId); @@ -18021,6 +18078,13 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); if (ps.getInstalled(userId)) { prepareAppData(volumeUuid, userId, flags, ps.pkg, restoreconNeeded); + + if (maybeMigrateAppData(volumeUuid, userId, ps.pkg)) { + // We may have just shuffled around app data directories, so + // prepare them one more time + prepareAppData(volumeUuid, userId, flags, ps.pkg, restoreconNeeded); + } + preparedCount++; } } @@ -18148,6 +18212,30 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } + /** + * For system apps on non-FBE devices, this method migrates any existing + * CE/DE data to match the {@code forceDeviceEncrypted} flag requested by + * the app. + */ + private boolean maybeMigrateAppData(String volumeUuid, int userId, PackageParser.Package pkg) { + if (pkg.isSystemApp() && !StorageManager.isFileBasedEncryptionEnabled() + && PackageManager.APPLY_FORCE_DEVICE_ENCRYPTED) { + final int storageTarget = pkg.applicationInfo.isForceDeviceEncrypted() + ? StorageManager.FLAG_STORAGE_DE : StorageManager.FLAG_STORAGE_CE; + synchronized (mInstallLock) { + try { + mInstaller.migrateAppData(volumeUuid, pkg.packageName, userId, storageTarget); + } catch (InstallerException e) { + logCriticalInfo(Log.WARN, + "Failed to migrate " + pkg.packageName + ": " + e.getMessage()); + } + } + return true; + } else { + return false; + } + } + private void unfreezePackage(String packageName) { synchronized (mPackages) { final PackageSetting ps = mSettings.mPackages.get(packageName); @@ -18388,7 +18476,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); final Message msg = mHandler.obtainMessage(INIT_COPY); final OriginInfo origin = OriginInfo.fromExistingFile(codeFile); final InstallParams params = new InstallParams(origin, move, installObserver, installFlags, - installerPackageName, volumeUuid, null, user, packageAbiOverride, null); + installerPackageName, volumeUuid, null /*verificationInfo*/, user, + packageAbiOverride, null); params.setTraceMethod("movePackage").setTraceCookie(System.identityHashCode(params)); msg.obj = params; diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 16521855507e..310ad5353e32 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3049,7 +3049,7 @@ final class Settings { tmpPa.dump(new LogPrinter(Log.DEBUG, TAG), " "); } Intent intent = new Intent(); - int flags = 0; + int flags = PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE; intent.setAction(tmpPa.getAction(0)); for (int i=0; i<tmpPa.countCategories(); i++) { String cat = tmpPa.getCategory(i); diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 8a2729eec805..49aaa4aa1047 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -2512,7 +2512,7 @@ public final class TvInputManagerService extends SystemService { // For the recording session only @Override - public void onTuned() { + public void onTuned(Uri channelUri) { synchronized (mLock) { if (DEBUG) { Slog.d(TAG, "onTuned()"); @@ -2521,7 +2521,7 @@ public final class TvInputManagerService extends SystemService { return; } try { - mSessionState.client.onTuned(mSessionState.seq); + mSessionState.client.onTuned(mSessionState.seq, channelUri); } catch (RemoteException e) { Slog.e(TAG, "error in onTuned", e); } diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java index 2f076d1d69e3..7611527d2b99 100644 --- a/services/core/java/com/android/server/vr/VrManagerService.java +++ b/services/core/java/com/android/server/vr/VrManagerService.java @@ -15,9 +15,12 @@ */ package com.android.server.vr; +import android.app.AppOpsManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.os.Binder; +import android.os.IBinder; import android.os.UserHandle; import android.util.ArraySet; import android.util.Slog; @@ -40,6 +43,9 @@ public class VrManagerService extends SystemService { private static native void setVrModeNative(boolean enabled); private final Object mLock = new Object(); + + private final IBinder mOverlayToken = new Binder(); + private boolean mVrModeEnabled = false; private ArraySet<VrStateListener> mListeners = new ArraySet<>(); @@ -97,11 +103,25 @@ public class VrManagerService extends SystemService { // Log mode change event. Slog.i(TAG, "VR mode " + ((mVrModeEnabled) ? "enabled" : "disabled")); setVrModeNative(mVrModeEnabled); + updateOverlayStateLocked(); onVrModeChangedLocked(); } } } + private void updateOverlayStateLocked() { + final long identity = Binder.clearCallingIdentity(); + try { + AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class); + if (appOpsManager != null) { + appOpsManager.setUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, + mVrModeEnabled, mOverlayToken); + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + private boolean getVrMode() { synchronized (mLock) { return mVrModeEnabled; diff --git a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java index 0979cd32a1e2..ccba88ddeb17 100644 --- a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java +++ b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java @@ -35,7 +35,7 @@ public class WindowManagerDebugConfig { static final boolean DEBUG_RESIZE = false; static final boolean DEBUG = false; - static final boolean DEBUG_ADD_REMOVE = false; + static final boolean DEBUG_ADD_REMOVE = true; static final boolean DEBUG_FOCUS = false; static final boolean DEBUG_FOCUS_LIGHT = DEBUG_FOCUS || false; static final boolean DEBUG_ANIM = false; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 69d2d20a9018..fe215d523338 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8777,10 +8777,10 @@ public class WindowManagerService extends IWindowManager.Stub i -= lastBelow; if (i != numRemoved) { displayContent.layoutNeeded = true; - Slog.w(TAG_WM, "On display=" + displayContent.getDisplayId() + " Rebuild removed " + - numRemoved + " windows but added " + i, - new RuntimeException("here").fillInStackTrace()); - for (i=0; i<numRemoved; i++) { + Slog.w(TAG_WM, "On display=" + displayContent.getDisplayId() + " Rebuild removed " + + numRemoved + " windows but added " + i + " rebuildAppWindowListLocked() " + + " callers=" + Debug.getCallers(10)); + for (i = 0; i < numRemoved; i++) { WindowState ws = mRebuildTmp[i]; if (ws.mRebuilding) { StringWriter sw = new StringWriter(); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 60c3a35017d4..0252ea45c0b6 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -769,7 +769,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { out.attribute(null, ATTR_VALUE, Boolean.toString(disableContactsSearch)); out.endTag(null, TAG_DISABLE_CONTACTS_SEARCH); } - if (disableBluetoothContactSharing) { + if (!disableBluetoothContactSharing) { out.startTag(null, TAG_DISABLE_BLUETOOTH_CONTACT_SHARING); out.attribute(null, ATTR_VALUE, Boolean.toString(disableBluetoothContactSharing)); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 0ece6aafc742..9aa2b9452b87 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1036,6 +1036,7 @@ public final class SystemServer { traceBeginAndSlog("StartNetworkTimeUpdateService"); try { networkTimeUpdater = new NetworkTimeUpdateService(context); + ServiceManager.addService("network_time_update_service", networkTimeUpdater); } catch (Throwable e) { reportWtf("starting NetworkTimeUpdate service", e); } diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java index 2a90c60656ab..afae9563cb19 100644 --- a/services/net/java/android/net/ip/IpManager.java +++ b/services/net/java/android/net/ip/IpManager.java @@ -66,9 +66,6 @@ public class IpManager extends StateMachine { private static final boolean DBG = true; private static final boolean VDBG = false; - private static final boolean NO_CALLBACKS = false; - private static final boolean SEND_CALLBACKS = true; - // For message logging. private static final Class[] sMessageClasses = { IpManager.class, DhcpClient.class }; private static final SparseArray<String> sWhatToString = @@ -98,6 +95,10 @@ public class IpManager extends StateMachine { public void onProvisioningSuccess(LinkProperties newLp) {} public void onProvisioningFailure(LinkProperties newLp) {} + // This is called whenever 464xlat is being enabled or disabled (i.e. + // started or stopped). + public void on464XlatChange(boolean enabled) {} + // Invoked on LinkProperties changes. public void onLinkPropertiesChange(LinkProperties newLp) {} @@ -207,6 +208,13 @@ public class IpManager extends StateMachine { private static final int MAX_LOG_RECORDS = 1000; + private static final boolean NO_CALLBACKS = false; + private static final boolean SEND_CALLBACKS = true; + + // This must match the interface prefix in clatd.c. + // TODO: Revert this hack once IpManager and Nat464Xlat work in concert. + private static final String CLAT_PREFIX = "v4-"; + private final Object mLock = new Object(); private final State mStoppedState = new StoppedState(); private final State mStoppingState = new StoppingState(); @@ -215,6 +223,7 @@ public class IpManager extends StateMachine { private final String mTag; private final Context mContext; private final String mInterfaceName; + private final String mClatInterfaceName; @VisibleForTesting protected final Callback mCallback; private final INetworkManagementService mNwService; @@ -241,15 +250,23 @@ public class IpManager extends StateMachine { public IpManager(Context context, String ifName, Callback callback) throws IllegalArgumentException { + this(context, ifName, callback, INetworkManagementService.Stub.asInterface( + ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE))); + } + + /** + * An expanded constructor, useful for dependency injection. + */ + public IpManager(Context context, String ifName, Callback callback, + INetworkManagementService nwService) throws IllegalArgumentException { super(IpManager.class.getSimpleName() + "." + ifName); mTag = getName(); mContext = context; mInterfaceName = ifName; + mClatInterfaceName = CLAT_PREFIX + ifName; mCallback = callback; - - mNwService = INetworkManagementService.Stub.asInterface( - ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)); + mNwService = nwService; mNetlinkTracker = new NetlinkTracker( mInterfaceName, @@ -258,7 +275,22 @@ public class IpManager extends StateMachine { public void update() { sendMessage(EVENT_NETLINK_LINKPROPERTIES_CHANGED); } - }); + }) { + @Override + public void interfaceAdded(String iface) { + if (mClatInterfaceName.equals(iface)) { + mCallback.on464XlatChange(true); + } + } + + @Override + public void interfaceRemoved(String iface) { + if (mClatInterfaceName.equals(iface)) { + mCallback.on464XlatChange(false); + } + } + }; + try { mNwService.registerObserver(mNetlinkTracker); } catch (RemoteException e) { @@ -277,25 +309,6 @@ public class IpManager extends StateMachine { super.start(); } - /** - * A special constructor for use in testing that bypasses some of the more - * complicated setup bits. - * - * TODO: Figure out how to delete this yet preserve testability. - */ - @VisibleForTesting - protected IpManager(String ifName, Callback callback) { - super(IpManager.class.getSimpleName() + ".test-" + ifName); - mTag = getName(); - - mInterfaceName = ifName; - mCallback = callback; - - mContext = null; - mNwService = null; - mNetlinkTracker = null; - } - @Override protected void onQuitting() { mCallback.onQuit(); diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index 587442916d51..69f12eb5b08c 100644 --- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -59,14 +59,17 @@ import android.os.Message; import android.os.MessageQueue; import android.os.Messenger; import android.os.MessageQueue.IdleHandler; +import android.os.SystemClock; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; import android.util.LogPrinter; +import com.android.internal.util.WakeupMessage; import com.android.server.connectivity.NetworkAgentInfo; import com.android.server.connectivity.NetworkMonitor; +import com.android.server.net.NetworkPinner; import java.net.InetAddress; import java.util.concurrent.CountDownLatch; @@ -87,10 +90,30 @@ public class ConnectivityServiceTest extends AndroidTestCase { private BroadcastInterceptingContext mServiceContext; private WrappedConnectivityService mService; - private ConnectivityManager mCm; + private WrappedConnectivityManager mCm; private MockNetworkAgent mWiFiNetworkAgent; private MockNetworkAgent mCellNetworkAgent; + // This class exists to test bindProcessToNetwork and getBoundNetworkForProcess. These methods + // do not go through ConnectivityService but talk to netd directly, so they don't automatically + // reflect the state of our test ConnectivityService. + private class WrappedConnectivityManager extends ConnectivityManager { + private Network mFakeBoundNetwork; + + public synchronized boolean bindProcessToNetwork(Network network) { + mFakeBoundNetwork = network; + return true; + } + + public synchronized Network getBoundNetworkForProcess() { + return mFakeBoundNetwork; + } + + public WrappedConnectivityManager(Context context, ConnectivityService service) { + super(context, service); + } + } + private class MockContext extends BroadcastInterceptingContext { MockContext(Context base) { super(base); @@ -484,6 +507,35 @@ public class ConnectivityServiceTest extends AndroidTestCase { } } + private class FakeWakeupMessage extends WakeupMessage { + private static final int UNREASONABLY_LONG_WAIT = 1000; + + public FakeWakeupMessage(Context context, Handler handler, String cmdName, int cmd) { + super(context, handler, cmdName, cmd); + } + + @Override + public void schedule(long when) { + long delayMs = when - SystemClock.elapsedRealtime(); + if (delayMs < 0) delayMs = 0; + if (delayMs > UNREASONABLY_LONG_WAIT) { + fail("Attempting to send msg more than " + UNREASONABLY_LONG_WAIT + + "ms into the future: " + delayMs); + } + mHandler.sendEmptyMessageDelayed(mCmd, delayMs); + } + + @Override + public void cancel() { + mHandler.removeMessages(mCmd); + } + + @Override + public void onAlarm() { + throw new AssertionError("Should never happen. Update this fake."); + } + } + // NetworkMonitor implementation allowing overriding of Internet connectivity probe result. private class WrappedNetworkMonitor extends NetworkMonitor { // HTTP response code fed back to NetworkMonitor for Internet connectivity probe. @@ -498,6 +550,12 @@ public class ConnectivityServiceTest extends AndroidTestCase { protected int isCaptivePortal() { return gen204ProbeResult; } + + @Override + protected WakeupMessage makeWakeupMessage( + Context context, Handler handler, String cmdName, int cmd) { + return new FakeWakeupMessage(context, handler, cmdName, cmd); + } } private class WrappedConnectivityService extends ConnectivityService { @@ -575,10 +633,10 @@ public class ConnectivityServiceTest extends AndroidTestCase { int delays = 0; while (!criteria.get()) { try { - Thread.sleep(100); + Thread.sleep(50); } catch (InterruptedException e) { } - if (++delays == 5) fail(); + if (++delays == 10) fail(); } } @@ -594,6 +652,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { public void setUp() throws Exception { super.setUp(); + NetworkMonitor.SetDefaultLingerTime(120); + // InstrumentationTestRunner prepares a looper, but AndroidJUnitRunner does not. // http://b/25897652 . if (Looper.myLooper() == null) { @@ -607,7 +667,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { mock(INetworkPolicyManager.class)); mService.systemReady(); - mCm = new ConnectivityManager(getContext(), mService); + mCm = new WrappedConnectivityManager(getContext(), mService); + mCm.bindProcessToNetwork(null); } private int transportToLegacyType(int transport) { @@ -674,8 +735,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { @LargeTest public void testLingering() throws Exception { - // Decrease linger timeout to the minimum allowed by AlarmManagerService. - NetworkMonitor.SetDefaultLingerTime(5000); verifyNoNetwork(); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); @@ -702,10 +761,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { assertTrue(mCm.getAllNetworks()[0].equals(mCellNetworkAgent.getNetwork()) || mCm.getAllNetworks()[1].equals(mCellNetworkAgent.getNetwork())); // Test cellular linger timeout. - try { - Thread.sleep(6000); - } catch (InterruptedException e) { - } + waitFor(new Criteria() { + public boolean get() { return mCm.getAllNetworks().length == 1; } }); verifyActiveNetwork(TRANSPORT_WIFI); assertEquals(1, mCm.getAllNetworks().length); assertEquals(mCm.getAllNetworks()[0], mCm.getActiveNetwork()); @@ -1543,4 +1600,103 @@ public class ConnectivityServiceTest extends AndroidTestCase { String url = mCm.getCaptivePortalServerUrl(); assertEquals("http://connectivitycheck.gstatic.com/generate_204", url); } + + private static class TestNetworkPinner extends NetworkPinner { + public static boolean awaitPin(int timeoutMs) { + synchronized(sLock) { + if (sNetwork == null) { + try { + sLock.wait(timeoutMs); + } catch (InterruptedException e) {} + } + return sNetwork != null; + } + } + + public static boolean awaitUnpin(int timeoutMs) { + synchronized(sLock) { + if (sNetwork != null) { + try { + sLock.wait(timeoutMs); + } catch (InterruptedException e) {} + } + return sNetwork == null; + } + } + } + + private void assertPinnedToWifiWithCellDefault() { + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getBoundNetworkForProcess()); + assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + } + + private void assertPinnedToWifiWithWifiDefault() { + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getBoundNetworkForProcess()); + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + } + + private void assertNotPinnedToWifi() { + assertNull(mCm.getBoundNetworkForProcess()); + assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + } + + @SmallTest + public void testNetworkPinner() { + NetworkRequest wifiRequest = new NetworkRequest.Builder() + .addTransportType(TRANSPORT_WIFI) + .build(); + assertNull(mCm.getBoundNetworkForProcess()); + + TestNetworkPinner.pin(mServiceContext, wifiRequest); + assertNull(mCm.getBoundNetworkForProcess()); + + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); + mCellNetworkAgent.connect(true); + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false); + + // When wi-fi connects, expect to be pinned. + assertTrue(TestNetworkPinner.awaitPin(100)); + assertPinnedToWifiWithCellDefault(); + + // Disconnect and expect the pin to drop. + mWiFiNetworkAgent.disconnect(); + assertTrue(TestNetworkPinner.awaitUnpin(100)); + assertNotPinnedToWifi(); + + // Reconnecting does not cause the pin to come back. + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false); + assertFalse(TestNetworkPinner.awaitPin(100)); + assertNotPinnedToWifi(); + + // Pinning while connected causes the pin to take effect immediately. + TestNetworkPinner.pin(mServiceContext, wifiRequest); + assertTrue(TestNetworkPinner.awaitPin(100)); + assertPinnedToWifiWithCellDefault(); + + // Explicitly unpin and expect to use the default network again. + TestNetworkPinner.unpin(); + assertNotPinnedToWifi(); + + // Disconnect cell and wifi. + ConditionVariable cv = waitForConnectivityBroadcasts(3); // cell down, wifi up, wifi down. + mCellNetworkAgent.disconnect(); + mWiFiNetworkAgent.disconnect(); + waitFor(cv); + + // Pinning takes effect even if the pinned network is the default when the pin is set... + TestNetworkPinner.pin(mServiceContext, wifiRequest); + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false); + assertTrue(TestNetworkPinner.awaitPin(100)); + assertPinnedToWifiWithWifiDefault(); + + // ... and is maintained even when that network is no longer the default. + cv = waitForConnectivityBroadcasts(1); + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mCellNetworkAgent.connect(true); + waitFor(cv); + assertPinnedToWifiWithCellDefault(); + } } diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 8b250f4c18d8..8da17852b437 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -437,7 +437,7 @@ public class UsageStatsService extends SystemService implements return false; } } catch (RemoteException re) { - return false; + throw re.rethrowFromSystemServer(); } final long elapsedRealtime = SystemClock.elapsedRealtime(); @@ -805,6 +805,7 @@ public class UsageStatsService extends SystemService implements return false; } } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); } if (isActiveDeviceAdmin(packageName, userId)) { @@ -849,7 +850,7 @@ public class UsageStatsService extends SystemService implements } apps = slice.getList(); } catch (RemoteException e) { - return new int[0]; + throw e.rethrowFromSystemServer(); } // State of each uid. Key is the uid. Value lower 16 bits is the number of apps @@ -1258,7 +1259,7 @@ public class UsageStatsService extends SystemService implements userId = ActivityManagerNative.getDefault().handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "isAppInactive", null); } catch (RemoteException re) { - return false; + throw re.rethrowFromSystemServer(); } final long token = Binder.clearCallingIdentity(); try { @@ -1277,7 +1278,7 @@ public class UsageStatsService extends SystemService implements Binder.getCallingPid(), callingUid, userId, false, true, "setAppIdle", null); } catch (RemoteException re) { - return; + throw re.rethrowFromSystemServer(); } getContext().enforceCallingPermission(Manifest.permission.CHANGE_APP_IDLE_STATE, "No permission to change app idle state"); diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index de9020250f25..10808da8785e 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -624,6 +624,21 @@ public final class Call { parcelableCall.getExtras(), parcelableCall.getIntentExtras()); } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("[pa: "); + sb.append(mAccountHandle); + sb.append(", hdl: "); + sb.append(Log.pii(mHandle)); + sb.append(", caps: "); + sb.append(capabilitiesToString(mCallCapabilities)); + sb.append(", props: "); + sb.append(mCallProperties); + sb.append("]"); + return sb.toString(); + } } public static abstract class Callback { @@ -1000,6 +1015,48 @@ public final class Call { } } + @Override + public String toString() { + return new StringBuilder(). + append("Call [id: "). + append(mTelecomCallId). + append(", state: "). + append(stateToString(mState)). + append(", details: "). + append(mDetails). + append("]").toString(); + } + + /** + * @param state An integer value of a {@code STATE_*} constant. + * @return A string representation of the value. + */ + private static String stateToString(int state) { + switch (state) { + case STATE_NEW: + return "NEW"; + case STATE_RINGING: + return "RINGING"; + case STATE_DIALING: + return "DIALING"; + case STATE_ACTIVE: + return "ACTIVE"; + case STATE_HOLDING: + return "HOLDING"; + case STATE_DISCONNECTED: + return "DISCONNECTED"; + case STATE_CONNECTING: + return "CONNECTING"; + case STATE_DISCONNECTING: + return "DISCONNECTING"; + case STATE_SELECT_PHONE_ACCOUNT: + return "SELECT_PHONE_ACCOUNT"; + default: + Log.w(Call.class, "Unknown state %d", state); + return "UNKNOWN"; + } + } + /** * Adds a listener to this {@code Call}. * diff --git a/telecomm/java/android/telecom/Log.java b/telecomm/java/android/telecom/Log.java index 3f32dbe0fdbe..2ab0525a33c4 100644 --- a/telecomm/java/android/telecom/Log.java +++ b/telecomm/java/android/telecom/Log.java @@ -16,7 +16,10 @@ package android.telecom; +import android.net.Uri; import android.os.AsyncTask; +import android.telephony.PhoneNumberUtils; +import android.text.TextUtils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -152,10 +155,37 @@ final public class Log { public static String pii(Object pii) { if (pii == null || VERBOSE) { return String.valueOf(pii); + } if (pii instanceof Uri) { + return piiUri((Uri) pii); } return "[" + secureHash(String.valueOf(pii).getBytes()) + "]"; } + private static String piiUri(Uri handle) { + StringBuilder sb = new StringBuilder(); + String scheme = handle.getScheme(); + if (!TextUtils.isEmpty(scheme)) { + sb.append(scheme).append(":"); + } + String value = handle.getSchemeSpecificPart(); + if (!TextUtils.isEmpty(value)) { + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + if (PhoneNumberUtils.isStartsPostDial(c)) { + sb.append(c); + } else if (PhoneNumberUtils.isDialable(c)) { + sb.append("*"); + } else if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) { + sb.append("*"); + } else { + sb.append(c); + } + } + } + return sb.toString(); + + } + private static String secureHash(byte[] input) { if (sMessageDigest != null) { sMessageDigest.reset(); diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 9f478df2063e..605e0d3acd90 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -1425,7 +1425,9 @@ public class TelecomManager { * <p> This method displays the UI to manage blocked numbers only if * {@link android.provider.BlockedNumberContract#canCurrentUserBlockNumbers(Context)} returns * {@code true} for the current user. + * @deprecated Use {@link #createManageBlockedNumbersIntent()} instead. */ + // TODO: Delete this. public void launchManageBlockedNumbersActivity() { ITelecomService service = getTelecomService(); if (service != null) { @@ -1437,6 +1439,26 @@ public class TelecomManager { } } + /** + * Creates the {@link Intent} which can be used with {@link Context#startActivity(Intent)} to + * launch the activity to manage blocked numbers. + * <p> This method displays the UI to manage blocked numbers only if + * {@link android.provider.BlockedNumberContract#canCurrentUserBlockNumbers(Context)} returns + * {@code true} for the current user. + */ + public Intent createManageBlockedNumbersIntent() { + ITelecomService service = getTelecomService(); + Intent result = null; + if (service != null) { + try { + result = service.createManageBlockedNumbersIntent(); + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelecomService#createManageBlockedNumbersIntent", e); + } + } + return result; + } + private ITelecomService getTelecomService() { if (mTelecomServiceOverride != null) { return mTelecomServiceOverride; diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl index 95c8db54498c..3c250f1b54fd 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -17,6 +17,7 @@ package com.android.internal.telecom; import android.content.ComponentName; +import android.content.Intent; import android.telecom.ParcelableCallAnalytics; import android.telecom.PhoneAccountHandle; import android.net.Uri; @@ -247,5 +248,11 @@ interface ITelecomService { /** * @see TelecomServiceImpl#launchManageBlockedNumbersActivity **/ + // TODO: Delete this. void launchManageBlockedNumbersActivity(in String callingPackageName); + + /** + * @see TelecomServiceImpl#createManageBlockedNumbersIntent + **/ + Intent createManageBlockedNumbersIntent(); } diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index da4346002110..c34d4a919242 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -25,7 +25,6 @@ import android.content.IntentFilter; import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; -import android.content.pm.ContainerEncryptionParams; import android.content.pm.EphemeralApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IPackageDataObserver; @@ -44,7 +43,6 @@ import android.content.pm.PermissionInfo; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; -import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.res.Resources; import android.content.res.XmlResourceParser; @@ -602,14 +600,6 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } - /** @hide */ - @Override - public void installPackageAsUser(Uri packageURI, PackageInstallObserver observer, - int flags, String installerPackageName, int userId) { - throw new UnsupportedOperationException(); - } - - @Override public void setInstallerPackageName(String targetPackage, String installerPackageName) { @@ -873,26 +863,6 @@ public class MockPackageManager extends PackageManager { * @hide */ @Override - public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, - int flags, String installerPackageName, Uri verificationURI, - ContainerEncryptionParams encryptionParams) { - throw new UnsupportedOperationException(); - } - - /** - * @hide - */ - @Override - public void installPackageWithVerificationAndEncryption(Uri packageURI, - IPackageInstallObserver observer, int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) { - throw new UnsupportedOperationException(); - } - - /** - * @hide - */ - @Override public boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden, UserHandle user) { return false; @@ -1024,27 +994,6 @@ public class MockPackageManager extends PackageManager { * @hide */ @Override - public void installPackageWithVerification(Uri packageURI, - PackageInstallObserver observer, int flags, String installerPackageName, - Uri verificationURI, - ContainerEncryptionParams encryptionParams) { - throw new UnsupportedOperationException(); - } - - /** - * @hide - */ - @Override - public void installPackageWithVerificationAndEncryption(Uri packageURI, - PackageInstallObserver observer, int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) { - throw new UnsupportedOperationException(); - } - - /** - * @hide - */ - @Override public void addCrossProfileIntentFilter(IntentFilter filter, int sourceUserId, int targetUserId, int flags) { throw new UnsupportedOperationException(); diff --git a/tests/HwAccelerationTest/res/drawable/default_wallpaper.jpg b/tests/HwAccelerationTest/res/drawable/default_wallpaper.jpg Binary files differdeleted file mode 100644 index 5acad947cc83..000000000000 --- a/tests/HwAccelerationTest/res/drawable/default_wallpaper.jpg +++ /dev/null diff --git a/tests/HwAccelerationTest/res/drawable/default_wallpaper.png b/tests/HwAccelerationTest/res/drawable/default_wallpaper.png Binary files differnew file mode 100644 index 000000000000..91ad252507e5 --- /dev/null +++ b/tests/HwAccelerationTest/res/drawable/default_wallpaper.png diff --git a/tests/HwAccelerationTest/res/layout/projection_clipping.xml b/tests/HwAccelerationTest/res/layout/projection_clipping.xml index 1f2b93946f48..1ea9f9cd49f6 100644 --- a/tests/HwAccelerationTest/res/layout/projection_clipping.xml +++ b/tests/HwAccelerationTest/res/layout/projection_clipping.xml @@ -3,24 +3,32 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> - <FrameLayout + <ScrollView + android:orientation="vertical" android:translationX="50dp" android:translationY="50dp" android:elevation="30dp" android:layout_width="200dp" android:layout_height="200dp" android:background="@drawable/round_rect_background"> - <View - android:id="@+id/clickable1" - android:layout_width="100dp" - android:layout_height="100dp" - android:background="?android:attr/selectableItemBackgroundBorderless"/> - <View - android:id="@+id/clickable2" - android:translationX="50dp" - android:translationY="10dp" - android:layout_width="150dp" - android:layout_height="100dp" - android:background="?android:attr/selectableItemBackgroundBorderless"/> - </FrameLayout> + <FrameLayout + android:layout_width="200dp" + android:layout_height="wrap_content"> + <View + android:layout_width="200dp" + android:layout_height="2000dp"/> + <View + android:id="@+id/clickable1" + android:layout_width="100dp" + android:layout_height="100dp" + android:background="?android:attr/selectableItemBackgroundBorderless"/> + <View + android:id="@+id/clickable2" + android:translationX="50dp" + android:translationY="10dp" + android:layout_width="150dp" + android:layout_height="100dp" + android:background="?android:attr/selectableItemBackgroundBorderless"/> + </FrameLayout> + </ScrollView> </LinearLayout> diff --git a/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java index 3791d0246f69..d7f4a38f7644 100644 --- a/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java +++ b/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java @@ -140,7 +140,7 @@ public class ActivityManagerPermissionTests extends TestCase { @SmallTest public void testSET_ACTIVITY_WATCHER() { try { - mAm.setActivityController(null); + mAm.setActivityController(null, false); fail("IActivityManager.setActivityController did not throw SecurityException as" + " expected"); } catch (SecurityException e) { diff --git a/tools/aapt2/compile/Png.cpp b/tools/aapt2/compile/Png.cpp index 9837c4efc4d2..bbf7f411d07e 100644 --- a/tools/aapt2/compile/Png.cpp +++ b/tools/aapt2/compile/Png.cpp @@ -1175,7 +1175,7 @@ getout: if (errorMsg) { std::stringstream err; err << "9-patch malformed: " << errorMsg; - if (!errorEdge) { + if (errorEdge) { err << "." << std::endl; if (errorPixel >= 0) { err << "Found at pixel #" << errorPixel << " along " << errorEdge << " edge"; diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py index df76bc9ba4cc..a8a8c5c7236a 100644 --- a/tools/apilint/apilint.py +++ b/tools/apilint/apilint.py @@ -264,6 +264,9 @@ def verify_constants(clazz): if "static" in f.split and "final" in f.split: if re.match("[A-Z0-9_]+", f.name) is None: error(clazz, f, "C2", "Constant field names must be FOO_NAME") + elif f.typ != "java.lang.String": + if f.name.startswith("MIN_") or f.name.startswith("MAX_"): + warn(clazz, f, "C8", "If min/max could change in future, make them dynamic methods") def verify_enums(clazz): @@ -417,6 +420,9 @@ def verify_parcelable(clazz): if len(creator) == 0 or len(write) == 0 or len(describe) == 0: error(clazz, None, "FW3", "Parcelable requires CREATOR, writeToParcel, and describeContents; missing one") + if " final class " not in clazz.raw: + error(clazz, None, "FW8", "Parcelable classes must be final") + def verify_protected(clazz): """Verify that no protected methods or fields are allowed.""" @@ -730,6 +736,13 @@ def verify_exception(clazz): if "throws java.lang.Exception" in m.raw or "throws java.lang.Throwable" in m.raw or "throws java.lang.Error" in m.raw: error(clazz, m, "S1", "Methods must not throw generic exceptions") + if "throws android.os.RemoteException" in m.raw: + if clazz.name == "android.content.ContentProviderClient": continue + if clazz.name == "android.os.Binder": continue + if clazz.name == "android.os.IBinder": continue + + error(clazz, m, "FW9", "Methods calling into system server should rethrow RemoteException as RuntimeException") + def verify_google(clazz): """Verifies that APIs never reference Google.""" @@ -946,6 +959,27 @@ def verify_resource_names(clazz): error(clazz, f, "C7", "Expected resource name in this class to be FooBar_Baz style") +def verify_files(clazz): + """Verifies that methods accepting File also accept streams.""" + + has_file = set() + has_stream = set() + + test = [] + test.extend(clazz.ctors) + test.extend(clazz.methods) + + for m in test: + if "java.io.File" in m.args: + has_file.add(m) + if "java.io.FileDescriptor" in m.args or "android.os.ParcelFileDescriptor" in m.args or "java.io.InputStream" in m.args or "java.io.OutputStream" in m.args: + has_stream.add(m.name) + + for m in has_file: + if m.name not in has_stream: + warn(clazz, m, "M10", "Methods accepting File should also accept FileDescriptor or streams") + + def examine_clazz(clazz): """Find all style issues in the given class.""" if clazz.pkg.name.startswith("java"): return @@ -954,6 +988,7 @@ def examine_clazz(clazz): if clazz.pkg.name.startswith("org.xml"): return if clazz.pkg.name.startswith("org.json"): return if clazz.pkg.name.startswith("org.w3c"): return + if clazz.pkg.name.startswith("android.icu."): return verify_constants(clazz) verify_enums(clazz) @@ -989,6 +1024,7 @@ def examine_clazz(clazz): verify_context_first(clazz) verify_listener_last(clazz) verify_resource_names(clazz) + verify_files(clazz) def examine_stream(stream): diff --git a/tools/layoutlib/.idea/libraries/junit.xml b/tools/layoutlib/.idea/libraries/junit.xml new file mode 100644 index 000000000000..c889f5ff6c97 --- /dev/null +++ b/tools/layoutlib/.idea/libraries/junit.xml @@ -0,0 +1,11 @@ +<component name="libraryTable"> + <library name="junit"> + <CLASSES> + <root url="jar://$PROJECT_DIR$/../../../../out/host/common/obj/JAVA_LIBRARIES/junit_intermediates/javalib.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="file://$PROJECT_DIR$/../../../../external/junit/src" /> + </SOURCES> + </library> +</component>
\ No newline at end of file diff --git a/tools/layoutlib/.idea/runConfigurations/Create.xml b/tools/layoutlib/.idea/runConfigurations/Create.xml index 58f057ac7289..fb798b6e6dab 100644 --- a/tools/layoutlib/.idea/runConfigurations/Create.xml +++ b/tools/layoutlib/.idea/runConfigurations/Create.xml @@ -2,7 +2,7 @@ <configuration default="false" name="Create" type="Application" factoryName="Application" singleton="true"> <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> <option name="MAIN_CLASS_NAME" value="com.android.tools.layoutlib.create.Main" /> - <option name="VM_PARAMETERS" value="" /> + <option name="VM_PARAMETERS" value="-ea" /> <option name="PROGRAM_PARAMETERS" value="out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/classes.jar out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar out/target/common/obj/JAVA_LIBRARIES/icu4j-icudata-jarjar_intermediates/classes.jar out/target/common/obj/JAVA_LIBRARIES/icu4j-icutzdata-jarjar_intermediates/classes.jar out/target/common/obj/JAVA_LIBRARIES/ext_intermediates/classes.jar out/target/common/obj/JAVA_LIBRARIES/ext_intermediates/javalib.jar" /> <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/../../../../" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> diff --git a/tools/layoutlib/bridge/bridge.iml b/tools/layoutlib/bridge/bridge.iml index ccc10b325b77..57d08cb22c7e 100644 --- a/tools/layoutlib/bridge/bridge.iml +++ b/tools/layoutlib/bridge/bridge.iml @@ -84,6 +84,6 @@ </SOURCES> </library> </orderEntry> - <orderEntry type="library" scope="TEST" name="JUnit4" level="application" /> + <orderEntry type="library" scope="TEST" name="junit" level="project" /> </component> </module>
\ No newline at end of file diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index fcfbad2743ed..85e26103fbf5 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -24,7 +24,6 @@ import android.content.IntentFilter; import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; -import android.content.pm.ContainerEncryptionParams; import android.content.pm.EphemeralApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IPackageDataObserver; @@ -43,7 +42,6 @@ import android.content.pm.PermissionInfo; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; -import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.res.Resources; import android.content.res.XmlResourceParser; @@ -555,40 +553,11 @@ public class BridgePackageManager extends PackageManager { } @Override - public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, - int flags, String installerPackageName, Uri verificationURI, - ContainerEncryptionParams encryptionParams) { - } - - @Override - public void installPackageWithVerificationAndEncryption(Uri packageURI, - IPackageInstallObserver observer, int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) { - } - - @Override public void installPackage(Uri packageURI, PackageInstallObserver observer, int flags, String installerPackageName) { } @Override - public void installPackageAsUser(Uri packageURI, PackageInstallObserver observer,int flags, - String installerPackageName, int userId) { - } - - @Override - public void installPackageWithVerification(Uri packageURI, PackageInstallObserver observer, - int flags, String installerPackageName, Uri verificationURI, - ContainerEncryptionParams encryptionParams) { - } - - @Override - public void installPackageWithVerificationAndEncryption(Uri packageURI, - PackageInstallObserver observer, int flags, String installerPackageName, - VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) { - } - - @Override public int installExistingPackage(String packageName) throws NameNotFoundException { return 0; } diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java index 6b23da71861a..27260421a938 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java @@ -335,7 +335,7 @@ public class Main { .setNavigation(Navigation.NONAV); SessionParams params = getSessionParams(parser, customConfigGenerator, - layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", false, + layoutLibCallback, "Theme.Material.Light.NoActionBar.Fullscreen", false, RenderingMode.V_SCROLL, 22); renderAndVerify(params, "expand_vert_layout.png"); @@ -348,7 +348,7 @@ public class Main { parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + "expand_horz_layout.xml"); params = getSessionParams(parser, customConfigGenerator, - layoutLibCallback, "Theme.Material.NoActionBar.Fullscreen", false, + layoutLibCallback, "Theme.Material.Light.NoActionBar.Fullscreen", false, RenderingMode.H_SCROLL, 22); renderAndVerify(params, "expand_horz_layout.png"); diff --git a/tools/layoutlib/create/create.iml b/tools/layoutlib/create/create.iml index b2b14b4e8a91..368b46bc92dc 100644 --- a/tools/layoutlib/create/create.iml +++ b/tools/layoutlib/create/create.iml @@ -22,6 +22,6 @@ </SOURCES> </library> </orderEntry> - <orderEntry type="library" scope="TEST" name="JUnit4" level="application" /> + <orderEntry type="library" scope="TEST" name="junit" level="project" /> </component> </module>
\ No newline at end of file diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java index 0912fb1e105c..afaa3997adf7 100644 --- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java @@ -53,12 +53,10 @@ public class DelegateClassAdapterTest { private MockLog mLog; - private static final String NATIVE_CLASS_NAME = ClassWithNative.class.getCanonicalName(); - private static final String OUTER_CLASS_NAME = OuterClass.class.getCanonicalName(); - private static final String INNER_CLASS_NAME = OuterClass.class.getCanonicalName() + "$" + - InnerClass.class.getSimpleName(); - private static final String STATIC_INNER_CLASS_NAME = - OuterClass.class.getCanonicalName() + "$" + StaticInnerClass.class.getSimpleName(); + private static final String NATIVE_CLASS_NAME = ClassWithNative.class.getName(); + private static final String OUTER_CLASS_NAME = OuterClass.class.getName(); + private static final String INNER_CLASS_NAME = InnerClass.class.getName(); + private static final String STATIC_INNER_CLASS_NAME = StaticInnerClass.class.getName(); @Before public void setUp() throws Exception { @@ -69,12 +67,12 @@ public class DelegateClassAdapterTest { /** * Tests that a class not being modified still works. */ - @SuppressWarnings("unchecked") @Test public void testNoOp() throws Throwable { // create an instance of the class that will be modified // (load the class in a distinct class loader so that we can trash its definition later) ClassLoader cl1 = new ClassLoader(this.getClass().getClassLoader()) { }; + @SuppressWarnings("unchecked") Class<ClassWithNative> clazz1 = (Class<ClassWithNative>) cl1.loadClass(NATIVE_CLASS_NAME); ClassWithNative instance1 = clazz1.newInstance(); assertEquals(42, instance1.add(20, 22)); diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/StubMethodAdapterTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/StubMethodAdapterTest.java new file mode 100644 index 000000000000..3db3e2364eec --- /dev/null +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/StubMethodAdapterTest.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.tools.layoutlib.create; + +import com.android.tools.layoutlib.create.dataclass.StubClass; + +import org.junit.Assert; +import org.junit.Test; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; + +import java.lang.reflect.Method; +import java.util.function.BiPredicate; +import java.util.function.Consumer; + +import static org.junit.Assert.*; + +public class StubMethodAdapterTest { + + private static final String STUB_CLASS_NAME = StubClass.class.getName(); + + /** + * Load a dummy class, stub one of its method and ensure that the modified class works as + * intended. + */ + @Test + public void testBoolean() throws Exception { + final String methodName = "returnTrue"; + // First don't change the method and assert that it returns true + testBoolean((name, type) -> false, Assert::assertTrue, methodName); + // Change the method now and assert that it returns false. + testBoolean((name, type) -> methodName.equals(name) && + Type.BOOLEAN_TYPE.equals(type.getReturnType()), Assert::assertFalse, methodName); + } + + /** + * @param methodPredicate tests if the method should be replaced + */ + private void testBoolean(BiPredicate<String, Type> methodPredicate, Consumer<Boolean> assertion, + String methodName) throws Exception { + ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); + // Always rename the class to avoid conflict with the original class. + String newClassName = STUB_CLASS_NAME + '_'; + new ClassReader(STUB_CLASS_NAME).accept( + new ClassAdapter(newClassName, writer, methodPredicate), 0); + MyClassLoader myClassLoader = new MyClassLoader(newClassName, writer.toByteArray()); + Class<?> aClass = myClassLoader.loadClass(newClassName); + assertTrue("StubClass not loaded by the classloader. Likely a bug in the test.", + myClassLoader.findClassCalled); + Method method = aClass.getMethod(methodName); + Object o = aClass.newInstance(); + assertion.accept((Boolean) method.invoke(o)); + } + + private static class ClassAdapter extends ClassVisitor { + + private final String mClassName; + private final BiPredicate<String, Type> mMethodPredicate; + + private ClassAdapter(String className, ClassVisitor cv, + BiPredicate<String, Type> methodPredicate) { + super(Main.ASM_VERSION, cv); + mClassName = className.replace('.', '/'); + mMethodPredicate = methodPredicate; + } + + @Override + public void visit(int version, int access, String name, String signature, String superName, + String[] interfaces) { + super.visit(version, access, mClassName, signature, superName, + interfaces); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, + String[] exceptions) { + // Copied partly from + // com.android.tools.layoutlib.create.DelegateClassAdapter.visitMethod() + // but not generating the _Original method. + boolean isStatic = (access & Opcodes.ACC_STATIC) != 0; + boolean isNative = (access & Opcodes.ACC_NATIVE) != 0; + MethodVisitor originalMethod = + super.visitMethod(access, name, desc, signature, exceptions); + Type descriptor = Type.getMethodType(desc); + if (mMethodPredicate.test(name, descriptor)) { + String methodSignature = mClassName + "#" + name; + String invokeSignature = methodSignature + desc; + return new StubMethodAdapter(originalMethod, name, descriptor.getReturnType(), + invokeSignature, isStatic, isNative); + } + return originalMethod; + } + } + + private static class MyClassLoader extends ClassLoader { + private final String mName; + private final byte[] mBytes; + private boolean findClassCalled; + + private MyClassLoader(String name, byte[] bytes) { + mName = name; + mBytes = bytes; + } + + @Override + protected Class<?> findClass(String name) throws ClassNotFoundException { + if (name.equals(mName)) { + findClassCalled = true; + return defineClass(name, mBytes, 0, mBytes.length); + } + return super.findClass(name); + } + } +} diff --git a/core/java/android/content/pm/VerificationParams.aidl b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/StubClass.java index 5bb7f6962fe8..3ae8e47de6e3 100644 --- a/core/java/android/content/pm/VerificationParams.aidl +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/StubClass.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Android Open Source Project + * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, @@ -14,6 +14,17 @@ * limitations under the License. */ -package android.content.pm; +package com.android.tools.layoutlib.create.dataclass; -parcelable VerificationParams; +import com.android.tools.layoutlib.create.StubMethodAdapterTest; + +/** + * Used by {@link StubMethodAdapterTest} + */ +@SuppressWarnings("unused") +public class StubClass { + + public boolean returnTrue() { + return true; + } +} diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index 59416b83dda1..13abaff8cdfe 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -300,7 +300,7 @@ public class RttManager { try { mRttCapabilities = mService.getRttCapabilities(); } catch (RemoteException e) { - Log.e(TAG, "Can not get RTT Capabilities"); + throw e.rethrowFromSystemServer(); } } return mRttCapabilities; @@ -1132,7 +1132,7 @@ public class RttManager { Log.d(TAG, "Get the messenger from " + mService); messenger = mService.getMessenger(); } catch (RemoteException e) { - /* do nothing */ + throw e.rethrowFromSystemServer(); } catch (SecurityException e) { /* do nothing */ } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 4921073cce6c..e2dd11121c17 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -39,9 +39,9 @@ import android.os.WorkSource; import android.util.Log; import android.util.SparseArray; -import com.android.internal.annotations.GuardedBy; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; +import com.android.server.net.NetworkPinner; import java.net.InetAddress; import java.util.ArrayList; @@ -678,11 +678,6 @@ public class WifiManager { 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 @@ -723,8 +718,7 @@ public class WifiManager { try { return mService.getConfiguredNetworks(); } catch (RemoteException e) { - Log.w(TAG, "Caught RemoteException trying to get configured networks: " + e); - return null; + throw e.rethrowFromSystemServer(); } } @@ -734,7 +728,7 @@ public class WifiManager { try { return mService.getPrivilegedConfiguredNetworks(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -744,7 +738,7 @@ public class WifiManager { try { return mService.getConnectionStatistics(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -758,7 +752,7 @@ public class WifiManager { try { return mService.getMatchingWifiConfig(scanResult); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -818,7 +812,7 @@ public class WifiManager { try { return mService.addOrUpdateNetwork(config); } catch (RemoteException e) { - return -1; + throw e.rethrowFromSystemServer(); } } @@ -832,7 +826,7 @@ public class WifiManager { try { return mService.addPasspointManagementObject(mo); } catch (RemoteException e) { - return -1; + throw e.rethrowFromSystemServer(); } } @@ -848,7 +842,7 @@ public class WifiManager { try { return mService.modifyPasspointManagementObject(fqdn, mos); } catch (RemoteException e) { - return -1; + throw e.rethrowFromSystemServer(); } } @@ -862,6 +856,7 @@ public class WifiManager { try { mService.queryPasspointIcon(bssid, fileName); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -875,7 +870,7 @@ public class WifiManager { try { return mService.matchProviderWithCurrentNetwork(fqdn); } catch (RemoteException e) { - return -1; + throw e.rethrowFromSystemServer(); } } @@ -889,6 +884,7 @@ public class WifiManager { try { mService.deauthenticateNetwork(holdoff, ess); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -922,7 +918,7 @@ public class WifiManager { try { return mService.removeNetwork(netId); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -955,18 +951,22 @@ public class WifiManager { public boolean enableNetwork(int netId, boolean disableOthers) { final boolean pin = disableOthers && mTargetSdkVersion < Build.VERSION_CODES.LOLLIPOP; if (pin) { - registerPinningNetworkCallback(); + NetworkRequest request = new NetworkRequest.Builder() + .clearCapabilities() + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .build(); + NetworkPinner.pin(mContext, request); } boolean success; try { success = mService.enableNetwork(netId, disableOthers); } catch (RemoteException e) { - success = false; + throw e.rethrowFromSystemServer(); } if (pin && !success) { - unregisterPinningNetworkCallback(); + NetworkPinner.unpin(); } return success; @@ -983,7 +983,7 @@ public class WifiManager { try { return mService.disableNetwork(netId); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -997,7 +997,7 @@ public class WifiManager { mService.disconnect(); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1012,7 +1012,7 @@ public class WifiManager { mService.reconnect(); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1027,7 +1027,7 @@ public class WifiManager { mService.reassociate(); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1042,7 +1042,7 @@ public class WifiManager { try { return mService.pingSupplicant(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1090,7 +1090,7 @@ public class WifiManager { try { return mService.getSupportedFeatures(); } catch (RemoteException e) { - return 0; + throw e.rethrowFromSystemServer(); } } @@ -1216,9 +1216,8 @@ public class WifiManager { return mService.reportActivityInfo(); } } catch (RemoteException e) { - Log.e(TAG, "getControllerActivityEnergyInfo: " + e); + throw e.rethrowFromSystemServer(); } - return null; } /** @@ -1232,7 +1231,7 @@ public class WifiManager { mService.startScan(null, null); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1243,7 +1242,7 @@ public class WifiManager { mService.startScan(null, workSource); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1299,7 +1298,7 @@ public class WifiManager { try { return mService.getWpsNfcConfigurationToken(netId); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1311,7 +1310,7 @@ public class WifiManager { try { return mService.getConnectionInfo(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1328,7 +1327,7 @@ public class WifiManager { try { return mService.getScanResults(mContext.getOpPackageName()); } catch (RemoteException e) { - return new ArrayList<ScanResult>(); + throw e.rethrowFromSystemServer(); } } @@ -1344,7 +1343,7 @@ public class WifiManager { try { return mService.isScanAlwaysAvailable(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1361,7 +1360,7 @@ public class WifiManager { try { return mService.saveConfiguration(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1375,7 +1374,9 @@ public class WifiManager { public void setCountryCode(String country, boolean persist) { try { mService.setCountryCode(country, persist); - } catch (RemoteException e) { } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -1387,9 +1388,9 @@ public class WifiManager { public String getCountryCode() { try { String country = mService.getCountryCode(); - return(country); + return country; } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1405,7 +1406,9 @@ public class WifiManager { public void setFrequencyBand(int band, boolean persist) { try { mService.setFrequencyBand(band, persist); - } catch (RemoteException e) { } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** @@ -1421,7 +1424,7 @@ public class WifiManager { try { return mService.getFrequencyBand(); } catch (RemoteException e) { - return -1; + throw e.rethrowFromSystemServer(); } } @@ -1434,7 +1437,7 @@ public class WifiManager { try { return mService.isDualBandSupported(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1447,7 +1450,7 @@ public class WifiManager { try { return mService.getDhcpInfo(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1461,7 +1464,7 @@ public class WifiManager { try { return mService.setWifiEnabled(enabled); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1476,7 +1479,7 @@ public class WifiManager { try { return mService.getWifiEnabledState(); } catch (RemoteException e) { - return WIFI_STATE_UNKNOWN; + throw e.rethrowFromSystemServer(); } } @@ -1553,7 +1556,7 @@ public class WifiManager { mService.setWifiApEnabled(wifiConfig, enabled); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1571,7 +1574,7 @@ public class WifiManager { try { return mService.getWifiApEnabledState(); } catch (RemoteException e) { - return WIFI_AP_STATE_FAILED; + throw e.rethrowFromSystemServer(); } } @@ -1598,7 +1601,7 @@ public class WifiManager { try { return mService.getWifiApConfiguration(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1612,8 +1615,7 @@ public class WifiManager { try { return mService.buildWifiConfig(uriString, mimeType, data); } catch (RemoteException e) { - Log.w(TAG, "Caught RemoteException trying to build wifi config: " + e); - return null; + throw e.rethrowFromSystemServer(); } } @@ -1629,7 +1631,7 @@ public class WifiManager { mService.setWifiApConfiguration(wifiConfig); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1646,7 +1648,7 @@ public class WifiManager { mService.addToBlacklist(bssid); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1663,7 +1665,7 @@ public class WifiManager { mService.clearBlacklist(); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -1692,7 +1694,7 @@ public class WifiManager { try { mService.enableTdls(remoteIPAddress.getHostAddress(), enable); } catch (RemoteException e) { - // Just ignore the exception + throw e.rethrowFromSystemServer(); } } @@ -1706,7 +1708,7 @@ public class WifiManager { try { mService.enableTdlsWithMacAddress(remoteMacAddress, enable); } catch (RemoteException e) { - // Just ignore the exception + throw e.rethrowFromSystemServer(); } } @@ -2012,100 +2014,6 @@ public class WifiManager { "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(); - try { - sCM.registerNetworkCallback(request, mNetworkCallback); - } catch (SecurityException e) { - Log.d(TAG, "Failed to register network callback", e); - } - } - } - } - - private void unregisterPinningNetworkCallback() { - initConnectivityManager(); - synchronized (sCM) { - if (mNetworkCallback != null) { - try { - sCM.unregisterNetworkCallback(mNetworkCallback); - } catch (SecurityException e) { - Log.d(TAG, "Failed to unregister network callback", e); - } - mNetworkCallback = null; - } - } - } - /** * Connect to a network with the given configuration. The network also * gets added to the supplicant configuration. @@ -2219,6 +2127,7 @@ public class WifiManager { try { mService.disableEphemeralNetwork(SSID); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -2259,7 +2168,7 @@ public class WifiManager { try { return mService.getWifiServiceMessenger(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } catch (SecurityException e) { return null; } @@ -2274,7 +2183,7 @@ public class WifiManager { try { return mService.getConfigFile(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -2340,7 +2249,8 @@ public class WifiManager { } mActiveLockCount++; } - } catch (RemoteException ignore) { + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } mHeld = true; } @@ -2367,7 +2277,8 @@ public class WifiManager { synchronized (WifiManager.this) { mActiveLockCount--; } - } catch (RemoteException ignore) { + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } mHeld = false; } @@ -2427,6 +2338,7 @@ public class WifiManager { try { mService.updateWifiLockWorkSource(mBinder, mWorkSource); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } } @@ -2456,7 +2368,8 @@ public class WifiManager { synchronized (WifiManager.this) { mActiveLockCount--; } - } catch (RemoteException ignore) { + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } } @@ -2572,7 +2485,8 @@ public class WifiManager { } mActiveLockCount++; } - } catch (RemoteException ignore) { + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } mHeld = true; } @@ -2611,7 +2525,8 @@ public class WifiManager { synchronized (WifiManager.this) { mActiveLockCount--; } - } catch (RemoteException ignore) { + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } mHeld = false; } @@ -2685,7 +2600,7 @@ public class WifiManager { try { return mService.isMulticastEnabled(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -2698,7 +2613,7 @@ public class WifiManager { mService.initializeMulticastFiltering(); return true; } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -2736,7 +2651,7 @@ public class WifiManager { try { return mService.getVerboseLoggingLevel(); } catch (RemoteException e) { - return 0; + throw e.rethrowFromSystemServer(); } } @@ -2748,7 +2663,7 @@ public class WifiManager { try { mService.enableAggressiveHandover(enabled); } catch (RemoteException e) { - + throw e.rethrowFromSystemServer(); } } @@ -2761,7 +2676,7 @@ public class WifiManager { try { return mService.getAggressiveHandover(); } catch (RemoteException e) { - return 0; + throw e.rethrowFromSystemServer(); } } @@ -2773,7 +2688,7 @@ public class WifiManager { try { mService.setAllowScansWithTraffic(enabled); } catch (RemoteException e) { - + throw e.rethrowFromSystemServer(); } } @@ -2785,7 +2700,7 @@ public class WifiManager { try { return mService.getAllowScansWithTraffic(); } catch (RemoteException e) { - return 0; + throw e.rethrowFromSystemServer(); } } @@ -2798,6 +2713,7 @@ public class WifiManager { try { mService.factoryReset(); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -2810,7 +2726,7 @@ public class WifiManager { try { return mService.getCurrentNetwork(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -2824,7 +2740,7 @@ public class WifiManager { try { return mService.enableAutoJoinWhenAssociated(enabled); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } @@ -2836,7 +2752,7 @@ public class WifiManager { try { return mService.getEnableAutoJoinWhenAssociated(); } catch (RemoteException e) { - return false; + throw e.rethrowFromSystemServer(); } } /** @@ -2847,7 +2763,7 @@ public class WifiManager { try { mService.setHalBasedAutojoinOffload(enabled); } catch (RemoteException e) { - + throw e.rethrowFromSystemServer(); } } @@ -2859,7 +2775,7 @@ public class WifiManager { try { return mService.getHalBasedAutojoinOffload(); } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - return 0; } } diff --git a/wifi/java/android/net/wifi/nan/WifiNanManager.java b/wifi/java/android/net/wifi/nan/WifiNanManager.java index 667c4b1de6d0..1b78bebfbba7 100644 --- a/wifi/java/android/net/wifi/nan/WifiNanManager.java +++ b/wifi/java/android/net/wifi/nan/WifiNanManager.java @@ -75,7 +75,7 @@ public class WifiNanManager { } mService.connect(mBinder, listener.callback, events); } catch (RemoteException e) { - Log.w(TAG, "connect RemoteException (FYI - ignoring): " + e); + throw e.rethrowFromSystemServer(); } } @@ -94,7 +94,7 @@ public class WifiNanManager { mService.disconnect(mBinder); mBinder = null; } catch (RemoteException e) { - Log.w(TAG, "disconnect RemoteException (FYI - ignoring): " + e); + throw e.rethrowFromSystemServer(); } } @@ -116,7 +116,7 @@ public class WifiNanManager { try { mService.requestConfig(configRequest); } catch (RemoteException e) { - Log.w(TAG, "requestConfig RemoteException (FYI - ignoring): " + e); + throw e.rethrowFromSystemServer(); } } @@ -173,8 +173,7 @@ public class WifiNanManager { if (DBG) Log.d(TAG, "publish: session created - sessionId=" + sessionId); mService.publish(sessionId, publishData, publishSettings); } catch (RemoteException e) { - Log.w(TAG, "createSession/publish RemoteException: " + e); - return null; + throw e.rethrowFromSystemServer(); } return new WifiNanPublishSession(this, sessionId); @@ -200,7 +199,7 @@ public class WifiNanManager { try { mService.publish(sessionId, publishData, publishSettings); } catch (RemoteException e) { - Log.w(TAG, "publish RemoteException: " + e); + throw e.rethrowFromSystemServer(); } } /** @@ -256,8 +255,7 @@ public class WifiNanManager { if (DBG) Log.d(TAG, "subscribe: session created - sessionId=" + sessionId); mService.subscribe(sessionId, subscribeData, subscribeSettings); } catch (RemoteException e) { - Log.w(TAG, "createSession/subscribe RemoteException: " + e); - return null; + throw e.rethrowFromSystemServer(); } return new WifiNanSubscribeSession(this, sessionId); @@ -286,7 +284,7 @@ public class WifiNanManager { try { mService.subscribe(sessionId, subscribeData, subscribeSettings); } catch (RemoteException e) { - Log.w(TAG, "subscribe RemoteException: " + e); + throw e.rethrowFromSystemServer(); } } @@ -299,7 +297,7 @@ public class WifiNanManager { try { mService.stopSession(sessionId); } catch (RemoteException e) { - Log.w(TAG, "stopSession RemoteException (FYI - ignoring): " + e); + throw e.rethrowFromSystemServer(); } } @@ -312,7 +310,7 @@ public class WifiNanManager { try { mService.destroySession(sessionId); } catch (RemoteException e) { - Log.w(TAG, "destroySession RemoteException (FYI - ignoring): " + e); + throw e.rethrowFromSystemServer(); } } @@ -328,7 +326,7 @@ public class WifiNanManager { } mService.sendMessage(sessionId, peerId, message, messageLength, messageId); } catch (RemoteException e) { - Log.w(TAG, "subscribe RemoteException (FYI - ignoring): " + e); + throw e.rethrowFromSystemServer(); } } } diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java index 6409450358f6..8d5cf6319d24 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java @@ -1362,8 +1362,8 @@ public class WifiP2pManager { public void setMiracastMode(int mode) { try { mService.setMiracastMode(mode); - } catch(RemoteException e) { - // ignore + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } @@ -1378,7 +1378,7 @@ public class WifiP2pManager { try { return mService.getMessenger(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } @@ -1393,7 +1393,7 @@ public class WifiP2pManager { try { return mService.getP2pStateMachineMessenger(); } catch (RemoteException e) { - return null; + throw e.rethrowFromSystemServer(); } } |