diff options
575 files changed, 7172 insertions, 3018 deletions
diff --git a/Android.mk b/Android.mk index 0bd6b7f925d2..165aed91b0d9 100644 --- a/Android.mk +++ b/Android.mk @@ -117,6 +117,7 @@ LOCAL_SRC_FILES += \ core/java/android/bluetooth/IBluetoothManager.aidl \ core/java/android/bluetooth/IBluetoothManagerCallback.aidl \ core/java/android/bluetooth/IBluetoothPbap.aidl \ + core/java/android/bluetooth/IBluetoothPbapClient.aidl \ core/java/android/bluetooth/IBluetoothMap.aidl \ core/java/android/bluetooth/IBluetoothSap.aidl \ core/java/android/bluetooth/IBluetoothStateChangeCallback.aidl \ diff --git a/api/current.txt b/api/current.txt index c04debfe209e..27d53fd139f4 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3442,7 +3442,7 @@ package android.app { method public android.view.View getCurrentFocus(); method public android.app.FragmentManager getFragmentManager(); method public android.content.Intent getIntent(); - method public deprecated java.lang.Object getLastNonConfigurationInstance(); + method public java.lang.Object getLastNonConfigurationInstance(); method public android.view.LayoutInflater getLayoutInflater(); method public android.app.LoaderManager getLoaderManager(); method public java.lang.String getLocalClassName(); @@ -3543,7 +3543,7 @@ package android.app { method protected void onRestoreInstanceState(android.os.Bundle); method public void onRestoreInstanceState(android.os.Bundle, android.os.PersistableBundle); method protected void onResume(); - method public deprecated java.lang.Object onRetainNonConfigurationInstance(); + method public java.lang.Object onRetainNonConfigurationInstance(); method protected void onSaveInstanceState(android.os.Bundle); method public void onSaveInstanceState(android.os.Bundle, android.os.PersistableBundle); method public boolean onSearchRequested(android.view.SearchEvent); @@ -10117,7 +10117,6 @@ package android.content.res { method public static deprecated android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public int describeContents(); - method public int getChangingConfigurations(); method public int getColorForState(int[], int); method public int getDefaultColor(); method public boolean isOpaque(); @@ -10129,6 +10128,7 @@ package android.content.res { public abstract class ComplexColor { ctor public ComplexColor(); + method public int getChangingConfigurations(); method public abstract int getDefaultColor(); method public boolean isStateful(); } @@ -11476,17 +11476,6 @@ package android.gesture { package android.graphics { - public deprecated class AvoidXfermode extends android.graphics.Xfermode { - ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode); - } - - public static final class AvoidXfermode.Mode extends java.lang.Enum { - method public static android.graphics.AvoidXfermode.Mode valueOf(java.lang.String); - method public static final android.graphics.AvoidXfermode.Mode[] values(); - enum_constant public static final android.graphics.AvoidXfermode.Mode AVOID; - enum_constant public static final android.graphics.AvoidXfermode.Mode TARGET; - } - public final class Bitmap implements android.os.Parcelable { method public boolean compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream); method public android.graphics.Bitmap copy(android.graphics.Bitmap.Config, boolean); @@ -12353,10 +12342,6 @@ package android.graphics { field public int bytesPerPixel; } - public deprecated class PixelXorXfermode extends android.graphics.Xfermode { - ctor public PixelXorXfermode(int); - } - public class Point implements android.os.Parcelable { ctor public Point(); ctor public Point(int, int); @@ -13036,9 +13021,9 @@ package android.graphics.drawable { method public void setPaddingMode(int); method public void setPaddingRelative(int, int, int, int); method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable); + field public static final int INSET_UNDEFINED = -2147483648; // 0x80000000 field public static final int PADDING_MODE_NEST = 0; // 0x0 field public static final int PADDING_MODE_STACK = 1; // 0x1 - field public static final int UNDEFINED_INSET = -2147483648; // 0x80000000 } public class LevelListDrawable extends android.graphics.drawable.DrawableContainer { @@ -23105,6 +23090,7 @@ package android.media.tv { method public void notifyError(int); method public void notifyRecordingStopped(android.net.Uri); 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); method public abstract void onStopRecording(); @@ -23122,6 +23108,7 @@ package android.media.tv { method public void notifyTracksChanged(java.util.List<android.media.tv.TvTrackInfo>); method public void notifyVideoAvailable(); method public void notifyVideoUnavailable(int); + method public void onAppPrivateCommand(java.lang.String, android.os.Bundle); method public android.view.View onCreateOverlayView(); method public boolean onGenericMotionEvent(android.view.MotionEvent); method public boolean onKeyDown(int, android.view.KeyEvent); @@ -23153,6 +23140,7 @@ package android.media.tv { public class TvRecordingClient { ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler); method public void release(); + method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle); method public void startRecording(android.net.Uri); method public void stopRecording(); method public void tune(java.lang.String, android.net.Uri); @@ -23214,6 +23202,7 @@ package android.media.tv { method public boolean onUnhandledInputEvent(android.view.InputEvent); method public void reset(); method public void selectTrack(int, java.lang.String); + method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle); method public void setCallback(android.media.tv.TvView.TvInputCallback); method public void setCaptionEnabled(boolean); method public void setOnUnhandledInputEventListener(android.media.tv.TvView.OnUnhandledInputEventListener); @@ -30763,6 +30752,7 @@ package android.provider { public static class CallLog.Calls implements android.provider.BaseColumns { ctor public CallLog.Calls(); method public static java.lang.String getLastOutgoingCall(android.content.Context); + field public static final int ANSWERED_EXTERNALLY_TYPE = 7; // 0x7 field public static final int BLOCKED_TYPE = 6; // 0x6 field public static final java.lang.String CACHED_FORMATTED_NUMBER = "formatted_number"; field public static final java.lang.String CACHED_LOOKUP_URI = "lookup_uri"; @@ -30785,6 +30775,7 @@ package android.provider { field public static final java.lang.String DURATION = "duration"; field public static final java.lang.String EXTRA_CALL_TYPE_FILTER = "android.provider.extra.CALL_TYPE_FILTER"; field public static final java.lang.String FEATURES = "features"; + field public static final int FEATURES_PULLED_EXTERNALLY = 2; // 0x2 field public static final int FEATURES_VIDEO = 1; // 0x1 field public static final java.lang.String GEOCODED_LOCATION = "geocoded_location"; field public static final int INCOMING_TYPE = 1; // 0x1 @@ -32428,7 +32419,6 @@ package android.provider { field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS"; field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS"; field public static final java.lang.String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"; - field public static final java.lang.String ACTION_SCREEN_READER_TUTORIAL = "android.settings.SCREEN_READER_TUTORIAL"; field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS"; field public static final java.lang.String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS"; field public static final java.lang.String ACTION_SETTINGS = "android.settings.SETTINGS"; @@ -36059,9 +36049,11 @@ package android.telecom { method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean); method public void playDtmfTone(char); method public void postDialContinue(boolean); + method public void pullExternalCall(); method public void registerCallback(android.telecom.Call.Callback); method public void registerCallback(android.telecom.Call.Callback, android.os.Handler); method public void reject(boolean, java.lang.String); + method public void sendCallEvent(java.lang.String, android.os.Bundle); method public void splitFromConference(); method public void stopDtmfTone(); method public void swapConference(); @@ -36075,6 +36067,7 @@ package android.telecom { field public static final int STATE_DISCONNECTING = 10; // 0xa field public static final int STATE_HOLDING = 3; // 0x3 field public static final int STATE_NEW = 0; // 0x0 + field public static final int STATE_PULLING_CALL = 11; // 0xb field public static final int STATE_RINGING = 2; // 0x2 field public static final int STATE_SELECT_PHONE_ACCOUNT = 8; // 0x8 } @@ -36085,6 +36078,7 @@ package android.telecom { method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>); method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>); method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>); + method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details); method public void onParentChanged(android.telecom.Call, android.telecom.Call); method public void onPostDialWait(android.telecom.Call, java.lang.String); @@ -36115,6 +36109,7 @@ package android.telecom { method public static java.lang.String propertiesToString(int); field public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 4194304; // 0x400000 field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000 + field public static final int CAPABILITY_CAN_PULL_CALL = 8388608; // 0x800000 field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000 field public static final int CAPABILITY_HOLD = 1; // 0x1 field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80 @@ -36134,6 +36129,7 @@ package android.telecom { field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 4; // 0x4 field public static final int PROPERTY_GENERIC_CONFERENCE = 2; // 0x2 field public static final int PROPERTY_HIGH_DEF_AUDIO = 16; // 0x10 + field public static final int PROPERTY_IS_EXTERNAL_CALL = 64; // 0x40 field public static final int PROPERTY_WIFI = 8; // 0x8 field public static final int PROPERTY_WORK_CALL = 32; // 0x20 } @@ -36248,15 +36244,19 @@ package android.telecom { method public void onAnswer(int); method public void onAnswer(); method public void onCallAudioStateChanged(android.telecom.CallAudioState); + method public void onCallEvent(java.lang.String, android.os.Bundle); method public void onDisconnect(); method public void onHold(); method public void onPlayDtmfTone(char); method public void onPostDialContinue(boolean); + method public void onPullExternalCall(); method public void onReject(); + method public void onReject(java.lang.String); method public void onSeparate(); method public void onStateChanged(int); method public void onStopDtmfTone(); method public void onUnhold(); + method public void sendConnectionEvent(java.lang.String, android.os.Bundle); method public final void setActive(); method public final void setAddress(android.net.Uri, int); method public final void setAudioModeIsVoip(boolean); @@ -36280,9 +36280,12 @@ package android.telecom { method public static java.lang.String stateToString(int); field public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 8388608; // 0x800000 field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000 + field public static final int CAPABILITY_CAN_PULL_CALL = 33554432; // 0x2000000 + field public static final int CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION = 4194304; // 0x400000 field public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 524288; // 0x80000 field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000 field public static final int CAPABILITY_HOLD = 1; // 0x1 + field public static final int CAPABILITY_IS_EXTERNAL_CALL = 16777216; // 0x1000000 field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80 field public static final int CAPABILITY_MERGE_CONFERENCE = 4; // 0x4 field public static final int CAPABILITY_MUTE = 64; // 0x40 @@ -36296,6 +36299,7 @@ package android.telecom { field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 2048; // 0x800 field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2 field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 + field public static final java.lang.String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED"; field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; @@ -36305,6 +36309,7 @@ package android.telecom { field public static final int STATE_HOLDING = 5; // 0x5 field public static final int STATE_INITIALIZING = 0; // 0x0 field public static final int STATE_NEW = 1; // 0x1 + field public static final int STATE_PULLING_CALL = 7; // 0x7 field public static final int STATE_RINGING = 2; // 0x2 } @@ -36382,7 +36387,9 @@ package android.telecom { method public java.lang.String getReason(); method public int getTone(); method public void writeToParcel(android.os.Parcel, int); + field public static final int ANSWERED_ELSEWHERE = 11; // 0xb field public static final int BUSY = 7; // 0x7 + field public static final int CALL_PULLED = 12; // 0xc field public static final int CANCELED = 4; // 0x4 field public static final int CONNECTION_MANAGER_NOT_SUPPORTED = 10; // 0xa field public static final android.os.Parcelable.Creator<android.telecom.DisconnectCause> CREATOR; @@ -36418,6 +36425,7 @@ package android.telecom { method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onCallRemoved(android.telecom.Call); method public void onCanAddCallChanged(boolean); + method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public void onSilenceRinger(); method public final void setAudioRoute(int); method public final void setMuted(boolean); @@ -36568,6 +36576,7 @@ package android.telecom { method public boolean isVoipAudioMode(); method public void playDtmfTone(char); method public void postDialContinue(boolean); + method public void pullExternalCall(); method public void registerCallback(android.telecom.RemoteConnection.Callback); method public void registerCallback(android.telecom.RemoteConnection.Callback, android.os.Handler); method public void reject(); @@ -36584,6 +36593,7 @@ package android.telecom { method public void onConferenceChanged(android.telecom.RemoteConnection, android.telecom.RemoteConference); method public void onConferenceableConnectionsChanged(android.telecom.RemoteConnection, java.util.List<android.telecom.RemoteConnection>); method public void onConnectionCapabilitiesChanged(android.telecom.RemoteConnection, int); + method public void onConnectionEvent(android.telecom.RemoteConnection, java.lang.String, android.os.Bundle); method public void onDestroyed(android.telecom.RemoteConnection); method public void onDisconnected(android.telecom.RemoteConnection, android.telecom.DisconnectCause); method public void onExtrasChanged(android.telecom.RemoteConnection, android.os.Bundle); @@ -36681,6 +36691,7 @@ package android.telecom { field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE"; field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; + field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI"; field public static final int PRESENTATION_ALLOWED = 1; // 0x1 @@ -42586,6 +42597,7 @@ package android.view { method public void onStartTemporaryDetach(); method public boolean onTouchEvent(android.view.MotionEvent); method public boolean onTrackballEvent(android.view.MotionEvent); + method public void onVisibilityAggregated(android.view.View, int); method protected void onVisibilityChanged(android.view.View, int); method public void onWindowFocusChanged(boolean); method public void onWindowSystemUiVisibilityChanged(int); @@ -57345,6 +57357,7 @@ package java.util { method public void ensureCapacity(int); method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); + method public boolean removeIf(java.util.function.Predicate<? super E>); method public int size(); method public java.util.Spliterator<E> spliterator(); method public void trimToSize(); @@ -57429,6 +57442,24 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); + method public static void parallelSort(byte[]); + method public static void parallelSort(byte[], int, int); + method public static void parallelSort(char[]); + method public static void parallelSort(char[], int, int); + method public static void parallelSort(short[]); + method public static void parallelSort(short[], int, int); + method public static void parallelSort(int[]); + method public static void parallelSort(int[], int, int); + method public static void parallelSort(long[]); + method public static void parallelSort(long[], int, int); + method public static void parallelSort(float[]); + method public static void parallelSort(float[], int, int); + method public static void parallelSort(double[]); + method public static void parallelSort(double[], int, int); + method public static void parallelSort(T[]); + method public static void parallelSort(T[], int, int); + method public static void parallelSort(T[], java.util.Comparator<? super T>); + method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>); method public static void sort(int[]); method public static void sort(int[], int, int); method public static void sort(long[]); @@ -57616,6 +57647,7 @@ package java.util { method public abstract java.util.Iterator<E> iterator(); method public abstract boolean remove(java.lang.Object); method public abstract boolean removeAll(java.util.Collection<?>); + method public default boolean removeIf(java.util.function.Predicate<? super E>); method public abstract boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public abstract java.lang.Object[] toArray(); @@ -58249,18 +58281,28 @@ package java.util { public abstract interface Map { method public abstract void clear(); + method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public default V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public abstract boolean containsKey(java.lang.Object); 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 default V getOrDefault(java.lang.Object, V); method public abstract int hashCode(); method public abstract boolean isEmpty(); method public abstract java.util.Set<K> keySet(); + method public default V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); method public abstract V put(K, V); method public abstract void putAll(java.util.Map<? extends K, ? extends V>); + method public default V putIfAbsent(K, V); method public abstract V remove(java.lang.Object); + method public default boolean remove(java.lang.Object, java.lang.Object); + method public default boolean replace(K, V, V); + method public default V replace(K, V); + method public default void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public abstract int size(); method public abstract java.util.Collection<V> values(); } @@ -58268,6 +58310,8 @@ package java.util { public static abstract interface Map.Entry { method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -58998,6 +59042,7 @@ package java.util { method public synchronized void removeAllElements(); method public synchronized boolean removeElement(java.lang.Object); method public synchronized void removeElementAt(int); + method public synchronized boolean removeIf(java.util.function.Predicate<? super E>); method public synchronized void setElementAt(E, int); method public synchronized void setSize(int); method public synchronized int size(); @@ -59049,6 +59094,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -59112,6 +59158,78 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } + public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + ctor public CompletableFuture(); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...); + method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...); + method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public boolean cancel(boolean); + method public boolean complete(T); + method public boolean completeExceptionally(java.lang.Throwable); + method public static java.util.concurrent.CompletableFuture<U> completedFuture(U); + method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); + method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public T getNow(T); + method public int getNumberOfDependents(); + method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public boolean isCancelled(); + method public boolean isCompletedExceptionally(); + method public boolean isDone(); + method public T join(); + method public void obtrudeException(java.lang.Throwable); + method public void obtrudeValue(T); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); + method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<T> toCompletableFuture(); + method public java.util.concurrent.CompletableFuture<T> whenComplete(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); + } + + public static abstract interface CompletableFuture.AsynchronousCompletionTask { + } + + public class CompletionException extends java.lang.RuntimeException { + ctor protected CompletionException(); + ctor protected CompletionException(java.lang.String); + ctor public CompletionException(java.lang.String, java.lang.Throwable); + ctor public CompletionException(java.lang.Throwable); + } + public abstract interface CompletionService { method public abstract java.util.concurrent.Future<V> poll(); method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; @@ -59120,20 +59238,130 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException; } + public abstract interface CompletionStage { + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); + method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletableFuture<T> toCompletableFuture(); + method public abstract java.util.concurrent.CompletionStage<T> whenComplete(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); + } + public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>); ctor public ConcurrentHashMap(int, float); ctor public ConcurrentHashMap(int, float, int); + method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public boolean contains(java.lang.Object); method public java.util.Enumeration<V> elements(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); + method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>); + method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>); + method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachKey(long, java.util.function.Consumer<? super K>); + method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachValue(long, java.util.function.Consumer<? super V>); + method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public V getOrDefault(java.lang.Object, V); + method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V); method public java.util.Enumeration<K> keys(); + method public long mappingCount(); + method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); method public V putIfAbsent(K, V); + method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>); + method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator); + method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator); + method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator); + method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>); + method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator); + method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator); + method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator); + method public double reduceToDouble(long, java.util.function.ToDoubleBiFunction<? super K, ? super V>, double, java.util.function.DoubleBinaryOperator); + method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator); + method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator); + method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>); + method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator); + method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator); + method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator); method public boolean remove(java.lang.Object, java.lang.Object); method public boolean replace(K, V, V); method public V replace(K, V); + method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); + method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); + method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>); + method public U searchValues(long, java.util.function.Function<? super V, ? extends U>); + } + + static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + method public final void clear(); + method public abstract boolean contains(java.lang.Object); + method public final boolean containsAll(java.util.Collection<?>); + method public java.util.concurrent.ConcurrentHashMap<K, V> getMap(); + method public final boolean isEmpty(); + method public abstract java.util.Iterator<E> iterator(); + method public abstract boolean remove(java.lang.Object); + method public final boolean removeAll(java.util.Collection<?>); + method public final boolean retainAll(java.util.Collection<?>); + method public final int size(); + method public final java.lang.Object[] toArray(); + method public final T[] toArray(T[]); + method public final java.lang.String toString(); + } + + public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + method public boolean add(K); + method public boolean addAll(java.util.Collection<? extends K>); + method public boolean contains(java.lang.Object); + method public void forEach(java.util.function.Consumer<? super K>); + method public V getMappedValue(); + method public java.util.Iterator<K> iterator(); + method public boolean remove(java.lang.Object); + method public java.util.Spliterator<K> spliterator(); } public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { @@ -59163,6 +59391,7 @@ package java.util.concurrent { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { @@ -59173,6 +59402,7 @@ package java.util.concurrent { method public E peek(); method public E poll(); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public abstract interface ConcurrentMap implements java.util.Map { @@ -59204,6 +59434,9 @@ package java.util.concurrent { method public K ceilingKey(K); method public java.util.concurrent.ConcurrentSkipListMap<K, V> clone(); method public java.util.Comparator<? super K> comparator(); + method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public java.util.NavigableSet<K> descendingKeySet(); method public java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); @@ -59211,6 +59444,8 @@ package java.util.concurrent { 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 V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean); method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K); method public java.util.Map.Entry<K, V> higherEntry(K); @@ -59219,6 +59454,7 @@ package java.util.concurrent { method public K lastKey(); method public java.util.Map.Entry<K, V> lowerEntry(K); method public K lowerKey(K); + method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); method public java.util.NavigableSet<K> navigableKeySet(); method public java.util.Map.Entry<K, V> pollFirstEntry(); method public java.util.Map.Entry<K, V> pollLastEntry(); @@ -59226,6 +59462,7 @@ package java.util.concurrent { method public boolean remove(java.lang.Object, java.lang.Object); method public boolean replace(K, V, V); method public V replace(K, V); + method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, boolean, K, boolean); method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, K); method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K, boolean); @@ -59253,6 +59490,7 @@ package java.util.concurrent { method public E pollFirst(); method public E pollLast(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean); method public java.util.NavigableSet<E> subSet(E, E); method public java.util.NavigableSet<E> tailSet(E, boolean); @@ -59296,8 +59534,11 @@ package java.util.concurrent { public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>); + method public void forEach(java.util.function.Consumer<? super E>); method public java.util.Iterator<E> iterator(); + method public boolean removeIf(java.util.function.Predicate<? super E>); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class CountDownLatch { @@ -59308,6 +59549,32 @@ package java.util.concurrent { method public long getCount(); } + public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int); + ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>); + ctor protected CountedCompleter(); + method public final void addToPendingCount(int); + method public final boolean compareAndSetPendingCount(int, int); + method public void complete(T); + method public abstract void compute(); + method public final int decrementPendingCountUnlessZero(); + method protected final boolean exec(); + method public final java.util.concurrent.CountedCompleter<?> firstComplete(); + method public final java.util.concurrent.CountedCompleter<?> getCompleter(); + method public final int getPendingCount(); + method public T getRawResult(); + method public final java.util.concurrent.CountedCompleter<?> getRoot(); + method public final void helpComplete(int); + method public final java.util.concurrent.CountedCompleter<?> nextComplete(); + method public void onCompletion(java.util.concurrent.CountedCompleter<?>); + method public boolean onExceptionalCompletion(java.lang.Throwable, java.util.concurrent.CountedCompleter<?>); + method public final void propagateCompletion(); + method public final void quietlyCompleteRoot(); + method public final void setPendingCount(int); + method protected void setRawResult(T); + method public final void tryComplete(); + } + public class CyclicBarrier { ctor public CyclicBarrier(int, java.lang.Runnable); ctor public CyclicBarrier(int); @@ -59398,6 +59665,8 @@ package java.util.concurrent { method public static java.util.concurrent.ExecutorService newSingleThreadExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(); method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); + method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); + method public static java.util.concurrent.ExecutorService newWorkStealingPool(); method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); @@ -59411,11 +59680,13 @@ package java.util.concurrent { ctor public ForkJoinPool(int, java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory, java.lang.Thread.UncaughtExceptionHandler, boolean); method public boolean awaitQuiescence(long, java.util.concurrent.TimeUnit); method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public static java.util.concurrent.ForkJoinPool commonPool(); method protected int drainTasksTo(java.util.Collection<? super java.util.concurrent.ForkJoinTask<?>>); method public void execute(java.util.concurrent.ForkJoinTask<?>); method public void execute(java.lang.Runnable); method public int getActiveThreadCount(); method public boolean getAsyncMode(); + method public static int getCommonPoolParallelism(); method public java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory getFactory(); method public int getParallelism(); method public int getPoolSize(); @@ -59453,6 +59724,7 @@ package java.util.concurrent { method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); method public boolean cancel(boolean); + method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); method public void completeExceptionally(java.lang.Throwable); method protected abstract boolean exec(); @@ -59460,6 +59732,7 @@ package java.util.concurrent { method public final V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public final V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public final java.lang.Throwable getException(); + method public final short getForkJoinTaskTag(); method public static java.util.concurrent.ForkJoinPool getPool(); method public static int getQueuedTaskCount(); method public abstract V getRawResult(); @@ -59478,9 +59751,11 @@ package java.util.concurrent { method protected static java.util.concurrent.ForkJoinTask<?> peekNextLocalTask(); method protected static java.util.concurrent.ForkJoinTask<?> pollNextLocalTask(); method protected static java.util.concurrent.ForkJoinTask<?> pollTask(); + method public final void quietlyComplete(); method public final void quietlyInvoke(); method public final void quietlyJoin(); method public void reinitialize(); + method public final short setForkJoinTaskTag(short); method protected abstract void setRawResult(V); method public boolean tryUnfork(); } @@ -59554,6 +59829,7 @@ package java.util.concurrent { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; method public E takeFirst() throws java.lang.InterruptedException; method public E takeLast() throws java.lang.InterruptedException; @@ -59574,6 +59850,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -59593,6 +59870,7 @@ package java.util.concurrent { method public void put(E); method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; method public void transfer(E) throws java.lang.InterruptedException; method public boolean tryTransfer(E); @@ -59640,6 +59918,7 @@ package java.util.concurrent { method public void put(E); method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -59743,6 +60022,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -59872,112 +60152,136 @@ package java.util.concurrent.atomic { public class AtomicInteger extends java.lang.Number implements java.io.Serializable { ctor public AtomicInteger(int); ctor public AtomicInteger(); + method public final int accumulateAndGet(int, java.util.function.IntBinaryOperator); method public final int addAndGet(int); method public final boolean compareAndSet(int, int); method public final int decrementAndGet(); method public double doubleValue(); method public float floatValue(); method public final int get(); + method public final int getAndAccumulate(int, java.util.function.IntBinaryOperator); method public final int getAndAdd(int); method public final int getAndDecrement(); method public final int getAndIncrement(); method public final int getAndSet(int); + method public final int getAndUpdate(java.util.function.IntUnaryOperator); method public final int incrementAndGet(); method public int intValue(); method public final void lazySet(int); method public long longValue(); method public final void set(int); + method public final int updateAndGet(java.util.function.IntUnaryOperator); method public final boolean weakCompareAndSet(int, int); } public class AtomicIntegerArray implements java.io.Serializable { ctor public AtomicIntegerArray(int); ctor public AtomicIntegerArray(int[]); + method public final int accumulateAndGet(int, int, java.util.function.IntBinaryOperator); method public final int addAndGet(int, int); method public final boolean compareAndSet(int, int, int); method public final int decrementAndGet(int); method public final int get(int); + method public final int getAndAccumulate(int, int, java.util.function.IntBinaryOperator); method public final int getAndAdd(int, int); method public final int getAndDecrement(int); method public final int getAndIncrement(int); method public final int getAndSet(int, int); + method public final int getAndUpdate(int, java.util.function.IntUnaryOperator); method public final int incrementAndGet(int); method public final void lazySet(int, int); method public final int length(); method public final void set(int, int); + method public final int updateAndGet(int, java.util.function.IntUnaryOperator); method public final boolean weakCompareAndSet(int, int, int); } public abstract class AtomicIntegerFieldUpdater { ctor protected AtomicIntegerFieldUpdater(); + method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); method public abstract boolean compareAndSet(T, int, int); method public int decrementAndGet(T); method public abstract int get(T); + method public final int getAndAccumulate(T, int, java.util.function.IntBinaryOperator); method public int getAndAdd(T, int); method public int getAndDecrement(T); method public int getAndIncrement(T); method public int getAndSet(T, int); + method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, int); + method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); } public class AtomicLong extends java.lang.Number implements java.io.Serializable { ctor public AtomicLong(long); ctor public AtomicLong(); + method public final long accumulateAndGet(long, java.util.function.LongBinaryOperator); method public final long addAndGet(long); method public final boolean compareAndSet(long, long); method public final long decrementAndGet(); method public double doubleValue(); method public float floatValue(); method public final long get(); + method public final long getAndAccumulate(long, java.util.function.LongBinaryOperator); method public final long getAndAdd(long); method public final long getAndDecrement(); method public final long getAndIncrement(); method public final long getAndSet(long); + method public final long getAndUpdate(java.util.function.LongUnaryOperator); method public final long incrementAndGet(); method public int intValue(); method public final void lazySet(long); method public long longValue(); method public final void set(long); + method public final long updateAndGet(java.util.function.LongUnaryOperator); method public final boolean weakCompareAndSet(long, long); } public class AtomicLongArray implements java.io.Serializable { ctor public AtomicLongArray(int); ctor public AtomicLongArray(long[]); + method public final long accumulateAndGet(int, long, java.util.function.LongBinaryOperator); method public long addAndGet(int, long); method public final boolean compareAndSet(int, long, long); method public final long decrementAndGet(int); method public final long get(int); + method public final long getAndAccumulate(int, long, java.util.function.LongBinaryOperator); method public final long getAndAdd(int, long); method public final long getAndDecrement(int); method public final long getAndIncrement(int); method public final long getAndSet(int, long); + method public final long getAndUpdate(int, java.util.function.LongUnaryOperator); method public final long incrementAndGet(int); method public final void lazySet(int, long); method public final int length(); method public final void set(int, long); + method public final long updateAndGet(int, java.util.function.LongUnaryOperator); method public final boolean weakCompareAndSet(int, long, long); } public abstract class AtomicLongFieldUpdater { ctor protected AtomicLongFieldUpdater(); + method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); method public abstract boolean compareAndSet(T, long, long); method public long decrementAndGet(T); method public abstract long get(T); + method public final long getAndAccumulate(T, long, java.util.function.LongBinaryOperator); method public long getAndAdd(T, long); method public long getAndDecrement(T); method public long getAndIncrement(T); method public long getAndSet(T, long); + method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, long); + method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } @@ -59995,34 +60299,46 @@ package java.util.concurrent.atomic { public class AtomicReference implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); + method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>); method public final boolean compareAndSet(V, V); method public final V get(); + method public final V getAndAccumulate(V, java.util.function.BinaryOperator<V>); method public final V getAndSet(V); + method public final V getAndUpdate(java.util.function.UnaryOperator<V>); method public final void lazySet(V); method public final void set(V); + method public final V updateAndGet(java.util.function.UnaryOperator<V>); method public final boolean weakCompareAndSet(V, V); } public class AtomicReferenceArray implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); + method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>); method public final boolean compareAndSet(int, E, E); method public final E get(int); + method public final E getAndAccumulate(int, E, java.util.function.BinaryOperator<E>); method public final E getAndSet(int, E); + method public final E getAndUpdate(int, java.util.function.UnaryOperator<E>); method public final void lazySet(int, E); method public final int length(); method public final void set(int, E); + method public final E updateAndGet(int, java.util.function.UnaryOperator<E>); method public final boolean weakCompareAndSet(int, E, E); } public abstract class AtomicReferenceFieldUpdater { ctor protected AtomicReferenceFieldUpdater(); + method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>); method public abstract boolean compareAndSet(T, V, V); method public abstract V get(T); + method public final V getAndAccumulate(T, V, java.util.function.BinaryOperator<V>); method public V getAndSet(T, V); + method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>); method public abstract void lazySet(T, V); method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); method public abstract void set(T, V); + method public final V updateAndGet(T, java.util.function.UnaryOperator<V>); method public abstract boolean weakCompareAndSet(T, V, V); } @@ -60037,6 +60353,59 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, int, int); } + public class DoubleAccumulator extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public DoubleAccumulator(java.util.function.DoubleBinaryOperator, double); + method public void accumulate(double); + method public double doubleValue(); + method public float floatValue(); + method public double get(); + method public double getThenReset(); + method public int intValue(); + method public long longValue(); + method public void reset(); + } + + public class DoubleAdder extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public DoubleAdder(); + method public void add(double); + method public double doubleValue(); + method public float floatValue(); + method public int intValue(); + method public long longValue(); + method public void reset(); + method public double sum(); + method public double sumThenReset(); + } + + public class LongAccumulator extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public LongAccumulator(java.util.function.LongBinaryOperator, long); + method public void accumulate(long); + method public double doubleValue(); + method public float floatValue(); + method public long get(); + method public long getThenReset(); + method public int intValue(); + method public long longValue(); + method public void reset(); + } + + public class LongAdder extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public LongAdder(); + method public void add(long); + method public void decrement(); + method public double doubleValue(); + method public float floatValue(); + method public void increment(); + method public int intValue(); + method public long longValue(); + method public void reset(); + method public long sum(); + method public long sumThenReset(); + } + + abstract class Striped64 extends java.lang.Number { + } + } package java.util.concurrent.locks { @@ -60244,6 +60613,34 @@ package java.util.concurrent.locks { method public void unlock(); } + public class StampedLock implements java.io.Serializable { + ctor public StampedLock(); + method public java.util.concurrent.locks.Lock asReadLock(); + method public java.util.concurrent.locks.ReadWriteLock asReadWriteLock(); + method public java.util.concurrent.locks.Lock asWriteLock(); + method public int getReadLockCount(); + method public boolean isReadLocked(); + method public boolean isWriteLocked(); + method public long readLock(); + method public long readLockInterruptibly() throws java.lang.InterruptedException; + method public long tryConvertToOptimisticRead(long); + method public long tryConvertToReadLock(long); + method public long tryConvertToWriteLock(long); + method public long tryOptimisticRead(); + method public long tryReadLock(); + method public long tryReadLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public boolean tryUnlockRead(); + method public boolean tryUnlockWrite(); + method public long tryWriteLock(); + method public long tryWriteLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public void unlock(long); + method public void unlockRead(long); + method public void unlockWrite(long); + method public boolean validate(long); + method public long writeLock(); + method public long writeLockInterruptibly() throws java.lang.InterruptedException; + } + } package java.util.function { diff --git a/api/removed.txt b/api/removed.txt index 2f553734068a..8ac2d63d99a2 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -35,6 +35,25 @@ package android.database { } +package android.graphics { + + public deprecated class AvoidXfermode extends android.graphics.Xfermode { + ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode); + } + + public static final class AvoidXfermode.Mode extends java.lang.Enum { + method public static android.graphics.AvoidXfermode.Mode valueOf(java.lang.String); + method public static final android.graphics.AvoidXfermode.Mode[] values(); + enum_constant public static final android.graphics.AvoidXfermode.Mode AVOID; + enum_constant public static final android.graphics.AvoidXfermode.Mode TARGET; + } + + public deprecated class PixelXorXfermode extends android.graphics.Xfermode { + ctor public PixelXorXfermode(int); + } + +} + package android.media { public final class AudioFormat implements android.os.Parcelable { diff --git a/api/system-current.txt b/api/system-current.txt index d242e2ffe9dc..32fb87f3274f 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3557,7 +3557,7 @@ package android.app { method public android.view.View getCurrentFocus(); method public android.app.FragmentManager getFragmentManager(); method public android.content.Intent getIntent(); - method public deprecated java.lang.Object getLastNonConfigurationInstance(); + method public java.lang.Object getLastNonConfigurationInstance(); method public android.view.LayoutInflater getLayoutInflater(); method public android.app.LoaderManager getLoaderManager(); method public java.lang.String getLocalClassName(); @@ -3660,7 +3660,7 @@ package android.app { method protected void onRestoreInstanceState(android.os.Bundle); method public void onRestoreInstanceState(android.os.Bundle, android.os.PersistableBundle); method protected void onResume(); - method public deprecated java.lang.Object onRetainNonConfigurationInstance(); + method public java.lang.Object onRetainNonConfigurationInstance(); method protected void onSaveInstanceState(android.os.Bundle); method public void onSaveInstanceState(android.os.Bundle, android.os.PersistableBundle); method public boolean onSearchRequested(android.view.SearchEvent); @@ -8409,6 +8409,7 @@ package android.content { field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard"; field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity"; field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir"; + field public static final java.lang.String CONTEXTHUB_SERVICE = "contexthub"; field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2 field public static final int CONTEXT_INCLUDE_CODE = 1; // 0x1 field public static final int CONTEXT_RESTRICTED = 4; // 0x4 @@ -10512,7 +10513,6 @@ package android.content.res { method public static deprecated android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public int describeContents(); - method public int getChangingConfigurations(); method public int getColorForState(int[], int); method public int getDefaultColor(); method public boolean isOpaque(); @@ -10524,6 +10524,7 @@ package android.content.res { public abstract class ComplexColor { ctor public ComplexColor(); + method public int getChangingConfigurations(); method public abstract int getDefaultColor(); method public boolean isStateful(); } @@ -11871,17 +11872,6 @@ package android.gesture { package android.graphics { - public deprecated class AvoidXfermode extends android.graphics.Xfermode { - ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode); - } - - public static final class AvoidXfermode.Mode extends java.lang.Enum { - method public static android.graphics.AvoidXfermode.Mode valueOf(java.lang.String); - method public static final android.graphics.AvoidXfermode.Mode[] values(); - enum_constant public static final android.graphics.AvoidXfermode.Mode AVOID; - enum_constant public static final android.graphics.AvoidXfermode.Mode TARGET; - } - public final class Bitmap implements android.os.Parcelable { method public boolean compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream); method public android.graphics.Bitmap copy(android.graphics.Bitmap.Config, boolean); @@ -12748,10 +12738,6 @@ package android.graphics { field public int bytesPerPixel; } - public deprecated class PixelXorXfermode extends android.graphics.Xfermode { - ctor public PixelXorXfermode(int); - } - public class Point implements android.os.Parcelable { ctor public Point(); ctor public Point(int, int); @@ -13431,9 +13417,9 @@ package android.graphics.drawable { method public void setPaddingMode(int); method public void setPaddingRelative(int, int, int, int); method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable); + field public static final int INSET_UNDEFINED = -2147483648; // 0x80000000 field public static final int PADDING_MODE_NEST = 0; // 0x0 field public static final int PADDING_MODE_STACK = 1; // 0x1 - field public static final int UNDEFINED_INSET = -2147483648; // 0x80000000 } public class LevelListDrawable extends android.graphics.drawable.DrawableContainer { @@ -15292,37 +15278,31 @@ package android.hardware.location { method public java.lang.String getToolchain(); method public int getToolchainVersion(); method public java.lang.String getVendor(); - method public void setId(int); - method public void setMemoryRegions(android.hardware.location.MemoryRegion[]); - method public void setName(java.lang.String); - method public void setPeakMips(float); - method public void setPeakPowerDrawMw(float); - method public void setPlatformVersion(int); - method public void setSleepPowerDrawMw(float); - method public void setStaticSwVersion(int); - method public void setStoppedPowerDrawMw(float); - method public void setSupportedSensors(int[]); - method public void setToolchain(java.lang.String); - method public void setToolchainVersion(int); - method public void setVendor(java.lang.String); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.hardware.location.ContextHubInfo> CREATOR; } public final class ContextHubManager { method public java.lang.Integer[] findNanoAppOnHub(int, android.hardware.location.NanoAppFilter); - method public int[] getContexthubHandles(); - method public android.hardware.location.ContextHubInfo getContexthubInfo(int); + method public int[] getContextHubHandles(); + method public android.hardware.location.ContextHubInfo getContextHubInfo(int); method public android.hardware.location.NanoAppInstanceInfo getNanoAppInstanceInfo(int); method public int loadNanoApp(int, android.hardware.location.NanoApp); + method public int registerContextHubCallback(android.hardware.location.ContextHubManager.ContextHubCallback); + method public int registerContextHubCallback(android.hardware.location.ContextHubManager.ContextHubCallback, android.os.Handler); method public int sendMessage(int, int, android.hardware.location.ContextHubMessage); method public int unloadNanoApp(int); + method public int unregisterContextHubCallback(android.hardware.location.ContextHubManager.ContextHubCallback); field public static final int ANY_HUB = -1; // 0xffffffff field public static final int MSG_DATA_SEND = 3; // 0x3 field public static final int MSG_LOAD_NANO_APP = 1; // 0x1 field public static final int MSG_UNLOAD_NANO_APP = 2; // 0x2 } + public abstract class ContextHubManager.ContextHubCallback { + ctor public ContextHubManager.ContextHubCallback(); + } + public class ContextHubMessage { ctor public ContextHubMessage(int, int, byte[]); method public int describeContents(); @@ -33115,6 +33095,7 @@ package android.provider { public static class CallLog.Calls implements android.provider.BaseColumns { ctor public CallLog.Calls(); method public static java.lang.String getLastOutgoingCall(android.content.Context); + field public static final int ANSWERED_EXTERNALLY_TYPE = 7; // 0x7 field public static final int BLOCKED_TYPE = 6; // 0x6 field public static final java.lang.String CACHED_FORMATTED_NUMBER = "formatted_number"; field public static final java.lang.String CACHED_LOOKUP_URI = "lookup_uri"; @@ -33137,6 +33118,7 @@ package android.provider { field public static final java.lang.String DURATION = "duration"; field public static final java.lang.String EXTRA_CALL_TYPE_FILTER = "android.provider.extra.CALL_TYPE_FILTER"; field public static final java.lang.String FEATURES = "features"; + field public static final int FEATURES_PULLED_EXTERNALLY = 2; // 0x2 field public static final int FEATURES_VIDEO = 1; // 0x1 field public static final java.lang.String GEOCODED_LOCATION = "geocoded_location"; field public static final int INCOMING_TYPE = 1; // 0x1 @@ -34912,7 +34894,6 @@ package android.provider { field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS"; field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS"; field public static final java.lang.String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"; - field public static final java.lang.String ACTION_SCREEN_READER_TUTORIAL = "android.settings.SCREEN_READER_TUTORIAL"; field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS"; field public static final java.lang.String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS"; field public static final java.lang.String ACTION_SETTINGS = "android.settings.SETTINGS"; @@ -38659,10 +38640,12 @@ package android.telecom { method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean); method public void playDtmfTone(char); method public void postDialContinue(boolean); + method public void pullExternalCall(); method public void registerCallback(android.telecom.Call.Callback); method public void registerCallback(android.telecom.Call.Callback, android.os.Handler); method public void reject(boolean, java.lang.String); method public deprecated void removeListener(android.telecom.Call.Listener); + method public void sendCallEvent(java.lang.String, android.os.Bundle); method public void splitFromConference(); method public void stopDtmfTone(); method public void swapConference(); @@ -38677,6 +38660,7 @@ package android.telecom { field public static final int STATE_HOLDING = 3; // 0x3 field public static final int STATE_NEW = 0; // 0x0 field public static final deprecated int STATE_PRE_DIAL_WAIT = 8; // 0x8 + field public static final int STATE_PULLING_CALL = 11; // 0xb field public static final int STATE_RINGING = 2; // 0x2 field public static final int STATE_SELECT_PHONE_ACCOUNT = 8; // 0x8 } @@ -38687,6 +38671,7 @@ package android.telecom { method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>); method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>); method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>); + method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details); method public void onParentChanged(android.telecom.Call, android.telecom.Call); method public void onPostDialWait(android.telecom.Call, java.lang.String); @@ -38717,6 +38702,7 @@ package android.telecom { method public static java.lang.String propertiesToString(int); field public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 4194304; // 0x400000 field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000 + field public static final int CAPABILITY_CAN_PULL_CALL = 8388608; // 0x800000 field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000 field public static final int CAPABILITY_HOLD = 1; // 0x1 field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80 @@ -38736,6 +38722,7 @@ package android.telecom { field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 4; // 0x4 field public static final int PROPERTY_GENERIC_CONFERENCE = 2; // 0x2 field public static final int PROPERTY_HIGH_DEF_AUDIO = 16; // 0x10 + field public static final int PROPERTY_IS_EXTERNAL_CALL = 64; // 0x40 field public static final int PROPERTY_WIFI = 8; // 0x8 field public static final int PROPERTY_WORK_CALL = 32; // 0x20 } @@ -38861,15 +38848,19 @@ package android.telecom { method public void onAnswer(); method public deprecated void onAudioStateChanged(android.telecom.AudioState); method public void onCallAudioStateChanged(android.telecom.CallAudioState); + method public void onCallEvent(java.lang.String, android.os.Bundle); method public void onDisconnect(); method public void onHold(); method public void onPlayDtmfTone(char); method public void onPostDialContinue(boolean); + method public void onPullExternalCall(); method public void onReject(); + method public void onReject(java.lang.String); method public void onSeparate(); method public void onStateChanged(int); method public void onStopDtmfTone(); method public void onUnhold(); + method public void sendConnectionEvent(java.lang.String, android.os.Bundle); method public final void setActive(); method public final void setAddress(android.net.Uri, int); method public final void setAudioModeIsVoip(boolean); @@ -38893,9 +38884,12 @@ package android.telecom { method public static java.lang.String stateToString(int); field public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 8388608; // 0x800000 field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000 + field public static final int CAPABILITY_CAN_PULL_CALL = 33554432; // 0x2000000 + field public static final int CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION = 4194304; // 0x400000 field public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 524288; // 0x80000 field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000 field public static final int CAPABILITY_HOLD = 1; // 0x1 + field public static final int CAPABILITY_IS_EXTERNAL_CALL = 16777216; // 0x1000000 field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80 field public static final int CAPABILITY_MERGE_CONFERENCE = 4; // 0x4 field public static final int CAPABILITY_MUTE = 64; // 0x40 @@ -38909,6 +38903,7 @@ package android.telecom { field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 2048; // 0x800 field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2 field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 + field public static final java.lang.String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED"; field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; @@ -38918,6 +38913,7 @@ package android.telecom { field public static final int STATE_HOLDING = 5; // 0x5 field public static final int STATE_INITIALIZING = 0; // 0x0 field public static final int STATE_NEW = 1; // 0x1 + field public static final int STATE_PULLING_CALL = 7; // 0x7 field public static final int STATE_RINGING = 2; // 0x2 } @@ -38995,7 +38991,9 @@ package android.telecom { method public java.lang.String getReason(); method public int getTone(); method public void writeToParcel(android.os.Parcel, int); + field public static final int ANSWERED_ELSEWHERE = 11; // 0xb field public static final int BUSY = 7; // 0x7 + field public static final int CALL_PULLED = 12; // 0xc field public static final int CANCELED = 4; // 0x4 field public static final int CONNECTION_MANAGER_NOT_SUPPORTED = 10; // 0xa field public static final android.os.Parcelable.Creator<android.telecom.DisconnectCause> CREATOR; @@ -39032,6 +39030,7 @@ package android.telecom { method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onCallRemoved(android.telecom.Call); method public void onCanAddCallChanged(boolean); + method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public deprecated void onPhoneCreated(android.telecom.Phone); method public deprecated void onPhoneDestroyed(android.telecom.Phone); method public void onSilenceRinger(); @@ -39237,6 +39236,7 @@ package android.telecom { method public boolean isVoipAudioMode(); method public void playDtmfTone(char); method public void postDialContinue(boolean); + method public void pullExternalCall(); method public void registerCallback(android.telecom.RemoteConnection.Callback); method public void registerCallback(android.telecom.RemoteConnection.Callback, android.os.Handler); method public void reject(); @@ -39254,6 +39254,7 @@ package android.telecom { method public void onConferenceChanged(android.telecom.RemoteConnection, android.telecom.RemoteConference); method public void onConferenceableConnectionsChanged(android.telecom.RemoteConnection, java.util.List<android.telecom.RemoteConnection>); method public void onConnectionCapabilitiesChanged(android.telecom.RemoteConnection, int); + method public void onConnectionEvent(android.telecom.RemoteConnection, java.lang.String, android.os.Bundle); method public void onDestroyed(android.telecom.RemoteConnection); method public void onDisconnected(android.telecom.RemoteConnection, android.telecom.DisconnectCause); method public void onExtrasChanged(android.telecom.RemoteConnection, android.os.Bundle); @@ -39378,6 +39379,7 @@ package android.telecom { field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE"; field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; + field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI"; field public static final int PRESENTATION_ALLOWED = 1; // 0x1 @@ -45349,6 +45351,7 @@ package android.view { method public void onStartTemporaryDetach(); method public boolean onTouchEvent(android.view.MotionEvent); method public boolean onTrackballEvent(android.view.MotionEvent); + method public void onVisibilityAggregated(android.view.View, int); method protected void onVisibilityChanged(android.view.View, int); method public void onWindowFocusChanged(boolean); method public void onWindowSystemUiVisibilityChanged(int); @@ -60445,6 +60448,7 @@ package java.util { method public void ensureCapacity(int); method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); + method public boolean removeIf(java.util.function.Predicate<? super E>); method public int size(); method public java.util.Spliterator<E> spliterator(); method public void trimToSize(); @@ -60529,6 +60533,24 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); + method public static void parallelSort(byte[]); + method public static void parallelSort(byte[], int, int); + method public static void parallelSort(char[]); + method public static void parallelSort(char[], int, int); + method public static void parallelSort(short[]); + method public static void parallelSort(short[], int, int); + method public static void parallelSort(int[]); + method public static void parallelSort(int[], int, int); + method public static void parallelSort(long[]); + method public static void parallelSort(long[], int, int); + method public static void parallelSort(float[]); + method public static void parallelSort(float[], int, int); + method public static void parallelSort(double[]); + method public static void parallelSort(double[], int, int); + method public static void parallelSort(T[]); + method public static void parallelSort(T[], int, int); + method public static void parallelSort(T[], java.util.Comparator<? super T>); + method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>); method public static void sort(int[]); method public static void sort(int[], int, int); method public static void sort(long[]); @@ -60716,6 +60738,7 @@ package java.util { method public abstract java.util.Iterator<E> iterator(); method public abstract boolean remove(java.lang.Object); method public abstract boolean removeAll(java.util.Collection<?>); + method public default boolean removeIf(java.util.function.Predicate<? super E>); method public abstract boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public abstract java.lang.Object[] toArray(); @@ -61349,18 +61372,28 @@ package java.util { public abstract interface Map { method public abstract void clear(); + method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public default V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public abstract boolean containsKey(java.lang.Object); 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 default V getOrDefault(java.lang.Object, V); method public abstract int hashCode(); method public abstract boolean isEmpty(); method public abstract java.util.Set<K> keySet(); + method public default V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); method public abstract V put(K, V); method public abstract void putAll(java.util.Map<? extends K, ? extends V>); + method public default V putIfAbsent(K, V); method public abstract V remove(java.lang.Object); + method public default boolean remove(java.lang.Object, java.lang.Object); + method public default boolean replace(K, V, V); + method public default V replace(K, V); + method public default void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public abstract int size(); method public abstract java.util.Collection<V> values(); } @@ -61368,6 +61401,8 @@ package java.util { public static abstract interface Map.Entry { method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -62098,6 +62133,7 @@ package java.util { method public synchronized void removeAllElements(); method public synchronized boolean removeElement(java.lang.Object); method public synchronized void removeElementAt(int); + method public synchronized boolean removeIf(java.util.function.Predicate<? super E>); method public synchronized void setElementAt(E, int); method public synchronized void setSize(int); method public synchronized int size(); @@ -62149,6 +62185,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -62212,6 +62249,78 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } + public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + ctor public CompletableFuture(); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...); + method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...); + method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public boolean cancel(boolean); + method public boolean complete(T); + method public boolean completeExceptionally(java.lang.Throwable); + method public static java.util.concurrent.CompletableFuture<U> completedFuture(U); + method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); + method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public T getNow(T); + method public int getNumberOfDependents(); + method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public boolean isCancelled(); + method public boolean isCompletedExceptionally(); + method public boolean isDone(); + method public T join(); + method public void obtrudeException(java.lang.Throwable); + method public void obtrudeValue(T); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); + method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<T> toCompletableFuture(); + method public java.util.concurrent.CompletableFuture<T> whenComplete(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); + } + + public static abstract interface CompletableFuture.AsynchronousCompletionTask { + } + + public class CompletionException extends java.lang.RuntimeException { + ctor protected CompletionException(); + ctor protected CompletionException(java.lang.String); + ctor public CompletionException(java.lang.String, java.lang.Throwable); + ctor public CompletionException(java.lang.Throwable); + } + public abstract interface CompletionService { method public abstract java.util.concurrent.Future<V> poll(); method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; @@ -62220,20 +62329,130 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException; } + public abstract interface CompletionStage { + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); + method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletableFuture<T> toCompletableFuture(); + method public abstract java.util.concurrent.CompletionStage<T> whenComplete(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); + } + public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>); ctor public ConcurrentHashMap(int, float); ctor public ConcurrentHashMap(int, float, int); + method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public boolean contains(java.lang.Object); method public java.util.Enumeration<V> elements(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); + method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>); + method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>); + method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachKey(long, java.util.function.Consumer<? super K>); + method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachValue(long, java.util.function.Consumer<? super V>); + method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public V getOrDefault(java.lang.Object, V); + method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V); method public java.util.Enumeration<K> keys(); + method public long mappingCount(); + method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); method public V putIfAbsent(K, V); + method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>); + method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator); + method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator); + method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator); + method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>); + method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator); + method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator); + method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator); + method public double reduceToDouble(long, java.util.function.ToDoubleBiFunction<? super K, ? super V>, double, java.util.function.DoubleBinaryOperator); + method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator); + method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator); + method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>); + method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator); + method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator); + method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator); method public boolean remove(java.lang.Object, java.lang.Object); method public boolean replace(K, V, V); method public V replace(K, V); + method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); + method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); + method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>); + method public U searchValues(long, java.util.function.Function<? super V, ? extends U>); + } + + static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + method public final void clear(); + method public abstract boolean contains(java.lang.Object); + method public final boolean containsAll(java.util.Collection<?>); + method public java.util.concurrent.ConcurrentHashMap<K, V> getMap(); + method public final boolean isEmpty(); + method public abstract java.util.Iterator<E> iterator(); + method public abstract boolean remove(java.lang.Object); + method public final boolean removeAll(java.util.Collection<?>); + method public final boolean retainAll(java.util.Collection<?>); + method public final int size(); + method public final java.lang.Object[] toArray(); + method public final T[] toArray(T[]); + method public final java.lang.String toString(); + } + + public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + method public boolean add(K); + method public boolean addAll(java.util.Collection<? extends K>); + method public boolean contains(java.lang.Object); + method public void forEach(java.util.function.Consumer<? super K>); + method public V getMappedValue(); + method public java.util.Iterator<K> iterator(); + method public boolean remove(java.lang.Object); + method public java.util.Spliterator<K> spliterator(); } public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { @@ -62263,6 +62482,7 @@ package java.util.concurrent { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { @@ -62273,6 +62493,7 @@ package java.util.concurrent { method public E peek(); method public E poll(); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public abstract interface ConcurrentMap implements java.util.Map { @@ -62304,6 +62525,9 @@ package java.util.concurrent { method public K ceilingKey(K); method public java.util.concurrent.ConcurrentSkipListMap<K, V> clone(); method public java.util.Comparator<? super K> comparator(); + method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public java.util.NavigableSet<K> descendingKeySet(); method public java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); @@ -62311,6 +62535,8 @@ package java.util.concurrent { 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 V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean); method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K); method public java.util.Map.Entry<K, V> higherEntry(K); @@ -62319,6 +62545,7 @@ package java.util.concurrent { method public K lastKey(); method public java.util.Map.Entry<K, V> lowerEntry(K); method public K lowerKey(K); + method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); method public java.util.NavigableSet<K> navigableKeySet(); method public java.util.Map.Entry<K, V> pollFirstEntry(); method public java.util.Map.Entry<K, V> pollLastEntry(); @@ -62326,6 +62553,7 @@ package java.util.concurrent { method public boolean remove(java.lang.Object, java.lang.Object); method public boolean replace(K, V, V); method public V replace(K, V); + method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, boolean, K, boolean); method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, K); method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K, boolean); @@ -62353,6 +62581,7 @@ package java.util.concurrent { method public E pollFirst(); method public E pollLast(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean); method public java.util.NavigableSet<E> subSet(E, E); method public java.util.NavigableSet<E> tailSet(E, boolean); @@ -62396,8 +62625,11 @@ package java.util.concurrent { public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>); + method public void forEach(java.util.function.Consumer<? super E>); method public java.util.Iterator<E> iterator(); + method public boolean removeIf(java.util.function.Predicate<? super E>); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class CountDownLatch { @@ -62408,6 +62640,32 @@ package java.util.concurrent { method public long getCount(); } + public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int); + ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>); + ctor protected CountedCompleter(); + method public final void addToPendingCount(int); + method public final boolean compareAndSetPendingCount(int, int); + method public void complete(T); + method public abstract void compute(); + method public final int decrementPendingCountUnlessZero(); + method protected final boolean exec(); + method public final java.util.concurrent.CountedCompleter<?> firstComplete(); + method public final java.util.concurrent.CountedCompleter<?> getCompleter(); + method public final int getPendingCount(); + method public T getRawResult(); + method public final java.util.concurrent.CountedCompleter<?> getRoot(); + method public final void helpComplete(int); + method public final java.util.concurrent.CountedCompleter<?> nextComplete(); + method public void onCompletion(java.util.concurrent.CountedCompleter<?>); + method public boolean onExceptionalCompletion(java.lang.Throwable, java.util.concurrent.CountedCompleter<?>); + method public final void propagateCompletion(); + method public final void quietlyCompleteRoot(); + method public final void setPendingCount(int); + method protected void setRawResult(T); + method public final void tryComplete(); + } + public class CyclicBarrier { ctor public CyclicBarrier(int, java.lang.Runnable); ctor public CyclicBarrier(int); @@ -62498,6 +62756,8 @@ package java.util.concurrent { method public static java.util.concurrent.ExecutorService newSingleThreadExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(); method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); + method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); + method public static java.util.concurrent.ExecutorService newWorkStealingPool(); method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); @@ -62511,11 +62771,13 @@ package java.util.concurrent { ctor public ForkJoinPool(int, java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory, java.lang.Thread.UncaughtExceptionHandler, boolean); method public boolean awaitQuiescence(long, java.util.concurrent.TimeUnit); method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public static java.util.concurrent.ForkJoinPool commonPool(); method protected int drainTasksTo(java.util.Collection<? super java.util.concurrent.ForkJoinTask<?>>); method public void execute(java.util.concurrent.ForkJoinTask<?>); method public void execute(java.lang.Runnable); method public int getActiveThreadCount(); method public boolean getAsyncMode(); + method public static int getCommonPoolParallelism(); method public java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory getFactory(); method public int getParallelism(); method public int getPoolSize(); @@ -62553,6 +62815,7 @@ package java.util.concurrent { method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); method public boolean cancel(boolean); + method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); method public void completeExceptionally(java.lang.Throwable); method protected abstract boolean exec(); @@ -62560,6 +62823,7 @@ package java.util.concurrent { method public final V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public final V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public final java.lang.Throwable getException(); + method public final short getForkJoinTaskTag(); method public static java.util.concurrent.ForkJoinPool getPool(); method public static int getQueuedTaskCount(); method public abstract V getRawResult(); @@ -62578,9 +62842,11 @@ package java.util.concurrent { method protected static java.util.concurrent.ForkJoinTask<?> peekNextLocalTask(); method protected static java.util.concurrent.ForkJoinTask<?> pollNextLocalTask(); method protected static java.util.concurrent.ForkJoinTask<?> pollTask(); + method public final void quietlyComplete(); method public final void quietlyInvoke(); method public final void quietlyJoin(); method public void reinitialize(); + method public final short setForkJoinTaskTag(short); method protected abstract void setRawResult(V); method public boolean tryUnfork(); } @@ -62654,6 +62920,7 @@ package java.util.concurrent { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; method public E takeFirst() throws java.lang.InterruptedException; method public E takeLast() throws java.lang.InterruptedException; @@ -62674,6 +62941,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -62693,6 +62961,7 @@ package java.util.concurrent { method public void put(E); method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; method public void transfer(E) throws java.lang.InterruptedException; method public boolean tryTransfer(E); @@ -62740,6 +63009,7 @@ package java.util.concurrent { method public void put(E); method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -62843,6 +63113,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -62972,112 +63243,136 @@ package java.util.concurrent.atomic { public class AtomicInteger extends java.lang.Number implements java.io.Serializable { ctor public AtomicInteger(int); ctor public AtomicInteger(); + method public final int accumulateAndGet(int, java.util.function.IntBinaryOperator); method public final int addAndGet(int); method public final boolean compareAndSet(int, int); method public final int decrementAndGet(); method public double doubleValue(); method public float floatValue(); method public final int get(); + method public final int getAndAccumulate(int, java.util.function.IntBinaryOperator); method public final int getAndAdd(int); method public final int getAndDecrement(); method public final int getAndIncrement(); method public final int getAndSet(int); + method public final int getAndUpdate(java.util.function.IntUnaryOperator); method public final int incrementAndGet(); method public int intValue(); method public final void lazySet(int); method public long longValue(); method public final void set(int); + method public final int updateAndGet(java.util.function.IntUnaryOperator); method public final boolean weakCompareAndSet(int, int); } public class AtomicIntegerArray implements java.io.Serializable { ctor public AtomicIntegerArray(int); ctor public AtomicIntegerArray(int[]); + method public final int accumulateAndGet(int, int, java.util.function.IntBinaryOperator); method public final int addAndGet(int, int); method public final boolean compareAndSet(int, int, int); method public final int decrementAndGet(int); method public final int get(int); + method public final int getAndAccumulate(int, int, java.util.function.IntBinaryOperator); method public final int getAndAdd(int, int); method public final int getAndDecrement(int); method public final int getAndIncrement(int); method public final int getAndSet(int, int); + method public final int getAndUpdate(int, java.util.function.IntUnaryOperator); method public final int incrementAndGet(int); method public final void lazySet(int, int); method public final int length(); method public final void set(int, int); + method public final int updateAndGet(int, java.util.function.IntUnaryOperator); method public final boolean weakCompareAndSet(int, int, int); } public abstract class AtomicIntegerFieldUpdater { ctor protected AtomicIntegerFieldUpdater(); + method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); method public abstract boolean compareAndSet(T, int, int); method public int decrementAndGet(T); method public abstract int get(T); + method public final int getAndAccumulate(T, int, java.util.function.IntBinaryOperator); method public int getAndAdd(T, int); method public int getAndDecrement(T); method public int getAndIncrement(T); method public int getAndSet(T, int); + method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, int); + method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); } public class AtomicLong extends java.lang.Number implements java.io.Serializable { ctor public AtomicLong(long); ctor public AtomicLong(); + method public final long accumulateAndGet(long, java.util.function.LongBinaryOperator); method public final long addAndGet(long); method public final boolean compareAndSet(long, long); method public final long decrementAndGet(); method public double doubleValue(); method public float floatValue(); method public final long get(); + method public final long getAndAccumulate(long, java.util.function.LongBinaryOperator); method public final long getAndAdd(long); method public final long getAndDecrement(); method public final long getAndIncrement(); method public final long getAndSet(long); + method public final long getAndUpdate(java.util.function.LongUnaryOperator); method public final long incrementAndGet(); method public int intValue(); method public final void lazySet(long); method public long longValue(); method public final void set(long); + method public final long updateAndGet(java.util.function.LongUnaryOperator); method public final boolean weakCompareAndSet(long, long); } public class AtomicLongArray implements java.io.Serializable { ctor public AtomicLongArray(int); ctor public AtomicLongArray(long[]); + method public final long accumulateAndGet(int, long, java.util.function.LongBinaryOperator); method public long addAndGet(int, long); method public final boolean compareAndSet(int, long, long); method public final long decrementAndGet(int); method public final long get(int); + method public final long getAndAccumulate(int, long, java.util.function.LongBinaryOperator); method public final long getAndAdd(int, long); method public final long getAndDecrement(int); method public final long getAndIncrement(int); method public final long getAndSet(int, long); + method public final long getAndUpdate(int, java.util.function.LongUnaryOperator); method public final long incrementAndGet(int); method public final void lazySet(int, long); method public final int length(); method public final void set(int, long); + method public final long updateAndGet(int, java.util.function.LongUnaryOperator); method public final boolean weakCompareAndSet(int, long, long); } public abstract class AtomicLongFieldUpdater { ctor protected AtomicLongFieldUpdater(); + method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); method public abstract boolean compareAndSet(T, long, long); method public long decrementAndGet(T); method public abstract long get(T); + method public final long getAndAccumulate(T, long, java.util.function.LongBinaryOperator); method public long getAndAdd(T, long); method public long getAndDecrement(T); method public long getAndIncrement(T); method public long getAndSet(T, long); + method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, long); + method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } @@ -63095,34 +63390,46 @@ package java.util.concurrent.atomic { public class AtomicReference implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); + method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>); method public final boolean compareAndSet(V, V); method public final V get(); + method public final V getAndAccumulate(V, java.util.function.BinaryOperator<V>); method public final V getAndSet(V); + method public final V getAndUpdate(java.util.function.UnaryOperator<V>); method public final void lazySet(V); method public final void set(V); + method public final V updateAndGet(java.util.function.UnaryOperator<V>); method public final boolean weakCompareAndSet(V, V); } public class AtomicReferenceArray implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); + method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>); method public final boolean compareAndSet(int, E, E); method public final E get(int); + method public final E getAndAccumulate(int, E, java.util.function.BinaryOperator<E>); method public final E getAndSet(int, E); + method public final E getAndUpdate(int, java.util.function.UnaryOperator<E>); method public final void lazySet(int, E); method public final int length(); method public final void set(int, E); + method public final E updateAndGet(int, java.util.function.UnaryOperator<E>); method public final boolean weakCompareAndSet(int, E, E); } public abstract class AtomicReferenceFieldUpdater { ctor protected AtomicReferenceFieldUpdater(); + method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>); method public abstract boolean compareAndSet(T, V, V); method public abstract V get(T); + method public final V getAndAccumulate(T, V, java.util.function.BinaryOperator<V>); method public V getAndSet(T, V); + method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>); method public abstract void lazySet(T, V); method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); method public abstract void set(T, V); + method public final V updateAndGet(T, java.util.function.UnaryOperator<V>); method public abstract boolean weakCompareAndSet(T, V, V); } @@ -63137,6 +63444,59 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, int, int); } + public class DoubleAccumulator extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public DoubleAccumulator(java.util.function.DoubleBinaryOperator, double); + method public void accumulate(double); + method public double doubleValue(); + method public float floatValue(); + method public double get(); + method public double getThenReset(); + method public int intValue(); + method public long longValue(); + method public void reset(); + } + + public class DoubleAdder extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public DoubleAdder(); + method public void add(double); + method public double doubleValue(); + method public float floatValue(); + method public int intValue(); + method public long longValue(); + method public void reset(); + method public double sum(); + method public double sumThenReset(); + } + + public class LongAccumulator extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public LongAccumulator(java.util.function.LongBinaryOperator, long); + method public void accumulate(long); + method public double doubleValue(); + method public float floatValue(); + method public long get(); + method public long getThenReset(); + method public int intValue(); + method public long longValue(); + method public void reset(); + } + + public class LongAdder extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public LongAdder(); + method public void add(long); + method public void decrement(); + method public double doubleValue(); + method public float floatValue(); + method public void increment(); + method public int intValue(); + method public long longValue(); + method public void reset(); + method public long sum(); + method public long sumThenReset(); + } + + abstract class Striped64 extends java.lang.Number { + } + } package java.util.concurrent.locks { @@ -63344,6 +63704,34 @@ package java.util.concurrent.locks { method public void unlock(); } + public class StampedLock implements java.io.Serializable { + ctor public StampedLock(); + method public java.util.concurrent.locks.Lock asReadLock(); + method public java.util.concurrent.locks.ReadWriteLock asReadWriteLock(); + method public java.util.concurrent.locks.Lock asWriteLock(); + method public int getReadLockCount(); + method public boolean isReadLocked(); + method public boolean isWriteLocked(); + method public long readLock(); + method public long readLockInterruptibly() throws java.lang.InterruptedException; + method public long tryConvertToOptimisticRead(long); + method public long tryConvertToReadLock(long); + method public long tryConvertToWriteLock(long); + method public long tryOptimisticRead(); + method public long tryReadLock(); + method public long tryReadLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public boolean tryUnlockRead(); + method public boolean tryUnlockWrite(); + method public long tryWriteLock(); + method public long tryWriteLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public void unlock(long); + method public void unlockRead(long); + method public void unlockWrite(long); + method public boolean validate(long); + method public long writeLock(); + method public long writeLockInterruptibly() throws java.lang.InterruptedException; + } + } package java.util.function { diff --git a/api/system-removed.txt b/api/system-removed.txt index 79f72975a194..caeecf5d544d 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -33,6 +33,25 @@ package android.database { } +package android.graphics { + + public deprecated class AvoidXfermode extends android.graphics.Xfermode { + ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode); + } + + public static final class AvoidXfermode.Mode extends java.lang.Enum { + method public static android.graphics.AvoidXfermode.Mode valueOf(java.lang.String); + method public static final android.graphics.AvoidXfermode.Mode[] values(); + enum_constant public static final android.graphics.AvoidXfermode.Mode AVOID; + enum_constant public static final android.graphics.AvoidXfermode.Mode TARGET; + } + + public deprecated class PixelXorXfermode extends android.graphics.Xfermode { + ctor public PixelXorXfermode(int); + } + +} + package android.media { public final class AudioFormat implements android.os.Parcelable { diff --git a/api/test-current.txt b/api/test-current.txt index 78bdf16bee90..45ef8398d845 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3442,7 +3442,7 @@ package android.app { method public android.view.View getCurrentFocus(); method public android.app.FragmentManager getFragmentManager(); method public android.content.Intent getIntent(); - method public deprecated java.lang.Object getLastNonConfigurationInstance(); + method public java.lang.Object getLastNonConfigurationInstance(); method public android.view.LayoutInflater getLayoutInflater(); method public android.app.LoaderManager getLoaderManager(); method public java.lang.String getLocalClassName(); @@ -3543,7 +3543,7 @@ package android.app { method protected void onRestoreInstanceState(android.os.Bundle); method public void onRestoreInstanceState(android.os.Bundle, android.os.PersistableBundle); method protected void onResume(); - method public deprecated java.lang.Object onRetainNonConfigurationInstance(); + method public java.lang.Object onRetainNonConfigurationInstance(); method protected void onSaveInstanceState(android.os.Bundle); method public void onSaveInstanceState(android.os.Bundle, android.os.PersistableBundle); method public boolean onSearchRequested(android.view.SearchEvent); @@ -10127,7 +10127,6 @@ package android.content.res { method public static deprecated android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public int describeContents(); - method public int getChangingConfigurations(); method public int getColorForState(int[], int); method public int getDefaultColor(); method public boolean isOpaque(); @@ -10139,6 +10138,7 @@ package android.content.res { public abstract class ComplexColor { ctor public ComplexColor(); + method public int getChangingConfigurations(); method public abstract int getDefaultColor(); method public boolean isStateful(); } @@ -11486,17 +11486,6 @@ package android.gesture { package android.graphics { - public deprecated class AvoidXfermode extends android.graphics.Xfermode { - ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode); - } - - public static final class AvoidXfermode.Mode extends java.lang.Enum { - method public static android.graphics.AvoidXfermode.Mode valueOf(java.lang.String); - method public static final android.graphics.AvoidXfermode.Mode[] values(); - enum_constant public static final android.graphics.AvoidXfermode.Mode AVOID; - enum_constant public static final android.graphics.AvoidXfermode.Mode TARGET; - } - public final class Bitmap implements android.os.Parcelable { method public boolean compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream); method public android.graphics.Bitmap copy(android.graphics.Bitmap.Config, boolean); @@ -12363,10 +12352,6 @@ package android.graphics { field public int bytesPerPixel; } - public deprecated class PixelXorXfermode extends android.graphics.Xfermode { - ctor public PixelXorXfermode(int); - } - public class Point implements android.os.Parcelable { ctor public Point(); ctor public Point(int, int); @@ -13046,9 +13031,9 @@ package android.graphics.drawable { method public void setPaddingMode(int); method public void setPaddingRelative(int, int, int, int); method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable); + field public static final int INSET_UNDEFINED = -2147483648; // 0x80000000 field public static final int PADDING_MODE_NEST = 0; // 0x0 field public static final int PADDING_MODE_STACK = 1; // 0x1 - field public static final int UNDEFINED_INSET = -2147483648; // 0x80000000 } public class LevelListDrawable extends android.graphics.drawable.DrawableContainer { @@ -23171,6 +23156,7 @@ package android.media.tv { method public void notifyError(int); method public void notifyRecordingStopped(android.net.Uri); 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); method public abstract void onStopRecording(); @@ -23188,6 +23174,7 @@ package android.media.tv { method public void notifyTracksChanged(java.util.List<android.media.tv.TvTrackInfo>); method public void notifyVideoAvailable(); method public void notifyVideoUnavailable(int); + method public void onAppPrivateCommand(java.lang.String, android.os.Bundle); method public android.view.View onCreateOverlayView(); method public boolean onGenericMotionEvent(android.view.MotionEvent); method public boolean onKeyDown(int, android.view.KeyEvent); @@ -23219,6 +23206,7 @@ package android.media.tv { public class TvRecordingClient { ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler); method public void release(); + method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle); method public void startRecording(android.net.Uri); method public void stopRecording(); method public void tune(java.lang.String, android.net.Uri); @@ -23280,6 +23268,7 @@ package android.media.tv { method public boolean onUnhandledInputEvent(android.view.InputEvent); method public void reset(); method public void selectTrack(int, java.lang.String); + method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle); method public void setCallback(android.media.tv.TvView.TvInputCallback); method public void setCaptionEnabled(boolean); method public void setOnUnhandledInputEventListener(android.media.tv.TvView.OnUnhandledInputEventListener); @@ -30833,6 +30822,7 @@ package android.provider { public static class CallLog.Calls implements android.provider.BaseColumns { ctor public CallLog.Calls(); method public static java.lang.String getLastOutgoingCall(android.content.Context); + field public static final int ANSWERED_EXTERNALLY_TYPE = 7; // 0x7 field public static final int BLOCKED_TYPE = 6; // 0x6 field public static final java.lang.String CACHED_FORMATTED_NUMBER = "formatted_number"; field public static final java.lang.String CACHED_LOOKUP_URI = "lookup_uri"; @@ -30855,6 +30845,7 @@ package android.provider { field public static final java.lang.String DURATION = "duration"; field public static final java.lang.String EXTRA_CALL_TYPE_FILTER = "android.provider.extra.CALL_TYPE_FILTER"; field public static final java.lang.String FEATURES = "features"; + field public static final int FEATURES_PULLED_EXTERNALLY = 2; // 0x2 field public static final int FEATURES_VIDEO = 1; // 0x1 field public static final java.lang.String GEOCODED_LOCATION = "geocoded_location"; field public static final int INCOMING_TYPE = 1; // 0x1 @@ -32498,7 +32489,6 @@ package android.provider { field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS"; field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS"; field public static final java.lang.String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"; - field public static final java.lang.String ACTION_SCREEN_READER_TUTORIAL = "android.settings.SCREEN_READER_TUTORIAL"; field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS"; field public static final java.lang.String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS"; field public static final java.lang.String ACTION_SETTINGS = "android.settings.SETTINGS"; @@ -36131,9 +36121,11 @@ package android.telecom { method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean); method public void playDtmfTone(char); method public void postDialContinue(boolean); + method public void pullExternalCall(); method public void registerCallback(android.telecom.Call.Callback); method public void registerCallback(android.telecom.Call.Callback, android.os.Handler); method public void reject(boolean, java.lang.String); + method public void sendCallEvent(java.lang.String, android.os.Bundle); method public void splitFromConference(); method public void stopDtmfTone(); method public void swapConference(); @@ -36147,6 +36139,7 @@ package android.telecom { field public static final int STATE_DISCONNECTING = 10; // 0xa field public static final int STATE_HOLDING = 3; // 0x3 field public static final int STATE_NEW = 0; // 0x0 + field public static final int STATE_PULLING_CALL = 11; // 0xb field public static final int STATE_RINGING = 2; // 0x2 field public static final int STATE_SELECT_PHONE_ACCOUNT = 8; // 0x8 } @@ -36157,6 +36150,7 @@ package android.telecom { method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>); method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>); method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>); + method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details); method public void onParentChanged(android.telecom.Call, android.telecom.Call); method public void onPostDialWait(android.telecom.Call, java.lang.String); @@ -36187,6 +36181,7 @@ package android.telecom { method public static java.lang.String propertiesToString(int); field public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 4194304; // 0x400000 field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000 + field public static final int CAPABILITY_CAN_PULL_CALL = 8388608; // 0x800000 field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000 field public static final int CAPABILITY_HOLD = 1; // 0x1 field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80 @@ -36206,6 +36201,7 @@ package android.telecom { field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 4; // 0x4 field public static final int PROPERTY_GENERIC_CONFERENCE = 2; // 0x2 field public static final int PROPERTY_HIGH_DEF_AUDIO = 16; // 0x10 + field public static final int PROPERTY_IS_EXTERNAL_CALL = 64; // 0x40 field public static final int PROPERTY_WIFI = 8; // 0x8 field public static final int PROPERTY_WORK_CALL = 32; // 0x20 } @@ -36320,15 +36316,19 @@ package android.telecom { method public void onAnswer(int); method public void onAnswer(); method public void onCallAudioStateChanged(android.telecom.CallAudioState); + method public void onCallEvent(java.lang.String, android.os.Bundle); method public void onDisconnect(); method public void onHold(); method public void onPlayDtmfTone(char); method public void onPostDialContinue(boolean); + method public void onPullExternalCall(); method public void onReject(); + method public void onReject(java.lang.String); method public void onSeparate(); method public void onStateChanged(int); method public void onStopDtmfTone(); method public void onUnhold(); + method public void sendConnectionEvent(java.lang.String, android.os.Bundle); method public final void setActive(); method public final void setAddress(android.net.Uri, int); method public final void setAudioModeIsVoip(boolean); @@ -36352,9 +36352,12 @@ package android.telecom { method public static java.lang.String stateToString(int); field public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 8388608; // 0x800000 field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000 + field public static final int CAPABILITY_CAN_PULL_CALL = 33554432; // 0x2000000 + field public static final int CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION = 4194304; // 0x400000 field public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 524288; // 0x80000 field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000 field public static final int CAPABILITY_HOLD = 1; // 0x1 + field public static final int CAPABILITY_IS_EXTERNAL_CALL = 16777216; // 0x1000000 field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80 field public static final int CAPABILITY_MERGE_CONFERENCE = 4; // 0x4 field public static final int CAPABILITY_MUTE = 64; // 0x40 @@ -36368,6 +36371,7 @@ package android.telecom { field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 2048; // 0x800 field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2 field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 + field public static final java.lang.String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED"; field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; @@ -36377,6 +36381,7 @@ package android.telecom { field public static final int STATE_HOLDING = 5; // 0x5 field public static final int STATE_INITIALIZING = 0; // 0x0 field public static final int STATE_NEW = 1; // 0x1 + field public static final int STATE_PULLING_CALL = 7; // 0x7 field public static final int STATE_RINGING = 2; // 0x2 } @@ -36454,7 +36459,9 @@ package android.telecom { method public java.lang.String getReason(); method public int getTone(); method public void writeToParcel(android.os.Parcel, int); + field public static final int ANSWERED_ELSEWHERE = 11; // 0xb field public static final int BUSY = 7; // 0x7 + field public static final int CALL_PULLED = 12; // 0xc field public static final int CANCELED = 4; // 0x4 field public static final int CONNECTION_MANAGER_NOT_SUPPORTED = 10; // 0xa field public static final android.os.Parcelable.Creator<android.telecom.DisconnectCause> CREATOR; @@ -36490,6 +36497,7 @@ package android.telecom { method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onCallRemoved(android.telecom.Call); method public void onCanAddCallChanged(boolean); + method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public void onSilenceRinger(); method public final void setAudioRoute(int); method public final void setMuted(boolean); @@ -36640,6 +36648,7 @@ package android.telecom { method public boolean isVoipAudioMode(); method public void playDtmfTone(char); method public void postDialContinue(boolean); + method public void pullExternalCall(); method public void registerCallback(android.telecom.RemoteConnection.Callback); method public void registerCallback(android.telecom.RemoteConnection.Callback, android.os.Handler); method public void reject(); @@ -36656,6 +36665,7 @@ package android.telecom { method public void onConferenceChanged(android.telecom.RemoteConnection, android.telecom.RemoteConference); method public void onConferenceableConnectionsChanged(android.telecom.RemoteConnection, java.util.List<android.telecom.RemoteConnection>); method public void onConnectionCapabilitiesChanged(android.telecom.RemoteConnection, int); + method public void onConnectionEvent(android.telecom.RemoteConnection, java.lang.String, android.os.Bundle); method public void onDestroyed(android.telecom.RemoteConnection); method public void onDisconnected(android.telecom.RemoteConnection, android.telecom.DisconnectCause); method public void onExtrasChanged(android.telecom.RemoteConnection, android.os.Bundle); @@ -36753,6 +36763,7 @@ package android.telecom { field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE"; field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; + field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI"; field public static final int PRESENTATION_ALLOWED = 1; // 0x1 @@ -42660,6 +42671,7 @@ package android.view { method public void onStartTemporaryDetach(); method public boolean onTouchEvent(android.view.MotionEvent); method public boolean onTrackballEvent(android.view.MotionEvent); + method public void onVisibilityAggregated(android.view.View, int); method protected void onVisibilityChanged(android.view.View, int); method public void onWindowFocusChanged(boolean); method public void onWindowSystemUiVisibilityChanged(int); @@ -57419,6 +57431,7 @@ package java.util { method public void ensureCapacity(int); method public void forEach(java.util.function.Consumer<? super E>); method public E get(int); + method public boolean removeIf(java.util.function.Predicate<? super E>); method public int size(); method public java.util.Spliterator<E> spliterator(); method public void trimToSize(); @@ -57503,6 +57516,24 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); + method public static void parallelSort(byte[]); + method public static void parallelSort(byte[], int, int); + method public static void parallelSort(char[]); + method public static void parallelSort(char[], int, int); + method public static void parallelSort(short[]); + method public static void parallelSort(short[], int, int); + method public static void parallelSort(int[]); + method public static void parallelSort(int[], int, int); + method public static void parallelSort(long[]); + method public static void parallelSort(long[], int, int); + method public static void parallelSort(float[]); + method public static void parallelSort(float[], int, int); + method public static void parallelSort(double[]); + method public static void parallelSort(double[], int, int); + method public static void parallelSort(T[]); + method public static void parallelSort(T[], int, int); + method public static void parallelSort(T[], java.util.Comparator<? super T>); + method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>); method public static void sort(int[]); method public static void sort(int[], int, int); method public static void sort(long[]); @@ -57690,6 +57721,7 @@ package java.util { method public abstract java.util.Iterator<E> iterator(); method public abstract boolean remove(java.lang.Object); method public abstract boolean removeAll(java.util.Collection<?>); + method public default boolean removeIf(java.util.function.Predicate<? super E>); method public abstract boolean retainAll(java.util.Collection<?>); method public abstract int size(); method public abstract java.lang.Object[] toArray(); @@ -58323,18 +58355,28 @@ package java.util { public abstract interface Map { method public abstract void clear(); + method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public default V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public abstract boolean containsKey(java.lang.Object); 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 default V getOrDefault(java.lang.Object, V); method public abstract int hashCode(); method public abstract boolean isEmpty(); method public abstract java.util.Set<K> keySet(); + method public default V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); method public abstract V put(K, V); method public abstract void putAll(java.util.Map<? extends K, ? extends V>); + method public default V putIfAbsent(K, V); method public abstract V remove(java.lang.Object); + method public default boolean remove(java.lang.Object, java.lang.Object); + method public default boolean replace(K, V, V); + method public default V replace(K, V); + method public default void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public abstract int size(); method public abstract java.util.Collection<V> values(); } @@ -58342,6 +58384,8 @@ package java.util { public static abstract interface Map.Entry { method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(); method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(); + method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -59072,6 +59116,7 @@ package java.util { method public synchronized void removeAllElements(); method public synchronized boolean removeElement(java.lang.Object); method public synchronized void removeElementAt(int); + method public synchronized boolean removeIf(java.util.function.Predicate<? super E>); method public synchronized void setElementAt(E, int); method public synchronized void setSize(int); method public synchronized int size(); @@ -59123,6 +59168,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -59186,6 +59232,78 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } + public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + ctor public CompletableFuture(); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...); + method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...); + method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public boolean cancel(boolean); + method public boolean complete(T); + method public boolean completeExceptionally(java.lang.Throwable); + method public static java.util.concurrent.CompletableFuture<U> completedFuture(U); + method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); + method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public T getNow(T); + method public int getNumberOfDependents(); + method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public boolean isCancelled(); + method public boolean isCompletedExceptionally(); + method public boolean isDone(); + method public T join(); + method public void obtrudeException(java.lang.Throwable); + method public void obtrudeValue(T); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable); + method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>); + method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable); + method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture<T> toCompletableFuture(); + method public java.util.concurrent.CompletableFuture<T> whenComplete(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public java.util.concurrent.CompletableFuture<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); + } + + public static abstract interface CompletableFuture.AsynchronousCompletionTask { + } + + public class CompletionException extends java.lang.RuntimeException { + ctor protected CompletionException(); + ctor protected CompletionException(java.lang.String); + ctor public CompletionException(java.lang.String, java.lang.Throwable); + ctor public CompletionException(java.lang.Throwable); + } + public abstract interface CompletionService { method public abstract java.util.concurrent.Future<V> poll(); method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; @@ -59194,20 +59312,130 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException; } + public abstract interface CompletionStage { + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>); + method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>); + method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEither(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>); + method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>); + method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>); + method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable); + method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletableFuture<T> toCompletableFuture(); + method public abstract java.util.concurrent.CompletionStage<T> whenComplete(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>); + method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor); + } + public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>); ctor public ConcurrentHashMap(int, float); ctor public ConcurrentHashMap(int, float, int); + method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public boolean contains(java.lang.Object); method public java.util.Enumeration<V> elements(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); + method public void forEach(java.util.function.BiConsumer<? super K, ? super V>); + method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>); + method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>); + method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachKey(long, java.util.function.Consumer<? super K>); + method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>); + method public void forEachValue(long, java.util.function.Consumer<? super V>); + method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>); + method public V getOrDefault(java.lang.Object, V); + method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V); method public java.util.Enumeration<K> keys(); + method public long mappingCount(); + method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int); method public V putIfAbsent(K, V); + method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>); + method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator); + method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator); + method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator); + method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>); + method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator); + method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator); + method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator); + method public double reduceToDouble(long, java.util.function.ToDoubleBiFunction<? super K, ? super V>, double, java.util.function.DoubleBinaryOperator); + method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator); + method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator); + method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>); + method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>); + method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator); + method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator); + method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator); method public boolean remove(java.lang.Object, java.lang.Object); method public boolean replace(K, V, V); method public V replace(K, V); + method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>); + method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>); + method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>); + method public U searchValues(long, java.util.function.Function<? super V, ? extends U>); + } + + static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + method public final void clear(); + method public abstract boolean contains(java.lang.Object); + method public final boolean containsAll(java.util.Collection<?>); + method public java.util.concurrent.ConcurrentHashMap<K, V> getMap(); + method public final boolean isEmpty(); + method public abstract java.util.Iterator<E> iterator(); + method public abstract boolean remove(java.lang.Object); + method public final boolean removeAll(java.util.Collection<?>); + method public final boolean retainAll(java.util.Collection<?>); + method public final int size(); + method public final java.lang.Object[] toArray(); + method public final T[] toArray(T[]); + method public final java.lang.String toString(); + } + + public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + method public boolean add(K); + method public boolean addAll(java.util.Collection<? extends K>); + method public boolean contains(java.lang.Object); + method public void forEach(java.util.function.Consumer<? super K>); + method public V getMappedValue(); + method public java.util.Iterator<K> iterator(); + method public boolean remove(java.lang.Object); + method public java.util.Spliterator<K> spliterator(); } public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { @@ -59237,6 +59465,7 @@ package java.util.concurrent { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { @@ -59247,6 +59476,7 @@ package java.util.concurrent { method public E peek(); method public E poll(); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public abstract interface ConcurrentMap implements java.util.Map { @@ -59278,6 +59508,9 @@ package java.util.concurrent { method public K ceilingKey(K); method public java.util.concurrent.ConcurrentSkipListMap<K, V> clone(); method public java.util.Comparator<? super K> comparator(); + method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); + method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>); + method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public java.util.NavigableSet<K> descendingKeySet(); method public java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap(); method public java.util.Set<java.util.Map.Entry<K, V>> entrySet(); @@ -59285,6 +59518,8 @@ package java.util.concurrent { 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 V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean); method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K); method public java.util.Map.Entry<K, V> higherEntry(K); @@ -59293,6 +59528,7 @@ package java.util.concurrent { method public K lastKey(); method public java.util.Map.Entry<K, V> lowerEntry(K); method public K lowerKey(K); + method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>); method public java.util.NavigableSet<K> navigableKeySet(); method public java.util.Map.Entry<K, V> pollFirstEntry(); method public java.util.Map.Entry<K, V> pollLastEntry(); @@ -59300,6 +59536,7 @@ package java.util.concurrent { method public boolean remove(java.lang.Object, java.lang.Object); method public boolean replace(K, V, V); method public V replace(K, V); + method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>); method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, boolean, K, boolean); method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, K); method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K, boolean); @@ -59327,6 +59564,7 @@ package java.util.concurrent { method public E pollFirst(); method public E pollLast(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean); method public java.util.NavigableSet<E> subSet(E, E); method public java.util.NavigableSet<E> tailSet(E, boolean); @@ -59370,8 +59608,11 @@ package java.util.concurrent { public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>); + method public void forEach(java.util.function.Consumer<? super E>); method public java.util.Iterator<E> iterator(); + method public boolean removeIf(java.util.function.Predicate<? super E>); method public int size(); + method public java.util.Spliterator<E> spliterator(); } public class CountDownLatch { @@ -59382,6 +59623,32 @@ package java.util.concurrent { method public long getCount(); } + public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int); + ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>); + ctor protected CountedCompleter(); + method public final void addToPendingCount(int); + method public final boolean compareAndSetPendingCount(int, int); + method public void complete(T); + method public abstract void compute(); + method public final int decrementPendingCountUnlessZero(); + method protected final boolean exec(); + method public final java.util.concurrent.CountedCompleter<?> firstComplete(); + method public final java.util.concurrent.CountedCompleter<?> getCompleter(); + method public final int getPendingCount(); + method public T getRawResult(); + method public final java.util.concurrent.CountedCompleter<?> getRoot(); + method public final void helpComplete(int); + method public final java.util.concurrent.CountedCompleter<?> nextComplete(); + method public void onCompletion(java.util.concurrent.CountedCompleter<?>); + method public boolean onExceptionalCompletion(java.lang.Throwable, java.util.concurrent.CountedCompleter<?>); + method public final void propagateCompletion(); + method public final void quietlyCompleteRoot(); + method public final void setPendingCount(int); + method protected void setRawResult(T); + method public final void tryComplete(); + } + public class CyclicBarrier { ctor public CyclicBarrier(int, java.lang.Runnable); ctor public CyclicBarrier(int); @@ -59472,6 +59739,8 @@ package java.util.concurrent { method public static java.util.concurrent.ExecutorService newSingleThreadExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(); method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); + method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); + method public static java.util.concurrent.ExecutorService newWorkStealingPool(); method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>); method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); @@ -59485,11 +59754,13 @@ package java.util.concurrent { ctor public ForkJoinPool(int, java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory, java.lang.Thread.UncaughtExceptionHandler, boolean); method public boolean awaitQuiescence(long, java.util.concurrent.TimeUnit); method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public static java.util.concurrent.ForkJoinPool commonPool(); method protected int drainTasksTo(java.util.Collection<? super java.util.concurrent.ForkJoinTask<?>>); method public void execute(java.util.concurrent.ForkJoinTask<?>); method public void execute(java.lang.Runnable); method public int getActiveThreadCount(); method public boolean getAsyncMode(); + method public static int getCommonPoolParallelism(); method public java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory getFactory(); method public int getParallelism(); method public int getPoolSize(); @@ -59527,6 +59798,7 @@ package java.util.concurrent { method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T); method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>); method public boolean cancel(boolean); + method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); method public void completeExceptionally(java.lang.Throwable); method protected abstract boolean exec(); @@ -59534,6 +59806,7 @@ package java.util.concurrent { method public final V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public final V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public final java.lang.Throwable getException(); + method public final short getForkJoinTaskTag(); method public static java.util.concurrent.ForkJoinPool getPool(); method public static int getQueuedTaskCount(); method public abstract V getRawResult(); @@ -59552,9 +59825,11 @@ package java.util.concurrent { method protected static java.util.concurrent.ForkJoinTask<?> peekNextLocalTask(); method protected static java.util.concurrent.ForkJoinTask<?> pollNextLocalTask(); method protected static java.util.concurrent.ForkJoinTask<?> pollTask(); + method public final void quietlyComplete(); method public final void quietlyInvoke(); method public final void quietlyJoin(); method public void reinitialize(); + method public final short setForkJoinTaskTag(short); method protected abstract void setRawResult(V); method public boolean tryUnfork(); } @@ -59628,6 +59903,7 @@ package java.util.concurrent { method public E removeLast(); method public boolean removeLastOccurrence(java.lang.Object); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; method public E takeFirst() throws java.lang.InterruptedException; method public E takeLast() throws java.lang.InterruptedException; @@ -59648,6 +59924,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -59667,6 +59944,7 @@ package java.util.concurrent { method public void put(E); method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; method public void transfer(E) throws java.lang.InterruptedException; method public boolean tryTransfer(E); @@ -59714,6 +59992,7 @@ package java.util.concurrent { method public void put(E); method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -59817,6 +60096,7 @@ package java.util.concurrent { method public void put(E) throws java.lang.InterruptedException; method public int remainingCapacity(); method public int size(); + method public java.util.Spliterator<E> spliterator(); method public E take() throws java.lang.InterruptedException; } @@ -59946,112 +60226,136 @@ package java.util.concurrent.atomic { public class AtomicInteger extends java.lang.Number implements java.io.Serializable { ctor public AtomicInteger(int); ctor public AtomicInteger(); + method public final int accumulateAndGet(int, java.util.function.IntBinaryOperator); method public final int addAndGet(int); method public final boolean compareAndSet(int, int); method public final int decrementAndGet(); method public double doubleValue(); method public float floatValue(); method public final int get(); + method public final int getAndAccumulate(int, java.util.function.IntBinaryOperator); method public final int getAndAdd(int); method public final int getAndDecrement(); method public final int getAndIncrement(); method public final int getAndSet(int); + method public final int getAndUpdate(java.util.function.IntUnaryOperator); method public final int incrementAndGet(); method public int intValue(); method public final void lazySet(int); method public long longValue(); method public final void set(int); + method public final int updateAndGet(java.util.function.IntUnaryOperator); method public final boolean weakCompareAndSet(int, int); } public class AtomicIntegerArray implements java.io.Serializable { ctor public AtomicIntegerArray(int); ctor public AtomicIntegerArray(int[]); + method public final int accumulateAndGet(int, int, java.util.function.IntBinaryOperator); method public final int addAndGet(int, int); method public final boolean compareAndSet(int, int, int); method public final int decrementAndGet(int); method public final int get(int); + method public final int getAndAccumulate(int, int, java.util.function.IntBinaryOperator); method public final int getAndAdd(int, int); method public final int getAndDecrement(int); method public final int getAndIncrement(int); method public final int getAndSet(int, int); + method public final int getAndUpdate(int, java.util.function.IntUnaryOperator); method public final int incrementAndGet(int); method public final void lazySet(int, int); method public final int length(); method public final void set(int, int); + method public final int updateAndGet(int, java.util.function.IntUnaryOperator); method public final boolean weakCompareAndSet(int, int, int); } public abstract class AtomicIntegerFieldUpdater { ctor protected AtomicIntegerFieldUpdater(); + method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); method public abstract boolean compareAndSet(T, int, int); method public int decrementAndGet(T); method public abstract int get(T); + method public final int getAndAccumulate(T, int, java.util.function.IntBinaryOperator); method public int getAndAdd(T, int); method public int getAndDecrement(T); method public int getAndIncrement(T); method public int getAndSet(T, int); + method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, int); + method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); } public class AtomicLong extends java.lang.Number implements java.io.Serializable { ctor public AtomicLong(long); ctor public AtomicLong(); + method public final long accumulateAndGet(long, java.util.function.LongBinaryOperator); method public final long addAndGet(long); method public final boolean compareAndSet(long, long); method public final long decrementAndGet(); method public double doubleValue(); method public float floatValue(); method public final long get(); + method public final long getAndAccumulate(long, java.util.function.LongBinaryOperator); method public final long getAndAdd(long); method public final long getAndDecrement(); method public final long getAndIncrement(); method public final long getAndSet(long); + method public final long getAndUpdate(java.util.function.LongUnaryOperator); method public final long incrementAndGet(); method public int intValue(); method public final void lazySet(long); method public long longValue(); method public final void set(long); + method public final long updateAndGet(java.util.function.LongUnaryOperator); method public final boolean weakCompareAndSet(long, long); } public class AtomicLongArray implements java.io.Serializable { ctor public AtomicLongArray(int); ctor public AtomicLongArray(long[]); + method public final long accumulateAndGet(int, long, java.util.function.LongBinaryOperator); method public long addAndGet(int, long); method public final boolean compareAndSet(int, long, long); method public final long decrementAndGet(int); method public final long get(int); + method public final long getAndAccumulate(int, long, java.util.function.LongBinaryOperator); method public final long getAndAdd(int, long); method public final long getAndDecrement(int); method public final long getAndIncrement(int); method public final long getAndSet(int, long); + method public final long getAndUpdate(int, java.util.function.LongUnaryOperator); method public final long incrementAndGet(int); method public final void lazySet(int, long); method public final int length(); method public final void set(int, long); + method public final long updateAndGet(int, java.util.function.LongUnaryOperator); method public final boolean weakCompareAndSet(int, long, long); } public abstract class AtomicLongFieldUpdater { ctor protected AtomicLongFieldUpdater(); + method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); method public abstract boolean compareAndSet(T, long, long); method public long decrementAndGet(T); method public abstract long get(T); + method public final long getAndAccumulate(T, long, java.util.function.LongBinaryOperator); method public long getAndAdd(T, long); method public long getAndDecrement(T); method public long getAndIncrement(T); method public long getAndSet(T, long); + method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String); method public abstract void set(T, long); + method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } @@ -60069,34 +60373,46 @@ package java.util.concurrent.atomic { public class AtomicReference implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); + method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>); method public final boolean compareAndSet(V, V); method public final V get(); + method public final V getAndAccumulate(V, java.util.function.BinaryOperator<V>); method public final V getAndSet(V); + method public final V getAndUpdate(java.util.function.UnaryOperator<V>); method public final void lazySet(V); method public final void set(V); + method public final V updateAndGet(java.util.function.UnaryOperator<V>); method public final boolean weakCompareAndSet(V, V); } public class AtomicReferenceArray implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); + method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>); method public final boolean compareAndSet(int, E, E); method public final E get(int); + method public final E getAndAccumulate(int, E, java.util.function.BinaryOperator<E>); method public final E getAndSet(int, E); + method public final E getAndUpdate(int, java.util.function.UnaryOperator<E>); method public final void lazySet(int, E); method public final int length(); method public final void set(int, E); + method public final E updateAndGet(int, java.util.function.UnaryOperator<E>); method public final boolean weakCompareAndSet(int, E, E); } public abstract class AtomicReferenceFieldUpdater { ctor protected AtomicReferenceFieldUpdater(); + method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>); method public abstract boolean compareAndSet(T, V, V); method public abstract V get(T); + method public final V getAndAccumulate(T, V, java.util.function.BinaryOperator<V>); method public V getAndSet(T, V); + method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>); method public abstract void lazySet(T, V); method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String); method public abstract void set(T, V); + method public final V updateAndGet(T, java.util.function.UnaryOperator<V>); method public abstract boolean weakCompareAndSet(T, V, V); } @@ -60111,6 +60427,59 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, int, int); } + public class DoubleAccumulator extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public DoubleAccumulator(java.util.function.DoubleBinaryOperator, double); + method public void accumulate(double); + method public double doubleValue(); + method public float floatValue(); + method public double get(); + method public double getThenReset(); + method public int intValue(); + method public long longValue(); + method public void reset(); + } + + public class DoubleAdder extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public DoubleAdder(); + method public void add(double); + method public double doubleValue(); + method public float floatValue(); + method public int intValue(); + method public long longValue(); + method public void reset(); + method public double sum(); + method public double sumThenReset(); + } + + public class LongAccumulator extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public LongAccumulator(java.util.function.LongBinaryOperator, long); + method public void accumulate(long); + method public double doubleValue(); + method public float floatValue(); + method public long get(); + method public long getThenReset(); + method public int intValue(); + method public long longValue(); + method public void reset(); + } + + public class LongAdder extends java.util.concurrent.atomic.Striped64 implements java.io.Serializable { + ctor public LongAdder(); + method public void add(long); + method public void decrement(); + method public double doubleValue(); + method public float floatValue(); + method public void increment(); + method public int intValue(); + method public long longValue(); + method public void reset(); + method public long sum(); + method public long sumThenReset(); + } + + abstract class Striped64 extends java.lang.Number { + } + } package java.util.concurrent.locks { @@ -60318,6 +60687,34 @@ package java.util.concurrent.locks { method public void unlock(); } + public class StampedLock implements java.io.Serializable { + ctor public StampedLock(); + method public java.util.concurrent.locks.Lock asReadLock(); + method public java.util.concurrent.locks.ReadWriteLock asReadWriteLock(); + method public java.util.concurrent.locks.Lock asWriteLock(); + method public int getReadLockCount(); + method public boolean isReadLocked(); + method public boolean isWriteLocked(); + method public long readLock(); + method public long readLockInterruptibly() throws java.lang.InterruptedException; + method public long tryConvertToOptimisticRead(long); + method public long tryConvertToReadLock(long); + method public long tryConvertToWriteLock(long); + method public long tryOptimisticRead(); + method public long tryReadLock(); + method public long tryReadLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public boolean tryUnlockRead(); + method public boolean tryUnlockWrite(); + method public long tryWriteLock(); + method public long tryWriteLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public void unlock(long); + method public void unlockRead(long); + method public void unlockWrite(long); + method public boolean validate(long); + method public long writeLock(); + method public long writeLockInterruptibly() throws java.lang.InterruptedException; + } + } package java.util.function { diff --git a/api/test-removed.txt b/api/test-removed.txt index 2f553734068a..8ac2d63d99a2 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -35,6 +35,25 @@ package android.database { } +package android.graphics { + + public deprecated class AvoidXfermode extends android.graphics.Xfermode { + ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode); + } + + public static final class AvoidXfermode.Mode extends java.lang.Enum { + method public static android.graphics.AvoidXfermode.Mode valueOf(java.lang.String); + method public static final android.graphics.AvoidXfermode.Mode[] values(); + enum_constant public static final android.graphics.AvoidXfermode.Mode AVOID; + enum_constant public static final android.graphics.AvoidXfermode.Mode TARGET; + } + + public deprecated class PixelXorXfermode extends android.graphics.Xfermode { + ctor public PixelXorXfermode(int); + } + +} + package android.media { public final class AudioFormat implements android.os.Parcelable { diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 6b67b959064e..a0a599e6c221 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -1976,15 +1976,13 @@ public class Activity extends ContextThemeWrapper * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this * function returns null. * - * @return Returns the object previously returned by - * {@link #onRetainNonConfigurationInstance()}. - * - * @deprecated Use the new {@link Fragment} API + * <p><strong>Note:</strong> For most cases you should use the {@link Fragment} API * {@link Fragment#setRetainInstance(boolean)} instead; this is also - * available on older platforms through the Android compatibility package. + * available on older platforms through the Android support libraries. + * + * @return the object previously returned by {@link #onRetainNonConfigurationInstance()} */ @Nullable - @Deprecated public Object getLastNonConfigurationInstance() { return mLastNonConfigurationInstances != null ? mLastNonConfigurationInstances.activity : null; @@ -2035,12 +2033,12 @@ public class Activity extends ContextThemeWrapper * guarantee for {@link android.os.AsyncTask#doInBackground} since that is * running in a separate thread.) * - * @return Return any Object holding the desired state to propagate to the - * next activity instance. - * - * @deprecated Use the new {@link Fragment} API + * <p><strong>Note:</strong> For most cases you should use the {@link Fragment} API * {@link Fragment#setRetainInstance(boolean)} instead; this is also - * available on older platforms through the Android compatibility package. + * available on older platforms through the Android support libraries. + * + * @return any Object holding the desired state to propagate to the + * next activity instance */ public Object onRetainNonConfigurationInstance() { return null; diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 8b62ef9d568f..811a05bac077 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2307,7 +2307,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM case KEYGUARD_GOING_AWAY_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); - keyguardGoingAway(data.readInt() != 0, data.readInt() != 0); + keyguardGoingAway(data.readInt()); reply.writeNoException(); return true; } @@ -5924,13 +5924,12 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } - public void keyguardGoingAway(boolean disableWindowAnimations, - boolean keyguardGoingToNotificationShade) throws RemoteException { + public void keyguardGoingAway(int flags) + throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); - data.writeInt(disableWindowAnimations ? 1 : 0); - data.writeInt(keyguardGoingToNotificationShade ? 1 : 0); + data.writeInt(flags); mRemote.transact(KEYGUARD_GOING_AWAY_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index 094950bfb3fd..f1784559c20e 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -777,15 +777,16 @@ public class ActivityOptions { /** * Sets the bounds (window size) that the activity should be launched in. + * Rect position should be provided in pixels and in screen coordinates. * Set to null explicitly for fullscreen. * <p> * <strong>NOTE:<strong/> This value is ignored on devices that don't have * {@link android.content.pm.PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT} or * {@link android.content.pm.PackageManager#FEATURE_PICTURE_IN_PICTURE} enabled. - * @param launchBounds Launch bounds to use for the activity or null for fullscreen. + * @param screenSpacePixelRect Launch bounds to use for the activity or null for fullscreen. */ - public ActivityOptions setLaunchBounds(@Nullable Rect launchBounds) { - mLaunchBounds = launchBounds != null ? new Rect(launchBounds) : null; + public ActivityOptions setLaunchBounds(@Nullable Rect screenSpacePixelRect) { + mLaunchBounds = screenSpacePixelRect != null ? new Rect(screenSpacePixelRect) : null; return this; } diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index ca050918d83a..cefb22dd7e50 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1147,7 +1147,7 @@ public class ApplicationPackageManager extends PackageManager { } private Drawable getManagedProfileIconForDensity(UserHandle user, int drawableId, int density) { - UserInfo userInfo = getUserIfProfile(user.getIdentifier()); + UserInfo userInfo = getUserInfo(user.getIdentifier()); if (userInfo != null && userInfo.isManagedProfile()) { return getDrawableForDensity(drawableId, density); } @@ -1156,7 +1156,7 @@ public class ApplicationPackageManager extends PackageManager { @Override public CharSequence getUserBadgedLabel(CharSequence label, UserHandle user) { - UserInfo userInfo = getUserIfProfile(user.getIdentifier()); + UserInfo userInfo = getUserInfo(user.getIdentifier()); if (userInfo != null && userInfo.isManagedProfile()) { return Resources.getSystem().getString( com.android.internal.R.string.managed_profile_label_badge, label); @@ -2252,21 +2252,15 @@ public class ApplicationPackageManager extends PackageManager { private int getBadgeResIdForUser(int userHandle) { // Return the framework-provided badge. - UserInfo userInfo = getUserIfProfile(userHandle); + UserInfo userInfo = getUserInfo(userHandle); if (userInfo != null && userInfo.isManagedProfile()) { return com.android.internal.R.drawable.ic_corp_icon_badge; } return 0; } - private UserInfo getUserIfProfile(int userHandle) { - List<UserInfo> userProfiles = getUserManager().getProfiles(mContext.getUserId()); - for (UserInfo user : userProfiles) { - if (user.id == userHandle) { - return user; - } - } - return null; + private UserInfo getUserInfo(int userHandle) { + return getUserManager().getUserInfo(userHandle); } /** {@hide} */ diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index cdbf598ebb9d..8e87e2661361 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -475,8 +475,13 @@ public interface IActivityManager extends IInterface { public void keyguardWaitingForActivityDrawn() throws RemoteException; - public void keyguardGoingAway(boolean disableWindowAnimations, - boolean keyguardGoingToNotificationShade) throws RemoteException; + /** + * Notify the system that the keyguard is going away. + * + * @param flags See {@link android.view.WindowManagerPolicy#KEYGUARD_GOING_AWAY_FLAG_TO_SHADE} + * etc. + */ + public void keyguardGoingAway(int flags) throws RemoteException; public boolean shouldUpRecreateTask(IBinder token, String destAffinity) throws RemoteException; diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index b8fc32308961..a03fd7236694 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -281,7 +281,7 @@ public final class LoadedApk { addedPaths.addAll(newPaths); } synchronized (this) { - mClassLoader = createOrUpdateClassLoaderLocked(addedPaths); + createOrUpdateClassLoaderLocked(addedPaths); if (mResources != null) { mResources = mActivityThread.getTopLevelResources(mResDir, mSplitResDirs, mOverlayDirs, mApplicationInfo.sharedLibraryFiles, Display.DEFAULT_DISPLAY, @@ -402,101 +402,99 @@ public final class LoadedApk { } } } - - final String zip = TextUtils.join(File.pathSeparator, outZipPaths); } - private ClassLoader createOrUpdateClassLoaderLocked(List<String> addedPaths) { - final ClassLoader classLoader; - if (mIncludeCode && !mPackageName.equals("android")) { - // Avoid the binder call when the package is the current application package. - // The activity manager will perform ensure that dexopt is performed before - // spinning up the process. - if (!Objects.equals(mPackageName, ActivityThread.currentPackageName())) { - VMRuntime.getRuntime().vmInstructionSet(); - try { - ActivityThread.getPackageManager().notifyPackageUse(mPackageName); - } catch (RemoteException re) { - throw re.rethrowFromSystemServer(); - } + private void createOrUpdateClassLoaderLocked(List<String> addedPaths) { + if (mPackageName.equals("android")) { + if (mClassLoader != null) { + // nothing to update + return; } - final List<String> zipPaths = new ArrayList<>(); - final List<String> libPaths = new ArrayList<>(); - - if (mRegisterPackage) { - try { - ActivityManagerNative.getDefault().addPackageDependency(mPackageName); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + if (mBaseClassLoader != null) { + mClassLoader = mBaseClassLoader; + } else { + mClassLoader = ClassLoader.getSystemClassLoader(); } - makePaths(mActivityThread, mApplicationInfo, zipPaths, libPaths); - final String zip = TextUtils.join(File.pathSeparator, zipPaths); - final boolean isBundledApp = mApplicationInfo.isSystemApp() - && !mApplicationInfo.isUpdatedSystemApp(); - String libraryPermittedPath = mDataDir; - if (isBundledApp) { - // This is necessary to grant bundled apps access to - // libraries located in subdirectories of /system/lib - libraryPermittedPath += File.pathSeparator + - System.getProperty("java.library.path"); + return; + } + + // Avoid the binder call when the package is the current application package. + // The activity manager will perform ensure that dexopt is performed before + // spinning up the process. + if (!Objects.equals(mPackageName, ActivityThread.currentPackageName())) { + VMRuntime.getRuntime().vmInstructionSet(); + try { + ActivityThread.getPackageManager().notifyPackageUse(mPackageName); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); } - // DO NOT SHIP: this is a workaround for apps loading native libraries - // provided by 3rd party apps using absolute path instead of corresponding - // classloader; see http://b/26954419 for example. - if (mApplicationInfo.targetSdkVersion <= 23) { - libraryPermittedPath += File.pathSeparator + "/data/app"; + } + + final List<String> zipPaths = new ArrayList<>(); + final List<String> libPaths = new ArrayList<>(); + + if (mRegisterPackage) { + try { + ActivityManagerNative.getDefault().addPackageDependency(mPackageName); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - // ----------------------------------------------------------------------------- + } - final String librarySearchPath = TextUtils.join(File.pathSeparator, libPaths); + makePaths(mActivityThread, mApplicationInfo, zipPaths, libPaths); + final String zip = mIncludeCode ? TextUtils.join(File.pathSeparator, zipPaths) : ""; + final boolean isBundledApp = mApplicationInfo.isSystemApp() + && !mApplicationInfo.isUpdatedSystemApp(); + String libraryPermittedPath = mDataDir; + if (isBundledApp) { + // This is necessary to grant bundled apps access to + // libraries located in subdirectories of /system/lib + libraryPermittedPath += File.pathSeparator + + System.getProperty("java.library.path"); + } + // DO NOT SHIP: this is a workaround for apps loading native libraries + // provided by 3rd party apps using absolute path instead of corresponding + // classloader; see http://b/26954419 for example. + if (mApplicationInfo.targetSdkVersion <= 23) { + libraryPermittedPath += File.pathSeparator + "/data/app"; + } + // ----------------------------------------------------------------------------- - /* - * With all the combination done (if necessary, actually - * create the class loader. - */ + final String librarySearchPath = TextUtils.join(File.pathSeparator, libPaths); - if (ActivityThread.localLOGV) - Slog.v(ActivityThread.TAG, "Class path: " + zip + - ", JNI path: " + librarySearchPath); + /* + * With all the combination done (if necessary, actually + * create the class loader. + */ - if (mClassLoader == null) { - // Temporarily disable logging of disk reads on the Looper thread - // as this is early and necessary. - StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); - - classLoader = ApplicationLoaders.getDefault().getClassLoader(zip, - mApplicationInfo.targetSdkVersion, isBundledApp, librarySearchPath, - libraryPermittedPath, mBaseClassLoader); - - StrictMode.setThreadPolicy(oldPolicy); - } else if (addedPaths != null && addedPaths.size() > 0) { - final String add = TextUtils.join(File.pathSeparator, addedPaths); - ApplicationLoaders.getDefault().addPath(mClassLoader, add); - classLoader = mClassLoader; - } else { - classLoader = mClassLoader; - } - } else { - if (mClassLoader == null) { - if (mBaseClassLoader == null) { - classLoader = ClassLoader.getSystemClassLoader(); - } else { - classLoader = mBaseClassLoader; - } - } else { - classLoader = mClassLoader; - } + if (ActivityThread.localLOGV) + Slog.v(ActivityThread.TAG, "Class path: " + zip + + ", JNI path: " + librarySearchPath); + + if (mClassLoader == null) { + // Temporarily disable logging of disk reads on the Looper thread + // as this is early and necessary. + StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); + + mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, + mApplicationInfo.targetSdkVersion, isBundledApp, librarySearchPath, + libraryPermittedPath, mBaseClassLoader); + + StrictMode.setThreadPolicy(oldPolicy); + } + + if (addedPaths != null && addedPaths.size() > 0) { + final String add = TextUtils.join(File.pathSeparator, addedPaths); + ApplicationLoaders.getDefault().addPath(mClassLoader, add); } - return classLoader; } public ClassLoader getClassLoader() { synchronized (this) { if (mClassLoader == null) { - mClassLoader = createOrUpdateClassLoaderLocked(null /*addedPaths*/); + createOrUpdateClassLoaderLocked(null /*addedPaths*/); } return mClassLoader; } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 88c89648f52e..132b6dd82a88 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3173,16 +3173,9 @@ public class Notification implements Parcelable } private void bindHeaderAppName(RemoteViews contentView) { - PackageManager packageManager = mContext.getPackageManager(); - ApplicationInfo info = null; - try { - info = packageManager.getApplicationInfo(mContext.getApplicationInfo().packageName, - 0); - } catch (final NameNotFoundException e) { - return; - } - CharSequence appName = info != null ? packageManager.getApplicationLabel(info) - : null; + CharSequence appName = mContext.getPackageManager() + .getApplicationLabel(mContext.getApplicationInfo()); + if (TextUtils.isEmpty(appName)) { return; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 10aa7ebc136a..0d4729d8349f 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -913,10 +913,6 @@ public class NotificationManager * (e.g. via sound & vibration) and is applied globally. * @return One of the INTERRUPTION_FILTER_ constants, or INTERRUPTION_FILTER_UNKNOWN when * unavailable. - * - * <p> - * Only available if policy access is granted to this package. - * See {@link #isNotificationPolicyAccessGranted}. */ public final @InterruptionFilter int getCurrentInterruptionFilter() { final INotificationManager service = getService(); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 6c0b69c8afdb..9d7f7246a25d 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -51,6 +51,7 @@ import android.hardware.display.DisplayManager; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.IHdmiControlService; import android.hardware.input.InputManager; +import android.hardware.location.ContextHubManager; import android.hardware.usb.IUsbManager; import android.hardware.usb.UsbManager; import android.hardware.radio.RadioManager; @@ -765,6 +766,14 @@ final class SystemServiceRegistry { public SystemHealthManager createService(ContextImpl ctx) { return new SystemHealthManager(); }}); + + registerService(Context.CONTEXTHUB_SERVICE, ContextHubManager.class, + new CachedServiceFetcher<ContextHubManager>() { + @Override + public ContextHubManager createService(ContextImpl ctx) { + return new ContextHubManager(ctx.getOuterContext(), + ctx.mMainThread.getHandler().getLooper()); + }}); } /** diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java index a34e8551ed4b..3be2cdc92541 100644 --- a/core/java/android/app/admin/DeviceAdminReceiver.java +++ b/core/java/android/app/admin/DeviceAdminReceiver.java @@ -284,10 +284,11 @@ public class DeviceAdminReceiver extends BroadcastReceiver { public static final String EXTRA_BUGREPORT_HASH = "android.app.extra.BUGREPORT_HASH"; /** - * An {@code int} failure code representing the reason of the bugreport failure. + * An {@code int} failure code representing the reason of the bugreport failure. One of + * {@link #BUGREPORT_FAILURE_FAILED_COMPLETING} + * or {@link #BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE} * * @see #ACTION_BUGREPORT_FAILED - * @see #BUGREPORT_FAILURE_FAILED_COMPLETING, #BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE * @hide */ public static final String EXTRA_BUGREPORT_FAILURE_REASON = @@ -305,9 +306,24 @@ public class DeviceAdminReceiver extends BroadcastReceiver { BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE }) public @interface BugreportFailureCode {} - /** Bugreport completion process failed. */ + + /** + * Bugreport completion process failed. + * + * <p>If this error code is received, the requesting of bugreport can be retried. + * @see DevicePolicyManager#requestBugreport + */ public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; - /** Bugreport is no longer available for collection. */ + + /** + * Bugreport has been created, but is no longer available for collection. + * + * <p>This error likely occurs because the user of the device hasn't consented to share + * the bugreport for a long period after its creation. + * + * <p>If this error code is received, the requesting of bugreport can be retried. + * @see DevicePolicyManager#requestBugreport + */ public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; /** @hide */ @@ -598,7 +614,8 @@ public class DeviceAdminReceiver extends BroadcastReceiver { * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. * @param failureCode int containing failure code. One of - * #BUGREPORT_FAILURE_FAILED_COMPLETING or #BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE + * {@link #BUGREPORT_FAILURE_FAILED_COMPLETING} + * or {@link #BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE} * @see DevicePolicyManager#requestBugreport */ public void onBugreportFailed(Context context, Intent intent, diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index ec1e3e67fbe3..90949129f4b1 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -25,16 +25,13 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; import android.annotation.UserIdInt; import android.app.Activity; -import android.auditing.SecurityLog; import android.auditing.SecurityLog.SecurityEvent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; -import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.graphics.Bitmap; import android.net.ProxyInfo; @@ -51,13 +48,12 @@ import android.provider.ContactsContract.Directory; import android.provider.Settings; import android.security.Credentials; import android.service.restrictions.RestrictionsReceiver; +import android.telephony.TelephonyManager; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.org.conscrypt.TrustedCertificateStore; -import org.xmlpull.v1.XmlPullParserException; - import java.io.ByteArrayInputStream; import java.io.IOException; import java.lang.annotation.Retention; @@ -80,18 +76,18 @@ import java.util.Set; /** * Public interface for managing policies enforced on a device. Most clients of this class must be - * registered with the system as a - * <a href="{@docRoot}guide/topics/admin/device-admin.html">device administrator</a>. Additionally, - * a device administrator may be registered as either a profile or device owner. A given method is - * accessible to all device administrators unless the documentation for that method specifies that - * it is restricted to either device or profile owners. - * + * registered with the system as a <a href="{@docRoot}guide/topics/admin/device-admin.html">device + * administrator</a>. Additionally, a device administrator may be registered as either a profile or + * device owner. A given method is accessible to all device administrators unless the documentation + * for that method specifies that it is restricted to either device or profile owners. Any + * application calling an api may only pass as an argument a device administrator component it + * owns. Otherwise, a {@link SecurityException} will be thrown. * <div class="special reference"> * <h3>Developer Guides</h3> - * <p>For more information about managing policies for device administration, read the - * <a href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a> - * developer guide. - * </div> + * <p> + * For more information about managing policies for device administration, read the <a href= + * "{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a> developer + * guide. </div> */ public class DevicePolicyManager { private static String TAG = "DevicePolicyManager"; @@ -1032,8 +1028,11 @@ public class DevicePolicyManager { public @interface UserProvisioningState {} /** - * Return true if the given administrator component is currently - * active (enabled) in the system. + * Return true if the given administrator component is currently active (enabled) in the system. + * + * @param admin The administrator component to check for. + * @return {@code true} if {@code admin} is currently enabled in the system, {@code false} + * otherwise */ public boolean isAdminActive(@NonNull ComponentName admin) { return isAdminActiveAsUser(admin, myUserId()); @@ -1127,6 +1126,9 @@ public class DevicePolicyManager { * * <p>Note that the operation is not synchronous and the admin might still be active (as * indicated by {@link #getActiveAdmins()}) by the time this method returns. + * + * @param admin The administration compononent to remove. + * @throws SecurityException if the caller is not in the owner application of {@code admin}. */ public void removeActiveAdmin(@NonNull ComponentName admin) { if (mService != null) { @@ -1139,13 +1141,14 @@ public class DevicePolicyManager { } /** - * Returns true if an administrator has been granted a particular device policy. This can - * be used to check whether the administrator was activated under an earlier set of policies, - * but requires additional policies after an upgrade. + * Returns true if an administrator has been granted a particular device policy. This can be + * used to check whether the administrator was activated under an earlier set of policies, but + * requires additional policies after an upgrade. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Must be - * an active administrator, or an exception will be thrown. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Must be an + * active administrator, or an exception will be thrown. * @param usesPolicy Which uses-policy to check, as defined in {@link DeviceAdminInfo}. + * @throws SecurityException if {@code admin} is not an active administrator. */ public boolean hasGrantedPolicy(@NonNull ComponentName admin, int usesPolicy) { if (mService != null) { @@ -1252,34 +1255,32 @@ public class DevicePolicyManager { public static final int PASSWORD_QUALITY_MANAGED = 0x80000; /** - * Called by an application that is administering the device to set the - * password restrictions it is imposing. After setting this, the user - * will not be able to enter a new password that is not at least as - * restrictive as what has been set. Note that the current password - * will remain until the user has set a new one, so the change does not - * take place immediately. To prompt the user for a new password, use - * {@link #ACTION_SET_NEW_PASSWORD} or + * Called by an application that is administering the device to set the password restrictions it + * is imposing. After setting this, the user will not be able to enter a new password that is + * not at least as restrictive as what has been set. Note that the current password will remain + * until the user has set a new one, so the change does not take place immediately. To prompt + * the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after calling this method. - * - * <p>Quality constants are ordered so that higher values are more restrictive; - * thus the highest requested quality constant (between the policy set here, - * the user's preference, and any other considerations) is the one that - * is in effect. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * <p> + * Quality constants are ordered so that higher values are more restrictive; thus the highest + * requested quality constant (between the policy set here, the user's preference, and any other + * considerations) is the one that is in effect. + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param quality The new desired quality. One of - * {@link #PASSWORD_QUALITY_UNSPECIFIED}, {@link #PASSWORD_QUALITY_SOMETHING}, - * {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, - * {@link #PASSWORD_QUALITY_ALPHABETIC}, {@link #PASSWORD_QUALITY_ALPHANUMERIC} - * or {@link #PASSWORD_QUALITY_COMPLEX}. + * @param quality The new desired quality. One of {@link #PASSWORD_QUALITY_UNSPECIFIED}, + * {@link #PASSWORD_QUALITY_SOMETHING}, {@link #PASSWORD_QUALITY_NUMERIC}, + * {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC}, + * {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}. + * @throws SecurityException if {@code admin} is not an active administrator or if {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public void setPasswordQuality(@NonNull ComponentName admin, int quality) { if (mService != null) { @@ -1320,30 +1321,30 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to set the - * minimum allowed password length. After setting this, the user - * will not be able to enter a new password that is not at least as - * restrictive as what has been set. Note that the current password - * will remain until the user has set a new one, so the change does not - * take place immediately. To prompt the user for a new password, use - * {@link #ACTION_SET_NEW_PASSWORD} or - * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This - * constraint is only imposed if the administrator has also requested either - * {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, - * {@link #PASSWORD_QUALITY_ALPHABETIC}, {@link #PASSWORD_QUALITY_ALPHANUMERIC}, - * or {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * Called by an application that is administering the device to set the minimum allowed password + * length. After setting this, the user will not be able to enter a new password that is not at + * least as restrictive as what has been set. Note that the current password will remain until + * the user has set a new one, so the change does not take place immediately. To prompt the user + * for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or + * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is + * only imposed if the administrator has also requested either {@link #PASSWORD_QUALITY_NUMERIC} + * , {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC}, + * {@link #PASSWORD_QUALITY_ALPHANUMERIC}, or {@link #PASSWORD_QUALITY_COMPLEX} with + * {@link #setPasswordQuality}. + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param length The new desired minimum password length. A value of 0 - * means there is no restriction. + * @param length The new desired minimum password length. A value of 0 means there is no + * restriction. + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public void setPasswordMinimumLength(@NonNull ComponentName admin, int length) { if (mService != null) { @@ -1385,31 +1386,28 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to set the - * minimum number of upper case letters required in the password. After - * setting this, the user will not be able to enter a new password that is - * not at least as restrictive as what has been set. Note that the current - * password will remain until the user has set a new one, so the change does - * not take place immediately. To prompt the user for a new password, use - * {@link #ACTION_SET_NEW_PASSWORD} or - * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This - * constraint is only imposed if the administrator has also requested - * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The - * default value is 0. + * Called by an application that is administering the device to set the minimum number of upper + * case letters required in the password. After setting this, the user will not be able to enter + * a new password that is not at least as restrictive as what has been set. Note that the + * current password will remain until the user has set a new one, so the change does not take + * place immediately. To prompt the user for a new password, use + * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after + * setting this value. This constraint is only imposed if the administrator has also requested + * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0. * <p> * The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param length The new desired minimum number of upper case letters - * required in the password. A value of 0 means there is no - * restriction. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param length The new desired minimum number of upper case letters required in the password. + * A value of 0 means there is no restriction. + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public void setPasswordMinimumUpperCase(@NonNull ComponentName admin, int length) { if (mService != null) { @@ -1457,31 +1455,28 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to set the - * minimum number of lower case letters required in the password. After - * setting this, the user will not be able to enter a new password that is - * not at least as restrictive as what has been set. Note that the current - * password will remain until the user has set a new one, so the change does - * not take place immediately. To prompt the user for a new password, use - * {@link #ACTION_SET_NEW_PASSWORD} or - * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This - * constraint is only imposed if the administrator has also requested - * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The - * default value is 0. + * Called by an application that is administering the device to set the minimum number of lower + * case letters required in the password. After setting this, the user will not be able to enter + * a new password that is not at least as restrictive as what has been set. Note that the + * current password will remain until the user has set a new one, so the change does not take + * place immediately. To prompt the user for a new password, use + * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after + * setting this value. This constraint is only imposed if the administrator has also requested + * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0. * <p> * The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param length The new desired minimum number of lower case letters - * required in the password. A value of 0 means there is no - * restriction. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param length The new desired minimum number of lower case letters required in the password. + * A value of 0 means there is no restriction. + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public void setPasswordMinimumLowerCase(@NonNull ComponentName admin, int length) { if (mService != null) { @@ -1529,30 +1524,28 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to set the - * minimum number of letters required in the password. After setting this, - * the user will not be able to enter a new password that is not at least as - * restrictive as what has been set. Note that the current password will - * remain until the user has set a new one, so the change does not take - * place immediately. To prompt the user for a new password, use - * {@link #ACTION_SET_NEW_PASSWORD} or - * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This - * constraint is only imposed if the administrator has also requested - * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The - * default value is 1. + * Called by an application that is administering the device to set the minimum number of + * letters required in the password. After setting this, the user will not be able to enter a + * new password that is not at least as restrictive as what has been set. Note that the current + * password will remain until the user has set a new one, so the change does not take place + * immediately. To prompt the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or + * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is + * only imposed if the administrator has also requested {@link #PASSWORD_QUALITY_COMPLEX} with + * {@link #setPasswordQuality}. The default value is 1. * <p> * The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param length The new desired minimum number of letters required in the - * password. A value of 0 means there is no restriction. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param length The new desired minimum number of letters required in the password. A value of + * 0 means there is no restriction. + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public void setPasswordMinimumLetters(@NonNull ComponentName admin, int length) { if (mService != null) { @@ -1599,30 +1592,28 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to set the - * minimum number of numerical digits required in the password. After - * setting this, the user will not be able to enter a new password that is - * not at least as restrictive as what has been set. Note that the current - * password will remain until the user has set a new one, so the change does - * not take place immediately. To prompt the user for a new password, use - * {@link #ACTION_SET_NEW_PASSWORD} or - * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This - * constraint is only imposed if the administrator has also requested - * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The - * default value is 1. + * Called by an application that is administering the device to set the minimum number of + * numerical digits required in the password. After setting this, the user will not be able to + * enter a new password that is not at least as restrictive as what has been set. Note that the + * current password will remain until the user has set a new one, so the change does not take + * place immediately. To prompt the user for a new password, use + * {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after + * setting this value. This constraint is only imposed if the administrator has also requested + * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 1. * <p> * The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param length The new desired minimum number of numerical digits required - * in the password. A value of 0 means there is no restriction. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param length The new desired minimum number of numerical digits required in the password. A + * value of 0 means there is no restriction. + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public void setPasswordMinimumNumeric(@NonNull ComponentName admin, int length) { if (mService != null) { @@ -1669,30 +1660,28 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to set the - * minimum number of symbols required in the password. After setting this, - * the user will not be able to enter a new password that is not at least as - * restrictive as what has been set. Note that the current password will - * remain until the user has set a new one, so the change does not take - * place immediately. To prompt the user for a new password, use - * {@link #ACTION_SET_NEW_PASSWORD} or - * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This - * constraint is only imposed if the administrator has also requested - * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The - * default value is 1. + * Called by an application that is administering the device to set the minimum number of + * symbols required in the password. After setting this, the user will not be able to enter a + * new password that is not at least as restrictive as what has been set. Note that the current + * password will remain until the user has set a new one, so the change does not take place + * immediately. To prompt the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or + * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is + * only imposed if the administrator has also requested {@link #PASSWORD_QUALITY_COMPLEX} with + * {@link #setPasswordQuality}. The default value is 1. * <p> * The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param length The new desired minimum number of symbols required in the - * password. A value of 0 means there is no restriction. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param length The new desired minimum number of symbols required in the password. A value of + * 0 means there is no restriction. + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public void setPasswordMinimumSymbols(@NonNull ComponentName admin, int length) { if (mService != null) { @@ -1738,30 +1727,28 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to set the - * minimum number of non-letter characters (numerical digits or symbols) - * required in the password. After setting this, the user will not be able - * to enter a new password that is not at least as restrictive as what has - * been set. Note that the current password will remain until the user has - * set a new one, so the change does not take place immediately. To prompt - * the user for a new password, use {@link #ACTION_SET_NEW_PASSWORD} or - * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after - * setting this value. This constraint is only imposed if the administrator - * has also requested {@link #PASSWORD_QUALITY_COMPLEX} with - * {@link #setPasswordQuality}. The default value is 0. + * Called by an application that is administering the device to set the minimum number of + * non-letter characters (numerical digits or symbols) required in the password. After setting + * this, the user will not be able to enter a new password that is not at least as restrictive + * as what has been set. Note that the current password will remain until the user has set a new + * one, so the change does not take place immediately. To prompt the user for a new password, + * use {@link #ACTION_SET_NEW_PASSWORD} or {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after + * setting this value. This constraint is only imposed if the administrator has also requested + * {@link #PASSWORD_QUALITY_COMPLEX} with {@link #setPasswordQuality}. The default value is 0. * <p> * The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param length The new desired minimum number of letters required in the - * password. A value of 0 means there is no restriction. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param length The new desired minimum number of letters required in the password. A value of + * 0 means there is no restriction. + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public void setPasswordMinimumNonLetter(@NonNull ComponentName admin, int length) { if (mService != null) { @@ -1807,33 +1794,31 @@ public class DevicePolicyManager { return 0; } - /** - * Called by an application that is administering the device to set the length - * of the password history. After setting this, the user will not be able to - * enter a new password that is the same as any password in the history. Note - * that the current password will remain until the user has set a new one, so - * the change does not take place immediately. To prompt the user for a new - * password, use {@link #ACTION_SET_NEW_PASSWORD} or - * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. - * This constraint is only imposed if the administrator has also requested - * either {@link #PASSWORD_QUALITY_NUMERIC}, {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX} - * {@link #PASSWORD_QUALITY_ALPHABETIC}, or {@link #PASSWORD_QUALITY_ALPHANUMERIC} - * with {@link #setPasswordQuality}. - * - * <p> - * The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this - * method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. - * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param length The new desired length of password history. A value of 0 - * means there is no restriction. - */ + /** + * Called by an application that is administering the device to set the length of the password + * history. After setting this, the user will not be able to enter a new password that is the + * same as any password in the history. Note that the current password will remain until the + * user has set a new one, so the change does not take place immediately. To prompt the user for + * a new password, use {@link #ACTION_SET_NEW_PASSWORD} or + * {@link #ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} after setting this value. This constraint is + * only imposed if the administrator has also requested either {@link #PASSWORD_QUALITY_NUMERIC} + * , {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX} {@link #PASSWORD_QUALITY_ALPHABETIC}, or + * {@link #PASSWORD_QUALITY_ALPHANUMERIC} with {@link #setPasswordQuality}. + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param length The new desired length of password history. A value of 0 means there is no + * restriction. + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} + */ public void setPasswordHistoryLength(@NonNull ComponentName admin, int length) { if (mService != null) { try { @@ -1845,30 +1830,32 @@ public class DevicePolicyManager { } /** - * Called by a device admin to set the password expiration timeout. Calling this method - * will restart the countdown for password expiration for the given admin, as will changing - * the device password (for all admins). - * - * <p>The provided timeout is the time delta in ms and will be added to the current time. - * For example, to have the password expire 5 days from now, timeout would be - * 5 * 86400 * 1000 = 432000000 ms for timeout. - * - * <p>To disable password expiration, a value of 0 may be used for timeout. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this - * method; if it has not, a security exception will be thrown. - * - * <p> Note that setting the password will automatically reset the expiration time for all - * active admins. Active admins do not need to explicitly call this method in that case. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * Called by a device admin to set the password expiration timeout. Calling this method will + * restart the countdown for password expiration for the given admin, as will changing the + * device password (for all admins). + * <p> + * The provided timeout is the time delta in ms and will be added to the current time. For + * example, to have the password expire 5 days from now, timeout would be 5 * 86400 * 1000 = + * 432000000 ms for timeout. + * <p> + * To disable password expiration, a value of 0 may be used for timeout. + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * Note that setting the password will automatically reset the expiration time for all active + * admins. Active admins do not need to explicitly call this method in that case. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param timeout The limit (in ms) that a password can remain in effect. A value of 0 - * means there is no restriction (unlimited). + * @param timeout The limit (in ms) that a password can remain in effect. A value of 0 means + * there is no restriction (unlimited). + * @throws SecurityException if {@code admin} is not an active administrator or {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} */ public void setPasswordExpirationTimeout(@NonNull ComponentName admin, long timeout) { if (mService != null) { @@ -1970,20 +1957,22 @@ public class DevicePolicyManager { } /** - * Determine whether the current password the user has set is sufficient - * to meet the policy requirements (e.g. quality, minimum length) that have been - * requested by the admins of this user and its participating profiles. - * Restrictions on profiles that have a separate challenge are not taken into account. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to determine - * if the password set on the parent profile is sufficient. + * Determine whether the current password the user has set is sufficient to meet the policy + * requirements (e.g. quality, minimum length) that have been requested by the admins of this + * user and its participating profiles. Restrictions on profiles that have a separate challenge + * are not taken into account. + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to determine if the password set on + * the parent profile is sufficient. * * @return Returns true if the password meets the current requirements, else false. + * @throws SecurityException if the calling application does not own an active administrator + * that uses {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} */ public boolean isActivePasswordSufficient() { if (mService != null) { @@ -2003,6 +1992,7 @@ public class DevicePolicyManager { * * @param userHandle the userId of the profile to check the password for. * @return Returns true if the password would meet the current requirements, else false. + * @throws SecurityException if {@code userHandle} is not a managed profile. * @hide */ public boolean isProfileActivePasswordSufficientForParent(int userHandle) { @@ -2017,16 +2007,20 @@ public class DevicePolicyManager { } /** - * Retrieve the number of times the user has failed at entering a - * password since that last successful password entry. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve - * the number of failed password attemts for the parent user. + * Retrieve the number of times the user has failed at entering a password since that last + * successful password entry. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to retrieve the number of failed + * password attemts for the parent user. + * <p> + * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} + * to be able to call this method; if it has not, a security exception will be thrown. * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} to be able to call - * this method; if it has not, a security exception will be thrown. + * @return The number of times user has entered an incorrect password since the last correct + * password entry. + * @throws SecurityException if the calling application does not own an active administrator + * that uses {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} */ public int getCurrentFailedPasswordAttempts() { return getCurrentFailedPasswordAttempts(myUserId()); @@ -2071,27 +2065,28 @@ public class DevicePolicyManager { } /** - * Setting this to a value greater than zero enables a built-in policy - * that will perform a device or profile wipe after too many incorrect - * device-unlock passwords have been entered. This built-in policy combines - * watching for failed passwords and wiping the device, and requires - * that you request both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and + * Setting this to a value greater than zero enables a built-in policy that will perform a + * device or profile wipe after too many incorrect device-unlock passwords have been entered. + * This built-in policy combines watching for failed passwords and wiping the device, and + * requires that you request both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}}. - * - * <p>To implement any other policy (e.g. wiping data for a particular - * application only, erasing or revoking credentials, or reporting the - * failure to a server), you should implement - * {@link DeviceAdminReceiver#onPasswordFailed(Context, android.content.Intent)} - * instead. Do not use this API, because if the maximum count is reached, - * the device or profile will be wiped immediately, and your callback will not be invoked. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * a value on the parent profile. + * <p> + * To implement any other policy (e.g. wiping data for a particular application only, erasing or + * revoking credentials, or reporting the failure to a server), you should implement + * {@link DeviceAdminReceiver#onPasswordFailed(Context, android.content.Intent)} instead. Do not + * use this API, because if the maximum count is reached, the device or profile will be wiped + * immediately, and your callback will not be invoked. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set a value on the parent + * profile. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param num The number of failed password attempts at which point the - * device or profile will be wiped. + * @param num The number of failed password attempts at which point the device or profile will + * be wiped. + * @throws SecurityException if {@code admin} is not an active administrator or does not use + * both {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN} and + * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}. */ public void setMaximumFailedPasswordsForWipe(@NonNull ComponentName admin, int num) { if (mService != null) { @@ -2169,42 +2164,41 @@ public class DevicePolicyManager { public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 0x0002; /** - * Force a new device unlock password (the password needed to access the - * entire device, not for individual accounts) on the user. This takes - * effect immediately. - * - * <p>Calling this from a managed profile that shares the password with the owner profile - * will throw a security exception. - * - * <p><em>Note: This API has been limited as of {@link android.os.Build.VERSION_CODES#N} for + * Force a new device unlock password (the password needed to access the entire device, not for + * individual accounts) on the user. This takes effect immediately. + * <p> + * Calling this from a managed profile that shares the password with the owner profile will + * throw a security exception. + * <p> + * <em>Note: This API has been limited as of {@link android.os.Build.VERSION_CODES#N} for * device admins that are not device owner and not profile owner. * The password can now only be changed if there is currently no password set. Device owner * and profile owner can still do this.</em> - * - * <p>The given password must be sufficient for the - * current password quality and length constraints as returned by - * {@link #getPasswordQuality(ComponentName)} and - * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet - * these constraints, then it will be rejected and false returned. Note - * that the password may be a stronger quality (containing alphanumeric - * characters when the requested quality is only numeric), in which case - * the currently active quality will be increased to match. - * - * <p>Calling with a null or empty password will clear any existing PIN, - * pattern or password if the current password constraints allow it. <em>Note: This will not + * <p> + * The given password must be sufficient for the current password quality and length constraints + * as returned by {@link #getPasswordQuality(ComponentName)} and + * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet these constraints, then + * it will be rejected and false returned. Note that the password may be a stronger quality + * (containing alphanumeric characters when the requested quality is only numeric), in which + * case the currently active quality will be increased to match. + * <p> + * Calling with a null or empty password will clear any existing PIN, pattern or password if the + * current password constraints allow it. <em>Note: This will not * work in {@link android.os.Build.VERSION_CODES#N} and later for device admins that are not * device owner and not profile owner. Once set, the password cannot be changed to null or * empty, except by device owner or profile owner.</em> - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call - * this method; if it has not, a security exception will be thrown. + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call this method; if it has + * not, a security exception will be thrown. * * @param password The new password for the user. Null or empty clears the password. * @param flags May be 0 or combination of {@link #RESET_PASSWORD_REQUIRE_ENTRY} and - * {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}. - * @return Returns true if the password was applied, or false if it is - * not acceptable for the current constraints or if the user has not been decrypted yet. + * {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}. + * @return Returns true if the password was applied, or false if it is not acceptable for the + * current constraints or if the user has not been decrypted yet. + * @throws SecurityException if the calling application does not own an active administrator + * that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} */ public boolean resetPassword(String password, int flags) { if (mParentInstance) { @@ -2221,21 +2215,22 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to set the - * maximum time for user activity until the device will lock. This limits - * the length that the user can set. It takes effect immediately. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to set - * restrictions on the parent profile. + * Called by an application that is administering the device to set the maximum time for user + * activity until the device will lock. This limits the length that the user can set. It takes + * effect immediately. + * <p> + * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} + * to be able to call this method; if it has not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param timeMs The new desired maximum time to lock in milliseconds. - * A value of 0 means there is no restriction. + * @param timeMs The new desired maximum time to lock in milliseconds. A value of 0 means there + * is no restriction. + * @throws SecurityException if {@code admin} is not an active administrator or it does not use + * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} */ public void setMaximumTimeToLock(@NonNull ComponentName admin, long timeMs) { if (mService != null) { @@ -2278,16 +2273,17 @@ public class DevicePolicyManager { } /** - * Make the device lock immediately, as if the lock screen timeout has - * expired at the point of this call. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call - * this method; if it has not, a security exception will be thrown. + * Make the device lock immediately, as if the lock screen timeout has expired at the point of + * this call. + * <p> + * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} + * to be able to call this method; if it has not, a security exception will be thrown. + * <p> + * This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to lock the parent profile. * - * <p>This method can be called on the {@link DevicePolicyManager} instance - * returned by {@link #getParentProfileInstance(ComponentName)} in order to lock - * the parent profile. + * @throws SecurityException if the calling application does not own an active administrator + * that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} */ public void lockNow() { if (mService != null) { @@ -2315,16 +2311,16 @@ public class DevicePolicyManager { public static final int WIPE_RESET_PROTECTION_DATA = 0x0002; /** - * Ask the user data be wiped. Wiping the primary user will cause the - * device to reboot, erasing all user data while next booting up. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to be able to call - * this method; if it has not, a security exception will be thrown. + * Ask the user data be wiped. Wiping the primary user will cause the device to reboot, erasing + * all user data while next booting up. + * <p> + * The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to + * be able to call this method; if it has not, a security exception will be thrown. * - * @param flags Bit mask of additional options: currently supported flags - * are {@link #WIPE_EXTERNAL_STORAGE} and - * {@link #WIPE_RESET_PROTECTION_DATA}. + * @param flags Bit mask of additional options: currently supported flags are + * {@link #WIPE_EXTERNAL_STORAGE} and {@link #WIPE_RESET_PROTECTION_DATA}. + * @throws SecurityException if the calling application does not own an active administrator + * that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} */ public void wipeData(int flags) { if (mService != null) { @@ -2408,20 +2404,20 @@ public class DevicePolicyManager { } /** - * Set a network-independent global HTTP proxy. This is not normally what you want - * for typical HTTP proxies - they are generally network dependent. However if you're - * doing something unusual like general internal filtering this may be useful. On - * a private network where the proxy is not accessible, you may break HTTP using this. - * - * <p>This method requires the caller to be the device owner. + * Set a network-independent global HTTP proxy. This is not normally what you want for typical + * HTTP proxies - they are generally network dependent. However if you're doing something + * unusual like general internal filtering this may be useful. On a private network where the + * proxy is not accessible, you may break HTTP using this. + * <p> + * This method requires the caller to be the device owner. + * <p> + * This proxy is only a recommendation and it is possible that some apps will ignore it. * - * <p>This proxy is only a recommendation and it is possible that some apps will ignore it. * @see ProxyInfo - * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param proxyInfo The a {@link ProxyInfo} object defining the new global - * HTTP proxy. A {@code null} value will clear the global HTTP proxy. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param proxyInfo The a {@link ProxyInfo} object defining the new global HTTP proxy. A + * {@code null} value will clear the global HTTP proxy. + * @throws SecurityException if {@code admin} is not the device owner. */ public void setRecommendedGlobalProxy(@NonNull ComponentName admin, @Nullable ProxyInfo proxyInfo) { @@ -2544,36 +2540,35 @@ public class DevicePolicyManager { public static final int KEYGUARD_DISABLE_FEATURES_ALL = 0x7fffffff; /** - * Called by an application that is administering the device to - * request that the storage system be encrypted. - * - * <p>When multiple device administrators attempt to control device - * encryption, the most secure, supported setting will always be - * used. If any device administrator requests device encryption, - * it will be enabled; Conversely, if a device administrator - * attempts to disable device encryption while another - * device administrator has enabled it, the call to disable will + * Called by an application that is administering the device to request that the storage system + * be encrypted. + * <p> + * When multiple device administrators attempt to control device encryption, the most secure, + * supported setting will always be used. If any device administrator requests device + * encryption, it will be enabled; Conversely, if a device administrator attempts to disable + * device encryption while another device administrator has enabled it, the call to disable will * fail (most commonly returning {@link #ENCRYPTION_STATUS_ACTIVE}). - * - * <p>This policy controls encryption of the secure (application data) storage area. Data - * written to other storage areas may or may not be encrypted, and this policy does not require - * or control the encryption of any other storage areas. - * There is one exception: If {@link android.os.Environment#isExternalStorageEmulated()} is - * {@code true}, then the directory returned by - * {@link android.os.Environment#getExternalStorageDirectory()} must be written to disk - * within the encrypted storage area. - * - * <p>Important Note: On some devices, it is possible to encrypt storage without requiring - * the user to create a device PIN or Password. In this case, the storage is encrypted, but - * the encryption key may not be fully secured. For maximum security, the administrator should - * also require (and check for) a pattern, PIN, or password. + * <p> + * This policy controls encryption of the secure (application data) storage area. Data written + * to other storage areas may or may not be encrypted, and this policy does not require or + * control the encryption of any other storage areas. There is one exception: If + * {@link android.os.Environment#isExternalStorageEmulated()} is {@code true}, then the + * directory returned by {@link android.os.Environment#getExternalStorageDirectory()} must be + * written to disk within the encrypted storage area. + * <p> + * Important Note: On some devices, it is possible to encrypt storage without requiring the user + * to create a device PIN or Password. In this case, the storage is encrypted, but the + * encryption key may not be fully secured. For maximum security, the administrator should also + * require (and check for) a pattern, PIN, or password. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param encrypt true to request encryption, false to release any previous request * @return the new request status (for all active admins) - will be one of - * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, or - * {@link #ENCRYPTION_STATUS_ACTIVE}. This is the value of the requests; Use - * {@link #getStorageEncryptionStatus()} to query the actual device state. + * {@link #ENCRYPTION_STATUS_UNSUPPORTED}, {@link #ENCRYPTION_STATUS_INACTIVE}, or + * {@link #ENCRYPTION_STATUS_ACTIVE}. This is the value of the requests; Use + * {@link #getStorageEncryptionStatus()} to query the actual device state. + * @throws SecurityException if {@code admin} is not an active administrator or does not use + * {@link DeviceAdminInfo#USES_ENCRYPTED_STORAGE} */ public int setStorageEncryption(@NonNull ComponentName admin, boolean encrypt) { if (mService != null) { @@ -2650,6 +2645,8 @@ public class DevicePolicyManager { * * @return false if the certBuffer cannot be parsed or installation is * interrupted, true otherwise. + * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile + * owner. */ public boolean installCaCert(@Nullable ComponentName admin, byte[] certBuffer) { if (mService != null) { @@ -2668,6 +2665,8 @@ public class DevicePolicyManager { * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or * {@code null} if calling from a delegated certificate installer. * @param certBuffer encoded form of the certificate to remove. + * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile + * owner. */ public void uninstallCaCert(@Nullable ComponentName admin, byte[] certBuffer) { if (mService != null) { @@ -2690,6 +2689,8 @@ public class DevicePolicyManager { * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or * {@code null} if calling from a delegated certificate installer. * @return a List of byte[] arrays, each encoding one user CA certificate. + * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile + * owner. */ public List<byte[]> getInstalledCaCerts(@Nullable ComponentName admin) { List<byte[]> certs = new ArrayList<byte[]>(); @@ -2717,6 +2718,8 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or * {@code null} if calling from a delegated certificate installer. + * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile + * owner. */ public void uninstallAllUserCaCerts(@Nullable ComponentName admin) { if (mService != null) { @@ -2735,6 +2738,8 @@ public class DevicePolicyManager { * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or * {@code null} if calling from a delegated certificate installer. * @param certBuffer encoded form of the certificate to look up. + * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile + * owner. */ public boolean hasCaCertInstalled(@Nullable ComponentName admin, byte[] certBuffer) { if (mService != null) { @@ -2769,6 +2774,8 @@ public class DevicePolicyManager { * @param alias The private key alias under which to install the certificate. If a certificate * with that alias already exists, it will be overwritten. * @return {@code true} if the keys were installed, {@code false} otherwise. + * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile + * owner. */ public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey, @NonNull Certificate cert, @NonNull String alias) { @@ -2794,6 +2801,8 @@ public class DevicePolicyManager { * credentials immediately. Otherwise, access to the credentials will be gated by user * approval. * @return {@code true} if the keys were installed, {@code false} otherwise. + * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile + * owner. */ public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey, @NonNull Certificate cert, @NonNull String alias, boolean requestAccess) { @@ -2820,6 +2829,8 @@ public class DevicePolicyManager { * {@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 private key alias no longer exists, {@code false} otherwise. + * @throws SecurityException if {@code admin} is not {@code null} and not a device or profile + * owner. */ public boolean removeKeyPair(@Nullable ComponentName admin, @NonNull String alias) { try { @@ -2849,15 +2860,16 @@ public class DevicePolicyManager { * Delegated certificate installer is a per-user state. The delegated access is persistent until * it is later cleared by calling this method with a null value or uninstallling the certificate * installer. - *<p> + * <p> * <b>Note:</b>Starting from {@link android.os.Build.VERSION_CODES#N}, if the caller * application's target SDK version is {@link android.os.Build.VERSION_CODES#N} or newer, the - * supplied certificate installer package must be installed when calling this API, - * otherwise an {@link IllegalArgumentException} will be thrown. + * supplied certificate installer package must be installed when calling this API, otherwise an + * {@link IllegalArgumentException} will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param installerPackage The package name of the certificate installer which will be given - * access. If {@code null} is given the current package will be cleared. + * access. If {@code null} is given the current package will be cleared. + * @throws SecurityException if {@code admin} is not a device or a profile owner. */ public void setCertInstallerPackage(@NonNull ComponentName admin, @Nullable String installerPackage) throws SecurityException { @@ -2871,12 +2883,13 @@ public class DevicePolicyManager { } /** - * Called by a profile owner or device owner to retrieve the certificate installer for the - * user. null if none is set. + * Called by a profile owner or device owner to retrieve the certificate installer for the user. + * null if none is set. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @return The package name of the current delegated certificate installer, or {@code null} - * if none is set. + * @return The package name of the current delegated certificate installer, or {@code null} if + * none is set. + * @throws SecurityException if {@code admin} is not a device or a profile owner. */ public String getCertInstallerPackage(@NonNull ComponentName admin) throws SecurityException { if (mService != null) { @@ -2891,18 +2904,18 @@ public class DevicePolicyManager { /** * Called by a device or profile owner to configure an always-on VPN connection through a - * specific application for the current user. - * This connection is automatically granted and persisted after a reboot. - * - * <p>The designated package should declare a {@link android.net.VpnService} in its - * manifest guarded by {@link android.Manifest.permission#BIND_VPN_SERVICE}, - * otherwise the call will fail. - * - * @param vpnPackage The package name for an installed VPN app on the device, or {@code null} - * to remove an existing always-on VPN configuration. + * specific application for the current user. This connection is automatically granted and + * persisted after a reboot. + * <p> + * The designated package should declare a {@link android.net.VpnService} in its manifest + * guarded by {@link android.Manifest.permission#BIND_VPN_SERVICE}, otherwise the call will + * fail. * - * @return {@code true} if the package is set as always-on VPN controller; - * {@code false} otherwise. + * @param vpnPackage The package name for an installed VPN app on the device, or {@code null} to + * remove an existing always-on VPN configuration. + * @return {@code true} if the package is set as always-on VPN controller; {@code false} + * otherwise. + * @throws SecurityException if {@code admin} is not a device or a profile owner. */ public boolean setAlwaysOnVpnPackage(@NonNull ComponentName admin, @Nullable String vpnPackage) { @@ -2918,12 +2931,12 @@ public class DevicePolicyManager { /** * Called by a device or profile owner to read the name of the package administering an - * always-on VPN connection for the current user. - * If there is no such package, or the always-on VPN is provided by the system instead - * of by an application, {@code null} will be returned. + * always-on VPN connection for the current user. If there is no such package, or the always-on + * VPN is provided by the system instead of by an application, {@code null} will be returned. * - * @return Package name of VPN controller responsible for always-on VPN, - * or {@code null} if none is set. + * @return Package name of VPN controller responsible for always-on VPN, or {@code null} if none + * is set. + * @throws SecurityException if {@code admin} is not a device or a profile owner. */ public String getAlwaysOnVpnPackage(@NonNull ComponentName admin) { if (mService != null) { @@ -2937,18 +2950,20 @@ public class DevicePolicyManager { } /** - * Called by an application that is administering the device to disable all cameras - * on the device, for this user. After setting this, no applications running as this user - * will be able to access any cameras on the device. - * - * <p>If the caller is device owner, then the restriction will be applied to all users. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} to be able to call - * this method; if it has not, a security exception will be thrown. + * Called by an application that is administering the device to disable all cameras on the + * device, for this user. After setting this, no applications running as this user will be able + * to access any cameras on the device. + * <p> + * If the caller is device owner, then the restriction will be applied to all users. + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} to be able to call this method; if it has + * not, a security exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param disabled Whether or not the camera should be disabled. + * @throws SecurityException if {@code admin} is not an active administrator or does not use + * {@link DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA}. */ public void setCameraDisabled(@NonNull ComponentName admin, boolean disabled) { if (mService != null) { @@ -2984,14 +2999,16 @@ 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 {@link SecurityException} will be thrown. + * <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 {@link DeviceAdminReceiver} this request is associated with. - * @return {@code true} if the bugreport collection started successfully, or {@code false} - * if it wasn't triggered because a previous bugreport operation is still active - * (either the bugreport is still running or waiting for the user to share or decline) + * @return {@code true} if the bugreport collection started successfully, or {@code false} if it + * wasn't triggered because a previous bugreport operation is still active (either the + * bugreport is still running or waiting for the user to share or decline) + * @throws SecurityException if {@code admin} is not a device owner, or if there are users other + * than the one managed by the device owner. */ public boolean requestBugreport(@NonNull ComponentName admin) { if (mService != null) { @@ -3020,15 +3037,16 @@ public class DevicePolicyManager { * screen capture also prevents the content from being shown on display devices that do not have * a secure video output. See {@link android.view.Display#FLAG_SECURE} for more details about * secure surfaces and secure displays. - * - * <p>The calling device admin must be a device or profile owner. If it is not, a - * security exception will be thrown. - * - * <p>From version {@link android.os.Build.VERSION_CODES#M} disabling screen capture also - * blocks assist requests for all activities of the relevant user. + * <p> + * The calling device admin must be a device or profile owner. If it is not, a security + * exception will be thrown. + * <p> + * From version {@link android.os.Build.VERSION_CODES#M} disabling screen capture also blocks + * assist requests for all activities of the relevant user. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param disabled Whether screen capture is disabled or not. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setScreenCaptureDisabled(@NonNull ComponentName admin, boolean disabled) { if (mService != null) { @@ -3063,16 +3081,17 @@ public class DevicePolicyManager { } /** - * Called by a device owner to set whether auto time is required. If auto time is - * required the user cannot set the date and time, but has to use network date and time. - * - * <p>Note: if auto time is required the user can still manually set the time zone. - * - * <p>The calling device admin must be a device owner. If it is not, a security exception will - * be thrown. + * Called by a device owner to set whether auto time is required. If auto time is required the + * user cannot set the date and time, but has to use network date and time. + * <p> + * Note: if auto time is required the user can still manually set the time zone. + * <p> + * The calling device admin must be a device owner. If it is not, a security exception will be + * thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param required Whether auto time is set required or not. + * @throws SecurityException if {@code admin} is not a device owner. */ public void setAutoTimeRequired(@NonNull ComponentName admin, boolean required) { if (mService != null) { @@ -3100,15 +3119,16 @@ public class DevicePolicyManager { /** * Called by a device owner to set whether all users created on the device should be ephemeral. - * - * <p>The system user is exempt from this policy - it is never ephemeral. - * - * <p>The calling device admin must be the device owner. If it is not, a security exception will - * be thrown. + * <p> + * The system user is exempt from this policy - it is never ephemeral. + * <p> + * The calling device admin must be the device owner. If it is not, a security exception will be + * thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param forceEphemeralUsers If true, all the existing users will be deleted and all - * subsequently created users will be ephemeral. + * subsequently created users will be ephemeral. + * @throws SecurityException if {@code admin} is not a device owner. * @hide */ public void setForceEphemeralUsers( @@ -3124,6 +3144,7 @@ public class DevicePolicyManager { /** * @return true if all users are created ephemeral. + * @throws SecurityException if {@code admin} is not a device owner. * @hide */ public boolean getForceEphemeralUsers(@NonNull ComponentName admin) { @@ -3141,39 +3162,41 @@ public class DevicePolicyManager { * Called by an application that is administering the device to disable keyguard customizations, * such as widgets. After setting this, keyguard features will be disabled according to the * provided feature list. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call - * this method; if it has not, a security exception will be thrown. - * - * <p>Calling this from a managed profile before version - * {@link android.os.Build.VERSION_CODES#M} will throw a security exception. From version - * {@link android.os.Build.VERSION_CODES#M} the profile owner of a managed profile can set: + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call this method; + * if it has not, a security exception will be thrown. + * <p> + * Calling this from a managed profile before version {@link android.os.Build.VERSION_CODES#M} + * will throw a security exception. From version {@link android.os.Build.VERSION_CODES#M} the + * profile owner of a managed profile can set: * <ul> * <li>{@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which affects the parent user, but only if there - * is no separate challenge set on the managed profile. + * is no separate challenge set on the managed profile. * <li>{@link #KEYGUARD_DISABLE_FINGERPRINT} which affects the managed profile challenge if - * there is one, or the parent user otherwise. - * <li>{@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS} which affects notifications - * generated by applications in the managed profile. + * there is one, or the parent user otherwise. + * <li>{@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS} which affects notifications generated + * by applications in the managed profile. * </ul> - * * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} and {@link #KEYGUARD_DISABLE_FINGERPRINT} can also be * set on the {@link DevicePolicyManager} instance returned by - * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the - * parent profile. - * - * <p>Requests to disable other features on a managed profile will be ignored. - * - * <p>The admin can check which features have been disabled by calling + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. + * <p> + * Requests to disable other features on a managed profile will be ignored. + * <p> + * The admin can check which features have been disabled by calling * {@link #getKeyguardDisabledFeatures(ComponentName)} * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param which {@link #KEYGUARD_DISABLE_FEATURES_NONE} (default), - * {@link #KEYGUARD_DISABLE_WIDGETS_ALL}, {@link #KEYGUARD_DISABLE_SECURE_CAMERA}, - * {@link #KEYGUARD_DISABLE_SECURE_NOTIFICATIONS}, {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, - * {@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}, {@link #KEYGUARD_DISABLE_FINGERPRINT}, - * {@link #KEYGUARD_DISABLE_FEATURES_ALL} + * {@link #KEYGUARD_DISABLE_WIDGETS_ALL}, {@link #KEYGUARD_DISABLE_SECURE_CAMERA}, + * {@link #KEYGUARD_DISABLE_SECURE_NOTIFICATIONS}, + * {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, + * {@link #KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}, + * {@link #KEYGUARD_DISABLE_FINGERPRINT}, {@link #KEYGUARD_DISABLE_FEATURES_ALL} + * @throws SecurityException if {@code admin} is not an active administrator or does not user + * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} */ public void setKeyguardDisabledFeatures(@NonNull ComponentName admin, int which) { if (mService != null) { @@ -3500,13 +3523,13 @@ public class DevicePolicyManager { } /** - * Clears the current device owner. The caller must be the device owner. - * - * This function should be used cautiously as once it is called it cannot - * be undone. The device owner can only be set as a part of device setup - * before setup completes. + * Clears the current device owner. The caller must be the device owner. This function should be + * used cautiously as once it is called it cannot be undone. The device owner can only be set as + * a part of device setup before setup completes. * * @param packageName The package name of the device owner. + * @throws SecurityException if the caller is not in {@code packageName} or {@code packageName} + * does not own the current device owner component. */ public void clearDeviceOwnerApp(String packageName) { if (mService != null) { @@ -3616,13 +3639,14 @@ public class DevicePolicyManager { } /** - * Clears the active profile owner and removes all user restrictions. The caller must - * be from the same package as the active profile owner for this user, otherwise a - * SecurityException will be thrown. - * - * <p>This doesn't work for managed profile owners. + * Clears the active profile owner and removes all user restrictions. The caller must be from + * the same package as the active profile owner for this user, otherwise a SecurityException + * will be thrown. + * <p> + * This doesn't work for managed profile owners. * * @param admin The component to remove as the profile owner. + * @throws SecurityException if {@code admin} is not an active profile owner. */ public void clearProfileOwner(@NonNull ComponentName admin) { if (mService != null) { @@ -3682,20 +3706,21 @@ public class DevicePolicyManager { /** * Sets the device owner information to be shown on the lock screen. - * - * <p>If the device owner information is {@code null} or empty then the device owner info is + * <p> + * If the device owner information is {@code null} or empty then the device owner info is * cleared and the user owner info is shown on the lock screen if it is set. - * <p>If the device owner information contains only whitespaces then the message on the lock - * screen will be blank and the user will not be allowed to change it. - * - * <p>If the device owner information needs to be localized, it is the responsibility of the + * <p> + * If the device owner information contains only whitespaces then the message on the lock screen + * will be blank and the user will not be allowed to change it. + * <p> + * If the device owner information needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast * and set a new version of this string accordingly. * * @param admin The name of the admin component to check. - * @param info Device owner information which will be displayed instead of the user - * owner info. + * @param info Device owner information which will be displayed instead of the user owner info. * @return Whether the device owner information has been set. + * @throws SecurityException if {@code admin} is not a device owner. */ public boolean setDeviceOwnerLockScreenInfo(@NonNull ComponentName admin, String info) { if (mService != null) { @@ -3724,21 +3749,22 @@ public class DevicePolicyManager { /** * Called by device or profile owners to suspend packages for this user. - * - * <p>A suspended package will not be able to start activities. Its notifications will - * be hidden, it will not show up in recents, will not be able to show toasts or dialogs - * or ring the device. - * - * <p>The package must already be installed. If the package is uninstalled while suspended - * the package will no longer be suspended. The admin can block this by using + * <p> + * A suspended package will not be able to start activities. Its notifications will be hidden, + * it will not show up in recents, will not be able to show toasts or dialogs or ring the + * device. + * <p> + * The package must already be installed. If the package is uninstalled while suspended the + * package will no longer be suspended. The admin can block this by using * {@link #setUninstallBlocked}. * * @param admin The name of the admin component to check. * @param packageNames The package names to suspend or unsuspend. * @param suspended If set to {@code true} than the packages will be suspended, if set to - * {@code false} the packages will be unsuspended. + * {@code false} the packages will be unsuspended. * @return an array of package names for which the suspended status is not set as requested in - * this method. + * this method. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public String[] setPackagesSuspended(@NonNull ComponentName admin, String[] packageNames, boolean suspended) { @@ -3758,7 +3784,8 @@ public class DevicePolicyManager { * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The name of the package to retrieve the suspended status of. * @return {@code true} if the package is suspended or {@code false} if the package is not - * suspended, could not be found or an error occurred. + * suspended, could not be found or an error occurred. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean getPackageSuspended(@NonNull ComponentName admin, String packageName) { if (mService != null) { @@ -3776,8 +3803,8 @@ public class DevicePolicyManager { * be used. Only the profile owner can call this. * * @see #isProfileOwnerApp - * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @throws SecurityException if {@code admin} is not a profile owner. */ public void setProfileEnabled(@NonNull ComponentName admin) { if (mService != null) { @@ -3790,15 +3817,15 @@ public class DevicePolicyManager { } /** - * Sets the name of the profile. In the device owner case it sets the name of the user - * which it is called from. Only a profile owner or device owner can call this. If this is - * never called by the profile or device owner, the name will be set to default values. + * Sets the name of the profile. In the device owner case it sets the name of the user which it + * is called from. Only a profile owner or device owner can call this. If this is never called + * by the profile or device owner, the name will be set to default values. * * @see #isProfileOwnerApp * @see #isDeviceOwnerApp - * * @param admin Which {@link DeviceAdminReceiver} this request is associate with. * @param profileName The name of the profile. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setProfileName(@NonNull ComponentName admin, String profileName) { if (mService != null) { @@ -3896,19 +3923,20 @@ public class DevicePolicyManager { /** * Called by a profile owner or device owner to add a default intent handler activity for * intents that match a certain intent filter. This activity will remain the default intent - * handler even if the set of potential event handlers for the intent filter changes and if - * the intent preferences are reset. - * - * <p>The default disambiguation mechanism takes over if the activity is not installed - * (anymore). When the activity is (re)installed, it is automatically reset as default - * intent handler for the filter. - * - * <p>The calling device admin must be a profile owner or device owner. If it is not, a - * security exception will be thrown. + * handler even if the set of potential event handlers for the intent filter changes and if the + * intent preferences are reset. + * <p> + * The default disambiguation mechanism takes over if the activity is not installed (anymore). + * When the activity is (re)installed, it is automatically reset as default intent handler for + * the filter. + * <p> + * The calling device admin must be a profile owner or device owner. If it is not, a security + * exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param filter The IntentFilter for which a default handler is added. * @param activity The Activity that is added as default intent handler. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void addPersistentPreferredActivity(@NonNull ComponentName admin, IntentFilter filter, @NonNull ComponentName activity) { @@ -3924,12 +3952,13 @@ public class DevicePolicyManager { /** * Called by a profile owner or device owner to remove all persistent intent handler preferences * associated with the given package that were set by {@link #addPersistentPreferredActivity}. - * - * <p>The calling device admin must be a profile owner. If it is not, a security - * exception will be thrown. + * <p> + * The calling device admin must be a profile owner. If it is not, a security exception will be + * thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The name of the package for which preferences are removed. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void clearPackagePersistentPreferredActivities(@NonNull ComponentName admin, String packageName) { @@ -3955,7 +3984,8 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The package name which will be given access to application restrictions - * APIs. If {@code null} is given the current package will be cleared. + * APIs. If {@code null} is given the current package will be cleared. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setApplicationRestrictionsManagingPackage(@NonNull ComponentName admin, @Nullable String packageName) { @@ -3974,7 +4004,8 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return The package name allowed to manage application restrictions on the current user, or - * {@code null} if none is set. + * {@code null} if none is set. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public String getApplicationRestrictionsManagingPackage(@NonNull ComponentName admin) { if (mService != null) { @@ -3988,9 +4019,12 @@ public class DevicePolicyManager { } /** - * Returns {@code true} if the calling package has been granted permission via - * {@link #setApplicationRestrictionsManagingPackage} to manage application - * restrictions for the calling user. + * Called by any application to find out whether it has been granted permission via + * {@link #setApplicationRestrictionsManagingPackage} to manage application restrictions + * for the calling user. + * + * <p>This is done by comparing the calling Linux uid with the uid of the package specified by + * that method. */ public boolean isCallerApplicationRestrictionsManagingPackage() { if (mService != null) { @@ -4005,34 +4039,34 @@ public class DevicePolicyManager { /** * Sets the application restrictions for a given target application running in the calling user. - * - * <p>The caller must be a profile or device owner on that user, or the package allowed to - * manage application restrictions via {@link #setApplicationRestrictionsManagingPackage}; - * otherwise a security exception will be thrown. - * - * <p>The provided {@link Bundle} consists of key-value pairs, where the types of values may be: + * <p> + * The caller must be a profile or device owner on that user, or the package allowed to manage + * application restrictions via {@link #setApplicationRestrictionsManagingPackage}; otherwise a + * security exception will be thrown. + * <p> + * The provided {@link Bundle} consists of key-value pairs, where the types of values may be: * <ul> * <li>{@code boolean} * <li>{@code int} * <li>{@code String} or {@code String[]} * <li>From {@link android.os.Build.VERSION_CODES#M}, {@code Bundle} or {@code Bundle[]} * </ul> - * - * <p>If the restrictions are not available yet, but may be applied in the near future, - * the caller can notify the target application of that by adding + * <p> + * If the restrictions are not available yet, but may be applied in the near future, the caller + * can notify the target application of that by adding * {@link UserManager#KEY_RESTRICTIONS_PENDING} to the settings parameter. - * - * <p>The application restrictions are only made visible to the target application via - * {@link UserManager#getApplicationRestrictions(String)}, in addition to the profile or - * device owner, and the application restrictions managing package via + * <p> + * The application restrictions are only made visible to the target application via + * {@link UserManager#getApplicationRestrictions(String)}, in addition to the profile or device + * owner, and the application restrictions managing package via * {@link #getApplicationRestrictions}. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or - * {@code null} if called by the application restrictions managing package. + * {@code null} if called by the application restrictions managing package. * @param packageName The name of the package to update restricted settings for. * @param settings A {@link Bundle} to be parsed by the receiving application, conveying a new - * set of active restrictions. - * + * set of active restrictions. + * @throws SecurityException if {@code admin} is not a device or profile owner. * @see #setApplicationRestrictionsManagingPackage * @see UserManager#KEY_RESTRICTIONS_PENDING */ @@ -4048,23 +4082,29 @@ public class DevicePolicyManager { } /** - * Sets a list of configuration features to enable for a TrustAgent component. This is meant - * to be used in conjunction with {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which disables all - * trust agents but those enabled by this function call. If flag + * Sets a list of configuration features to enable for a TrustAgent component. This is meant to + * be used in conjunction with {@link #KEYGUARD_DISABLE_TRUST_AGENTS}, which disables all trust + * agents but those enabled by this function call. If flag * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is not set, then this call has no effect. - * - * <p>The calling device admin must have requested - * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call - * this method; if not, a security exception will be thrown. + * <p> + * The calling device admin must have requested + * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} to be able to call this method; + * if not, a security exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param target Component name of the agent to be enabled. - * @param configuration TrustAgent-specific feature bundle. If null for any admin, agent - * will be strictly disabled according to the state of the - * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} flag. - * <p>If {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is set and options is not null for all admins, - * then it's up to the TrustAgent itself to aggregate the values from all device admins. - * <p>Consult documentation for the specific TrustAgent to determine legal options parameters. + * @param configuration TrustAgent-specific feature bundle. If null for any admin, agent will be + * strictly disabled according to the state of the + * {@link #KEYGUARD_DISABLE_TRUST_AGENTS} flag. + * <p> + * If {@link #KEYGUARD_DISABLE_TRUST_AGENTS} is set and options is not null for all + * admins, then it's up to the TrustAgent itself to aggregate the values from all + * device admins. + * <p> + * Consult documentation for the specific TrustAgent to determine legal options + * parameters. + * @throws SecurityException if {@code admin} is not an active administrator or does not use + * {@link DeviceAdminInfo#USES_POLICY_DISABLE_KEYGUARD_FEATURES} */ public void setTrustAgentConfiguration(@NonNull ComponentName admin, @NonNull ComponentName target, PersistableBundle configuration) { @@ -4110,14 +4150,15 @@ public class DevicePolicyManager { } /** - * Called by a profile owner of a managed profile to set whether caller-Id information from - * the managed profile will be shown in the parent profile, for incoming calls. - * - * <p>The calling device admin must be a profile owner. If it is not, a - * security exception will be thrown. + * Called by a profile owner of a managed profile to set whether caller-Id information from the + * managed profile will be shown in the parent profile, for incoming calls. + * <p> + * The calling device admin must be a profile owner. If it is not, a security exception will be + * thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param disabled If true caller-Id information in the managed profile is not displayed. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setCrossProfileCallerIdDisabled(@NonNull ComponentName admin, boolean disabled) { if (mService != null) { @@ -4132,11 +4173,12 @@ public class DevicePolicyManager { /** * Called by a profile owner of a managed profile to determine whether or not caller-Id * information has been disabled. - * - * <p>The calling device admin must be a profile owner. If it is not, a - * security exception will be thrown. + * <p> + * The calling device admin must be a profile owner. If it is not, a security exception will be + * thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean getCrossProfileCallerIdDisabled(@NonNull ComponentName admin) { if (mService != null) { @@ -4167,14 +4209,15 @@ public class DevicePolicyManager { } /** - * Called by a profile owner of a managed profile to set whether contacts search from - * the managed profile will be shown in the parent profile, for incoming calls. - * - * <p>The calling device admin must be a profile owner. If it is not, a - * security exception will be thrown. + * Called by a profile owner of a managed profile to set whether contacts search from the + * managed profile will be shown in the parent profile, for incoming calls. + * <p> + * The calling device admin must be a profile owner. If it is not, a security exception will be + * thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param disabled If true contacts search in the managed profile is not displayed. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setCrossProfileContactsSearchDisabled(@NonNull ComponentName admin, boolean disabled) { @@ -4190,11 +4233,12 @@ public class DevicePolicyManager { /** * Called by a profile owner of a managed profile to determine whether or not contacts search * has been disabled. - * - * <p>The calling device admin must be a profile owner. If it is not, a - * security exception will be thrown. + * <p> + * The calling device admin must be a profile owner. If it is not, a security exception will be + * thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean getCrossProfileContactsSearchDisabled(@NonNull ComponentName admin) { if (mService != null) { @@ -4254,18 +4298,17 @@ public class DevicePolicyManager { } /** - * Called by a profile owner of a managed profile to set whether bluetooth - * devices can access enterprise contacts. + * Called by a profile owner of a managed profile to set whether bluetooth devices can access + * enterprise contacts. * <p> - * The calling device admin must be a profile owner. If it is not, a - * security exception will be thrown. + * The calling device admin must be a profile owner. If it is not, a security exception will be + * thrown. * <p> * This API works on managed profile only. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param disabled If true, bluetooth devices cannot access enterprise - * contacts. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param disabled If true, bluetooth devices cannot access enterprise contacts. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setBluetoothContactSharingDisabled(@NonNull ComponentName admin, boolean disabled) { if (mService != null) { @@ -4278,16 +4321,16 @@ public class DevicePolicyManager { } /** - * Called by a profile owner of a managed profile to determine whether or - * not Bluetooth devices cannot access enterprise contacts. + * Called by a profile owner of a managed profile to determine whether or not Bluetooth devices + * cannot access enterprise contacts. * <p> - * The calling device admin must be a profile owner. If it is not, a - * security exception will be thrown. + * The calling device admin must be a profile owner. If it is not, a security exception will be + * thrown. * <p> * This API works on managed profile only. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean getBluetoothContactSharingDisabled(@NonNull ComponentName admin) { if (mService != null) { @@ -4322,14 +4365,15 @@ public class DevicePolicyManager { /** * Called by the profile owner of a managed profile so that some intents sent in the managed - * profile can also be resolved in the parent, or vice versa. - * Only activity intents are supported. + * profile can also be resolved in the parent, or vice versa. Only activity intents are + * supported. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param filter The {@link IntentFilter} the intent has to match to be also resolved in the - * other profile + * other profile * @param flags {@link DevicePolicyManager#FLAG_MANAGED_CAN_ACCESS_PARENT} and - * {@link DevicePolicyManager#FLAG_PARENT_CAN_ACCESS_MANAGED} are supported. + * {@link DevicePolicyManager#FLAG_PARENT_CAN_ACCESS_MANAGED} are supported. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void addCrossProfileIntentFilter(@NonNull ComponentName admin, IntentFilter filter, int flags) { if (mService != null) { @@ -4345,7 +4389,9 @@ public class DevicePolicyManager { * Called by a profile owner of a managed profile to remove the cross-profile intent filters * that go from the managed profile to the parent, or from the parent to the managed profile. * Only removes those that have been set by the profile owner. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void clearCrossProfileIntentFilters(@NonNull ComponentName admin) { if (mService != null) { @@ -4358,25 +4404,22 @@ public class DevicePolicyManager { } /** - * Called by a profile or device owner to set the permitted accessibility services. When - * set by a device owner or profile owner the restriction applies to all profiles of the - * user the device owner or profile owner is an admin for. - * - * By default the user can use any accessiblity service. When zero or more packages have - * been added, accessiblity services that are not in the list and not part of the system - * can not be enabled by the user. - * - * <p> Calling with a null value for the list disables the restriction so that all services - * can be used, calling with an empty list only allows the builtin system's services. - * - * <p> System accesibility services are always available to the user the list can't modify - * this. + * Called by a profile or device owner to set the permitted accessibility services. When set by + * a device owner or profile owner the restriction applies to all profiles of the user the + * device owner or profile owner is an admin for. By default the user can use any accessiblity + * service. When zero or more packages have been added, accessiblity services that are not in + * the list and not part of the system can not be enabled by the user. + * <p> + * Calling with a null value for the list disables the restriction so that all services can be + * used, calling with an empty list only allows the builtin system's services. + * <p> + * System accesibility services are always available to the user the list can't modify this. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageNames List of accessibility service package names. - * - * @return true if setting the restriction succeeded. It fail if there is - * one or more non-system accessibility services enabled, that are not in the list. + * @return true if setting the restriction succeeded. It fail if there is one or more non-system + * accessibility services enabled, that are not in the list. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean setPermittedAccessibilityServices(@NonNull ComponentName admin, List<String> packageNames) { @@ -4392,12 +4435,13 @@ public class DevicePolicyManager { /** * Returns the list of permitted accessibility services set by this device or profile owner. - * - * <p>An empty list means no accessibility services except system services are allowed. - * Null means all accessibility services are allowed. + * <p> + * An empty list means no accessibility services except system services are allowed. Null means + * all accessibility services are allowed. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return List of accessiblity service package names. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public List<String> getPermittedAccessibilityServices(@NonNull ComponentName admin) { if (mService != null) { @@ -4458,27 +4502,23 @@ public class DevicePolicyManager { } /** - * Called by a profile or device owner to set the permitted input methods services. When - * set by a device owner or profile owner the restriction applies to all profiles of the - * user the device owner or profile owner is an admin for. - * - * By default the user can use any input method. When zero or more packages have - * been added, input method that are not in the list and not part of the system - * can not be enabled by the user. - * - * This method will fail if it is called for a admin that is not for the foreground user - * or a profile of the foreground user. - * - * <p> Calling with a null value for the list disables the restriction so that all input methods - * can be used, calling with an empty list disables all but the system's own input methods. - * - * <p> System input methods are always available to the user this method can't modify this. + * Called by a profile or device owner to set the permitted input methods services. When set by + * a device owner or profile owner the restriction applies to all profiles of the user the + * device owner or profile owner is an admin for. By default the user can use any input method. + * When zero or more packages have been added, input method that are not in the list and not + * part of the system can not be enabled by the user. This method will fail if it is called for + * a admin that is not for the foreground user or a profile of the foreground user. + * <p> + * Calling with a null value for the list disables the restriction so that all input methods can + * be used, calling with an empty list disables all but the system's own input methods. + * <p> + * System input methods are always available to the user this method can't modify this. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageNames List of input method package names. - * @return true if setting the restriction succeeded. It will fail if there are - * one or more non-system input methods currently enabled that are not in - * the packageNames list. + * @return true if setting the restriction succeeded. It will fail if there are one or more + * non-system input methods currently enabled that are not in the packageNames list. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean setPermittedInputMethods(@NonNull ComponentName admin, List<String> packageNames) { if (mService != null) { @@ -4494,12 +4534,13 @@ public class DevicePolicyManager { /** * Returns the list of permitted input methods set by this device or profile owner. - * - * <p>An empty list means no input methods except system input methods are allowed. - * Null means all input methods are allowed. + * <p> + * An empty list means no input methods except system input methods are allowed. Null means all + * input methods are allowed. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return List of input method package names. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public List<String> getPermittedInputMethods(@NonNull ComponentName admin) { if (mService != null) { @@ -4586,6 +4627,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageNames List of package names to keep cached. + * @throws SecurityException if {@code admin} is not a device owner. * @hide */ public void setKeepUninstalledPackages(@NonNull ComponentName admin, @@ -4671,27 +4713,27 @@ public class DevicePolicyManager { * persisted as user handles are recycled as users are removed and created. If you need to * persist an identifier for this user, use {@link UserManager#getSerialNumberForUser}. The new * user will not be started in the background. - * - * <p>admin is the {@link DeviceAdminReceiver} which is the device owner. profileOwner is also - * a DeviceAdminReceiver in the same package as admin, and will become the profile owner and - * will be registered as an active admin on the new user. The profile owner package will be - * installed on the new user. - * - * <p>If the adminExtras are not null, they will be stored on the device until the user is - * started for the first time. Then the extras will be passed to the admin when - * onEnable is called. + * <p> + * admin is the {@link DeviceAdminReceiver} which is the device owner. profileOwner is also a + * DeviceAdminReceiver in the same package as admin, and will become the profile owner and will + * be registered as an active admin on the new user. The profile owner package will be installed + * on the new user. + * <p> + * If the adminExtras are not null, they will be stored on the device until the user is started + * for the first time. Then the extras will be passed to the admin when onEnable is called. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param name The user's name. * @param profileOwner Which {@link DeviceAdminReceiver} will be profile owner. Has to be in the - * same package as admin, otherwise no user is created and an IllegalArgumentException is - * thrown. + * same package as admin, otherwise no user is created and an + * IllegalArgumentException is thrown. * @param adminExtras Extras that will be passed to onEnable of the admin receiver on the new - * user. + * user. * @param flags {@link #SKIP_SETUP_WIZARD} is supported. * @see UserHandle * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the * user could not be created. + * @throws SecurityException if {@code admin} is not a device owner. */ public UserHandle createAndManageUser(@NonNull ComponentName admin, @NonNull String name, @NonNull ComponentName profileOwner, @Nullable PersistableBundle adminExtras, @@ -4704,12 +4746,13 @@ public class DevicePolicyManager { } /** - * Called by a device owner to remove a user and all associated data. The primary user can - * not be removed. + * Called by a device owner to remove a user and all associated data. The primary user can not + * be removed. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param userHandle the user to remove. * @return {@code true} if the user was removed, {@code false} otherwise. + * @throws SecurityException if {@code admin} is not a device owner. */ public boolean removeUser(@NonNull ComponentName admin, UserHandle userHandle) { try { @@ -4725,7 +4768,7 @@ public class DevicePolicyManager { * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param userHandle the user to switch to; null will switch to primary. * @return {@code true} if the switch was successful, {@code false} otherwise. - * + * @throws SecurityException if {@code admin} is not a device owner. * @see Intent#ACTION_USER_FOREGROUND */ public boolean switchUser(@NonNull ComponentName admin, @Nullable UserHandle userHandle) { @@ -4739,18 +4782,18 @@ public class DevicePolicyManager { /** * Retrieves the application restrictions for a given target application running in the calling * user. - * - * <p>The caller must be a profile or device owner on that user, or the package allowed to - * manage application restrictions via {@link #setApplicationRestrictionsManagingPackage}; - * otherwise a security exception will be thrown. + * <p> + * The caller must be a profile or device owner on that user, or the package allowed to manage + * application restrictions via {@link #setApplicationRestrictionsManagingPackage}; otherwise a + * security exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or - * {@code null} if called by the application restrictions managing package. + * {@code null} if called by the application restrictions managing package. * @param packageName The name of the package to fetch restricted settings of. * @return {@link Bundle} of settings corresponding to what was set last time - * {@link DevicePolicyManager#setApplicationRestrictions} was called, or an empty {@link Bundle} - * if no restrictions have been set. - * + * {@link DevicePolicyManager#setApplicationRestrictions} was called, or an empty + * {@link Bundle} if no restrictions have been set. + * @throws SecurityException if {@code admin} is not a device or profile owner. * @see {@link #setApplicationRestrictionsManagingPackage} */ public Bundle getApplicationRestrictions(@Nullable ComponentName admin, String packageName) { @@ -4767,13 +4810,13 @@ public class DevicePolicyManager { /** * Called by a profile or device owner to set a user restriction specified by the key. * <p> - * The calling device admin must be a profile or device owner; if it is not, - * a security exception will be thrown. + * The calling device admin must be a profile or device owner; if it is not, a security + * exception will be thrown. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param key The key of the restriction. See the constants in - * {@link android.os.UserManager} for the list of keys. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param key The key of the restriction. See the constants in {@link android.os.UserManager} + * for the list of keys. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void addUserRestriction(@NonNull ComponentName admin, String key) { if (mService != null) { @@ -4788,13 +4831,13 @@ public class DevicePolicyManager { /** * Called by a profile or device owner to clear a user restriction specified by the key. * <p> - * The calling device admin must be a profile or device owner; if it is not, - * a security exception will be thrown. + * The calling device admin must be a profile or device owner; if it is not, a security + * exception will be thrown. * - * @param admin Which {@link DeviceAdminReceiver} this request is associated - * with. - * @param key The key of the restriction. See the constants in - * {@link android.os.UserManager} for the list of keys. + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param key The key of the restriction. See the constants in {@link android.os.UserManager} + * for the list of keys. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void clearUserRestriction(@NonNull ComponentName admin, String key) { if (mService != null) { @@ -4811,11 +4854,11 @@ public class DevicePolicyManager { * {@link #addUserRestriction(ComponentName, String)}. * <p> * The target user may have more restrictions set by the system or other device owner / profile - * owner. To get all the user restrictions currently set, use + * owner. To get all the user restrictions currently set, use * {@link UserManager#getUserRestrictions()}. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @throws SecurityException if the {@code admin} is not an active admin. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public Bundle getUserRestrictions(@NonNull ComponentName admin) { return getUserRestrictions(admin, myUserId()); @@ -4835,14 +4878,15 @@ public class DevicePolicyManager { } /** - * Called by profile or device owners to hide or unhide packages. When a package is hidden it - * is unavailable for use, but the data and actual package file remain. + * Called by profile or device owners to hide or unhide packages. When a package is hidden it is + * unavailable for use, but the data and actual package file remain. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The name of the package to hide or unhide. * @param hidden {@code true} if the package should be hidden, {@code false} if it should be - * unhidden. + * unhidden. * @return boolean Whether the hidden setting of the package was successfully updated. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean setApplicationHidden(@NonNull ComponentName admin, String packageName, boolean hidden) { @@ -4862,6 +4906,7 @@ public class DevicePolicyManager { * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The name of the package to retrieve the hidden status of. * @return boolean {@code true} if the package is hidden, {@code false} otherwise. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean isApplicationHidden(@NonNull ComponentName admin, String packageName) { if (mService != null) { @@ -4880,6 +4925,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The package to be re-enabled in the calling profile. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void enableSystemApp(@NonNull ComponentName admin, String packageName) { if (mService != null) { @@ -4892,13 +4938,14 @@ public class DevicePolicyManager { } /** - * Called by profile or device owners to re-enable system apps by intent that were disabled - * by default when the user was initialized. + * Called by profile or device owners to re-enable system apps by intent that were disabled by + * default when the user was initialized. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param intent An intent matching the app(s) to be installed. All apps that resolve for this - * intent will be re-enabled in the calling profile. + * intent will be re-enabled in the calling profile. * @return int The number of activities that matched the intent and were installed. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public int enableSystemApp(@NonNull ComponentName admin, Intent intent) { if (mService != null) { @@ -4914,21 +4961,22 @@ public class DevicePolicyManager { /** * Called by a device owner or profile owner to disable account management for a specific type * of account. - * - * <p>The calling device admin must be a device owner or profile owner. If it is not, a - * security exception will be thrown. - * - * <p>When account management is disabled for an account type, adding or removing an account - * of that type will not be possible. - * - * <p>From {@link android.os.Build.VERSION_CODES#N} the profile or device owner can still use + * <p> + * The calling device admin must be a device owner or profile owner. If it is not, a security + * exception will be thrown. + * <p> + * When account management is disabled for an account type, adding or removing an account of + * that type will not be possible. + * <p> + * From {@link android.os.Build.VERSION_CODES#N} the profile or device owner can still use * {@link android.accounts.AccountManager} APIs to add or remove accounts when account * management for a specific type is disabled. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param accountType For which account management is disabled or enabled. * @param disabled The boolean indicating that account management will be disabled (true) or - * enabled (false). + * enabled (false). + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setAccountManagementDisabled(@NonNull ComponentName admin, String accountType, boolean disabled) { @@ -4973,17 +5021,15 @@ public class DevicePolicyManager { /** * Sets which packages may enter lock task mode. + * <p> + * Any packages that shares uid with an allowed package will also be allowed to activate lock + * task. From {@link android.os.Build.VERSION_CODES#M} removing packages from the lock task + * package list results in locked tasks belonging to those packages to be finished. This + * function can only be called by the device owner. * - * <p>Any packages that shares uid with an allowed package will also be allowed - * to activate lock task. - * - * From {@link android.os.Build.VERSION_CODES#M} removing packages from the lock task - * package list results in locked tasks belonging to those packages to be finished. - * - * This function can only be called by the device owner. * @param packages The list of packages allowed to enter lock task mode * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * + * @throws SecurityException if {@code admin} is not a device owner. * @see Activity#startLockTask() * @see DeviceAdminReceiver#onLockTaskModeEntering(Context, Intent, String) * @see DeviceAdminReceiver#onLockTaskModeExiting(Context, Intent) @@ -5036,7 +5082,8 @@ public class DevicePolicyManager { /** * Called by device owners to update {@link Settings.Global} settings. Validation that the value * of the setting is in the correct form for the setting type should be performed by the caller. - * <p>The settings that can be updated with this method are: + * <p> + * The settings that can be updated with this method are: * <ul> * <li>{@link Settings.Global#ADB_ENABLED}</li> * <li>{@link Settings.Global#AUTO_TIME}</li> @@ -5044,30 +5091,30 @@ public class DevicePolicyManager { * <li>{@link Settings.Global#DATA_ROAMING}</li> * <li>{@link Settings.Global#USB_MASS_STORAGE_ENABLED}</li> * <li>{@link Settings.Global#WIFI_SLEEP_POLICY}</li> - * <li>{@link Settings.Global#STAY_ON_WHILE_PLUGGED_IN} - * This setting is only available from {@link android.os.Build.VERSION_CODES#M} onwards - * and can only be set if {@link #setMaximumTimeToLock} is not used to set a timeout.</li> - * <li>{@link Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> - * This setting is only available from {@link android.os.Build.VERSION_CODES#M} onwards. - * </li> + * <li>{@link Settings.Global#STAY_ON_WHILE_PLUGGED_IN} This setting is only available from + * {@link android.os.Build.VERSION_CODES#M} onwards and can only be set if + * {@link #setMaximumTimeToLock} is not used to set a timeout.</li> + * <li>{@link Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> This setting is only + * available from {@link android.os.Build.VERSION_CODES#M} onwards.</li> * </ul> - * <p>Changing the following settings has no effect as of - * {@link android.os.Build.VERSION_CODES#M}: + * <p> + * Changing the following settings has no effect as of {@link android.os.Build.VERSION_CODES#M}: * <ul> - * <li>{@link Settings.Global#BLUETOOTH_ON}. - * Use {@link android.bluetooth.BluetoothAdapter#enable()} and - * {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li> + * <li>{@link Settings.Global#BLUETOOTH_ON}. Use + * {@link android.bluetooth.BluetoothAdapter#enable()} and + * {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li> * <li>{@link Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li> - * <li>{@link Settings.Global#MODE_RINGER}. - * Use {@link android.media.AudioManager#setRingerMode(int)} instead.</li> + * <li>{@link Settings.Global#MODE_RINGER}. Use + * {@link android.media.AudioManager#setRingerMode(int)} instead.</li> * <li>{@link Settings.Global#NETWORK_PREFERENCE}</li> - * <li>{@link Settings.Global#WIFI_ON}. - * Use {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li> + * <li>{@link Settings.Global#WIFI_ON}. Use + * {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li> * </ul> * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param setting The name of the setting to update. * @param value The value to update the setting to. + * @throws SecurityException if {@code admin} is not a device owner. */ public void setGlobalSetting(@NonNull ComponentName admin, String setting, String value) { if (mService != null) { @@ -5083,19 +5130,23 @@ public class DevicePolicyManager { * Called by profile or device owners to update {@link Settings.Secure} settings. Validation * that the value of the setting is in the correct form for the setting type should be performed * by the caller. - * <p>The settings that can be updated by a profile or device owner with this method are: + * <p> + * The settings that can be updated by a profile or device owner with this method are: * <ul> * <li>{@link Settings.Secure#DEFAULT_INPUT_METHOD}</li> * <li>{@link Settings.Secure#INSTALL_NON_MARKET_APPS}</li> * <li>{@link Settings.Secure#SKIP_FIRST_USE_HINTS}</li> * </ul> - * <p>A device owner can additionally update the following settings: + * <p> + * A device owner can additionally update the following settings: * <ul> * <li>{@link Settings.Secure#LOCATION_MODE}</li> * </ul> + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param setting The name of the setting to update. * @param value The value to update the setting to. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setSecureSetting(@NonNull ComponentName admin, String setting, String value) { if (mService != null) { @@ -5108,14 +5159,16 @@ public class DevicePolicyManager { } /** - * Designates a specific service component as the provider for - * making permission requests of a local or remote administrator of the user. + * Designates a specific service component as the provider for making permission requests of a + * local or remote administrator of the user. * <p/> * Only a profile owner can designate the restrictions provider. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param provider The component name of the service that implements - * {@link RestrictionsReceiver}. If this param is null, - * it removes the restrictions provider previously assigned. + * {@link RestrictionsReceiver}. If this param is null, it removes the restrictions + * provider previously assigned. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setRestrictionsProvider(@NonNull ComponentName admin, @Nullable ComponentName provider) { @@ -5133,6 +5186,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param on {@code true} to mute master volume, {@code false} to turn mute off. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setMasterVolumeMuted(@NonNull ComponentName admin, boolean on) { if (mService != null) { @@ -5149,6 +5203,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return {@code true} if master volume is muted, {@code false} if it's not. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean isMasterVolumeMuted(@NonNull ComponentName admin) { if (mService != null) { @@ -5162,12 +5217,12 @@ public class DevicePolicyManager { } /** - * Called by profile or device owners to change whether a user can uninstall - * a package. + * Called by profile or device owners to change whether a user can uninstall a package. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName package to change. * @param uninstallBlocked true if the user shouldn't be able to uninstall the package. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setUninstallBlocked(@NonNull ComponentName admin, String packageName, boolean uninstallBlocked) { @@ -5185,14 +5240,15 @@ public class DevicePolicyManager { * Requires the caller to be the profile owner if checking a specific admin's policy. * <p> * <strong>Note:</strong> Starting from {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1}, the - * behavior of this API is changed such that passing {@code null} as the {@code admin} - * parameter will return if any admin has blocked the uninstallation. Before L MR1, passing - * {@code null} will cause a NullPointerException to be raised. + * behavior of this API is changed such that passing {@code null} as the {@code admin} parameter + * will return if any admin has blocked the uninstallation. Before L MR1, passing {@code null} + * will cause a NullPointerException to be raised. * * @param admin The name of the admin component whose blocking policy will be checked, or - * {@code null} to check whether any admin has blocked the uninstallation. + * {@code null} to check whether any admin has blocked the uninstallation. * @param packageName package to check. * @return true if uninstallation is blocked. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public boolean isUninstallBlocked(@Nullable ComponentName admin, String packageName) { if (mService != null) { @@ -5206,19 +5262,18 @@ public class DevicePolicyManager { } /** - * Called by the profile owner of a managed profile to enable widget providers from a - * given package to be available in the parent profile. As a result the user will be able to - * add widgets from the white-listed package running under the profile to a widget - * host which runs under the parent profile, for example the home screen. Note that - * a package may have zero or more provider components, where each component - * provides a different widget type. + * Called by the profile owner of a managed profile to enable widget providers from a given + * package to be available in the parent profile. As a result the user will be able to add + * widgets from the white-listed package running under the profile to a widget host which runs + * under the parent profile, for example the home screen. Note that a package may have zero or + * more provider components, where each component provides a different widget type. * <p> * <strong>Note:</strong> By default no widget provider package is white-listed. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The package from which widget providers are white-listed. * @return Whether the package was added. - * + * @throws SecurityException if {@code admin} is not a profile owner. * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String) * @see #getCrossProfileWidgetProviders(android.content.ComponentName) */ @@ -5235,17 +5290,16 @@ public class DevicePolicyManager { /** * Called by the profile owner of a managed profile to disable widget providers from a given - * package to be available in the parent profile. For this method to take effect the - * package should have been added via {@link #addCrossProfileWidgetProvider( - * android.content.ComponentName, String)}. + * package to be available in the parent profile. For this method to take effect the package + * should have been added via + * {@link #addCrossProfileWidgetProvider( android.content.ComponentName, String)}. * <p> * <strong>Note:</strong> By default no widget provider package is white-listed. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param packageName The package from which widget providers are no longer - * white-listed. + * @param packageName The package from which widget providers are no longer white-listed. * @return Whether the package was removed. - * + * @throws SecurityException if {@code admin} is not a profile owner. * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String) * @see #getCrossProfileWidgetProviders(android.content.ComponentName) */ @@ -5267,9 +5321,9 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return The white-listed package list. - * * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String) * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String) + * @throws SecurityException if {@code admin} is not a profile owner. */ public List<String> getCrossProfileWidgetProviders(@NonNull ComponentName admin) { if (mService != null) { @@ -5290,6 +5344,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param icon the bitmap to set as the photo. + * @throws SecurityException if {@code admin} is not a device or profile owner. */ public void setUserIcon(@NonNull ComponentName admin, Bitmap icon) { try { @@ -5304,10 +5359,10 @@ public class DevicePolicyManager { * {@link #ACTION_SYSTEM_UPDATE_POLICY_CHANGED} is broadcasted. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. All - * components in the device owner package can set system update policies and the - * most recent policy takes - * effect. + * components in the device owner package can set system update policies and the most + * recent policy takes effect. * @param policy the new policy, or {@code null} to clear the current policy. + * @throws SecurityException if {@code admin} is not a device owner. * @see SystemUpdatePolicy */ public void setSystemUpdatePolicy(@NonNull ComponentName admin, SystemUpdatePolicy policy) { @@ -5338,17 +5393,17 @@ public class DevicePolicyManager { /** * Called by a device owner to disable the keyguard altogether. - * - * <p>Setting the keyguard to disabled has the same effect as choosing "None" as the screen - * lock type. However, this call has no effect if a password, pin or pattern is currently set. - * If a password, pin or pattern is set after the keyguard was disabled, the keyguard stops - * being disabled. + * <p> + * Setting the keyguard to disabled has the same effect as choosing "None" as the screen lock + * type. However, this call has no effect if a password, pin or pattern is currently set. If a + * password, pin or pattern is set after the keyguard was disabled, the keyguard stops being + * disabled. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param disabled {@code true} disables the keyguard, {@code false} reenables it. - * * @return {@code false} if attempting to disable the keyguard while a lock password was in - * place. {@code true} otherwise. + * place. {@code true} otherwise. + * @throws SecurityException if {@code admin} is not a device owner. */ public boolean setKeyguardDisabled(@NonNull ComponentName admin, boolean disabled) { try { @@ -5360,14 +5415,13 @@ public class DevicePolicyManager { /** * Called by device owner to disable the status bar. Disabling the status bar blocks - * notifications, quick settings and other screen overlays that allow escaping from - * a single use device. + * notifications, quick settings and other screen overlays that allow escaping from a single use + * device. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param disabled {@code true} disables the status bar, {@code false} reenables it. - * - * @return {@code false} if attempting to disable the status bar failed. - * {@code true} otherwise. + * @return {@code false} if attempting to disable the status bar failed. {@code true} otherwise. + * @throws SecurityException if {@code admin} is not a device owner. */ public boolean setStatusBarDisabled(@NonNull ComponentName admin, boolean disabled) { try { @@ -5399,19 +5453,19 @@ public class DevicePolicyManager { /** * Called by profile or device owners to set the default response for future runtime permission - * requests by applications. The policy can allow for normal operation which prompts the - * user to grant a permission, or can allow automatic granting or denying of runtime - * permission requests by an application. This also applies to new permissions declared by app - * updates. When a permission is denied or granted this way, the effect is equivalent to setting - * the permission grant state via {@link #setPermissionGrantState}. - * - * <p/>As this policy only acts on runtime permission requests, it only applies to applications + * requests by applications. The policy can allow for normal operation which prompts the user to + * grant a permission, or can allow automatic granting or denying of runtime permission requests + * by an application. This also applies to new permissions declared by app updates. When a + * permission is denied or granted this way, the effect is equivalent to setting the permission + * grant state via {@link #setPermissionGrantState}. + * <p/> + * As this policy only acts on runtime permission requests, it only applies to applications * built with a {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later. * * @param admin Which profile or device owner this request is associated with. * @param policy One of the policy constants {@link #PERMISSION_POLICY_PROMPT}, - * {@link #PERMISSION_POLICY_AUTO_GRANT} and {@link #PERMISSION_POLICY_AUTO_DENY}. - * + * {@link #PERMISSION_POLICY_AUTO_GRANT} and {@link #PERMISSION_POLICY_AUTO_DENY}. + * @throws SecurityException if {@code admin} is not a device or profile owner. * @see #setPermissionGrantState */ public void setPermissionPolicy(@NonNull ComponentName admin, int policy) { @@ -5437,29 +5491,28 @@ public class DevicePolicyManager { } /** - * Sets the grant state of a runtime permission for a specific application. The state - * can be {@link #PERMISSION_GRANT_STATE_DEFAULT default} in which a user can manage it - * through the UI, {@link #PERMISSION_GRANT_STATE_DENIED denied}, in which the permission - * is denied and the user cannot manage it through the UI, and {@link - * #PERMISSION_GRANT_STATE_GRANTED granted} in which the permission is granted and the - * user cannot manage it through the UI. This might affect all permissions in a - * group that the runtime permission belongs to. This method can only be called + * Sets the grant state of a runtime permission for a specific application. The state can be + * {@link #PERMISSION_GRANT_STATE_DEFAULT default} in which a user can manage it through the UI, + * {@link #PERMISSION_GRANT_STATE_DENIED denied}, in which the permission is denied and the user + * cannot manage it through the UI, and {@link #PERMISSION_GRANT_STATE_GRANTED granted} in which + * the permission is granted and the user cannot manage it through the UI. This might affect all + * permissions in a group that the runtime permission belongs to. This method can only be called * by a profile or device owner. - * - * <p/>Setting the grant state to {@link #PERMISSION_GRANT_STATE_DEFAULT default} does not - * revoke the permission. It retains the previous grant, if any. - * - * <p/>Permissions can be granted or revoked only for applications built with a + * <p/> + * Setting the grant state to {@link #PERMISSION_GRANT_STATE_DEFAULT default} does not revoke + * the permission. It retains the previous grant, if any. + * <p/> + * Permissions can be granted or revoked only for applications built with a * {@code targetSdkVersion} of {@link android.os.Build.VERSION_CODES#M} or later. * * @param admin Which profile or device owner this request is associated with. * @param packageName The application to grant or revoke a permission to. * @param permission The permission to grant or revoke. - * @param grantState The permission grant state which is one of {@link - * #PERMISSION_GRANT_STATE_DENIED}, {@link #PERMISSION_GRANT_STATE_DEFAULT}, - * {@link #PERMISSION_GRANT_STATE_GRANTED}, + * @param grantState The permission grant state which is one of + * {@link #PERMISSION_GRANT_STATE_DENIED}, {@link #PERMISSION_GRANT_STATE_DEFAULT}, + * {@link #PERMISSION_GRANT_STATE_GRANTED}, * @return whether the permission was successfully granted or revoked. - * + * @throws SecurityException if {@code admin} is not a device or profile owner. * @see #PERMISSION_GRANT_STATE_DENIED * @see #PERMISSION_GRANT_STATE_DEFAULT * @see #PERMISSION_GRANT_STATE_GRANTED @@ -5480,13 +5533,15 @@ public class DevicePolicyManager { * @param packageName The application to check the grant state for. * @param permission The permission to check for. * @return the current grant state specified by device policy. If the profile or device owner - * has not set a grant state, the return value is {@link #PERMISSION_GRANT_STATE_DEFAULT}. - * This does not indicate whether or not the permission is currently granted for the package. - * - * <p/>If a grant state was set by the profile or device owner, then the return value will - * be one of {@link #PERMISSION_GRANT_STATE_DENIED} or {@link #PERMISSION_GRANT_STATE_GRANTED}, - * which indicates if the permission is currently denied or granted. - * + * has not set a grant state, the return value is + * {@link #PERMISSION_GRANT_STATE_DEFAULT}. This does not indicate whether or not the + * permission is currently granted for the package. + * <p/> + * If a grant state was set by the profile or device owner, then the return value will + * be one of {@link #PERMISSION_GRANT_STATE_DENIED} or + * {@link #PERMISSION_GRANT_STATE_GRANTED}, which indicates if the permission is + * currently denied or granted. + * @throws SecurityException if {@code admin} is not a device or profile owner. * @see #setPermissionGrantState(ComponentName, String, String, int) * @see PackageManager#checkPermission(String, String) */ @@ -5503,9 +5558,6 @@ public class DevicePolicyManager { * Returns if provisioning a managed profile or device is possible or not. * @param action One of {@link #ACTION_PROVISION_MANAGED_DEVICE}, * {@link #ACTION_PROVISION_MANAGED_PROFILE}. - * Note that even if this method returns true, there is a slight possibility that the - * provisioning will not be allowed when it is actually initiated because some event has - * happened in between. * @return if provisioning a managed profile or device is possible or not. * @throws IllegalArgumentException if the supplied action is not valid. */ @@ -5552,10 +5604,11 @@ public class DevicePolicyManager { * Called by device owner to get the MAC address of the Wi-Fi device. * * @param admin Which device owner this request is associated with. - * @return the MAC address of the Wi-Fi device, or null when the information is not - * available. (For example, Wi-Fi hasn't been enabled, or the device doesn't support Wi-Fi.) - * - * <p>The address will be in the {@code XX:XX:XX:XX:XX:XX} format. + * @return the MAC address of the Wi-Fi device, or null when the information is not available. + * (For example, Wi-Fi hasn't been enabled, or the device doesn't support Wi-Fi.) + * <p> + * The address will be in the {@code XX:XX:XX:XX:XX:XX} format. + * @throws SecurityException if {@code admin} is not a device owner. */ public String getWifiMacAddress(@NonNull ComponentName admin) { try { @@ -5566,7 +5619,12 @@ public class DevicePolicyManager { } /** - * Called by device owner to reboot the device. + * Called by device owner to reboot the device. If there is an ongoing call on the device, + * throws an {@link IllegalStateException}. + * @param admin Which device owner the request is associated with. + * @throws IllegalStateException if device has an ongoing call. + * @throws SecurityException if {@code admin} is not a device owner. + * @see TelephonyManager#CALL_STATE_IDLE */ public void reboot(@NonNull ComponentName admin) { try { @@ -5577,24 +5635,21 @@ public class DevicePolicyManager { } /** - * Called by a device admin to set the short support message. This will - * be displayed to the user in settings screens where funtionality has - * been disabled by the admin. - * - * The message should be limited to a short statement such as - * "This setting is disabled by your administrator. Contact someone@example.com - * for support." - * If the message is longer than 200 characters it may be truncated. - * - * <p>If the short support message needs to be localized, it is the responsibility of the + * Called by a device admin to set the short support message. This will be displayed to the user + * in settings screens where funtionality has been disabled by the admin. The message should be + * limited to a short statement such as "This setting is disabled by your administrator. Contact + * someone@example.com for support." If the message is longer than 200 characters it may be + * truncated. + * <p> + * If the short support message needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast * and set a new version of this string accordingly. * * @see #setLongSupportMessage - * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param message Short message to be displayed to the user in settings or null to - * clear the existing message. + * @param message Short message to be displayed to the user in settings or null to clear the + * existing message. + * @throws SecurityException if {@code admin} is not an active administrator. */ public void setShortSupportMessage(@NonNull ComponentName admin, @Nullable String message) { @@ -5611,8 +5666,9 @@ public class DevicePolicyManager { * Called by a device admin to get the short support message. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @return The message set by {@link #setShortSupportMessage(ComponentName, String)} - * or null if no message has been set. + * @return The message set by {@link #setShortSupportMessage(ComponentName, String)} or null if + * no message has been set. + * @throws SecurityException if {@code admin} is not an active administrator. */ public String getShortSupportMessage(@NonNull ComponentName admin) { if (mService != null) { @@ -5626,18 +5682,18 @@ public class DevicePolicyManager { } /** - * Called by a device admin to set the long support message. This will - * be displayed to the user in the device administators settings screen. - * - * <p>If the long support message needs to be localized, it is the responsibility of the + * Called by a device admin to set the long support message. This will be displayed to the user + * in the device administators settings screen. + * <p> + * If the long support message needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast * and set a new version of this string accordingly. * * @see #setShortSupportMessage - * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param message Long message to be displayed to the user in settings or null to - * clear the existing message. + * @param message Long message to be displayed to the user in settings or null to clear the + * existing message. + * @throws SecurityException if {@code admin} is not an active administrator. */ public void setLongSupportMessage(@NonNull ComponentName admin, @Nullable String message) { @@ -5654,8 +5710,9 @@ public class DevicePolicyManager { * Called by a device admin to get the long support message. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @return The message set by {@link #setLongSupportMessage(ComponentName, String)} - * or null if no message has been set. + * @return The message set by {@link #setLongSupportMessage(ComponentName, String)} or null if + * no message has been set. + * @throws SecurityException if {@code admin} is not an active administrator. */ public String getLongSupportMessage(@NonNull ComponentName admin) { if (mService != null) { @@ -5712,10 +5769,11 @@ public class DevicePolicyManager { /** * Called by the profile owner of a managed profile to obtain a {@link DevicePolicyManager} * whose calls act on the parent profile. - * - * <p> Note only some methods will work on the parent Manager. + * <p> + * Note only some methods will work on the parent Manager. * * @return a new instance of {@link DevicePolicyManager} that acts on the parent profile. + * @throws SecurityException if {@code admin} is not a profile owner. */ public DevicePolicyManager getParentProfileInstance(@NonNull ComponentName admin) { try { @@ -5729,17 +5787,18 @@ public class DevicePolicyManager { } /** - * Called by device owner to control the device logging feature. Logging can only be - * enabled on single user devices where the sole user is managed by the device owner. - * - * <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. + * Called by device owner to control the device logging feature. Logging can only be enabled on + * single user devices where the sole user is managed by the device owner. + * <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. + * @throws SecurityException if {@code admin} is not a device owner. * @see #retrieveDeviceLogs */ public void setDeviceLoggingEnabled(@NonNull ComponentName admin, boolean enabled) { @@ -5752,12 +5811,12 @@ public class DevicePolicyManager { /** * 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. + * <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. + * @throws SecurityException if {@code admin} is not a device owner. */ public boolean getDeviceLoggingEnabled(@NonNull ComponentName admin) { try { @@ -5768,18 +5827,19 @@ public class DevicePolicyManager { } /** - * Called by device owner to retrieve all new device logging entries since the last call to - * this API after device boots. - * - * <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. + * Called by device owner to retrieve all new device logging entries since the last call to this + * API after device boots. + * <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. + * @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. + * @throws SecurityException if {@code admin} is not a device owner. */ public List<SecurityEvent> retrieveDeviceLogs(@NonNull ComponentName admin) { try { @@ -5813,18 +5873,18 @@ public class DevicePolicyManager { /** * Called by device owners to retrieve device logs from before the device's last reboot. - * * <p> * <strong> The device logs are retrieved from a RAM region which is not guaranteed to be - * corruption-free during power cycles, due to hardware variations and limitations. As a - * 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. + * corruption-free during power cycles, due to hardware variations and limitations. As a 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. + * @throws SecurityException if {@code admin} is not a device owner. */ public List<SecurityEvent> retrievePreviousDeviceLogs(@NonNull ComponentName admin) { try { @@ -5836,15 +5896,16 @@ public class DevicePolicyManager { } /** - * Called by a profile owner of a managed profile to set the color used for customization. - * This color is used as background color of the confirm credentials screen for that user. - * The default color is {@link android.graphics.Color#GRAY}. - * - * <p>The confirm credentials screen can be created using + * Called by a profile owner of a managed profile to set the color used for customization. This + * color is used as background color of the confirm credentials screen for that user. The + * default color is {@link android.graphics.Color#GRAY}. + * <p> + * The confirm credentials screen can be created using * {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent}. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param color The 32bit representation of the color to be used. + * @throws SecurityException if {@code admin} is not a profile owner. */ public void setOrganizationColor(@NonNull ComponentName admin, int color) { try { @@ -5879,6 +5940,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return The 32bit representation of the color to be used. + * @throws SecurityException if {@code admin} is not a profile owner. */ public int getOrganizationColor(@NonNull ComponentName admin) { try { @@ -5906,13 +5968,14 @@ public class DevicePolicyManager { /** * Called by a profile owner of a managed profile to set the name of the organization under * management. - * - * <p>If the organization name needs to be localized, it is the responsibility of the + * <p> + * If the organization name needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast * and set a new version of this string accordingly. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param title The organization name or {@code null} to clear a previously set name. + * @throws SecurityException if {@code admin} is not a profile owner. */ public void setOrganizationName(@NonNull ComponentName admin, @Nullable String title) { try { @@ -5923,11 +5986,12 @@ public class DevicePolicyManager { } /** - * Called by a profile owner of a managed profile to retrieve the name of the organization - * under management. + * Called by a profile owner of a managed profile to retrieve the name of the organization under + * management. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return The organization name or {@code null} if none is set. + * @throws SecurityException if {@code admin} is not a profile owner. */ public String getOrganizationName(@NonNull ComponentName admin) { try { diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java index 61b40d437514..54a2f7aff7d6 100644 --- a/core/java/android/app/admin/DevicePolicyManagerInternal.java +++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java @@ -16,6 +16,7 @@ package android.app.admin; +import android.content.Intent; import android.os.UserHandle; import java.util.List; @@ -74,10 +75,23 @@ public abstract class DevicePolicyManagerInternal { /** * Checks if a given package has a device or a profile owner for the given user. - * </br><em>Does <b>not</b> support negative userIds like {@link UserHandle#USER_ALL}</em> + * <p> + * <em>Note: does <b>not</b> support negative userIds like {@link UserHandle#USER_ALL}</em> + * * @param packageName The package to check * @param userId the userId to check for. * @return true if package has a device or profile owner, false otherwise. */ public abstract boolean hasDeviceOwnerOrProfileOwner(String packageName, int userId); + + /** + * Creates an intent to show the admin support dialog to let the user know that the package is + * suspended by the admin. This assumes that {@param packageName} is suspended by the + * device/profile owner. The caller should check if the package is suspended or not. + * + * @param packageName The package that is suspended + * @param userId The user having the suspended package. + * @return The intent to trigger the admin support dialog. + */ + public abstract Intent createPackageSuspendedDialogIntent(String packageName, int userId); } diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index eb4cb919ce1b..d762a1727272 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2015 The Android Open Source Project + * Copyright (C) 2009-2016 The Android Open Source Project * Copyright (C) 2015 Samsung LSI * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -1837,6 +1837,9 @@ public final class BluetoothAdapter { } else if (profile == BluetoothProfile.SAP) { BluetoothSap sap = new BluetoothSap(context, listener); return true; + } else if (profile == BluetoothProfile.PBAP_CLIENT) { + BluetoothPbapClient pbapClient = new BluetoothPbapClient(context, listener); + return true; } else { return false; } @@ -1905,6 +1908,10 @@ public final class BluetoothAdapter { BluetoothSap sap = (BluetoothSap)proxy; sap.close(); break; + case BluetoothProfile.PBAP_CLIENT: + BluetoothPbapClient pbapClient = (BluetoothPbapClient)proxy; + pbapClient.close(); + break; } } diff --git a/core/java/android/bluetooth/BluetoothPbapClient.java b/core/java/android/bluetooth/BluetoothPbapClient.java new file mode 100644 index 000000000000..736e55d17d8a --- /dev/null +++ b/core/java/android/bluetooth/BluetoothPbapClient.java @@ -0,0 +1,331 @@ +/* + * 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.bluetooth; + +import java.util.List; +import java.util.ArrayList; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.RemoteException; +import android.os.IBinder; +import android.util.Log; + +/** + * This class provides the APIs to control the Bluetooth PBAP Client Profile. + *@hide + */ +public final class BluetoothPbapClient implements BluetoothProfile { + + private static final String TAG = "BluetoothPbapClient"; + private static final boolean DBG = false; + private static final boolean VDBG = false; + + public static final String ACTION_CONNECTION_STATE_CHANGED = + "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED"; + + private IBluetoothPbapClient mService; + private BluetoothDevice mDevice; + private final Context mContext; + private ServiceListener mServiceListener; + private BluetoothAdapter mAdapter; + + /** There was an error trying to obtain the state */ + public static final int STATE_ERROR = -1; + + public static final int RESULT_FAILURE = 0; + public static final int RESULT_SUCCESS = 1; + /** Connection canceled before completion. */ + public static final int RESULT_CANCELED = 2; + + final private IBluetoothStateChangeCallback mBluetoothStateChangeCallback = + new IBluetoothStateChangeCallback.Stub() { + public void onBluetoothStateChange(boolean up) { + if (DBG) { + Log.d(TAG, "onBluetoothStateChange: PBAP CLIENT up=" + up); + } + if (!up) { + if (VDBG) { + Log.d(TAG,"Unbinding service..."); + } + synchronized (mConnection) { + try { + mService = null; + mContext.unbindService(mConnection); + } catch (Exception re) { + Log.e(TAG,"",re); + } + } + } else { + synchronized (mConnection) { + try { + if (mService == null) { + if (VDBG) { + Log.d(TAG,"Binding service..."); + } + doBind(); + } + } catch (Exception re) { + Log.e(TAG,"",re); + } + } + } + } + }; + + /** + * Create a BluetoothPbapClient proxy object. + */ + BluetoothPbapClient(Context context, ServiceListener l) { + if (DBG) { + Log.d(TAG, "Create BluetoothPbapClient proxy object"); + } + mContext = context; + mServiceListener = l; + mAdapter = BluetoothAdapter.getDefaultAdapter(); + IBluetoothManager mgr = mAdapter.getBluetoothManager(); + if (mgr != null) { + try { + mgr.registerStateChangeCallback(mBluetoothStateChangeCallback); + } catch (RemoteException e) { + Log.e(TAG,"",e); + } + } + doBind(); + } + + private boolean doBind() { + Intent intent = new Intent(IBluetoothPbapClient.class.getName()); + ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); + intent.setComponent(comp); + if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, + android.os.Process.myUserHandle())) { + Log.e(TAG, "Could not bind to Bluetooth PBAP Client Service with " + intent); + return false; + } + return true; + } + + protected void finalize() throws Throwable { + try { + close(); + } finally { + super.finalize(); + } + } + + /** + * Close the connection to the backing service. + * Other public functions of BluetoothPbapClient will return default error + * results once close() has been called. Multiple invocations of close() + * are ok. + */ + public synchronized void close() { + IBluetoothManager mgr = mAdapter.getBluetoothManager(); + if (mgr != null) { + try { + mgr.unregisterStateChangeCallback(mBluetoothStateChangeCallback); + } catch (Exception e) { + Log.e(TAG,"",e); + } + } + + synchronized (mConnection) { + if (mService != null) { + try { + mService = null; + mContext.unbindService(mConnection); + } catch (Exception re) { + Log.e(TAG,"",re); + } + } + } + mServiceListener = null; + } + + /** + * Initiate connection. + * Upon successful connection to remote PBAP server the Client will + * attempt to automatically download the users phonebook and call log. + * + * @param device a remote device we want connect to + * @return <code>true</code> if command has been issued successfully; + * <code>false</code> otherwise; + */ + public boolean connect(BluetoothDevice device) { + if (DBG) { + log("connect(" + device + ") for PBAP Client."); + } + if (mService != null && isEnabled() && isValidDevice(device)) { + try { + mDevice = device; + return mService.connect(device); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(new Throwable())); + return false; + } + } + if (mService == null) { + Log.w(TAG, "Proxy not attached to service"); + } + return false; + } + + /** + * Initiate disconnect. + * + * @param device Remote Bluetooth Device + * @return false on error, + * true otherwise + */ + public boolean disconnect() { + if (DBG) { + log("disconnect(" + mDevice + ")"); + } + if (mService != null && isEnabled() && isValidDevice(mDevice)) { + try { + mService.disconnect(mDevice); + return true; + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(new Throwable())); + return false; + } + } + if (mService == null) { + Log.w(TAG, "Proxy not attached to service"); + } + return false; + } + + /** + * Get the list of connected devices. + * Currently at most one. + * + * @return list of connected devices + */ + @Override + public List<BluetoothDevice> getConnectedDevices() { + if (DBG) { + log("getConnectedDevices()"); + } + if (mService != null && isEnabled()) { + try { + return mService.getConnectedDevices(); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(new Throwable())); + return new ArrayList<BluetoothDevice>(); + } + } + if (mService == null) { + Log.w(TAG, "Proxy not attached to service"); + } + return new ArrayList<BluetoothDevice>(); + } + + /** + * Get the list of devices matching specified states. Currently at most one. + * + * @return list of matching devices + */ + @Override + public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { + if (DBG) { + log("getDevicesMatchingStates()"); + } + if (mService != null && isEnabled()) { + try { + return mService.getDevicesMatchingConnectionStates(states); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(new Throwable())); + return new ArrayList<BluetoothDevice>(); + } + } + if (mService == null) { + Log.w(TAG, "Proxy not attached to service"); + } + return new ArrayList<BluetoothDevice>(); + } + + /** + * Get connection state of device + * + * @return device connection state + */ + @Override + public int getConnectionState(BluetoothDevice device) { + if (DBG) { + log("getConnectionState(" + device + ")"); + } + if (mService != null && isEnabled() && isValidDevice(device)) { + try { + return mService.getConnectionState(device); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(new Throwable())); + return BluetoothProfile.STATE_DISCONNECTED; + } + } + if (mService == null) { + Log.w(TAG, "Proxy not attached to service"); + } + return BluetoothProfile.STATE_DISCONNECTED; + } + + private final ServiceConnection mConnection = new ServiceConnection() { + public void onServiceConnected(ComponentName className, IBinder service) { + if (DBG) { + log("Proxy object connected"); + } + mService = IBluetoothPbapClient.Stub.asInterface(service); + if (mServiceListener != null) { + mServiceListener.onServiceConnected(BluetoothProfile.PBAP_CLIENT, BluetoothPbapClient.this); + } + } + public void onServiceDisconnected(ComponentName className) { + if (DBG) { + log("Proxy object disconnected"); + } + mService = null; + if (mServiceListener != null) { + mServiceListener.onServiceDisconnected(BluetoothProfile.PBAP_CLIENT); + } + } + }; + + private static void log(String msg) { + Log.d(TAG, msg); + } + + private boolean isEnabled() { + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if (adapter != null && adapter.getState() == BluetoothAdapter.STATE_ON) { + return true; + } + log("Bluetooth is Not enabled"); + return false; + } + + private boolean isValidDevice(BluetoothDevice device) { + if (device == null) { + return false; + } + if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) { + return true; + } + return false; + } +} diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java index cbce22cdea60..eee66d193fe4 100644 --- a/core/java/android/bluetooth/BluetoothProfile.java +++ b/core/java/android/bluetooth/BluetoothProfile.java @@ -131,6 +131,12 @@ public interface BluetoothProfile { public static final int HEADSET_CLIENT = 16; /** + * PBAP Client + * @hide + */ + public static final int PBAP_CLIENT = 17; + + /** * Default priority for devices that we try to auto-connect to and * and allow incoming connections for the profile * @hide diff --git a/core/java/android/bluetooth/IBluetoothPbapClient.aidl b/core/java/android/bluetooth/IBluetoothPbapClient.aidl new file mode 100644 index 000000000000..b26ea2957142 --- /dev/null +++ b/core/java/android/bluetooth/IBluetoothPbapClient.aidl @@ -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 android.bluetooth; + +import android.bluetooth.BluetoothDevice; + +/** + * API for Bluetooth Phone Book Access Provile Client Side + * + * {@hide} + */ +interface IBluetoothPbapClient { + boolean connect(in BluetoothDevice device); + boolean disconnect(in BluetoothDevice device); + List<BluetoothDevice> getConnectedDevices(); + List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states); + int getConnectionState(in BluetoothDevice device); +} diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index ccb0552ae482..c4dfdcf10405 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -2681,6 +2681,7 @@ public abstract class Context { HARDWARE_PROPERTIES_SERVICE, //@hide: SOUND_TRIGGER_SERVICE, SHORTCUT_SERVICE, + //@hide: CONTEXTHUB_SERVICE, }) @Retention(RetentionPolicy.SOURCE) public @interface ServiceName {} @@ -3585,6 +3586,18 @@ public abstract class Context { public static final String SHORTCUT_SERVICE = "shortcut"; /** + * Use with {@link #getSystemService} to retrieve a {@link + * android.hardware.location.ContextHubManager} for accessing context hubs. + * + * @see #getSystemService + * @see android.hardware.location.ContextHubManager + * + * @hide + */ + @SystemApi + public static final String CONTEXTHUB_SERVICE = "contexthub"; + + /** * Use with {@link #getSystemService} to retrieve a * {@link android.os.health.SystemHealthManager} for accessing system health (battery, power, * memory, etc) metrics. diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 182475ff6da4..35dbc3474865 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -660,6 +660,8 @@ public class Intent implements Parcelable, Cloneable { /** * Activity Action: Quick view the data. Launches a quick viewer for * a URI or a list of URIs. + * <p>Activities handling this intent action should handle the vast majority of + * MIME types rather than only specific ones. * <p>Input: {@link #getData} is a mandatory content URI of the item to * preview. {@link #getClipData} contains an optional list of content URIs * if there is more than one item to preview. {@link #EXTRA_INDEX} is an @@ -4142,7 +4144,8 @@ public class Intent implements Parcelable, Cloneable { /** * Optional index with semantics depending on the intent action. - * @see #ACTION_QUICK_VIEW + * + * <p>The value must be an integer greater or equal to 0. */ public static final String EXTRA_INDEX = "android.intent.extra.INDEX"; diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl index 7b578728b104..6b3d4f1326ea 100644 --- a/core/java/android/content/pm/ILauncherApps.aidl +++ b/core/java/android/content/pm/ILauncherApps.aidl @@ -34,7 +34,7 @@ import java.util.List; * {@hide} */ interface ILauncherApps { - void addOnAppsChangedListener(in IOnAppsChangedListener listener); + void addOnAppsChangedListener(String callingPackage, in IOnAppsChangedListener listener); void removeOnAppsChangedListener(in IOnAppsChangedListener listener); ParceledListSlice getLauncherActivities(String packageName, in UserHandle user); ResolveInfo resolveActivity(in Intent intent, in UserHandle user); diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 8d43c44ea4d5..8724d5ece5ca 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -565,7 +565,8 @@ public class LauncherApps { addCallbackLocked(callback, handler); if (addedFirstCallback) { try { - mService.addOnAppsChangedListener(mAppsChangedListener); + mService.addOnAppsChangedListener(mContext.getPackageName(), + mAppsChangedListener); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index e1e8a07310ac..c1017fb3f110 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4387,10 +4387,8 @@ public abstract class PackageManager { int badgeDensity); /** - * If the target user is a managed profile of the calling user or if the - * target user is the caller and is itself a managed profile, then this - * returns a badged copy of the given icon to be able to distinguish it from - * the original icon. For badging an arbitrary drawable use + * If the target user is a managed profile, then this returns a badged copy of the given icon + * to be able to distinguish it from the original icon. For badging an arbitrary drawable use * {@link #getUserBadgedDrawableForDensity( * android.graphics.drawable.Drawable, UserHandle, android.graphics.Rect, int)}. * <p> diff --git a/core/java/android/content/pm/ShortcutServiceInternal.java b/core/java/android/content/pm/ShortcutServiceInternal.java index 7c764aa7d0ff..4255582f7976 100644 --- a/core/java/android/content/pm/ShortcutServiceInternal.java +++ b/core/java/android/content/pm/ShortcutServiceInternal.java @@ -36,8 +36,7 @@ import java.util.List; */ public abstract class ShortcutServiceInternal { public interface ShortcutChangeListener { - void onShortcutChanged(@NonNull String packageName, - @NonNull List<ShortcutInfo> shortcuts, @UserIdInt int userId); + void onShortcutChanged(@NonNull String packageName, @UserIdInt int userId); } public abstract List<ShortcutInfo> diff --git a/core/java/android/content/res/ColorStateList.java b/core/java/android/content/res/ColorStateList.java index 5bf2e3e5aa49..fb5bfd363ce2 100644 --- a/core/java/android/content/res/ColorStateList.java +++ b/core/java/android/content/res/ColorStateList.java @@ -442,7 +442,7 @@ public class ColorStateList extends ComplexColor implements Parcelable { * @see android.content.pm.ActivityInfo */ public @Config int getChangingConfigurations() { - return mChangingConfigurations; + return super.getChangingConfigurations() | mChangingConfigurations; } private int modulateColorAlpha(int baseColor, float alphaMod) { diff --git a/core/java/android/content/res/ComplexColor.java b/core/java/android/content/res/ComplexColor.java index d96ec62749f0..b297764629cf 100644 --- a/core/java/android/content/res/ComplexColor.java +++ b/core/java/android/content/res/ComplexColor.java @@ -25,6 +25,8 @@ import android.graphics.Color; * {@link android.content.res.ColorStateList} or {@link android.content.res.GradientColor} */ public abstract class ComplexColor { + private int mChangingConfigurations; + /** * @return {@code true} if this ComplexColor changes color based on state, {@code false} * otherwise. @@ -52,4 +54,24 @@ public abstract class ComplexColor { * @hide only for resource preloading */ public abstract ComplexColor obtainForTheme(Theme t); + + /** + * @hide only for resource preloading + */ + final void setBaseChangingConfigurations(int changingConfigurations) { + mChangingConfigurations = changingConfigurations; + } + + /** + * Returns a mask of the configuration parameters for which this color + * may change, requiring that it be re-created. + * + * @return a mask of the changing configuration parameters, as defined by + * {@link android.content.pm.ActivityInfo} + * + * @see android.content.pm.ActivityInfo + */ + public int getChangingConfigurations() { + return mChangingConfigurations; + } } diff --git a/core/java/android/content/res/GradientColor.java b/core/java/android/content/res/GradientColor.java index 329134094824..f29656abe6c3 100644 --- a/core/java/android/content/res/GradientColor.java +++ b/core/java/android/content/res/GradientColor.java @@ -542,6 +542,19 @@ public class GradientColor extends ComplexColor { return clone; } + /** + * Returns a mask of the configuration parameters for which this gradient + * may change, requiring that it be re-created. + * + * @return a mask of the changing configuration parameters, as defined by + * {@link android.content.pm.ActivityInfo} + * + * @see android.content.pm.ActivityInfo + */ + public int getChangingConfigurations() { + return super.getChangingConfigurations() | mChangingConfigurations; + } + private void applyTheme(Theme t) { if (mThemeAttrs != null) { applyRootAttrsTheme(t); diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index 90037f7b508c..a36401098e27 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -713,9 +713,11 @@ public class ResourcesImpl { } if (complexColor != null) { + complexColor.setBaseChangingConfigurations(value.changingConfigurations); + if (mPreloading) { - if (verifyPreloadConfig(value.changingConfigurations, 0, value.resourceId, - "color")) { + if (verifyPreloadConfig(complexColor.getChangingConfigurations(), + 0, value.resourceId, "color")) { sPreloadedComplexColors.put(key, complexColor.getConstantState()); } } else { diff --git a/core/java/android/hardware/location/ContextHubInfo.aidl b/core/java/android/hardware/location/ContextHubInfo.aidl index 1a9221a02cc3..8de03daf203d 100644 --- a/core/java/android/hardware/location/ContextHubInfo.aidl +++ b/core/java/android/hardware/location/ContextHubInfo.aidl @@ -15,7 +15,7 @@ */ package android.hardware.location; -/* -@hide -*/ +/** + * @hide + */ parcelable ContextHubInfo; diff --git a/core/java/android/hardware/location/ContextHubInfo.java b/core/java/android/hardware/location/ContextHubInfo.java index e47c541ee62b..644e29fcaedf 100644 --- a/core/java/android/hardware/location/ContextHubInfo.java +++ b/core/java/android/hardware/location/ContextHubInfo.java @@ -23,7 +23,7 @@ import java.util.Arrays; /** * @hide - */ + */ @SystemApi public class ContextHubInfo { private int mId; @@ -58,6 +58,8 @@ public class ContextHubInfo { * set the context hub unique identifer * * @param id - unique system wide identifier for the hub + * + * @hide */ public void setId(int id) { mId = id; @@ -75,7 +77,9 @@ public class ContextHubInfo { /** * set a string as the hub name * - * @param String - the name for the hub + * @param name - the name for the hub + * + * @hide */ public void setName(String name) { mName = name; @@ -93,7 +97,9 @@ public class ContextHubInfo { /** * set a string as the vendor name * - * @param String - a name for the vendor + * @param vendor - a name for the vendor + * + * @hide */ public void setVendor(String vendor) { mVendor = vendor; @@ -111,7 +117,9 @@ public class ContextHubInfo { /** * set tool chain string * - * @param String - description of the tool chain + * @param toolchain - description of the tool chain + * + * @hide */ public void setToolchain(String toolchain) { mToolchain = toolchain; @@ -130,6 +138,8 @@ public class ContextHubInfo { * set platform version * * @param platformVersion - platform version number + * + * @hide */ public void setPlatformVersion(int platformVersion) { mPlatformVersion = platformVersion; @@ -148,6 +158,8 @@ public class ContextHubInfo { * set platform software version * * @param staticSwVersion - platform static s/w version number + * + * @hide */ public void setStaticSwVersion(int staticSwVersion) { mStaticSwVersion = staticSwVersion; @@ -166,6 +178,8 @@ public class ContextHubInfo { * set the tool chain version number * * @param toolchainVersion - tool chain version number + * + * @hide */ public void setToolchainVersion(int toolchainVersion) { mToolchainVersion = toolchainVersion; @@ -184,6 +198,8 @@ public class ContextHubInfo { * set the peak mips that this hub can support * * @param peakMips - peak mips this hub can deliver + * + * @hide */ public void setPeakMips(float peakMips) { mPeakMips = peakMips; @@ -206,6 +222,8 @@ public class ContextHubInfo { * Set the power consumed by the hub in stopped state * * @param stoppedPowerDrawMw - stopped power in milli watts + * + * @hide */ public void setStoppedPowerDrawMw(float stoppedPowerDrawMw) { mStoppedPowerDrawMw = stoppedPowerDrawMw; @@ -230,6 +248,8 @@ public class ContextHubInfo { * Set the sleep power draw in milliwatts * * @param sleepPowerDrawMw - sleep power draw in milliwatts. + * + * @hide */ public void setSleepPowerDrawMw(float sleepPowerDrawMw) { mSleepPowerDrawMw = sleepPowerDrawMw; @@ -250,6 +270,8 @@ public class ContextHubInfo { * * @param peakPowerDrawMw - peak power draw of the hub in * milliwatts. + * + * @hide */ public void setPeakPowerDrawMw(float peakPowerDrawMw) { mPeakPowerDrawMw = peakPowerDrawMw; @@ -281,6 +303,8 @@ public class ContextHubInfo { * set the supported sensors on this hub * * @param supportedSensors - supported sensors on this hub + * + * @hide */ public void setSupportedSensors(int[] supportedSensors) { mSupportedSensors = Arrays.copyOf(supportedSensors, supportedSensors.length); @@ -292,6 +316,8 @@ public class ContextHubInfo { * @param memoryRegions - memory regions information * * @see MemoryRegion + * + * @hide */ public void setMemoryRegions(MemoryRegion[] memoryRegions) { mMemoryRegions = Arrays.copyOf(memoryRegions, memoryRegions.length); diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java index 301b2e49a19c..38a760a065dd 100644 --- a/core/java/android/hardware/location/ContextHubManager.java +++ b/core/java/android/hardware/location/ContextHubManager.java @@ -15,18 +15,24 @@ */ package android.hardware.location; +import android.Manifest; import android.annotation.SystemApi; -import android.hardware.location.NanoAppInstanceInfo; import android.content.ComponentName; import android.content.Context; import android.content.ServiceConnection; -import android.Manifest; +import android.hardware.location.ContextHubService; +import android.hardware.location.NanoAppInstanceInfo; +import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.os.RemoteException; +import android.os.ServiceManager; import android.util.Log; import java.util.ArrayList; import java.util.HashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /** * A class that exposes the Context hubs on a device to @@ -48,9 +54,12 @@ public final class ContextHubManager { private static final String ENFORCE_HW_PERMISSION_MESSAGE = "Permission '" + HARDWARE_PERMISSION + "' not granted to access ContextHub Hardware"; - private Context mContext; + private final Context mContext; + private final Looper mMainLooper; private IContextHubService mContextHubService; private boolean mContextHubConnected; + private ContextHubCallback mCallback; + private Handler mCallbackHandler; /** * A special context hub identifer meaning any possible hub on @@ -70,19 +79,32 @@ public final class ContextHubManager { */ public static final int MSG_DATA_SEND = 3; + /** + * an interface to receive asynchronous communication from the context hub + */ + public abstract class ContextHubCallback { + /** + * callback function called on message receipt from context hub + * + * @param hubId id of the hub of the message + * @param nanoAppId identifier for the app that sent the message + * @param msg the context hub message + * + * @see ContextHubMessage + */ + abstract void onMessageReceipt(int hubId, int nanoAppId, ContextHubMessage msg); + } /** * Get a handle to all the context hubs in the system * @return array of context hub handles */ - public int[] getContexthubHandles() { + public int[] getContextHubHandles() { int[] retVal = null; - if(mContextHubConnected) { - try { - retVal = mContextHubService.getContextHubHandles(); - }catch (RemoteException e) { - Log.e (TAG, "Could not fetch context hub handles :" + e.toString()); - } + try { + retVal = getBinder().getContextHubHandles(); + } catch (RemoteException e) { + Log.e(TAG, "Could not fetch context hub handles :" + e.toString()); } return retVal; } @@ -96,17 +118,15 @@ public final class ContextHubManager { * * @see ContextHubInfo */ - public ContextHubInfo getContexthubInfo(int contexthubHandle) { + public ContextHubInfo getContextHubInfo(int contexthubHandle) { ContextHubInfo retVal = null; - if(mContextHubConnected) { - try { - retVal = mContextHubService.getContextHubInfo(contexthubHandle); - }catch (RemoteException e) { - Log.e (TAG, "Could not fetch context hub info :" + e.toString()); - } + try { + retVal = getBinder().getContextHubInfo(contexthubHandle); + } catch (RemoteException e) { + Log.e(TAG, "Could not fetch context hub info :" + e.toString()); } - return(retVal); + return retVal; } /** @@ -122,13 +142,14 @@ public final class ContextHubManager { */ public int loadNanoApp(int hubHandle, NanoApp app) { int retVal = -1; + if (app == null) { + return retVal; + } - if(mContextHubConnected) { - try { - retVal = mContextHubService.loadNanoApp(hubHandle, app); - }catch (RemoteException e) { - Log.e (TAG, "Could not fetch load nanoApp :" + e.toString()); - } + try { + retVal = getBinder().loadNanoApp(hubHandle, app); + } catch (RemoteException e) { + Log.e(TAG, "Could not fetch load nanoApp :" + e.toString()); } return retVal; @@ -144,12 +165,10 @@ public final class ContextHubManager { public int unloadNanoApp(int nanoAppInstanceHandle) { int retVal = -1; - if(mContextHubConnected) { - try { - retVal = mContextHubService.unloadNanoApp(nanoAppInstanceHandle); - }catch (RemoteException e) { - Log.e (TAG, "Could not fetch unload nanoApp :" + e.toString()); - } + try { + retVal = getBinder().unloadNanoApp(nanoAppInstanceHandle); + } catch (RemoteException e) { + Log.e(TAG, "Could not fetch unload nanoApp :" + e.toString()); } return retVal; @@ -168,12 +187,10 @@ public final class ContextHubManager { public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppInstanceHandle) { NanoAppInstanceInfo retVal = null; - if(mContextHubConnected) { - try { - retVal = mContextHubService.getNanoAppInstanceInfo(nanoAppInstanceHandle); - }catch (RemoteException e) { - Log.e (TAG, "Could not fetch nanoApp info :" + e.toString()); - } + try { + retVal = getBinder().getNanoAppInstanceInfo(nanoAppInstanceHandle); + } catch (RemoteException e) { + Log.e(TAG, "Could not fetch nanoApp info :" + e.toString()); } return retVal; @@ -193,16 +210,14 @@ public final class ContextHubManager { int[] temp; Integer[] retVal = null; - if(mContextHubConnected) { - try { - temp = mContextHubService.findNanoAppOnHub(hubHandle, filter); - retVal = new Integer[temp.length]; - for (int i = 0; i < temp.length; i++) { - retVal[i] = temp[i]; - } - }catch (RemoteException e) { - Log.e (TAG, "Could not query nanoApp instance :" + e.toString()); + try { + temp = getBinder().findNanoAppOnHub(hubHandle, filter); + retVal = new Integer[temp.length]; + for (int i = 0; i < temp.length; i++) { + retVal[i] = temp[i]; } + } catch (RemoteException e) { + Log.e(TAG, "Could not query nanoApp instance :" + e.toString()); } return retVal; @@ -221,58 +236,129 @@ public final class ContextHubManager { * * @return int 0 on success, -1 otherwise */ - public int sendMessage(int hubHandle, int nanoAppHandle, ContextHubMessage msg) { + public int sendMessage(int hubHandle, int nanoAppHandle, ContextHubMessage message) { int retVal = -1; - if(mContextHubConnected) { - try { - retVal = mContextHubService.sendMessage(hubHandle, nanoAppHandle, msg); - }catch (RemoteException e) { - Log.e (TAG, "Could not fetch send message :" + e.toString()); - } + try { + retVal = getBinder().sendMessage(hubHandle, nanoAppHandle, message); + } catch (RemoteException e) { + Log.e(TAG, "Could not fetch send message :" + e.toString()); } return retVal; } + /** + * Set a callback to receive messages from the context hub + * + * + * @param callback Callback object + * + * @see ContextHubCallback + * + * @return int 0 on success, -1 otherwise + */ + public int registerContextHubCallback(ContextHubCallback callback) { + return registerContextHubCallback(callback, null); + } + + /** + * Set a callback to receive messages from the context hub + * + * + * @param callback Callback object + * @param hander Hander object + * + * @see ContextHubCallback + * + * @return int 0 on success, -1 otherwise + */ + public int registerContextHubCallback(ContextHubCallback callback, Handler handler) { + synchronized(this) { + if (mCallback != null) { + Log.e(TAG, "Max number of callbacks reached!"); + return -1; + } + mCallback = callback; + mCallbackHandler = handler; + } + return 0; + } + + /** + * Unregister a callback for receive messages from the context + * hub + * + * @see ContextHubCallback + * + * @param callback method to deregister + * + * @return int 0 on success, -1 otherwise + */ + public int unregisterContextHubCallback(ContextHubCallback callback) { + synchronized(this) { + if (callback != mCallback) { + Log.e(TAG, "Cannot recognize callback!"); + return -1; + } + + mCallback = null; + mCallbackHandler = null; + } + return 0; + } + private void checkPermissions() { mContext.enforceCallingPermission(HARDWARE_PERMISSION, ENFORCE_HW_PERMISSION_MESSAGE); } private IContextHubCallback.Stub mClientCallback = new IContextHubCallback.Stub() { @Override - public void onMessageReceipt(int hubId, int nanoAppId, ContextHubMessage msg) throws RemoteException { - + public void onMessageReceipt(final int hubId, final int nanoAppId, + final ContextHubMessage message) throws RemoteException { + if (mCallback != null) { + synchronized(this) { + final ContextHubCallback callback = mCallback; + Handler handler = mCallbackHandler == null ? + new Handler(mMainLooper) : mCallbackHandler; + handler.post(new Runnable() { + @Override + public void run() { + callback.onMessageReceipt(hubId, nanoAppId, message); + } + }); + } + } else { + Log.d(TAG, "Context hub manager client callback is NULL"); + } } }; - private ContextHubManager(Context context) { + /** @hide */ + public ContextHubManager(Context context, Looper mainLooper) { checkPermissions(); mContext = context; - mContextHubConnected = false; - } + mMainLooper = mainLooper; - private ServiceConnection mServiceConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - mContextHubService = IContextHubService.Stub.asInterface(service); - mContextHubConnected = true; + IBinder b = ServiceManager.getService(ContextHubService.CONTEXTHUB_SERVICE); + if (b != null) { + mContextHubService = IContextHubService.Stub.asInterface(b); - // Register our Callback try { - mContextHubService.registerCallBack(mClientCallback); + getBinder().registerCallback(mClientCallback); } catch (RemoteException e) { - Log.e(TAG, "Could not register callback with context hub service :" + e.toString()); + Log.e(TAG, "Could not register callback:" + e.toString()); } - Log.d(TAG, "contexthub manager connected to " + name.toString()); - } - @Override - public void onServiceDisconnected(ComponentName name) { - mContextHubService = null; - mContextHubConnected = false; - Log.d(TAG, "contexthub manager disconnected from " + name.toString()); + } else { + Log.d(TAG, "failed to getService"); } - }; + } + private IContextHubService getBinder() throws RemoteException { + if (mContextHubService == null) { + throw new RemoteException("Service not connected."); + } + return mContextHubService; + } } diff --git a/core/java/android/hardware/location/ContextHubMessage.aidl b/core/java/android/hardware/location/ContextHubMessage.aidl index 915f1ec683c9..56704e70ba5f 100644 --- a/core/java/android/hardware/location/ContextHubMessage.aidl +++ b/core/java/android/hardware/location/ContextHubMessage.aidl @@ -15,8 +15,8 @@ */ package android.hardware.location; -/* -@hide -*/ +/** + * @hide + */ parcelable ContextHubMessage; diff --git a/core/java/android/hardware/location/ContextHubService.java b/core/java/android/hardware/location/ContextHubService.java index a2a13c6f8289..658d90bae21e 100644 --- a/core/java/android/hardware/location/ContextHubService.java +++ b/core/java/android/hardware/location/ContextHubService.java @@ -29,175 +29,157 @@ import java.util.HashMap; /** * @hide */ -public class ContextHubService extends Service { +public class ContextHubService extends IContextHubService.Stub { private static final String TAG = "ContextHubService"; - private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private static ContextHubService sSingletonInstance; - private static final Object sSingletonInstanceLock = new Object(); + public static final String CONTEXTHUB_SERVICE = "contexthub_service"; + + private final Context mContext; - private HashMap<Integer, ContextHubInfo> mHubHash; private HashMap<Integer, NanoAppInstanceInfo> mNanoAppHash; - private ContextHubInfo[] mContexthubInfo; + private ContextHubInfo[] mContextHubInfo; + private IContextHubCallback mCallback; + + public ContextHubService(Context context) { + mContext = context; + mContextHubInfo = nativeInitialize(); + for (int i = 0; i < mContextHubInfo.length; i++) { + Log.v(TAG, "ContextHub[" + i + "] id: " + mContextHubInfo[i].getId() + + ", name: " + mContextHubInfo[i].getName()); + } + } private native int nativeSendMessage(int[] header, byte[] data); private native ContextHubInfo[] nativeInitialize(); - private int onMessageReceipt(int[] header, byte[] data) { + @Override + public int registerCallback(IContextHubCallback callback) throws RemoteException{ + mCallback = callback; return 0; } - private void initialize() { - mContexthubInfo = nativeInitialize(); - mHubHash = new HashMap<Integer, ContextHubInfo>(); - for (int i = 0; i < mContexthubInfo.length; i++) { - mHubHash.put(i + 1, mContexthubInfo[i]); // Avoiding zero - } - } - - private ContextHubService(Context context) { - initialize(); - Log.d(TAG, "Created from " + context.toString()); - } - - public static ContextHubService getInstance(Context context) { - synchronized (sSingletonInstanceLock) { - if (sSingletonInstance == null) { - sSingletonInstance = new ContextHubService(context); + private int onMessageReceipt(int[] header, byte[] data) { + if (mCallback != null) { + // TODO : Defend against unexpected header sizes + // Add abstraction for magic numbers + // onMessageRecipt should pass the right arguments + ContextHubMessage msg = new ContextHubMessage(header[0], header[1], data); + + try { + mCallback.onMessageReceipt(0, 0, msg); + } catch (Exception e) { + Log.e(TAG, "Exception " + e + " when calling remote callback"); + return -1; } - return sSingletonInstance; + } else { + Log.d(TAG, "Message Callback is NULL"); } - } - @Override - public void onCreate() { - super.onCreate(); + return 0; } @Override - public IBinder onBind(Intent intent) { - return null; - } - - private final IContextHubService.Stub mBinder = new IContextHubService.Stub() { + public int[] getContextHubHandles() throws RemoteException { + int [] returnArray = new int[mContextHubInfo.length]; - private IContextHubCallback callback; - - @Override - public int registerCallBack(IContextHubCallback callback) throws RemoteException{ - this.callback = callback; - return 0; + for (int i = 0; i < returnArray.length; ++i) { + returnArray[i] = i + 1; //valid handles from 1...n + Log.d(TAG, String.format("Hub %s is mapped to %d", + mContextHubInfo[i].getName(), returnArray[i])); } - @Override - public int[] getContextHubHandles() throws RemoteException { - int [] returnArray = new int[mHubHash.size()]; - int i = 0; - for (int key : mHubHash.keySet()) { - // Add any filtering here - returnArray[i] = key; - i++; - } - return returnArray; - } + return returnArray; + } - @Override - public ContextHubInfo getContextHubInfo(int contexthubHandle) throws RemoteException { - return mHubHash.get(contexthubHandle); + @Override + public ContextHubInfo getContextHubInfo(int contextHubHandle) throws RemoteException { + contextHubHandle -= 1; + if (!(contextHubHandle >= 0 && contextHubHandle < mContextHubInfo.length)) { + return null; // null means fail } - @Override - public int loadNanoApp(int hubHandle, NanoApp app) throws RemoteException { - if (!mHubHash.containsKey(hubHandle)) { - return -1; - } else { - // Call Native interface here - int[] msgHeader = new int[8]; - msgHeader[0] = ContextHubManager.MSG_LOAD_NANO_APP; - msgHeader[1] = app.getAppId(); - msgHeader[2] = app.getAppVersion(); - msgHeader[3] = 0; // LOADING_HINTS - msgHeader[4] = hubHandle; + return mContextHubInfo[contextHubHandle]; + } - int handle = nativeSendMessage(msgHeader, app.getAppBinary()); + @Override + public int loadNanoApp(int contextHubHandle, NanoApp app) throws RemoteException { + contextHubHandle -= 1; - // if successful, add an entry to mNanoAppHash + if (!(contextHubHandle >= 0 && contextHubHandle < mContextHubInfo.length)) { + return -1; // negative handle are invalid, means failed + } - if(handle > 0) { - return 0; - } else { + // Call Native interface here + int[] msgHeader = new int[8]; + msgHeader[0] = contextHubHandle; + msgHeader[1] = app.getAppId(); + msgHeader[2] = app.getAppVersion(); + msgHeader[3] = ContextHubManager.MSG_LOAD_NANO_APP; + msgHeader[4] = 0; // Loading hints - return -1; - } - } - } + return nativeSendMessage(msgHeader, app.getAppBinary()); + } - @Override - public int unloadNanoApp(int nanoAppInstanceHandle) throws RemoteException { - if(!mNanoAppHash.containsKey(nanoAppInstanceHandle)) { - return -1; - } else { - NanoAppInstanceInfo info = mNanoAppHash.get(nanoAppInstanceHandle); - // Call Native interface here - int[] msgHeader = new int[8]; - msgHeader[0] = ContextHubManager.MSG_UNLOAD_NANO_APP; - msgHeader[1] = info.getContexthubId(); - msgHeader[2] = info.getHandle(); - - int result = nativeSendMessage(msgHeader, null); - // if successful, remove the entry in mNanoAppHash - if(result == 0) { - mNanoAppHash.remove(nanoAppInstanceHandle); - } - return(result); - } + @Override + public int unloadNanoApp(int nanoAppInstanceHandle) throws RemoteException { + NanoAppInstanceInfo info = mNanoAppHash.get(nanoAppInstanceHandle); + if (info == null) { + return -1; //means failed } - @Override - public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppInstanceHandle) throws RemoteException { - // This assumes that all the nanoAppInfo is current. This is reasonable - // for the use cases for tightly controlled nanoApps. - // - if(!mNanoAppHash.containsKey(nanoAppInstanceHandle)) { - return(mNanoAppHash.get(nanoAppInstanceHandle)); - } else { - return null; - } - } + // Call Native interface here + int[] msgHeader = new int[8]; + msgHeader[0] = info.getContexthubId(); + msgHeader[1] = ContextHubManager.MSG_UNLOAD_NANO_APP; + msgHeader[2] = info.getHandle(); - @Override - public int[] findNanoAppOnHub(int hubHandle, NanoAppFilter filter) throws RemoteException { - ArrayList<Integer> foundInstances = new ArrayList<Integer>(); + return nativeSendMessage(msgHeader, null); + } - for(Integer nanoAppInstance : mNanoAppHash.keySet()) { - NanoAppInstanceInfo info = mNanoAppHash.get(nanoAppInstance); + @Override + public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppInstanceHandle) throws RemoteException { + // This assumes that all the nanoAppInfo is current. This is reasonable + // for the use cases for tightly controlled nanoApps. + if (mNanoAppHash.containsKey(nanoAppInstanceHandle)) { + return mNanoAppHash.get(nanoAppInstanceHandle); + } else { + return null; + } + } - if(filter.testMatch(info)){ - foundInstances.add(nanoAppInstance); - } - } + @Override + public int[] findNanoAppOnHub(int hubHandle, NanoAppFilter filter) throws RemoteException { + ArrayList<Integer> foundInstances = new ArrayList<Integer>(); + + for(Integer nanoAppInstance : mNanoAppHash.keySet()) { + NanoAppInstanceInfo info = mNanoAppHash.get(nanoAppInstance); - int[] retArray = new int[foundInstances.size()]; - for (int i = 0; i < foundInstances.size(); i++) { - retArray[i] = foundInstances.get(i).intValue(); + if(filter.testMatch(info)){ + foundInstances.add(nanoAppInstance); } + } - return retArray; + int[] retArray = new int[foundInstances.size()]; + for (int i = 0; i < foundInstances.size(); i++) { + retArray[i] = foundInstances.get(i).intValue(); } - @Override - public int sendMessage(int hubHandle, int nanoAppHandle, ContextHubMessage msg) throws RemoteException { - int[] msgHeader = new int[8]; - msgHeader[0] = ContextHubManager.MSG_DATA_SEND; - msgHeader[1] = hubHandle; - msgHeader[2] = nanoAppHandle; - msgHeader[3] = msg.getMsgType(); - msgHeader[4] = msg.getVersion(); + return retArray; + } - return (nativeSendMessage(msgHeader, msg.getData())); - } - }; + @Override + public int sendMessage(int hubHandle, int nanoAppHandle, ContextHubMessage msg) throws RemoteException { + int[] msgHeader = new int[8]; + msgHeader[0] = ContextHubManager.MSG_DATA_SEND; + msgHeader[1] = hubHandle; + msgHeader[2] = nanoAppHandle; + msgHeader[3] = msg.getMsgType(); + msgHeader[4] = msg.getVersion(); + + return nativeSendMessage(msgHeader, msg.getData()); + } } + diff --git a/core/java/android/hardware/location/IContextHubCallback.aidl b/core/java/android/hardware/location/IContextHubCallback.aidl index 45b1ef494ac2..141fcf6a598b 100644 --- a/core/java/android/hardware/location/IContextHubCallback.aidl +++ b/core/java/android/hardware/location/IContextHubCallback.aidl @@ -18,7 +18,9 @@ package android.hardware.location; import android.hardware.location.ContextHubMessage; -/** @hide */ +/** + * @hide + */ oneway interface IContextHubCallback { void onMessageReceipt(int hubId, int nanoAppId, in ContextHubMessage msg); } diff --git a/core/java/android/hardware/location/IContextHubService.aidl b/core/java/android/hardware/location/IContextHubService.aidl index b2db0b2cdd23..ff8c1d07ce2c 100644 --- a/core/java/android/hardware/location/IContextHubService.aidl +++ b/core/java/android/hardware/location/IContextHubService.aidl @@ -24,11 +24,13 @@ import android.hardware.location.NanoAppInstanceInfo; import android.hardware.location.NanoAppFilter; import android.hardware.location.IContextHubCallback; -/** @hide */ +/** + * @hide + */ interface IContextHubService { // register a callback to receive messages - int registerCallBack(in IContextHubCallback callback); + int registerCallback(in IContextHubCallback callback); // Gets a list of available context hub handles int[] getContextHubHandles(); diff --git a/core/java/android/hardware/location/MemoryRegion.java b/core/java/android/hardware/location/MemoryRegion.java index e8c761527c2c..d100de257549 100644 --- a/core/java/android/hardware/location/MemoryRegion.java +++ b/core/java/android/hardware/location/MemoryRegion.java @@ -23,7 +23,6 @@ import android.os.Parcelable; /** * @hide */ - @SystemApi public class MemoryRegion implements Parcelable{ diff --git a/core/java/android/hardware/location/NanoApp.aidl b/core/java/android/hardware/location/NanoApp.aidl index d32c44a5c44a..9df9a087afdc 100644 --- a/core/java/android/hardware/location/NanoApp.aidl +++ b/core/java/android/hardware/location/NanoApp.aidl @@ -15,7 +15,7 @@ */ package android.hardware.location; -/* -@hide -*/ +/** + * @hide + */ parcelable NanoApp; diff --git a/core/java/android/hardware/location/NanoApp.java b/core/java/android/hardware/location/NanoApp.java index 36d181f91fba..b447b6245712 100644 --- a/core/java/android/hardware/location/NanoApp.java +++ b/core/java/android/hardware/location/NanoApp.java @@ -13,16 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package android.hardware.location; - import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; -/** - * A class describing nano apps. +/** A class describing nano apps. * A nano app is a piece of executable code that can be * downloaded onto a specific architecture. These are targtted * for low power compute domains on a device. diff --git a/core/java/android/hardware/location/NanoAppFilter.aidl b/core/java/android/hardware/location/NanoAppFilter.aidl index cc6d4755997a..5f1020111613 100644 --- a/core/java/android/hardware/location/NanoAppFilter.aidl +++ b/core/java/android/hardware/location/NanoAppFilter.aidl @@ -15,7 +15,7 @@ */ package android.hardware.location; -/* -@hide -*/ +/** + * @hide + */ parcelable NanoAppFilter; diff --git a/core/java/android/hardware/location/NanoAppFilter.java b/core/java/android/hardware/location/NanoAppFilter.java index ac341e417b64..369f9e44e8d9 100644 --- a/core/java/android/hardware/location/NanoAppFilter.java +++ b/core/java/android/hardware/location/NanoAppFilter.java @@ -110,8 +110,9 @@ public class NanoAppFilter { return true; } /** + * Test match method. * - * @param nano app instance info + * @param info nano app instance info * * @return true if this is a match, false otherwise */ diff --git a/core/java/android/hardware/location/NanoAppInstanceInfo.aidl b/core/java/android/hardware/location/NanoAppInstanceInfo.aidl index c8c40d7be233..2db5566a590d 100644 --- a/core/java/android/hardware/location/NanoAppInstanceInfo.aidl +++ b/core/java/android/hardware/location/NanoAppInstanceInfo.aidl @@ -15,7 +15,7 @@ */ package android.hardware.location; -/* -@hide -*/ -parcelable NanoAppInstanceInfo;
\ No newline at end of file +/** + * @hide + */ +parcelable NanoAppInstanceInfo; diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 282688295fee..6b79a8ac438a 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -2269,8 +2269,9 @@ public class InputMethodService extends AbstractInputMethodService { public void onExtractedDeleteText(int start, int end) { InputConnection conn = getCurrentInputConnection(); if (conn != null) { + conn.finishComposingText(); conn.setSelection(start, start); - conn.deleteSurroundingText(0, end-start); + conn.deleteSurroundingText(0, end - start); } } diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index ddcd63520549..b25b33d00aa8 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -434,25 +434,35 @@ public class RecoverySystem { String filename = packageFile.getCanonicalPath(); Log.w(TAG, "!!! REBOOTING TO INSTALL " + filename + " !!!"); - if (!processed && filename.startsWith("/data/")) { - FileWriter uncryptFile = new FileWriter(UNCRYPT_PACKAGE_FILE); - try { - uncryptFile.write(filename + "\n"); - } finally { - uncryptFile.close(); - } - // UNCRYPT_PACKAGE_FILE needs to be readable and writable by system server. - if (!UNCRYPT_PACKAGE_FILE.setReadable(true, false) - || !UNCRYPT_PACKAGE_FILE.setWritable(true, false)) { - Log.e(TAG, "Error setting permission for " + UNCRYPT_PACKAGE_FILE); - } + // If the package is on the /data partition, the package needs to + // be processed (i.e. uncrypt'd). The caller specifies if that has + // been done in 'processed' parameter. + if (filename.startsWith("/data/")) { + if (processed) { + if (!BLOCK_MAP_FILE.exists()) { + Log.e(TAG, "Package claimed to have been processed but failed to find " + + "the block map file."); + throw new IOException("Failed to find block map file"); + } + } else { + FileWriter uncryptFile = new FileWriter(UNCRYPT_PACKAGE_FILE); + try { + uncryptFile.write(filename + "\n"); + } finally { + uncryptFile.close(); + } + // UNCRYPT_PACKAGE_FILE needs to be readable and writable + // by system server. + if (!UNCRYPT_PACKAGE_FILE.setReadable(true, false) + || !UNCRYPT_PACKAGE_FILE.setWritable(true, false)) { + Log.e(TAG, "Error setting permission for " + UNCRYPT_PACKAGE_FILE); + } - BLOCK_MAP_FILE.delete(); - } + BLOCK_MAP_FILE.delete(); + } - // If the package is on the /data partition, use the block map file as - // the package name instead. - if (filename.startsWith("/data/")) { + // If the package is on the /data partition, use the block map + // file as the package name instead. filename = "@/cache/recovery/block.map"; } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 7223dfbdccdb..e2675b1b1863 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -972,7 +972,8 @@ public class UserManager { /** * Returns the UserInfo object describing a specific user. - * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. + * Requires {@link android.Manifest.permission#MANAGE_USERS} permission or the caller is + * in the same profile group of target user. * @param userHandle the user handle of the user whose information is being requested. * @return the UserInfo object for a specific user. * @hide diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java index e7c4a075cf72..e2ae133cf6e9 100644 --- a/core/java/android/provider/CallLog.java +++ b/core/java/android/provider/CallLog.java @@ -179,6 +179,7 @@ public class CallLog { * <li>{@link #VOICEMAIL_TYPE}</li> * <li>{@link #REJECTED_TYPE}</li> * <li>{@link #BLOCKED_TYPE}</li> + * <li>{@link #ANSWERED_EXTERNALLY_TYPE}</li> * </ul> * </p> */ @@ -196,6 +197,12 @@ public class CallLog { public static final int REJECTED_TYPE = 5; /** Call log type for calls blocked automatically. */ public static final int BLOCKED_TYPE = 6; + /** + * Call log type for a call which was answered on another device. Used in situations where + * a call rings on multiple devices simultaneously and it ended up being answered on a + * device other than the current one. + */ + public static final int ANSWERED_EXTERNALLY_TYPE = 7; /** * Bit-mask describing features of the call (e.g. video). @@ -207,6 +214,9 @@ public class CallLog { /** Call had video. */ public static final int FEATURES_VIDEO = 0x1; + /** Call was pulled externally. */ + public static final int FEATURES_PULLED_EXTERNALLY = 0x2; + /** * The phone number as the user entered it. * <P>Type: TEXT</P> diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index e7a9b7d87fdd..4ad7969d1911 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -379,8 +379,18 @@ public final class DocumentsContract { * @see DocumentsProvider#queryChildDocuments(String, String[], String) * @hide */ - public static final int FLAG_ARCHIVE = 1 << 15; + + /** + * Flag indicating that a document is not complete, likely its + * contents are being downloaded. Partial files cannot be opened, + * copied, moved in the UI. But they can be deleted and retried + * if they represent a failed download. + * + * @see #COLUMN_FLAGS + * @hide + */ + public static final int FLAG_PARTIAL = 1 << 16; } /** diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index d4ff766c6063..136abab52a53 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -217,21 +217,6 @@ public final class Settings { "android.settings.ACCESSIBILITY_SETTINGS"; /** - * Activity Action: Launch the screen reader tutorial. - * <p> - * In some cases, a matching Activity may not exist, so ensure you - * safeguard against this. - * <p> - * Input: Nothing. - * <p> - * Output: Nothing. - */ - @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) - public static final String ACTION_SCREEN_READER_TUTORIAL = - "android.settings.SCREEN_READER_TUTORIAL"; - - - /** * Activity Action: Show settings to control access to usage information. * <p> * In some cases, a matching Activity may not exist, so ensure you diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index fb6a9d552c54..22d5ed862690 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -16,6 +16,7 @@ package android.view; +import android.annotation.IntDef; import android.annotation.RequiresPermission; import android.content.Context; import android.content.res.CompatibilityInfo; @@ -31,6 +32,8 @@ import android.os.SystemClock; import android.util.DisplayMetrics; import android.util.Log; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import static android.Manifest.permission.CONFIGURE_DISPLAY_COLOR_TRANSFORM; @@ -715,6 +718,14 @@ public final class Display { } /** + * Returns the display's HDR capabilities. + * @hide + */ + public HdrCapabilities getHdrCapabilities() { + return new HdrCapabilities(); + } + + /** * Gets the supported color transforms of this device. * @hide */ @@ -1112,6 +1123,117 @@ public final class Display { } /** + * Encapsulates the HDR capabilities of a given display. + * For example, what HDR types it supports and details about the desired luminance data. + * <p>You can get an instance for a given {@link Display} object with + * {@link Display#getHdrCapabilities getHdrCapabilities()}. + * @hide + */ + public static final class HdrCapabilities implements Parcelable { + /** + * Invalid luminance value. + */ + public static final float INVALID_LUMINANCE = -1; + /** + * Dolby Vision high dynamic range (HDR) display. + */ + public static final int HDR_TYPE_DOLBY_VISION = 1; + /** + * HDR10 display. + */ + public static final int HDR_TYPE_HDR10 = 2; + /** + * Hybrid Log-Gamma HDR display. + */ + public static final int HDR_TYPE_HLG = 3; + + @IntDef({ + HDR_TYPE_DOLBY_VISION, + HDR_TYPE_HDR10, + HDR_TYPE_HLG, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface HdrType {} + + private @HdrType int[] mSupportedHdrTypes = new int[0]; + private float mMaxLuminance = INVALID_LUMINANCE; + private float mMaxAverageLuminance = INVALID_LUMINANCE; + private float mMinLuminance = INVALID_LUMINANCE; + + public HdrCapabilities() { + } + + /** + * Gets the supported HDR types of this display. + * Returns empty array if HDR is not supported by the display. + */ + public @HdrType int[] getSupportedHdrTypes() { + return mSupportedHdrTypes; + } + /** + * Returns the desired content max luminance data in cd/m2 for this display. + */ + public float getDesiredMaxLuminance() { + return mMaxLuminance; + } + /** + * Returns the desired content max frame-average luminance data in cd/m2 for this display. + */ + public float getDesiredMaxAverageLuminance() { + return mMaxAverageLuminance; + } + /** + * Returns the desired content min luminance data in cd/m2 for this display. + */ + public float getDesiredMinLuminance() { + return mMinLuminance; + } + + public static final Creator<HdrCapabilities> CREATOR = new Creator<HdrCapabilities>() { + @Override + public HdrCapabilities createFromParcel(Parcel source) { + return new HdrCapabilities(source); + } + + @Override + public HdrCapabilities[] newArray(int size) { + return new HdrCapabilities[size]; + } + }; + + private HdrCapabilities(Parcel source) { + readFromParcel(source); + } + + public void readFromParcel(Parcel source) { + int types = source.readInt(); + mSupportedHdrTypes = new int[types]; + for (int i = 0; i < types; ++i) { + mSupportedHdrTypes[i] = source.readInt(); + } + mMaxLuminance = source.readFloat(); + mMaxAverageLuminance = source.readFloat(); + mMinLuminance = source.readFloat(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(mSupportedHdrTypes.length); + for (int i = 0; i < mSupportedHdrTypes.length; ++i) { + dest.writeInt(mSupportedHdrTypes[i]); + } + dest.writeFloat(mMaxLuminance); + dest.writeFloat(mMaxAverageLuminance); + dest.writeFloat(mMinLuminance); + } + + @Override + public int describeContents() { + return 0; + } + } + + /** * A color transform supported by a given display. * * @see Display#getSupportedColorTransforms() diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index f912e51b5bfb..d8b742107084 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -193,8 +193,7 @@ interface IWindowManager boolean isKeyguardSecure(); boolean inKeyguardRestrictedInputMode(); void dismissKeyguard(); - void keyguardGoingAway(boolean disableWindowAnimations, - boolean keyguardGoingToNotificationShade); + void keyguardGoingAway(int flags); void closeSystemDialogs(String reason); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 57ab6d400cd9..55393b159ee0 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -84,7 +84,6 @@ import android.view.AccessibilityIterators.CharacterTextSegmentIterator; import android.view.AccessibilityIterators.ParagraphTextSegmentIterator; import android.view.AccessibilityIterators.TextSegmentIterator; import android.view.AccessibilityIterators.WordTextSegmentIterator; -import android.view.ViewGroup.LayoutParams; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEventSource; import android.view.accessibility.AccessibilityManager; @@ -10151,19 +10150,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * {@link #INVISIBLE} or {@link #GONE}. */ protected void onVisibilityChanged(@NonNull View changedView, @Visibility int visibility) { - final boolean visible = visibility == VISIBLE && getVisibility() == VISIBLE; - if (visible && mAttachInfo != null) { - initialAwakenScrollBars(); - } - - final Drawable dr = mBackground; - if (dr != null && visible != dr.isVisible()) { - dr.setVisible(visible, false); - } - final Drawable fg = mForegroundInfo != null ? mForegroundInfo.mDrawable : null; - if (fg != null && visible != fg.isVisible()) { - fg.setVisible(visible, false); - } } /** @@ -10220,6 +10206,52 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Internal dispatching method for {@link #onVisibilityAggregated}. Overridden by + * ViewGroup. Intended to only be called when {@link #isAttachedToWindow()}, + * {@link #getWindowVisibility()} is {@link #VISIBLE} and this view's parent {@link #isShown()}. + * + * @param changedView the view that changed, either <code>this</code> or an ancestor + * @param visibility aggregated visibility of this view's parent or changedView, whichever + * is closer + * @return the aggregated visibility for this view + */ + int dispatchVisibilityAggregated(View changedView, @Visibility int visibility) { + visibility = Math.max(visibility, getVisibility()); + onVisibilityAggregated(changedView, visibility); + return visibility; + } + + /** + * Called when the user-visibility of this View is potentially affected by a change + * to this view itself, an ancestor view or the window this view is attached to. + * + * <p>The visibility value reported will be one of {@link #VISIBLE}, {@link #INVISIBLE} + * or {@link #GONE}, reflecting this view's aggregated visibility within its window. + * The visibility parameter takes this view's own visibility into account. + * Calls to this method may be repeated with the same visibility values; implementations + * should ensure that work done is not duplicated unnecessarily.</p> + * + * @param changedView the view that changed; may be <code>this</code> or an ancestor + * @param visibility the visibility of this view in the context of the full window + */ + @CallSuper + public void onVisibilityAggregated(View changedView, @Visibility int visibility) { + final boolean visible = visibility == VISIBLE && getVisibility() == VISIBLE; + if (visible && mAttachInfo != null) { + initialAwakenScrollBars(); + } + + final Drawable dr = mBackground; + if (dr != null && visible != dr.isVisible()) { + dr.setVisible(visible, false); + } + final Drawable fg = mForegroundInfo != null ? mForegroundInfo.mDrawable : null; + if (fg != null && visible != fg.isVisible()) { + fg.setVisible(visible, false); + } + } + + /** * Returns the current visibility of the window this view is attached to * (either {@link #GONE}, {@link #INVISIBLE}, or {@link #VISIBLE}). * @@ -11336,6 +11368,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (mAttachInfo != null) { dispatchVisibilityChanged(this, newVisibility); + + // Aggregated visibility changes are dispatched to attached views + // in visible windows where the parent is currently shown/drawn + // or the parent is not a ViewGroup (and therefore assumed to be a ViewRoot), + // discounting clipping or overlapping. This makes it a good place + // to change animation states. + if (mParent != null && getWindowVisibility() == VISIBLE && + ((!(mParent instanceof ViewGroup)) || ((ViewGroup) mParent).isShown())) { + dispatchVisibilityAggregated(this, newVisibility); + } notifySubtreeAccessibilityStateChangedIfNeeded(); } } @@ -15246,6 +15288,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int vis = info.mWindowVisibility; if (vis != GONE) { onWindowVisibilityChanged(vis); + if (isShown()) { + onVisibilityAggregated(this, vis); + } } // Send onVisibilityChanged directly instead of dispatchVisibilityChanged. @@ -15266,6 +15311,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int vis = info.mWindowVisibility; if (vis != GONE) { onWindowVisibilityChanged(GONE); + if (isShown()) { + onVisibilityAggregated(this, GONE); + } } } @@ -17958,6 +18006,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (mBackground != null) { mBackground.setCallback(null); unscheduleDrawable(mBackground); + mBackground.setVisible(false, false); } if (background != null) { @@ -17998,7 +18047,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (background.isStateful()) { background.setState(getDrawableState()); } - background.setVisible(getVisibility() == VISIBLE, false); + background.setVisible(getWindowVisibility() == VISIBLE && isShown(), false); mBackground = background; applyBackgroundTint(); @@ -18180,6 +18229,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (mForegroundInfo.mDrawable != null) { mForegroundInfo.mDrawable.setCallback(null); unscheduleDrawable(mForegroundInfo.mDrawable); + mForegroundInfo.mDrawable.setVisible(false, false); } mForegroundInfo.mDrawable = foreground; @@ -18194,6 +18244,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, foreground.setState(getDrawableState()); } applyForegroundTint(); + foreground.setVisible(getWindowVisibility() == VISIBLE && isShown(), false); } else if ((mViewFlags & WILL_NOT_DRAW) != 0 && mBackground == null) { mPrivateFlags |= PFLAG_SKIP_DRAW; } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 56ee47895687..36a5db179f1f 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -1291,6 +1291,23 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } @Override + int dispatchVisibilityAggregated(View changedView, @Visibility int visibility) { + visibility = super.dispatchVisibilityAggregated(changedView, visibility); + final int count = mChildrenCount; + final View[] children = mChildren; + for (int i = 0; i < count; i++) { + // Only dispatch to children with at least the same level of visibility + // that we're reporting, otherwise it won't affect that child/subtree at all + // so it's not worth telling them about it. Note that we use <= here + // because VISIBLE < INVISIBLE < GONE as constant values. + if (children[i].getVisibility() <= visibility) { + children[i].dispatchVisibilityAggregated(changedView, visibility); + } + } + return visibility; + } + + @Override public void dispatchConfigurationChanged(Configuration newConfig) { super.dispatchConfigurationChanged(newConfig); final int count = mChildrenCount; diff --git a/core/java/android/view/ViewOverlay.java b/core/java/android/view/ViewOverlay.java index 69c30bac723a..b770bd50c277 100644 --- a/core/java/android/view/ViewOverlay.java +++ b/core/java/android/view/ViewOverlay.java @@ -216,6 +216,9 @@ public class ViewOverlay { public void clear() { removeAllViews(); if (mDrawables != null) { + for (Drawable drawable : mDrawables) { + drawable.setCallback(null); + } mDrawables.clear(); } } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index f7405e2db304..fecf8922862e 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1472,6 +1472,7 @@ public final class ViewRootImpl implements ViewParent, if (viewVisibilityChanged) { mAttachInfo.mWindowVisibility = viewVisibility; host.dispatchWindowVisibilityChanged(viewVisibility); + host.dispatchVisibilityAggregated(host, viewVisibility); if (viewVisibility != View.VISIBLE || mNewSurfaceNeeded) { endDragResizing(); destroyHardwareResources(); diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 34e81fcd074c..c1392fe07235 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -91,6 +91,11 @@ public interface WindowManagerPolicy { public final static int FLAG_INTERACTIVE = 0x20000000; public final static int FLAG_PASS_TO_USER = 0x40000000; + // Flags for IActivityManager.keyguardGoingAway() + public final static int KEYGUARD_GOING_AWAY_FLAG_TO_SHADE = 1 << 0; + public final static int KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS = 1 << 1; + public final static int KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER = 1 << 2; + // Flags used for indicating whether the internal and/or external input devices // of some type are available. public final static int PRESENCE_INTERNAL = 1 << 0; diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 3b6ba3a758a1..4bcb40655772 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -18,6 +18,7 @@ package android.widget; import android.R; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; @@ -216,6 +217,7 @@ public class Editor { boolean mInBatchEditControllers; boolean mShowSoftInputOnFocus = true; private boolean mPreserveSelection; + private boolean mRestartActionModeOnNextRefresh; boolean mTemporaryDetach; boolean mIsBeingLongClicked; @@ -380,9 +382,8 @@ public class Editor { updateSpellCheckSpans(0, mTextView.getText().length(), true /* create the spell checker if needed */); - if (mTextView.getSelectionStart() != mTextView.getSelectionEnd()) { - // We had an active selection from before, start the selection mode. - startSelectionActionMode(); + if (mTextView.hasSelection()) { + refreshTextActionMode(); } getPositionListener().addSubscriber(mCursorAnchorInfoNotifier, true); @@ -1081,6 +1082,10 @@ public class Editor { } private void startDragAndDrop() { + // TODO: Fix drag and drop in full screen extracted mode. + if (mTextView.isInExtractedMode()) { + return; + } final int start = mTextView.getSelectionStart(); final int end = mTextView.getSelectionEnd(); CharSequence selectedText = mTextView.getTransformedText(start, end); @@ -1283,7 +1288,7 @@ public class Editor { } final InputMethodManager imm = InputMethodManager.peekInstance(); if (mTextView.hasSelection() && !extractedTextModeWillBeStarted()) { - startSelectionActionMode(); + refreshTextActionMode(); } } else { if (mBlink != null) { @@ -1846,6 +1851,7 @@ public class Editor { void refreshTextActionMode() { if (extractedTextModeWillBeStarted()) { + mRestartActionModeOnNextRefresh = false; return; } final boolean hasSelection = mTextView.hasSelection(); @@ -1854,12 +1860,19 @@ public class Editor { if ((selectionController != null && selectionController.isCursorBeingModified()) || (insertionController != null && insertionController.isCursorBeingModified())) { // ActionMode should be managed by the currently active cursor controller. + mRestartActionModeOnNextRefresh = false; return; } if (hasSelection) { - if (mTextActionMode == null || selectionController == null - || !selectionController.isActive()) { - // Avoid dismissing the selection if it exists. + hideInsertionPointCursorController(); + if (mTextActionMode == null) { + if (mRestartActionModeOnNextRefresh || mTextView.isInExtractedMode()) { + // To avoid distraction, newly start action mode only when selection action + // mode is being restarted or in full screen extracted mode. + startSelectionActionMode(); + } + } else if (selectionController == null || !selectionController.isActive()) { + // Insertion action mode is active. Avoid dismissing the selection. stopTextActionModeWithPreservingSelection(); startSelectionActionMode(); } else { @@ -1874,6 +1887,7 @@ public class Editor { mTextActionMode.invalidateContentRect(); } } + mRestartActionModeOnNextRefresh = false; } /** @@ -1904,11 +1918,12 @@ public class Editor { * * @return true if the selection mode was actually started. */ - private boolean startSelectionActionMode() { + boolean startSelectionActionMode() { boolean selectionStarted = startSelectionActionModeInternal(); if (selectionStarted) { getSelectionController().show(); } + mRestartActionModeOnNextRefresh = false; return selectionStarted; } @@ -2112,6 +2127,9 @@ public class Editor { } private void stopTextActionModeWithPreservingSelection() { + if (mTextActionMode != null) { + mRestartActionModeOnNextRefresh = true; + } mPreserveSelection = true; stopTextActionMode(); mPreserveSelection = false; @@ -2460,7 +2478,7 @@ public class Editor { } final SubMenu subMenu = menu.addSubMenu(Menu.NONE, Menu.NONE, MENU_ITEM_ORDER_REPLACE, com.android.internal.R.string.replace); - final int numItems = mSuggestionHelper.getSuggestionInfo(suggestionInfoArray); + final int numItems = mSuggestionHelper.getSuggestionInfo(suggestionInfoArray, null); for (int i = 0; i < numItems; i++) { final SuggestionInfo info = suggestionInfoArray[i]; subMenu.add(Menu.NONE, Menu.NONE, i, info.mText) @@ -2516,32 +2534,44 @@ public class Editor { mPreserveSelection = true; } - private void replaceWithSuggestion(final SuggestionInfo suggestionInfo) { + @Nullable + private SuggestionSpan findEquivalentSuggestionSpan( + @NonNull SuggestionSpanInfo suggestionSpanInfo) { final Editable editable = (Editable) mTextView.getText(); - if (editable.getSpanStart(suggestionInfo.mSuggestionSpan) < 0) { - // Suggestion span coundn't be found. Try to find a suggestion span that has the same - // contents. - final SuggestionSpan[] suggestionSpans = editable.getSpans( - suggestionInfo.mSuggestionSpanStart, suggestionInfo.mSuggestionSpanEnd, - SuggestionSpan.class); - for (final SuggestionSpan suggestionSpan : suggestionSpans) { - final int spanStart = editable.getSpanStart(suggestionSpan); - if (spanStart != suggestionInfo.mSuggestionSpanStart) { - continue; - } - int spanEnd = editable.getSpanEnd(suggestionSpan); - if (spanEnd != suggestionInfo.mSuggestionSpanEnd) { - continue; - } - if (suggestionSpan.equals(suggestionInfo.mSuggestionSpan)) { - // Found. - suggestionInfo.mSuggestionSpan = suggestionSpan; - break; - } + if (editable.getSpanStart(suggestionSpanInfo.mSuggestionSpan) >= 0) { + // Exactly same span is found. + return suggestionSpanInfo.mSuggestionSpan; + } + // Suggestion span couldn't be found. Try to find a suggestion span that has the same + // contents. + final SuggestionSpan[] suggestionSpans = editable.getSpans(suggestionSpanInfo.mSpanStart, + suggestionSpanInfo.mSpanEnd, SuggestionSpan.class); + for (final SuggestionSpan suggestionSpan : suggestionSpans) { + final int start = editable.getSpanStart(suggestionSpan); + if (start != suggestionSpanInfo.mSpanStart) { + continue; + } + final int end = editable.getSpanEnd(suggestionSpan); + if (end != suggestionSpanInfo.mSpanEnd) { + continue; + } + if (suggestionSpan.equals(suggestionSpanInfo.mSuggestionSpan)) { + return suggestionSpan; } } - final int spanStart = editable.getSpanStart(suggestionInfo.mSuggestionSpan); - final int spanEnd = editable.getSpanEnd(suggestionInfo.mSuggestionSpan); + return null; + } + + private void replaceWithSuggestion(@NonNull final SuggestionInfo suggestionInfo) { + final SuggestionSpan targetSuggestionSpan = findEquivalentSuggestionSpan( + suggestionInfo.mSuggestionSpanInfo); + if (targetSuggestionSpan == null) { + // Span has been removed + return; + } + final Editable editable = (Editable) mTextView.getText(); + final int spanStart = editable.getSpanStart(targetSuggestionSpan); + final int spanEnd = editable.getSpanEnd(targetSuggestionSpan); if (spanStart < 0 || spanEnd <= spanStart) { // Span has been removed return; @@ -2571,7 +2601,7 @@ public class Editor { } // Notify source IME of the suggestion pick. Do this before swapping texts. - suggestionInfo.mSuggestionSpan.notifySelection( + targetSuggestionSpan.notifySelection( mTextView.getContext(), originalText, suggestionInfo.mSuggestionIndex); // Swap text content between actual text and Suggestion span @@ -2581,7 +2611,7 @@ public class Editor { suggestionStart, suggestionEnd).toString(); mTextView.replaceText_internal(spanStart, spanEnd, suggestion); - String[] suggestions = suggestionInfo.mSuggestionSpan.getSuggestions(); + String[] suggestions = targetSuggestionSpan.getSuggestions(); suggestions[suggestionInfo.mSuggestionIndex] = originalText; // Restore previous SuggestionSpans @@ -3029,28 +3059,44 @@ public class Editor { } } - private static class SuggestionInfo { + private static final class SuggestionInfo { // Range of actual suggestion within mText int mSuggestionStart, mSuggestionEnd; // The SuggestionSpan that this TextView represents + final SuggestionSpanInfo mSuggestionSpanInfo = new SuggestionSpanInfo(); + + // The index of this suggestion inside suggestionSpan + int mSuggestionIndex; + + final SpannableStringBuilder mText = new SpannableStringBuilder(); + + void clear() { + mSuggestionSpanInfo.clear(); + mText.clear(); + } + + // Utility method to set attributes about a SuggestionSpan. + void setSpanInfo(SuggestionSpan span, int spanStart, int spanEnd) { + mSuggestionSpanInfo.mSuggestionSpan = span; + mSuggestionSpanInfo.mSpanStart = spanStart; + mSuggestionSpanInfo.mSpanEnd = spanEnd; + } + } + + private static final class SuggestionSpanInfo { + // The SuggestionSpan; @Nullable SuggestionSpan mSuggestionSpan; // The SuggestionSpan start position - int mSuggestionSpanStart; + int mSpanStart; // The SuggestionSpan end position - int mSuggestionSpanEnd; - - // The index of this suggestion inside suggestionSpan - int mSuggestionIndex; - - final SpannableStringBuilder mText = new SpannableStringBuilder(); + int mSpanEnd; void clear() { mSuggestionSpan = null; - mText.clear(); } } @@ -3109,48 +3155,51 @@ public class Editor { * position. * * @param suggestionInfos SuggestionInfo array the results will be set. + * @param misspelledSpanInfo a struct the misspelled SuggestionSpan info will be set. * @return the number of suggestions actually fetched. */ - public int getSuggestionInfo(SuggestionInfo[] suggestionInfos) { + public int getSuggestionInfo(SuggestionInfo[] suggestionInfos, + @Nullable SuggestionSpanInfo misspelledSpanInfo) { final Spannable spannable = (Spannable) mTextView.getText(); final SuggestionSpan[] suggestionSpans = getSortedSuggestionSpans(); final int nbSpans = suggestionSpans.length; if (nbSpans == 0) return 0; int numberOfSuggestions = 0; - for (int spanIndex = 0; spanIndex < nbSpans; spanIndex++) { - final SuggestionSpan suggestionSpan = suggestionSpans[spanIndex]; + for (final SuggestionSpan suggestionSpan : suggestionSpans) { final int spanStart = spannable.getSpanStart(suggestionSpan); final int spanEnd = spannable.getSpanEnd(suggestionSpan); + if (misspelledSpanInfo != null + && (suggestionSpan.getFlags() & SuggestionSpan.FLAG_MISSPELLED) != 0) { + misspelledSpanInfo.mSuggestionSpan = suggestionSpan; + misspelledSpanInfo.mSpanStart = spanStart; + misspelledSpanInfo.mSpanEnd = spanEnd; + } + final String[] suggestions = suggestionSpan.getSuggestions(); final int nbSuggestions = suggestions.length; + suggestionLoop: for (int suggestionIndex = 0; suggestionIndex < nbSuggestions; suggestionIndex++) { final String suggestion = suggestions[suggestionIndex]; - boolean suggestionIsDuplicate = false; for (int i = 0; i < numberOfSuggestions; i++) { - if (suggestionInfos[i].mText.toString().equals(suggestion)) { - final SuggestionSpan otherSuggestionSpan = - suggestionInfos[i].mSuggestionSpan; - final int otherSpanStart = spannable.getSpanStart(otherSuggestionSpan); - final int otherSpanEnd = spannable.getSpanEnd(otherSuggestionSpan); + final SuggestionInfo otherSuggestionInfo = suggestionInfos[i]; + if (otherSuggestionInfo.mText.toString().equals(suggestion)) { + final int otherSpanStart = + otherSuggestionInfo.mSuggestionSpanInfo.mSpanStart; + final int otherSpanEnd = + otherSuggestionInfo.mSuggestionSpanInfo.mSpanEnd; if (spanStart == otherSpanStart && spanEnd == otherSpanEnd) { - suggestionIsDuplicate = true; - break; + continue suggestionLoop; } } } - if (suggestionIsDuplicate) { - continue; - } SuggestionInfo suggestionInfo = suggestionInfos[numberOfSuggestions]; - suggestionInfo.mSuggestionSpan = suggestionSpan; + suggestionInfo.setSpanInfo(suggestionSpan, spanStart, spanEnd); suggestionInfo.mSuggestionIndex = suggestionIndex; suggestionInfo.mSuggestionStart = 0; suggestionInfo.mSuggestionEnd = suggestion.length(); - suggestionInfo.mSuggestionSpanStart = spanStart; - suggestionInfo.mSuggestionSpanEnd = spanEnd; suggestionInfo.mText.replace(0, suggestionInfo.mText.length(), suggestion); numberOfSuggestions++; if (numberOfSuggestions >= suggestionInfos.length) { @@ -3180,7 +3229,7 @@ public class Editor { private TextView mAddToDictionaryButton; private TextView mDeleteButton; private ListView mSuggestionListView; - private SuggestionSpan mMisspelledSpan; + private final SuggestionSpanInfo mMisspelledSpanInfo = new SuggestionSpanInfo(); private int mContainerMarginWidth; private int mContainerMarginTop; @@ -3252,9 +3301,18 @@ public class Editor { com.android.internal.R.id.addToDictionaryButton); mAddToDictionaryButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { + final SuggestionSpan misspelledSpan = + findEquivalentSuggestionSpan(mMisspelledSpanInfo); + if (misspelledSpan == null) { + // Span has been removed. + return; + } final Editable editable = (Editable) mTextView.getText(); - final int spanStart = editable.getSpanStart(mMisspelledSpan); - final int spanEnd = editable.getSpanEnd(mMisspelledSpan); + final int spanStart = editable.getSpanStart(misspelledSpan); + final int spanEnd = editable.getSpanEnd(misspelledSpan); + if (spanStart < 0 || spanEnd <= spanStart) { + return; + } final String originalText = TextUtils.substring(editable, spanStart, spanEnd); final Intent intent = new Intent(Settings.ACTION_USER_DICTIONARY_INSERT); @@ -3265,7 +3323,7 @@ public class Editor { mTextView.getContext().startActivity(intent); // There is no way to know if the word was indeed added. Re-check. // TODO The ExtractEditText should remove the span in the original text instead - editable.removeSpan(mMisspelledSpan); + editable.removeSpan(mMisspelledSpanInfo.mSuggestionSpan); Selection.setSelection(editable, spanEnd); updateSpellCheckSpans(spanStart, spanEnd, false); hideWithCleanUp(); @@ -3422,30 +3480,29 @@ public class Editor { for (final SuggestionInfo info : mSuggestionInfos) { info.clear(); } - mMisspelledSpan = null; + mMisspelledSpanInfo.clear(); hide(); } private boolean updateSuggestions() { Spannable spannable = (Spannable) mTextView.getText(); mNumberOfSuggestions = - mSuggestionHelper.getSuggestionInfo(mSuggestionInfos); - if (mNumberOfSuggestions == 0) { + mSuggestionHelper.getSuggestionInfo(mSuggestionInfos, mMisspelledSpanInfo); + if (mNumberOfSuggestions == 0 && mMisspelledSpanInfo.mSuggestionSpan == null) { return false; } int spanUnionStart = mTextView.getText().length(); int spanUnionEnd = 0; - mMisspelledSpan = null; for (int i = 0; i < mNumberOfSuggestions; i++) { - final SuggestionInfo suggestionInfo = mSuggestionInfos[i]; - final SuggestionSpan suggestionSpan = suggestionInfo.mSuggestionSpan; - if ((suggestionSpan.getFlags() & SuggestionSpan.FLAG_MISSPELLED) != 0) { - mMisspelledSpan = suggestionSpan; - } - spanUnionStart = Math.min(spanUnionStart, suggestionInfo.mSuggestionSpanStart); - spanUnionEnd = Math.max(spanUnionEnd, suggestionInfo.mSuggestionSpanEnd); + final SuggestionSpanInfo spanInfo = mSuggestionInfos[i].mSuggestionSpanInfo; + spanUnionStart = Math.min(spanUnionStart, spanInfo.mSpanStart); + spanUnionEnd = Math.max(spanUnionEnd, spanInfo.mSpanEnd); + } + if (mMisspelledSpanInfo.mSuggestionSpan != null) { + spanUnionStart = Math.min(spanUnionStart, mMisspelledSpanInfo.mSpanStart); + spanUnionEnd = Math.max(spanUnionEnd, mMisspelledSpanInfo.mSpanEnd); } for (int i = 0; i < mNumberOfSuggestions; i++) { @@ -3454,17 +3511,23 @@ public class Editor { // Make "Add to dictionary" item visible if there is a span with the misspelled flag int addToDictionaryButtonVisibility = View.GONE; - if (mMisspelledSpan != null) { - final int misspelledStart = spannable.getSpanStart(mMisspelledSpan); - final int misspelledEnd = spannable.getSpanEnd(mMisspelledSpan); - if (misspelledStart >= 0 && misspelledEnd > misspelledStart) { + if (mMisspelledSpanInfo.mSuggestionSpan != null) { + if (mMisspelledSpanInfo.mSpanStart >= 0 + && mMisspelledSpanInfo.mSpanEnd > mMisspelledSpanInfo.mSpanStart) { addToDictionaryButtonVisibility = View.VISIBLE; } } mAddToDictionaryButton.setVisibility(addToDictionaryButtonVisibility); if (mSuggestionRangeSpan == null) mSuggestionRangeSpan = new SuggestionRangeSpan(); - final int underlineColor = mSuggestionInfos[0].mSuggestionSpan.getUnderlineColor(); + final int underlineColor; + if (mNumberOfSuggestions != 0) { + underlineColor = + mSuggestionInfos[0].mSuggestionSpanInfo.mSuggestionSpan.getUnderlineColor(); + } else { + underlineColor = mMisspelledSpanInfo.mSuggestionSpan.getUnderlineColor(); + } + if (underlineColor == 0) { // Fallback on the default highlight color when the first span does not provide one mSuggestionRangeSpan.setBackgroundColor(mTextView.mHighlightColor); @@ -3484,8 +3547,8 @@ public class Editor { private void highlightTextDifferences(SuggestionInfo suggestionInfo, int unionStart, int unionEnd) { final Spannable text = (Spannable) mTextView.getText(); - final int spanStart = suggestionInfo.mSuggestionSpanStart; - final int spanEnd = suggestionInfo.mSuggestionSpanEnd; + final int spanStart = suggestionInfo.mSuggestionSpanInfo.mSpanStart; + final int spanEnd = suggestionInfo.mSuggestionSpanInfo.mSpanEnd; // Adjust the start/end of the suggestion span suggestionInfo.mSuggestionStart = spanStart - unionStart; @@ -3661,6 +3724,8 @@ public class Editor { @Override public void onDestroyActionMode(ActionMode mode) { + // Clear mTextActionMode not to recursively destroy action mode by clearing selection. + mTextActionMode = null; Callback customCallback = getCustomCallback(); if (customCallback != null) { customCallback.onDestroyActionMode(mode); @@ -3679,8 +3744,6 @@ public class Editor { if (mSelectionModifierCursorController != null) { mSelectionModifierCursorController.hide(); } - - mTextActionMode = null; } @Override @@ -5083,27 +5146,12 @@ public class Editor { // No longer dragging to select text, let the parent intercept events. mTextView.getParent().requestDisallowInterceptTouchEvent(false); - int startOffset = mTextView.getSelectionStart(); - int endOffset = mTextView.getSelectionEnd(); - - // Since we don't let drag handles pass once they're visible, we need to - // make sure the start / end locations are correct because the user *can* - // switch directions during the initial drag. - if (endOffset < startOffset) { - int tmp = endOffset; - endOffset = startOffset; - startOffset = tmp; + // No longer the first dragging motion, reset. + resetDragAcceleratorState(); - // Also update the selection with the right offsets in this case. - Selection.setSelection((Spannable) mTextView.getText(), - startOffset, endOffset); - } - if (startOffset != endOffset) { + if (mTextView.hasSelection()) { startSelectionActionMode(); } - - // No longer the first dragging motion, reset. - resetDragAcceleratorState(); break; } } diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 3400873896f8..71b5ce9547c5 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -913,6 +913,7 @@ public class ImageView extends View { if (mDrawable != null) { mDrawable.setCallback(null); unscheduleDrawable(mDrawable); + mDrawable.setVisible(false, false); } mDrawable = d; @@ -923,7 +924,8 @@ public class ImageView extends View { if (d.isStateful()) { d.setState(getDrawableState()); } - d.setVisible(getVisibility() == VISIBLE, true); + d.setVisible(isAttachedToWindow() && getWindowVisibility() == VISIBLE && isShown(), + true); d.setLevel(mLevel); mDrawableWidth = d.getIntrinsicWidth(); mDrawableHeight = d.getIntrinsicHeight(); @@ -1498,32 +1500,15 @@ public class ImageView extends View { } } - @RemotableViewMethod @Override - public void setVisibility(int visibility) { - super.setVisibility(visibility); + public void onVisibilityAggregated(View changedView, @Visibility int visibility) { + super.onVisibilityAggregated(changedView, visibility); if (mDrawable != null) { mDrawable.setVisible(visibility == VISIBLE, false); } } @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - if (mDrawable != null) { - mDrawable.setVisible(getVisibility() == VISIBLE, false); - } - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - if (mDrawable != null) { - mDrawable.setVisible(false, false); - } - } - - @Override public CharSequence getAccessibilityClassName() { return ImageView.class.getName(); } diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index ce948706542f..dd0f91e44045 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -246,6 +246,8 @@ public class ProgressBar extends View { boolean mMirrorForRtl = false; + private boolean mAggregatedIsVisible; + private final ArrayList<RefreshData> mRefreshData = new ArrayList<RefreshData>(); private AccessibilityEventSender mAccessibilityEventSender; @@ -620,9 +622,7 @@ public class ProgressBar extends View { oldDrawable.setVisible(false, false); } if (mCurrentDrawable != null) { - mCurrentDrawable.setVisible( - getVisibility() == VISIBLE && getWindowVisibility() == VISIBLE, - false); + mCurrentDrawable.setVisible(getWindowVisibility() == VISIBLE && isShown(), false); } } } @@ -1645,50 +1645,26 @@ public class ProgressBar extends View { } @Override - @RemotableViewMethod - public void setVisibility(int v) { - if (getVisibility() != v) { - super.setVisibility(v); + public void onVisibilityAggregated(View changedView, @Visibility int visibility) { + super.onVisibilityAggregated(changedView, visibility); + + final boolean isVisible = visibility == VISIBLE; + if (isVisible != mAggregatedIsVisible) { + mAggregatedIsVisible = isVisible; if (mIndeterminate) { // let's be nice with the UI thread - if (v == GONE || v == INVISIBLE) { - stopAnimation(); - } else { + if (isVisible) { startAnimation(); + } else { + stopAnimation(); } } - } - } - - @Override - protected void onVisibilityChanged(View changedView, int visibility) { - super.onVisibilityChanged(changedView, visibility); - - updateVisibility(); - } - - @Override - protected void onWindowVisibilityChanged(@Visibility int visibility) { - super.onWindowVisibilityChanged(visibility); - updateVisibility(); - } - - private void updateVisibility() { - final boolean isVisible = getVisibility() == VISIBLE && getWindowVisibility() == VISIBLE; - if (mIndeterminate) { - // let's be nice with the UI thread - if (isVisible) { - startAnimation(); - } else { - stopAnimation(); + if (mCurrentDrawable != null) { + mCurrentDrawable.setVisible(isVisible, false); } } - - if (mCurrentDrawable != null) { - mCurrentDrawable.setVisible(isVisible, false); - } } @Override diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index e971f865bf45..fbedbdac9065 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -9212,6 +9212,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if (start >= 0 && start <= end && end <= text.length()) { Selection.setSelection((Spannable) text, start, end); + // Make sure selection mode is engaged. + if (mEditor != null) { + mEditor.startSelectionActionMode(); + } return true; } } diff --git a/core/java/com/android/internal/app/UnlaunchableAppActivity.java b/core/java/com/android/internal/app/UnlaunchableAppActivity.java index 29190f9baa0a..f6fbaab8f8f3 100644 --- a/core/java/com/android/internal/app/UnlaunchableAppActivity.java +++ b/core/java/com/android/internal/app/UnlaunchableAppActivity.java @@ -42,15 +42,13 @@ import com.android.internal.R; /** * A dialog shown to the user when they try to launch an app from a quiet profile - * ({@link UserManager#isQuietModeEnabled(UserHandle)}, or when the app is suspended by the - * profile owner or device owner. + * ({@link UserManager#isQuietModeEnabled(UserHandle)}. */ public class UnlaunchableAppActivity extends Activity implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener { private static final String TAG = "UnlaunchableAppActivity"; private static final int UNLAUNCHABLE_REASON_QUIET_MODE = 1; - private static final int UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE = 2; private static final String EXTRA_UNLAUNCHABLE_REASON = "unlaunchable_reason"; private int mUserId; @@ -74,37 +72,6 @@ public class UnlaunchableAppActivity extends Activity if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE) { dialogTitle = getResources().getString(R.string.work_mode_off_title); dialogMessage = getResources().getString(R.string.work_mode_off_message); - } else if (mReason == UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE) { - DevicePolicyManager dpm = (DevicePolicyManager) getSystemService( - Context.DEVICE_POLICY_SERVICE); - String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME); - String packageLabel = packageName; - try { - Context userContext = createPackageContextAsUser(packageName, 0, - UserHandle.of(mUserId)); - ApplicationInfo appInfo = userContext.getApplicationInfo(); - if (appInfo != null) { - packageLabel = userContext.getPackageManager().getApplicationLabel(appInfo) - .toString(); - } - } catch (NameNotFoundException e) { - } - dialogTitle = String.format(getResources().getString(R.string.suspended_package_title), - packageLabel); - ComponentName profileOwner = dpm.getProfileOwnerAsUser(mUserId); - String profileOwnerName = null; - if (profileOwner != null) { - dialogMessage = dpm.getShortSupportMessageForUser(profileOwner, mUserId); - profileOwnerName = dpm.getProfileOwnerNameAsUser(mUserId); - } - // Fall back to standard message if profile owner hasn't set something specific. - if (TextUtils.isEmpty(dialogMessage)) { - if (TextUtils.isEmpty(profileOwnerName)) { - profileOwnerName = getResources().getString(R.string.unknownName); - } - dialogMessage = getResources().getString(R.string.suspended_package_message, - profileOwnerName); - } } else { Log.wtf(TAG, "Invalid unlaunchable type: " + mReason); finish(); @@ -154,12 +121,4 @@ public class UnlaunchableAppActivity extends Activity intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); return intent; } - - public static Intent createPackageSuspendedDialogIntent(String packageName, int userId) { - Intent intent = createBaseIntent(); - intent.putExtra(EXTRA_UNLAUNCHABLE_REASON, UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE); - intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); - intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); - return intent; - } } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index c484121236ac..8de9c098e31a 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -1953,7 +1953,7 @@ public class BatteryStatsImpl extends BatteryStats { */ @Override public LongSamplingCounter getIdleTimeCounter() { - return mRxTimeMillis; + return mIdleTimeMillis; } /** diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 623b603d8280..8ef1a22aef76 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -161,6 +161,7 @@ LOCAL_SRC_FILES:= \ android_hardware_UsbDevice.cpp \ android_hardware_UsbDeviceConnection.cpp \ android_hardware_UsbRequest.cpp \ + android_hardware_location_ContextHubService.cpp \ android_hardware_location_ActivityRecognitionHardware.cpp \ android_util_FileObserver.cpp \ android/opengl/poly_clip.cpp.arm \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 798a6deb92f9..95323f75706e 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -95,6 +95,7 @@ extern int register_android_hardware_UsbDevice(JNIEnv *env); extern int register_android_hardware_UsbDeviceConnection(JNIEnv *env); extern int register_android_hardware_UsbRequest(JNIEnv *env); extern int register_android_hardware_location_ActivityRecognitionHardware(JNIEnv* env); +extern int register_android_hardware_location_ContextHubService(JNIEnv* env); extern int register_android_media_AudioRecord(JNIEnv *env); extern int register_android_media_AudioSystem(JNIEnv *env); @@ -1357,6 +1358,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_hardware_UsbDeviceConnection), REG_JNI(register_android_hardware_UsbRequest), REG_JNI(register_android_hardware_location_ActivityRecognitionHardware), + REG_JNI(register_android_hardware_location_ContextHubService), REG_JNI(register_android_media_AudioRecord), REG_JNI(register_android_media_AudioSystem), REG_JNI(register_android_media_AudioTrack), diff --git a/core/jni/android/graphics/Xfermode.cpp b/core/jni/android/graphics/Xfermode.cpp index 7441acc95cea..78975a4f9787 100644 --- a/core/jni/android/graphics/Xfermode.cpp +++ b/core/jni/android/graphics/Xfermode.cpp @@ -15,34 +15,20 @@ */ #include "jni.h" -#include "GraphicsJNI.h" +//#include "GraphicsJNI.h" #include "core_jni_helpers.h" -#include "AvoidXfermode.h" -#include "SkPixelXorXfermode.h" +#include <SkXfermode.h> namespace android { class SkXfermodeGlue { public: - static void finalizer(JNIEnv* env, jobject, jlong objHandle) { SkXfermode* obj = reinterpret_cast<SkXfermode *>(objHandle); SkSafeUnref(obj); } - - static jlong avoid_create(JNIEnv* env, jobject, jint opColor, - jint tolerance, jint modeHandle) - { - AvoidXfermode::Mode mode = static_cast<AvoidXfermode::Mode>(modeHandle); - return reinterpret_cast<jlong>(AvoidXfermode::Create(opColor, tolerance, mode)); - } - - static jlong pixelxor_create(JNIEnv* env, jobject, jint opColor) - { - return reinterpret_cast<jlong>(SkPixelXorXfermode::Create(opColor)); - } }; /////////////////////////////////////////////////////////////////////////////// @@ -51,24 +37,9 @@ static const JNINativeMethod gXfermodeMethods[] = { {"finalizer", "(J)V", (void*) SkXfermodeGlue::finalizer} }; -static const JNINativeMethod gAvoidMethods[] = { - {"nativeCreate", "(III)J", (void*) SkXfermodeGlue::avoid_create} -}; - -static const JNINativeMethod gPixelXorMethods[] = { - {"nativeCreate", "(I)J", (void*) SkXfermodeGlue::pixelxor_create} -}; - int register_android_graphics_Xfermode(JNIEnv* env) { android::RegisterMethodsOrDie(env, "android/graphics/Xfermode", gXfermodeMethods, NELEM(gXfermodeMethods)); - android::RegisterMethodsOrDie(env, "android/graphics/Xfermode", gXfermodeMethods, - NELEM(gXfermodeMethods)); - android::RegisterMethodsOrDie(env, "android/graphics/AvoidXfermode", gAvoidMethods, - NELEM(gAvoidMethods)); - android::RegisterMethodsOrDie(env, "android/graphics/PixelXorXfermode", gPixelXorMethods, - NELEM(gPixelXorMethods)); - return 0; } diff --git a/core/jni/android_hardware_location_ContextHubService.cpp b/core/jni/android_hardware_location_ContextHubService.cpp new file mode 100644 index 000000000000..87247292a73b --- /dev/null +++ b/core/jni/android_hardware_location_ContextHubService.cpp @@ -0,0 +1,344 @@ +/* + * 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. + */ + +#include "context_hub.h" + +#include <string.h> +#include <stdint.h> +#include <stdio.h> + +#include <jni.h> +#include "JNIHelp.h" +#include "core_jni_helpers.h" +#include "stdint.h" +#include "stdlib.h" + + +namespace android { + +namespace { + +// TODO: We should share this array_length function widely around Android +// code. +/* + * Finds the length of a statically-sized array using template trickery that + * also prevents it from being applied to the wrong type. + */ +template <typename T, size_t N> +constexpr size_t array_length(T (&)[N]) { return N; } + +struct jniInfo_s { + JavaVM *vm; + jclass contextHubInfoClass; + jclass contextHubServiceClass; + jclass memoryRegionsClass; + + jobject jContextHubService; + + jmethodID msgReceiptCallBack; + + jmethodID contextHubInfoCtor; + jmethodID contextHubInfoSetId; + jmethodID contextHubInfoSetName; + jmethodID contextHubInfoSetVendor; + jmethodID contextHubInfoSetToolchain; + jmethodID contextHubInfoSetPlatformVersion; + jmethodID contextHubInfoSetStaticSwVersion; + jmethodID contextHubInfoSetToolchainVersion; + jmethodID contextHubInfoSetPeakMips; + jmethodID contextHubInfoSetStoppedPowerDrawMw; + jmethodID contextHubInfoSetSleepPowerDrawMw; + jmethodID contextHubInfoSetPeakPowerDrawMw; + jmethodID contextHubInfoSetSupportedSensors; + jmethodID contextHubInfoSetMemoryRegions; + + jmethodID contextHubServiceMsgReceiptCallback; +}; + +struct context_hub_info_s { + int cookie; + int numHubs; + const struct context_hub_t *hubs; + struct context_hub_module_t *contextHubModule; +}; + +struct contextHubServiceDb_s { + int initialized; + context_hub_info_s hubInfo; + jniInfo_s jniInfo; +}; + +} // unnamed namespace + +static contextHubServiceDb_s db; + +int context_hub_callback(uint32_t hub_id, const struct hub_message_t *msg, + void *cookie); + +static void initContextHubService() { + int err = 0; + db.hubInfo.hubs = NULL; + db.hubInfo.numHubs = 0; + db.hubInfo.cookie = 0; + int i; + + err = hw_get_module(CONTEXT_HUB_MODULE_ID, + (hw_module_t const**)(&db.hubInfo.contextHubModule)); + + if (err) { + ALOGE("** Could not load %s module : err %s", CONTEXT_HUB_MODULE_ID, + strerror(-err)); + } + + if (db.hubInfo.contextHubModule) { + ALOGD("Fetching hub info"); + db.hubInfo.numHubs = db.hubInfo.contextHubModule->get_hubs(db.hubInfo.contextHubModule, + &db.hubInfo.hubs); + + if (db.hubInfo.numHubs > 0) { + for (i = 0; i < db.hubInfo.numHubs; i++) { + // TODO : Event though one cookie is OK for now, lets change + // this to be one per hub + db.hubInfo.contextHubModule->subscribe_messages(db.hubInfo.hubs[i].hub_id, + context_hub_callback, + &db.hubInfo.cookie); + } + } + } +} + +static int onMessageReceipt(int *header, int headerLen, char *msg, int msgLen) { + JNIEnv *env; + if ((db.jniInfo.vm)->AttachCurrentThread(&env, NULL) != JNI_OK) { + return -1; + } + + jbyteArray jmsg = env->NewByteArray(msgLen); + jintArray jheader = env->NewIntArray(headerLen); + + env->SetByteArrayRegion(jmsg, 0, msgLen, (jbyte *)msg); + env->SetIntArrayRegion(jheader, 0, headerLen, (jint *)header); + + + return env->CallIntMethod(db.jniInfo.jContextHubService, + db.jniInfo.contextHubServiceMsgReceiptCallback, + jheader, jmsg); +} + +int context_hub_callback(uint32_t hub_id, const struct hub_message_t *msg, + void *cookie) { + int msgHeader[4]; + + msgHeader[0] = msg->message_type; + msgHeader[1] = 0; // TODO : HAL does not have a version field + msgHeader[2] = hub_id; + + onMessageReceipt(msgHeader, sizeof(msgHeader), (char *)msg->message, msg->message_len); // TODO : Populate this + return 0; +} + +static int init_jni(JNIEnv *env, jobject instance) { + + if (env->GetJavaVM(&db.jniInfo.vm) != JNI_OK) { + return -1; + } + + db.jniInfo.jContextHubService = env->NewGlobalRef(instance); + + db.jniInfo.contextHubInfoClass = + env->FindClass("android/hardware/location/ContextHubInfo"); + + db.jniInfo.contextHubServiceClass = + env->FindClass("android/hardware/location/ContextHubService"); + + db.jniInfo.memoryRegionsClass = + env->FindClass("android/hardware/location/MemoryRegion"); + + //TODO :: Add error checking + db.jniInfo.contextHubInfoCtor = + env->GetMethodID(db.jniInfo.contextHubInfoClass, "<init>", "()V"); + db.jniInfo.contextHubInfoSetId = + env->GetMethodID(db.jniInfo.contextHubInfoClass, "setId", "(I)V"); + db.jniInfo.contextHubInfoSetName = + env->GetMethodID(db.jniInfo.contextHubInfoClass, "setName", + "(Ljava/lang/String;)V"); + + db.jniInfo.contextHubInfoSetVendor = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setVendor", "(Ljava/lang/String;)V"); + db.jniInfo.contextHubInfoSetToolchain = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setToolchain", "(Ljava/lang/String;)V"); + db.jniInfo.contextHubInfoSetPlatformVersion = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setPlatformVersion", "(I)V"); + db.jniInfo.contextHubInfoSetStaticSwVersion = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setStaticSwVersion", "(I)V"); + db.jniInfo.contextHubInfoSetToolchainVersion = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setToolchainVersion", "(I)V"); + db.jniInfo.contextHubInfoSetPeakMips = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setPeakMips", "(F)V"); + db.jniInfo.contextHubInfoSetStoppedPowerDrawMw = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setStoppedPowerDrawMw", "(F)V"); + db.jniInfo.contextHubInfoSetSleepPowerDrawMw = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setSleepPowerDrawMw", "(F)V"); + db.jniInfo.contextHubInfoSetPeakPowerDrawMw = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setPeakPowerDrawMw", "(F)V"); + db.jniInfo.contextHubInfoSetSupportedSensors = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setSupportedSensors", "([I)V"); + db.jniInfo.contextHubInfoSetMemoryRegions = + env->GetMethodID(db.jniInfo.contextHubInfoClass, + "setMemoryRegions", "([Landroid/hardware/location/MemoryRegion;)V"); + + + db.jniInfo.contextHubServiceMsgReceiptCallback = + env->GetMethodID(db.jniInfo.contextHubServiceClass, "onMessageReceipt", + "([I[B)I"); + db.jniInfo.contextHubInfoSetName = + env->GetMethodID(db.jniInfo.contextHubInfoClass, "setName", + "(Ljava/lang/String;)V"); + + + return 0; +} + +static jobject constructJContextHubInfo(JNIEnv *env, const struct context_hub_t *hub) { + jstring jstrBuf; + jintArray jintBuf; + jobjectArray jmemBuf; + + int dummyConnectedSensors[] = {1, 2, 3, 4, 5}; + + jobject jHub = env->NewObject(db.jniInfo.contextHubInfoClass, + db.jniInfo.contextHubInfoCtor); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetId, hub->hub_id); + + jstrBuf = env->NewStringUTF(hub->name); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetName, jstrBuf); + + jstrBuf = env->NewStringUTF(hub->vendor); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetVendor, jstrBuf); + + jstrBuf = env->NewStringUTF(hub->toolchain); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetToolchain, jstrBuf); + + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetPlatformVersion, hub->platform_version); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetToolchainVersion, hub->toolchain_version); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetPeakMips, hub->peak_mips); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetStoppedPowerDrawMw, hub->stopped_power_draw_mw); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetSleepPowerDrawMw, hub->sleep_power_draw_mw); + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetPeakPowerDrawMw, hub->peak_power_draw_mw); + + // TODO : jintBuf = env->NewIntArray(hub->num_connected_sensors); + // TODO : env->SetIntArrayRegion(jintBuf, 0, hub->num_connected_sensors, hub->connected_sensors); + jintBuf = env->NewIntArray(array_length(dummyConnectedSensors)); + env->SetIntArrayRegion(jintBuf, 0, hub->num_connected_sensors, dummyConnectedSensors); + + // We are not getting the memory regions from the CH Hal - change this when it is available + jmemBuf = env->NewObjectArray(0, db.jniInfo.memoryRegionsClass, NULL); + // Note the zero size above. We do not need to set any elements + env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetMemoryRegions, jmemBuf); + + return jHub; +} + +static jobjectArray nativeInitialize(JNIEnv *env, jobject instance) +{ + jobject hub; + jobjectArray retArray; + + initContextHubService(); + + if (init_jni(env, instance) < 0) { + return NULL; + } + + // Note : The service is clamping the number of hubs to 1 + db.hubInfo.numHubs = 1; + + initContextHubService(); + + retArray = env->NewObjectArray(db.hubInfo.numHubs, db.jniInfo.contextHubInfoClass, NULL); + + for(int i = 0; i < db.hubInfo.numHubs; i++) { + hub = constructJContextHubInfo(env, &db.hubInfo.hubs[i]); + env->SetObjectArrayElement(retArray, i, hub); + } + + return retArray; +} + +static jint nativeSendMessage(JNIEnv *env, jobject instance, jintArray header_, + jbyteArray data_) { + hub_message_t msg; + hub_app_name_t dest; + uint8_t os_name[8]; + + memset(os_name, 0, sizeof(os_name)); + + jint *header = env->GetIntArrayElements(header_, 0); + //int numHeaderElements = env->GetArrayLength(header_); + jbyte *data = env->GetByteArrayElements(data_, 0); + int dataBufferLength = env->GetArrayLength(data_); + + /* Assume an int - thats all we understand */ + dest.app_name_len = array_length(os_name); // TODO : Check this + //dest.app_name = &header[1]; + dest.app_name = os_name; + + msg.app = &dest; + + msg.message_type = header[3]; + msg.message_len = dataBufferLength; + msg.message = data; + + jint retVal = db.hubInfo.contextHubModule->send_message(header[0], &msg); + + env->ReleaseIntArrayElements(header_, header, 0); + env->ReleaseByteArrayElements(data_, data, 0); + + return retVal; +} + +//-------------------------------------------------------------------------------------------------- +// +static const JNINativeMethod gContextHubServiceMethods[] = { + {"nativeInitialize", + "()[Landroid/hardware/location/ContextHubInfo;", + (void*)nativeInitialize }, + {"nativeSendMessage", + "([I[B)I", + (void*)nativeSendMessage } +}; + +}//namespace android + +using namespace android; + +int register_android_hardware_location_ContextHubService(JNIEnv *env) +{ + RegisterMethodsOrDie(env, "android/hardware/location/ContextHubService", + gContextHubServiceMethods, NELEM(gContextHubServiceMethods)); + + return 0; +} diff --git a/core/res/res/anim/lock_screen_behind_enter.xml b/core/res/res/anim/lock_screen_behind_enter.xml index 6f3c4d4200f9..c96e2809d8a9 100644 --- a/core/res/res/anim/lock_screen_behind_enter.xml +++ b/core/res/res/anim/lock_screen_behind_enter.xml @@ -16,7 +16,6 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:background="#ff000000" android:detachWallpaper="true" android:shareInterpolator="false" android:startOffset="100"> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index de4ccaeec8ec..dfdb6b0bb2c8 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Werkmodus is AF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Stel werkprofiel in staat om te werk, insluitend programme, agtergrondsinkronisering en verwante kenmerke."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Skakel aan"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Deur %1$s gedeaktiveer"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Deur %1$s-administrateur gedeaktiveer. Kontak hulle om meer uit te vind."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Jy het nuwe boodskappe"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Maak SMS-program oop om te bekyk"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Sommige funksies kan beperk wees"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Ontspeld"</string> <string name="app_info" msgid="6856026610594615344">"Programinligting"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Voer \'n fabriekterugstelling uit om hierdie toestel normaal te gebruik"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Raak om meer te wete te kom."</string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 88e9367ba5cf..50f5f766ee33 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"የሥራ ሁነታ ጠፍቷል"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"መተግበሪያዎችን፣ የበስተጀርባ ሥምረት እና ተዛማጅ ባሕሪዎችን ጨምሮ የሥራ መገለጫ እንዲሰራ ይፍቀዱ።"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"አብራ"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s ተሰናክሏል"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"በ%1$s አስተዳዳሪ ተሰናክሏል። የበለጠ ለመረዳት ያነጋግሯቸው።"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"አዲስ መልእክቶች አለዎት"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ለመመልከት የኤስኤምኤስ መተግበሪያ ይክፈቱ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"አንዳንድ ተግባሮች የተገደቡ ሊሆኑ ይችላሉ"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"ንቀል"</string> <string name="app_info" msgid="6856026610594615344">"የመተግበሪያ መረጃ"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"ይህን መሣሪያ በመደበኛነት ለመጠቀም የፋብሪካ ዳግም ያስጀምሩ"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"የበለጠ ለመረዳት ይንኩ።"</string> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 84bc7683b45b..fcde6912eff0 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1625,8 +1625,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"وضع العمل معطَّل"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"السماح باستخدام الملف الشخصي للعمل، بما في ذلك التطبيقات ومزامنة الخلفية والميزات ذات الصلة."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"تشغيل"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"تم تعطيل %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"تم التعطيل بواسطة مشرف %1$s. يمكنك الاتصال به لمعرفة المزيد."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"لديك رسائل جديدة"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"فتح تطبيق الرسائل القصيرة SMS للعرض"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ربما تكون بعض الوظائف مُقيّدة."</string> @@ -1640,6 +1638,7 @@ <string name="unpin_target" msgid="3556545602439143442">"إزالة تثبيت"</string> <string name="app_info" msgid="6856026610594615344">"معلومات عن التطبيق"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"يمكنك إعادة تعيين إعدادات المصنع لاستخدام هذا الجهاز بشكل عادي"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"المس للتعرف على مزيد من المعلومات."</string> </resources> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 3953264e638f..3bc0ec36608d 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"İş rejimi DEAKTİVDİR"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Tətbiq, arxa fon sinxronizasiyası və digər əlaqədar xüsusiyyətlər daxil olmaqla iş profilinin fəaliyyətinə icazə verin."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivləşdirin"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s dekativ edildi"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s administratoru tərəfindən deaktiv edildi. Ətraflı məlumat üçün onlarla əlaqə saxlayın."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Yeni mesajlarınız var"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Baxmaq üçün SMS tətbiqini açın"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Bir neçə funksionallıq məhdudlaşdırıla bilər"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Çıxarın"</string> <string name="app_info" msgid="6856026610594615344">"Tətbiq məlumatı"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Cihazı normal istifadə etmək üçün fabrik sıfırlaması"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Daha çox məlumat üçün toxunun."</string> </resources> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 5c73fafe6fed..be40fa85d663 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1568,8 +1568,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Režim za Work je ISKLJUČEN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Dozvoljava profilu za Work da funkcioniše, uključujući aplikacije, sinhronizaciju u pozadini i srodne funkcije."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Paket %1$s je onemogućen"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Onemogućio je administrator kompanije %1$s. Kontaktirajte ga da biste saznali više."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Imate nove poruke"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Otvorite aplikaciju za SMS da biste pregledali"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Neke funkcije su možda ograničene"</string> @@ -1583,6 +1581,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Otkači"</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Resetujte uređaj na fabrička podešavanja da biste ga normalno koristili"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Dodirnite da biste saznali više."</string> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index b2633a9f683a..40e9572c02b9 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Работният режим е ИЗКЛЮЧЕН"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Разрешаване на функционирането на служебния потребителски профил, включително приложенията, синхронизирането на заден план и свързаните функции."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Включване"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Пакетът „%1$s“ е деактивиран"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Деактивирано от администратора на %1$s. Свържете се с него, за да научите повече."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Имате нови съобщения"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Преглед в приложението за SMS"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Някои функции може да са огранич."</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Освобождаване"</string> <string name="app_info" msgid="6856026610594615344">"Информация за приложението"</string> <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Възстановете фабричните настройки, за да използвате това устройство нормално"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Докоснете, за да научите повече."</string> </resources> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 2042c4c2b830..92bd3e7d82d1 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"কাজের মোড বন্ধ আছে"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"অ্যাপ্লিকেশান, পটভূমি সিঙ্ক এবং সম্পর্কিত বৈশিষ্ট্যগুলি সহ কর্মস্থলের প্রোফাইলটিকে কাজ করার মঞ্জুরি দিন।"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"চালু করুন"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s অক্ষম করা আছে"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s প্রশাসক অক্ষম করেছেন। আরো জানতে তাদের সাথে যোগাযোগ করুন।"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"আপনার নতুন বার্তা আছে"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"দেখার জন্য SMS অ্যাপ্লিকেশান খুলুন"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"কিছু ক্রিয়াকলাপ সীমিত হতে পারে"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"আনপিন করুন"</string> <string name="app_info" msgid="6856026610594615344">"অ্যাপ্লিকেশানের তথ্য"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"এই ডিভাইসটিকে স্বাভাবিকভাবে ব্যবহার করতে ফ্যাক্টরি পুনরায় সেট করুন"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"আরো জানতে স্পর্শ করুন৷"</string> </resources> diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml index f352620b23b4..ca7a80aed734 100644 --- a/core/res/res/values-bs-rBA/strings.xml +++ b/core/res/res/values-bs-rBA/strings.xml @@ -1568,8 +1568,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Radni način rada je ISKLJUČEN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Omogući radnom profilu da funkcionira, uključujući aplikacije, sinhronizaciju u pozadini i povezane funkcije."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s – onemogućeno"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Onemogućio administrator (%1$s). Obratite mu se za više informacija."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Imate nove poruke"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Otvorite SMS aplikaciju da biste pregledali poruke"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Neke funkcije mogu biti ograničene"</string> @@ -1583,6 +1581,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Otkači"</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Vratite na fabričke postavke kako biste mogli normalno koristiti ovaj uređaj"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Dodirnite da saznate više."</string> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 54828960573e..a73741204300 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Mode de feina desactivat"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permet que el perfil professional funcioni, incloses les aplicacions, la sincronització en segon pla i les funcions relacionades."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activa"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Aplicació %1$s desactivada"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"L\'administrador de l\'empresa %1$s ha desactivat el paquet. Contacta-hi per obtenir-ne més informació."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Tens missatges nous"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Obre l\'aplicació de SMS per veure\'ls"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algunes funcions es limitaran"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"No fixis"</string> <string name="app_info" msgid="6856026610594615344">"Informació de l\'aplicació"</string> <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Restableix les dades de fàbrica del dispositiu per utilitzar-lo amb normalitat"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toca per obtenir més informació."</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 390dfd063eac..5b6a213b5101 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1587,8 +1587,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Pracovní režim je VYPNUTÝ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Povolí fungování pracovního profilu, včetně aplikací, synchronizace na pozadí a souvisejících funkcí."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Zapnout"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Balíček %1$s byl zakázán"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Zakázáno administrátorem zařízení %1$s. Chcete-li získat další informace, kontaktujte jej."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Máte nové zprávy"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Zobrazíte je v aplikaci pro SMS"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funkce mohou být omezeny"</string> @@ -1602,6 +1600,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Odepnout"</string> <string name="app_info" msgid="6856026610594615344">"Informace o aplikaci"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Chcete-li toto zařízení normálně používat, obnovte jej do továrního nastavení"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Klepnutím zobrazíte další informace."</string> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 583a6b70603c..06861e7568de 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Arbejdstilstand er slået FRA"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Tillad, at arbejdsprofilen aktiveres, bl.a. i forbindelse med apps, baggrundssynkronisering og relaterede funktioner."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Slå til"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s er deaktiveret"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Deaktiveret af %1$s administrator. Kontakt vedkommende for at få flere oplysninger."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Du har nye beskeder"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Åbn sms-appen for at se beskeden"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Nogle funktioner er begrænsede"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Frigør"</string> <string name="app_info" msgid="6856026610594615344">"Oplysninger om appen"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Nulstil enheden til fabriksindstillingerne for at bruge den på normal vis"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Tryk for at få flere oplysninger."</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index b67402aac27b..30188b52beb5 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Arbeitsmodus ist AUS"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Arbeitsprofil aktivieren, einschließlich Apps, Synchronisierung im Hintergrund und verknüpfter Funktionen."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivieren"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s deaktiviert"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Durch den Administrator von %1$s deaktiviert. Setze dich für weitere Informationen mit ihm in Verbindung."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Du hast neue Nachrichten"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Zum Ansehen SMS-App öffnen"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Einige Funktionen sind evtl. eingeschränkt"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Markierung entfernen"</string> <string name="app_info" msgid="6856026610594615344">"App-Informationen"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Gerät zur normalen Verwendung auf Werkseinstellungen zurücksetzen"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Für weitere Informationen tippen."</string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 845018982dbd..10914950d81a 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Λειτουργία εργασίας ΑΠΕΝΕΡΓ/ΝΗ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Να επιτρέπεται η λειτουργία του προφίλ εργασίας σας, συμπεριλαμβανομένων των εφαρμογών, του συγχρονισμού στο παρασκήνιο και των σχετικών λειτουργιών."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ενεργοποίηση"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Το %1$s απενεργοποιήθηκε"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Απενεργοποιήθηκε από το διαχειριστή της συσκευής %1$s. Επικοινωνήστε με το διαχειριστή για να μάθετε περισσότερα."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Έχετε νέα μηνύματα"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Άνοιγμα της εφαρμογής SMS για προβολή"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Μερ. λειτ. ίσως είναι περιορ."</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Ξεκαρφίτσωμα"</string> <string name="app_info" msgid="6856026610594615344">"Πληροφορίες εφαρμογής"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Επαναφέρετε τις εργοστασιακές ρυθμίσεις για να χρησιμοποιήσετε αυτήν τη συσκευή κανονικά"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Αγγίξτε για να μάθετε περισσότερα."</string> </resources> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index ac7ad91522ed..58d45baae6eb 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Work mode is OFF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Allow work profile to function, including apps, background sync and related features."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s disabled"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Disabled by %1$s administrator. Contact them to find out more."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"You have new messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open SMS app to view"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Some functionality may be limited"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string> <string name="app_info" msgid="6856026610594615344">"App info"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Restore this device to factory settings to use normally"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Touch to find out more."</string> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index ac7ad91522ed..58d45baae6eb 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Work mode is OFF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Allow work profile to function, including apps, background sync and related features."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s disabled"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Disabled by %1$s administrator. Contact them to find out more."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"You have new messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open SMS app to view"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Some functionality may be limited"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string> <string name="app_info" msgid="6856026610594615344">"App info"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Restore this device to factory settings to use normally"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Touch to find out more."</string> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index ac7ad91522ed..58d45baae6eb 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Work mode is OFF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Allow work profile to function, including apps, background sync and related features."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s disabled"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Disabled by %1$s administrator. Contact them to find out more."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"You have new messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open SMS app to view"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Some functionality may be limited"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string> <string name="app_info" msgid="6856026610594615344">"App info"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Restore this device to factory settings to use normally"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Touch to find out more."</string> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 4623d77a00ee..225116fb44dd 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabajo DESACTIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permite que se active el perfil de trabajo, incluidas las apps, la sincronización en segundo plano y las funciones relacionadas."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Se inhabilitó %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"El administrador de %1$s lo inhabilitó. Comunícate con él para obtener más información."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Tienes mensajes nuevos"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abrir app de SMS para ver el mensaje"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funciones limitadas"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"No fijar"</string> <string name="app_info" msgid="6856026610594615344">"Información de la app"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Restablece la configuración de fábrica para usar este dispositivo con normalidad"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toca para obtener más información."</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 65f5f240d2d6..5ce171172b97 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1549,12 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabajo desactivado"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permite que se utilice el perfil de trabajo, incluidas las aplicaciones, la sincronización en segundo plano y las funciones relacionadas."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string> - <!-- String.format failed for translation --> - <!-- no translation found for suspended_package_title (3408150347778524435) --> - <skip /> - <!-- String.format failed for translation --> - <!-- no translation found for suspended_package_message (6341091587106868601) --> - <skip /> <string name="new_sms_notification_title" msgid="8442817549127555977">"Tienes mensajes nuevos"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abre la aplicación de SMS para ver el mensaje"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algunas funciones limitadas"</string> @@ -1568,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"No fijar"</string> <string name="app_info" msgid="6856026610594615344">"Información de la aplicación"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Restablece los datos de fábrica para utilizar este dispositivo con normalidad"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toca para obtener más información."</string> </resources> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index c35d222da2f9..3ce50d986816 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Töörežiim on VÄLJA LÜLITATUD"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Lubatakse tööprofiili toimingud, sh rakendused, taustal sünkroonimine ja seotud funktsioonid."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Lülita sisse"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Üksus %1$s on keelatud"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Keelas seadme %1$s administraator. Lisateabe saamiseks võtke temaga ühendust."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Teile on uusi sõnumeid"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Avage vaatamiseks SMS-rakendus"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funktsioon võib olla piiratud"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Vabasta"</string> <string name="app_info" msgid="6856026610594615344">"Rakenduse teave"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Seadme tavapäraseks kasutamiseks lähtestage see tehaseseadetele"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Lisateabe saamiseks puudutage."</string> </resources> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index bb83a9e57db8..6c41c2c0538e 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Desaktibatuta dago laneko modua"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Baimendu laneko profilak funtzionatzea, besteak beste, aplikazioak, atzeko planoko sinkronizazioa eta erlazionatutako eginbideak."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aktibatu"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Desgaituta dago %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Desgaitu egin du %1$s gailuaren administratzaileak. Informazio gehiago lortu nahi baduzu, jarri harekin harremanetan."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Mezu berriak dituzu"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Mezuak ikusteko, ireki SMS mezuen aplikazioa"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funtzioak mugatuta egon litezke"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Kendu aingura"</string> <string name="app_info" msgid="6856026610594615344">"Aplikazioari buruzko informazioa"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Berrezarri jatorrizko egoerara gailua ohi bezala erabiltzen jarraitu ahal izateko"</string> - <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Ukitu informazio gehiago lortzeko."</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> + <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Sakatu informazio gehiago lortzeko."</string> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index eeab6d35a3f4..aba5e08a6a93 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"حالت کاری خاموش است"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"به نمایه کاری اجازه فعالیت ( شامل استفاده از برنامهها، همگامسازی در پسزمینه و قابلیتهای مرتبط) داده شود."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"روشن کردن"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s غیرفعال است"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"سرپرست %1$s آن را غیرفعال کرده است. برای اطلاعات بیشتر با او تماس بگیرید."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"پیامهای جدیدی دارید"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"برای مشاهده، برنامه پیامک را باز کنید"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ممکن است برخی از عملکردها محدود باشند"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"برداشتن پین"</string> <string name="app_info" msgid="6856026610594615344">"اطلاعات برنامه"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"بازنشانی کارخانهای برای استفاده عادی از این دستگاه"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"برای یادگیری بیشتر لمس کنید."</string> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index d45e0bd60efe..e52d8707c6c2 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Työtila on pois käytöstä"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Sallii työprofiiliin toiminnan, esimerkiksi sovellukset ja taustasynkronoinnin."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ota käyttöön"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s poisti tämän käytöstä"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Organisaation %1$s järjestelmänvalvojan käytöstä poistama. Kysy häneltä lisätietoja."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Sinulle on uusia viestejä"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Katso avaamalla tekstiviestisovellus."</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Toimintorajoitus mahdollinen"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Irrota"</string> <string name="app_info" msgid="6856026610594615344">"Sovelluksen tiedot"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Palauta tehdasasetukset, jotta voit käyttää laitetta tavallisesti"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Lue lisätietoja koskettamalla."</string> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 6fa6f4915f5b..acfd0a656572 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Le mode Travail est désactivé"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Autoriser le fonctionnement du profil professionnel, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activer"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s est désactivé"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Cette option a été désactivée par l\'administrateur de %1$s. Communiquez avec lui pour en savoir plus."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Vous avez de nouveaux messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Ouvrez l\'application de messagerie texte pour l\'afficher"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Certaines fonct. sont limitées"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Annuler l\'épinglage"</string> <string name="app_info" msgid="6856026610594615344">"Détails de l\'application"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Rétablissez la configuration d\'usine pour utiliser cet appareil normalement"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Touchez ici pour en savoir plus."</string> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 02ad9e6a2d56..d3bb5d0405fa 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Mode professionnel DÉSACTIVÉ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Autoriser le fonctionnement du profil professionnel, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activer"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s désactivé"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Désactivé par l\'administrateur %1$s. Contactez-le pour en savoir plus."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Vous avez de nouveaux messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Ouvrir l\'application de SMS pour afficher le message"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Des fonctionnalités peuvent être limitées"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Retirer"</string> <string name="app_info" msgid="6856026610594615344">"Infos sur l\'appli"</string> <string name="negative_duration" msgid="5688706061127375131">"− <xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Rétablir la configuration d\'usine pour utiliser cet appareil normalement"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Appuyez ici pour en savoir plus."</string> </resources> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index cb0ac76e4ee2..6a2b7f3454d2 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de traballo DESACTIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permite que funcione o perfil de traballo, incluídas as aplicacións, a sincronización en segundo plano e as funcións relacionadas."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Desactivouse %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"O administrador de %1$s desactivou este paquete. Contacta con el para obter máis información."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Tes mensaxes novas"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abre a aplicación de SMS para ver as mensaxes"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Pode haber funcións limitadas"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Soltar"</string> <string name="app_info" msgid="6856026610594615344">"Información da aplicación"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Restablecemento da configuración de fábrica para usar este dispositivo con normalidade"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toca para acceder a máis información"</string> </resources> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 6270867d1e03..7595a88a8dfc 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"કાર્ય મોડ બંધ છે"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"કાર્ય પ્રોફાઇલને ઍપ્લિકેશનો, પૃષ્ઠભૂમિ સમન્વયન અને સંબંધિત સુવિધાઓ સહિતનું કાર્ય કરવાની મંજૂરી આપો."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ચાલુ કરો"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s અક્ષમ કરેલ"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ. વધુ જાણવા માટે તેમનો સંપર્ક કરો."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"તમારી પાસે નવા સંદેશા છે"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"જોવા માટે SMS ઍપ્લિકેશન ખોલો"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"કેટલીક કાર્યક્ષમતા મર્યાદિત હોઈ શકે છે"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"અનપિન કરો"</string> <string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"આ ઉપકરણને સામાન્ય રીતે ઉપયોગ કરવા માટે ફેક્ટરી રીસેટ કરો"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"વધુ જાણવા માટે ટચ કરો."</string> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 82e1d83b1139..3c33b38a0af1 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"कार्य मोड बंद है"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ऐप्स, पृष्ठभूमि समन्वयन और संबंधित सुविधाओं सहित कार्य प्रोफ़ाइल को काम करने की अनुमति दें"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"चालू करें"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s को अक्षम किया गया"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s व्यवस्थापक द्वारा अक्षम किया गया. अधिक जानने के लिए उनसे संपर्क करें."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"आपके पास नए संदेश हैं"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"देखने के लिए SMS ऐप खोलें"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"कुछ कार्य क्षमताएं सीमित हो सकती हैं"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"अनपिन करें"</string> <string name="app_info" msgid="6856026610594615344">"ऐप की जानकारी"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"इस डिवाइस का सामान्य रूप से उपयोग करने के लिए फ़ैक्टरी रीसेट करें"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"अधिक जानने के लिए स्पर्श करें."</string> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index cd23a1af5075..862ee6050b93 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1568,8 +1568,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Radni je način ISKLJUČEN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Omogućuje radnom profilu da funkcionira, uključujući aplikacije, sinkronizaciju u pozadini i povezane značajke."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s – onemogućeno"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Onemogućio administrator (%1$s). Obratite mu se za više informacija."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Imate nove poruke"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Otvorite SMS aplikaciju da biste pregledali poruke"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funkcije mogu biti ograničene"</string> @@ -1583,6 +1581,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Otkvači"</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Uređaj je vraćen na tvorničke postavke da biste ga mogli upotrebljavati na pravilan način"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Dodirnite da biste saznali više."</string> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index ffa8d214543d..d6114fa58fe7 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"A munka mód KI van kapcsolva"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Munkaprofil használatának engedélyezése, beleértve az alkalmazásokat, a háttérben való szinkronizálást és a kapcsolódó funkciókat."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Bekapcsolás"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s letiltva"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"A(z) %1$s szervezet rendszergazdája letiltotta. További információért vegye fel vele a kapcsolatot."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Új üzenetei érkeztek"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"SMS-alkalmazás megnyitása a megtekintéshez"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Egyes funkciók korlátozva lehetnek"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Feloldás"</string> <string name="app_info" msgid="6856026610594615344">"Alkalmazásinformáció"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Gyári beállítások visszaállítása az eszköz normál módú használatához"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Érintse meg a további információkért."</string> </resources> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 909a5c9b7c86..0b2fe576cb43 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -1137,7 +1137,7 @@ <string name="notification_listener_binding_label" msgid="2014162835481906429">"Ծանուցման ունկնդիր"</string> <string name="vr_listener_binding_label" msgid="4316591939343607306">"VR ունկնդրիչ"</string> <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Պայմանների մատակարար"</string> - <string name="notification_ranker_binding_label" msgid="774540592299064747">"Ըստ կարևորության ծանուցումների դասակարգման ծառայություն"</string> + <string name="notification_ranker_binding_label" msgid="774540592299064747">"Ծանուցումների դասակարգման ծառայություն"</string> <string name="vpn_title" msgid="19615213552042827">"VPN-ը ակտիվացված է"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN-ն ակտիվացված է <xliff:g id="APP">%s</xliff:g>-ի կողմից"</string> <string name="vpn_text" msgid="3011306607126450322">"Հպեք` ցանցի կառավարման համար:"</string> @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Աշխատանքային ռեժիմն ԱՆՋԱՏՎԱԾ Է"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Թույլատրել աշխատանքային պրոֆիլի (այդ թվում նաև հավելվածների, ֆոնային համաժամացման և առնչվող գործառական հնարավորությունների) աշխատանքը:"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Միացնել"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s-ը կասեցվել է"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Կասեցվել է %1$s ադմինիստրատորի կողմից: Ավելին իմանալու համար կապվեք նրա հետ:"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Դուք ունեք նոր հաղորդագրություններ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Դիտելու համար բացել SMS հավելվածը"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Որոշ գործառույթներ կարող են սահմանափակված լինել"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Ապամրացնել"</string> <string name="app_info" msgid="6856026610594615344">"Հավելվածի տվյալներ"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Սարքը սովորական ռեժիմում օգտագործելու համար կատարեք գործարանային վերակայում"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Հպեք՝ ավելին իմանալու համար:"</string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 14b7526bf10a..fca667a9c98c 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Mode kerja NONAKTIF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Izinkan profil kerja berfungsi, termasuk aplikasi, sinkronisasi latar belakang, dan fitur terkait."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aktifkan"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s dinonaktifkan"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Dinonaktifkan oleh administrator %1$s. Hubungi administrator untuk mempelajari lebih lanjut."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Ada pesan baru"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Buka aplikasi SMS untuk melihat"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Beberapa fungsi mungkin terbatas"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Lepas pin"</string> <string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Dikembalikan ke setelan pabrik untuk menggunakan perangkat ini secara normal"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Sentuh untuk mempelajari lebih lanjut."</string> </resources> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index e3278f3823a4..dc4121484659 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Slökkt á vinnusniði"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Leyfa virkni vinnusniðs, m.a. forrita, samstillingar í bakgrunni og tengdra eiginleika."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Kveikja"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s óvirkt"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Gert óvirkt af stjórnanda %1$s. Hafðu samband við hann til að fá frekari upplýsingar."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Þú ert með ný skilaboð"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Opnaðu SMS-forritið til að skoða"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Sum virkni kann að vera takmörkuð"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Losa"</string> <string name="app_info" msgid="6856026610594615344">"Forritsupplýsingar"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Núllstilltu til að nota þetta tæki í venjulegri stillingu"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Snertu til að fá frekari upplýsingar."</string> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 6f1c1ec12019..c43470ba178e 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modalità Lavoro DISATTIVATA"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Attiva il profilo di lavoro, incluse app, sincronizzazione in background e funzioni correlate."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Attiva"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s disattivato"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Disattivato dall\'amministratore di %1$s. Contattalo per ulteriori informazioni."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Hai nuovi messaggi"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Apri l\'app SMS per la visualizzazione"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funzioni potenzial. limitate"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Sblocca"</string> <string name="app_info" msgid="6856026610594615344">"Informazioni app"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Esegui il ripristino dei dati di fabbrica per utilizzare normalmente il dispositivo"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Tocca per ulteriori informazioni."</string> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index c79befabcc68..246140b3c3ee 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1587,8 +1587,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"מצב העבודה כבוי"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"אפשר לפרופיל העבודה לפעול, כולל אפליקציות, סנכרון ברקע ותכונות קשורות."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"הפעל"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"החבילה %1$s הושבתה"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"הושבתה על ידי מנהל המערכת של %1$s. צור איתו קשר כדי לקבל מידע נוסף."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"יש לך הודעות חדשות"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"פתח את אפליקציית ה-SMS כדי להציג"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ייתכן שחלק מהפונקציונליות תהיה מוגבלת"</string> @@ -1602,6 +1600,7 @@ <string name="unpin_target" msgid="3556545602439143442">"בטל הצמדה"</string> <string name="app_info" msgid="6856026610594615344">"פרטי אפליקציה"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"איפוס להגדרות היצרן לצורך שימוש במכשיר זה באופן רגיל"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"גע לקבלת מידע נוסף."</string> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 5c9729532bd8..1cd079be243d 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Work モード OFF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"仕事用プロファイルで、アプリ、バックグラウンド同期などの関連機能の使用を許可します。"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ON にする"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$sが無効です"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s管理者によって無効になっています。詳しくは管理者までお問い合わせください。"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"新着メッセージがあります"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"表示するには SMS アプリを開きます"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"一部機能が制限されている可能性"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"固定を解除"</string> <string name="app_info" msgid="6856026610594615344">"アプリ情報"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"この端末は正常に使用するために出荷時設定にリセットされました"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"タップして詳細をご確認ください。"</string> </resources> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 15167f735215..8ff6a09bb841 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"სამსახურის რეჟიმი გამორთულია"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"სამსახურის პროფილის მუშაობის დაშვება, მათ შორის, აპების, ფონური სინქრონიზაციის და დაკავშირებული ფუნქციების."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ჩართვა"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s გათიშულია"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"გათიშულია „%1$s“-ის ადმინისტრატორის მიერ. დაუკავშირდით მას მეტის გასაგებად."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"თქვენ ახალი შეტყობინებები გაქვთ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"სანახავად, გახსენით SMS აპი"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ზოგიერთი ფუნქცია შეიძლება შეიზღუდოს"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"ჩამაგრების მოხსნა"</string> <string name="app_info" msgid="6856026610594615344">"აპის შესახებ"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"ამ მოწყობილობის ჩვეულებრივად გამოსაყენებლად, დააბრუნეთ ქარხნული პარამეტრები"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"შეეხეთ მეტის გასაგებად."</string> </resources> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index 6d31dd1f195d..a0e987d135ff 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -1054,7 +1054,7 @@ <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Қате туралы есеп алынуда…"</string> <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Қате туралы есепті бөлісу керек пе?"</string> <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Қате туралы есеп бөлісілуде…"</string> - <string name="share_remote_bugreport_notification_message_finished" msgid="8610614010660772643">"АТ әкімшісі осы құрылғы ақауларын жоюға көмектесу үшін қате туралы есепті сұрады. Қолданбалар мен деректерді бөлісуі мүмкін."</string> + <string name="share_remote_bugreport_notification_message_finished" msgid="8610614010660772643">"АТ әкімшісі осы құрылғы ақауларын жоюға көмектесу үшін қате туралы есепті сұрады. Оған қолданбалар мен деректер көрсетілуі мүмкін."</string> <string name="share_remote_bugreport_action" msgid="6249476773913384948">"БӨЛІСУ"</string> <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ҚАБЫЛДАМАУ"</string> <string name="select_input_method" msgid="8547250819326693584">"Пернетақтаны өзгерту"</string> @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Жұмыс режимі ӨШІРУЛІ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Жұмыс профиліне, соның ішінде, қолданбаларға, фондық синхрондауға және қатысты мүмкіндіктерге жұмыс істеуге рұқсат ету."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Қосу"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s өшірілген"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s әкімшісі өшірген. Қосымша мәліметтер алу үшін оларға хабарласыңыз."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Сізде жаңа хабарлар бар"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Көру үшін SMS қолданбасын ашыңыз"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Кейбір функциялар істемеуі мүмкін"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Босату"</string> <string name="app_info" msgid="6856026610594615344">"Қолданба ақпараты"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Осы құрылғыны әдеттегідей пайдалану үшін зауыттық параметрлерді қалпына келтіріңіз"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Қосымша мәліметтер алу үшін түртіңіз."</string> </resources> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index e3e46b05ccad..e586c78c9573 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -1551,8 +1551,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"របៀបការងារបានបិទ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"អនុញ្ញាតឲ្យប្រវត្តិរូបការងារដំណើរការ ដោយរាប់បញ្ចូលទាំងកម្មវិធី ការធ្វើសមកាលកម្មផ្ទៃខាងក្រោយ និងលក្ខណៈពិសេសដែលពាក់ព័ន្ធ។"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"បើក"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"បានបិទដំណើរការ %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"បិទដំណើរការដោយអ្នកគ្រប់គ្រង %1$s។ សូមទាក់ទងពួកគេដើម្បីស្វែងយល់បន្ថែម។"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"អ្នកមានសារថ្មី"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"បើកកម្មវិធីសារ SMS ដើម្បីមើល"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"លទ្ធភាពប្រើមុខងារមួយចំនួនអាចត្រូវបាកម្រិត"</string> @@ -1566,6 +1564,7 @@ <string name="unpin_target" msgid="3556545602439143442">"មិនខ្ទាស់"</string> <string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"កំណត់ដូចចេញពីរោងចក្រឡើងវិញដើម្បីប្រើឧបករណ៍នេះតាមធម្មតា"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ប៉ះ ដើម្បីស្វែងយល់បន្ថែម។"</string> </resources> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index 7a41d4bb7077..74aa8019d5f8 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"ಕೆಲಸದ ಮೋಡ್ ಆಫ್ ಆಗಿದೆ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಹಿನ್ನೆಲೆ ಸಿಂಕ್ ಮತ್ತು ಇತರ ಸಂಬಂಧಿತ ವೈಶಿಷ್ಟ್ಯಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಅನುಮತಿಸಿ."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ಆನ್ ಮಾಡು"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s ನಿರ್ವಾಹಕರಿಂದ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಇನ್ನಷ್ಟು ತಿಳಿದುಕೊಳ್ಳಲು ಅವರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"ನೀವು ಹೊಸ ಸಂದೇಶಗಳನ್ನು ಹೊಂದಿರುವಿರಿ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ವೀಕ್ಷಿಸಲು SMS ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ಕೆಲವು ಕಾರ್ಯನಿರ್ವಹಣೆಗಳು ಸೀಮಿತವಾಗಿರಬಹುದು"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"ಅನ್ಪಿನ್"</string> <string name="app_info" msgid="6856026610594615344">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"ಈ ಸಾಧನವನ್ನು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ಬಳಸಲು ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್ ಮಾಡಿ"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಸ್ಪರ್ಶಿಸಿ."</string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index b236d398d0a3..3c09cfb8b43c 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"직장 모드가 사용 중지됨"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"앱, 백그라운드 동기화 및 관련 기능을 포함한 직장 프로필이 작동하도록 허용"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"사용 설정"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s이(가) 사용 중지됨"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s 관리자에 의해 사용 중지되었습니다. 자세히 알아보려면 관리자에게 문의하세요."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"새 메시지 있음"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"SMS 앱을 열고 확인"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"일부 기능이 제한될 수 있습니다."</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"고정 해제"</string> <string name="app_info" msgid="6856026610594615344">"앱 정보"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"정상적인 기기 사용을 위한 초기화"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"자세한 내용을 보려면 터치하세요."</string> </resources> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 3a30b55fb7a4..d10a50f04b7a 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -1138,7 +1138,7 @@ <string name="notification_listener_binding_label" msgid="2014162835481906429">"Эскертүү тыңшагычы"</string> <string name="vr_listener_binding_label" msgid="4316591939343607306">"VR режими"</string> <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Шарт түзүүчү"</string> - <string name="notification_ranker_binding_label" msgid="774540592299064747">"Эскертмени баалоо кызматы"</string> + <string name="notification_ranker_binding_label" msgid="774540592299064747">"Эскертмелердин маанилүүлүгүн баалоо кызматы"</string> <string name="vpn_title" msgid="19615213552042827">"VPN иштетилди"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g> аркылуу жандырылды"</string> <string name="vpn_text" msgid="3011306607126450322">"желени башкаруу үчүн басыңыз."</string> @@ -1550,8 +1550,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Жумуш режими ӨЧҮРҮЛГӨН"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Жумуш профилин, ошондой эле колдонмолорду, фондо шайкештирүү жана ага байланыштуу функцияларды иштетиңиз."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Күйгүзүү"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s өчүрүлгөн"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s администратору тарабынан өчүрүлгөн. Көбүрөөк билүү үчүн администраторго кайрылыңыз."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Сизге жаңы билдирүүлөр келди"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Көрүү үчүн SMS колдонмосун ачыңыз"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Айрым функциялар чектлши мүмкн"</string> @@ -1565,6 +1563,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Кадоодон алып коюу"</string> <string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Бул түзмөктү кадимкидей колдонуу үчүн заводдук баштапкы абалына келтириңиз"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Көбүрөөк билүү үчүн тийип коюңуз."</string> </resources> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index 5ad178673fad..46cc85aa3080 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"ໂໝດບ່ອນເຮັດວຽກປິດຢູ່"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ອະນຸຍາດໃຫ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກສາມາດນຳໃຊ້ໄດ້ ເຊິ່ງຮວມທັງແອັບ, ການຊິ້ງຂໍ້ມູນໃນພື້ນຫຼັງ ແລະ ຄຸນສົມບັດທີ່ກ່ຽວຂ້ອງ."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ເປີດ"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s ຖືກປິດໃຊ້ແລ້ວ"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"ຖືກປິດໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບ %1$s. ກະລຸນາຕິດຕໍ່ຫາພວກເຂົາເພື່ອສຶກສາເພີ່ມເຕີມ."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"ທ່ານມີຂໍ້ຄວາມໃໝ່"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ເປີດແອັບ SMS ເພື່ອເບິ່ງ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ບາງຄວາມສາມາດນຳໃຊ້ອາດຈະຖືກຈຳກັດ"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"ຖອນປັກໝຸດ"</string> <string name="app_info" msgid="6856026610594615344">"ຂໍ້ມູນແອັບ"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"ຣີເຊັດເປັນຄ່າໂຮງງານເພື່ອໃຊ້ອຸປະກອນນີ້ປົກກະຕິ"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 5496adaf6e07..0efdfcaf9896 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1587,8 +1587,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Darbo režimas išjungtas"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Leisti veikti darbo profiliui, įskaitant programas, sinchronizavimą fone ir susijusias funkcijas."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Įjungti"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s išjungtas"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Išjungė %1$s administratorius. Kad sužinotumėte daugiau, susisiekite su juo."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Turite naujų pranešimų"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Atidaryti SMS programą, norint peržiūrėti"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Kai kurios funkcijos gali būti ribojamos"</string> @@ -1602,6 +1600,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Atsegti"</string> <string name="app_info" msgid="6856026610594615344">"Programos informacija"</string> <string name="negative_duration" msgid="5688706061127375131">"–<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Atkurkite gamyklinius nustatymus, kad galėtumėte įprastai naudoti šį įrenginį"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Palieskite, kad sužinotumėte daugiau."</string> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 59ffdc3224f4..f5c59219eb99 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1568,8 +1568,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Darba režīms IZSLĒGTS"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Atļaujiet darboties darba profilam, tostarp lietotnēm, sinhronizācijai fonā un saistītajām funkcijām."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ieslēgt"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Pakotne %1$s atspējota"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Atspējoja %1$s administrators. Lai uzzinātu vairāk, sazinieties ar administratoru."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Jums ir jaunas īsziņas."</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Lai skatītu, atveriet īsziņu lietotni."</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funkcijas var būt ierobežotas"</string> @@ -1583,6 +1581,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Atspraust"</string> <string name="app_info" msgid="6856026610594615344">"Lietotnes informācija"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Rūpnīcas datu atiestatīšana ierīces normālai darbībai"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Pieskarieties, lai uzzinātu vairāk."</string> </resources> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index d0a7b20e8bbd..1fbf3630bcef 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -1551,8 +1551,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Режимот на работа е ИСКЛУЧЕН"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Дозволете работниот профил да функционира, вклучувајќи ги апликациите, синхронизирањето во заднина и други поврзани функции."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Вклучи"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s е оневозможен"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Оневозможено од администраторот на %1$s. Контактирајте со него за да дознаете повеќе."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Имате нови пораки"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Отворете ја апликацијата за СМС за приказ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Некои функции се ограничени"</string> @@ -1566,6 +1564,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Откачете"</string> <string name="app_info" msgid="6856026610594615344">"Информации за апликација"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Ресетирање на фабрички вредности за уредот да се користи нормално"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Допрете за да дознаете повеќе."</string> </resources> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index 829e06aac987..2fa6786226fa 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"ഔദ്യോഗിക മോഡ് ഓഫാണ്"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ആപ്സും, പശ്ചാത്തല സമന്വയവും ബന്ധപ്പെട്ട ഫീച്ചറുകളും ഉൾപ്പെടെ, ഔദ്യോഗിക പ്രൊഫൈലിനെ പ്രവർത്തിക്കാൻ അനുവദിക്കുക."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ഓണാക്കുക"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s പ്രവർത്തനരഹിതമാക്കി"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s അഡ്മിനിസ്ട്രേറ്റർ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു. കൂടുതലറിയാൻ അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"നിങ്ങൾക്ക് പുതിയ സന്ദേശങ്ങൾ ഉണ്ട്"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"കാണുന്നതിന് SMS ആപ്പ് തുറക്കുക"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ചില പ്രവർത്തനക്ഷമതകൾ പരിമിതപ്പെടാം"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"അൺപിൻ ചെയ്യുക"</string> <string name="app_info" msgid="6856026610594615344">"ആപ്പ് വിവരം"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"ഈ ഉപകരണം സാധാരണ നിലയിൽ ഉപയോഗിക്കാൻ ഫാക്ടറി പുനഃസജ്ജീകരണം നടത്തുക"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"കൂടുതലറിയുന്നതിന് സ്പർശിക്കുക."</string> </resources> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 9414f4e646a1..9956dbf0c319 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -1547,8 +1547,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Ажлын горимыг УНТРААСАН байна"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Ажлын профайлд апп, дэвсгэр синхрончлол болон бусад холбоотой тохиргоог ажиллахыг зөвшөөрнө үү."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Асаах"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s идэвхгүй болгосон"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s админ идэвхгүй болгосон. Дэлгэрэнгүй мэдэхийн тулд тэдэнтэй холбоо барина уу."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Танд шинэ зурвасууд байна"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Үзэхийн тулд SMS аппыг нээх"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Зарим үйлдэл хязгаарлалттай байж болно"</string> @@ -1562,6 +1560,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string> <string name="app_info" msgid="6856026610594615344">"Апп-н мэдээлэл"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Энэ төхөөрөмжийг хэвийн ашиглахын тулд үйлдвэрийн тохиргоонд дахин тохируулна уу"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Дэлгэрэнгүй үзэх бол дарна уу."</string> </resources> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index 67351eac138b..40f780780d61 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"कार्य मोड बंद आहे"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"कार्य प्रोफाइलला अॅप्स, पार्श्वभूमी संकालन आणि संबंधित वैशिष्ट्यांच्या समावेशासह कार्य करण्याची परवानगी द्या."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"चालू करा"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s अक्षम केले"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s प्रशासकाद्वारे अक्षम केले. अधिक जाणून घेण्यासाठी त्यांच्याशी संपर्क साधा."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"आपल्याकडे नवीन संदेश आहेत"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"पाहण्यासाठी SMS अॅप उघडा"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"काही कार्यक्षमता मर्यादित असू शकतात"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"अनपिन करा"</string> <string name="app_info" msgid="6856026610594615344">"अॅप माहिती"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"हे डिव्हाइस सामान्यपणे वापरण्यासाठी फॅक्टरी रीसेट करा"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"अधिक जाणून घेण्यासाठी स्पर्श करा."</string> </resources> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 5c342f0608e3..2154bda338cf 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Mod kerja DIMATIKAN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Benarkan profil kerja berfungsi, termasuk apl, penyegerakan latar belakang dan ciri yang berkaitan."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Hidupkan"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s dilumpuhkan"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Dilumpuhkan oleh pentadbir %1$s. Hubungi mereka untuk mengetahui lebih lanjut."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Anda mempunyai mesej baharu"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Buka apl SMS untuk melihat"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Sesetengah fungsi mungkin terhad"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Nyahsemat"</string> <string name="app_info" msgid="6856026610594615344">"Maklumat apl"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Lakukan tetapan semula kilang untuk menggunakan peranti ini seperti biasa"</string> - <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Sentuh untuk mengetahui lebih lanjut."</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> + <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Ketik untuk mengetahui lebih lanjut."</string> </resources> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index e66cf66a06f7..4a934f018116 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"အလုပ်မုဒ် ပိတ်ထားသည်"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"အက်ပ်များ၊ နောက်ခံစင့်ခ်လုပ်ခြင်း၊ နှင့်သက်ဆိုင်သည့်အင်္ဂါရပ်များကို ဆောင်ရွက်ရန် အလုပ်ပရိုဖိုင်ကိုခွင့်ပြုပါ။"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ဖွင့်ပါ"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s ကိုပိတ်ထားသည်"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s စီမံခန့်ခွဲသူမှ ပိတ်ထားသည်။ ပိုမိုလေ့လာရန် ၎င်းတို့ကိုဆက်သွယ်ပါ။"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"သင့်ထံတွင် စာအသစ်များရောက်နေသည်"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ကြည့်ရှုရန် SMS အက်ပ်ကိုဖွင့်ပါ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"အချို့လုပ်ဆောင်ချက်များ ကန့်သတ်ချက်ရှိနိုင်သည်"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"ဖြုတ်ပါ"</string> <string name="app_info" msgid="6856026610594615344">"အက်ပ်အချက်အလက်"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"ဤစက်ပစ္စည်းကို သာမန်အသုံးပြုနိုင်ရန် စက်ရုံထုတ်အတိုင်း ပြန်လည်သတ်မှတ်ပါ"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ပိုမိုလေ့လာရန် တို့ပါ။"</string> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 6c2358b4e13c..79a5a8603458 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1549,10 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Jobbmodus er AV"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Slå på jobbprofilen, inkludert apper, synkronisering i bakgrunnen og relaterte funksjoner."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Slå på"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s er slått av"</string> - <!-- String.format failed for translation --> - <!-- no translation found for suspended_package_message (6341091587106868601) --> - <skip /> <string name="new_sms_notification_title" msgid="8442817549127555977">"Du har nye meldinger"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Åpne SMS-appen for å se"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Enkelte funksjoner kan være begrenset"</string> @@ -1566,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Løsne"</string> <string name="app_info" msgid="6856026610594615344">"Info om appen"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Tilbakestill til fabrikkstandard for å bruke denne enheten som normalt"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Trykk for å finne ut mer."</string> </resources> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 40d13f091cea..db7cd0193d46 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -1555,8 +1555,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"कार्य मोड बन्द छ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"अनुप्रयोग, पृष्ठभूमि सिंक र सम्बन्धित विशेषताहरू सहित, कार्य प्रोफाइललाई कार्य गर्न अनुमति दिनुहोस्।"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"सक्रिय गर्नुहोस्"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s असक्षम भयो"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s प्रशासकद्वारा असक्षम गरिएको। थप जान्नका लागि तिनीहरूलाई सम्पर्क गर्नुहोस्।"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"तपाईंलाई नयाँ सन्देश आएको छ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"हेर्नका लागि SMS अनुप्रयोग खोल्नुहोस्"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"केही कार्य सीमित हुनसक्छ"</string> @@ -1570,6 +1568,7 @@ <string name="unpin_target" msgid="3556545602439143442">"अनपिन गर्नुहोस्"</string> <string name="app_info" msgid="6856026610594615344">"अनुप्रयोगका बारे जानकारी"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"यस यन्त्रलाई सामान्य रूपमा प्रयोग गर्नका लागि फ्याक्ट्री रिसेट गर्नुहोस्"</string> - <string name="audit_safemode_notification_details" msgid="1860601176690176413">"थप जान्नका लागि स्पर्श गर्नुहोस्।"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> + <string name="audit_safemode_notification_details" msgid="1860601176690176413">"थप जान्नका लागि छुनुहोस्।"</string> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index b48fc3329b41..c7c95e195ed8 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Werkmodus is UIT"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Functioneren van werkprofiel toestaan, waaronder apps, synchronisatie op de achtergrond en gerelateerde functies."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Inschakelen"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s is uitgeschakeld"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Uitgeschakeld door de beheerder van %1$s. Neem voor meer informatie contact op met de beheerder."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Je hebt nieuwe berichten"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open je sms-app om ze te bekijken"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Bepaalde functionaliteit kan zijn beperkt"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Losmaken"</string> <string name="app_info" msgid="6856026610594615344">"App-info"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Zet dit apparaat terug op de fabrieksinstellingen om het normaal te gebruiken"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Tik voor meer informatie."</string> </resources> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index 7ff207183f3e..cbb26282b582 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"ਕੰਮ ਮੋਡ ਬੰਦ ਹੈ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ਐਪਾਂ, ਬੈਕਗ੍ਰਾਊਂਡ ਸਮਕਾਲੀਕਰਨ, ਅਤੇ ਸਬੰਧਿਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋਏ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਕੰਮ ਕਰਨ ਦੀ ਮਨਜ਼ੂਰੀ ਦਿਓ।"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ਚਾਲੂ ਕਰੋ"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਉਹਨਾਂ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"ਤੁਹਾਨੂੰ ਨਵੇਂ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਹੋਏ ਹਨ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ਵੇਖਣ ਲਈ SMS ਐਪ ਖੋਲ੍ਹੋ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ਕੁਝ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਸੀਮਿਤ ਹੋ ਸਕਦੀ ਹੈ"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"ਅਨਪਿੰਨ ਕਰੋ"</string> <string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਸਧਾਰਨ ਰੂਪ ਵਿੱਚ ਵਰਤਣ ਲਈ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਕਰੋ"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ਹੋਰ ਜਾਣਨ ਲਈ ਸਪਰਸ਼ ਕਰੋ।"</string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index b68b45a8508e..5eb6b563a08a 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1587,8 +1587,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Tryb pracy jest WYŁĄCZONY"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Włącz profil do pracy, w tym aplikacje, synchronizację w tle i inne funkcje."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Włącz"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Wyłączono pakiet %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Wyłączone przez administratora organizacji %1$s. Skontaktuj się z nim, by dowiedzieć się więcej."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Masz nowe wiadomości"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Otwórz aplikację do SMS-ów, by wyświetlić wiadomość"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Niektóre funkcje mogą być niedostępne"</string> @@ -1602,6 +1600,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Odepnij"</string> <string name="app_info" msgid="6856026610594615344">"O aplikacji"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Aby używać tego urządzenia normalnie, przywróć ustawienia fabryczne"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Kliknij, by dowiedzieć się więcej."</string> </resources> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index cd0de0e2feb8..21f6665d7677 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabalho DESATIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permitir que o perfil de trabalho funcione, incluindo apps, sincronização em segundo plano e recursos relacionados"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s desativado"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Desativado pelo administrador de %1$s. Entre em contato com ele para saber mais."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Você tem mensagens novas"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abra o app de SMS para ver"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algumas funcionalidades são limitadas"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Liberar guia"</string> <string name="app_info" msgid="6856026610594615344">"Informações do app"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Redefinir para a configuração original para usar este dispositivo normalmente"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toque para saber mais."</string> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index dde0131118e4..011ad4ecfa73 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabalho DESATIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permitir o funcionamento do perfil de trabalho, incluindo as aplicações, a sincronização em segundo plano e as funcionalidades relacionadas."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s desativado"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Desativado pelo administrador de %1$s. Contacte-o para saber mais."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Tem mensagens novas"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abra a aplicação de SMS para ver"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algumas funcionalid. limitadas"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Soltar"</string> <string name="app_info" msgid="6856026610594615344">"Informações da aplicação"</string> <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Fazer uma reposição de dados de fábrica para utilizar este dispositivo normalmente"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toque para saber mais."</string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index cd0de0e2feb8..21f6665d7677 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabalho DESATIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permitir que o perfil de trabalho funcione, incluindo apps, sincronização em segundo plano e recursos relacionados"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s desativado"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Desativado pelo administrador de %1$s. Entre em contato com ele para saber mais."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Você tem mensagens novas"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abra o app de SMS para ver"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algumas funcionalidades são limitadas"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Liberar guia"</string> <string name="app_info" msgid="6856026610594615344">"Informações do app"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Redefinir para a configuração original para usar este dispositivo normalmente"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toque para saber mais."</string> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 1c6e02445908..fe5139eb618e 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1568,8 +1568,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modul de serviciu e DEZACTIVAT"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permiteți profilului de serviciu să funcționeze, inclusiv aplicațiile, sincronizarea în fundal și funcțiile asociate."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activați"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Dezactivat de %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Dezactivat de administratorul companiei %1$s. Contactați-l pentru a afla mai multe."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Aveți mesaje noi"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Deschideți aplicația pentru SMS-uri ca să vizualizați"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Unele funcții ar putea fi limitate"</string> @@ -1583,6 +1581,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Anulați fixarea"</string> <string name="app_info" msgid="6856026610594615344">"Informații despre aplicație"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Reveniți la setările din fabrică pentru a folosi acest dispozitiv ca de obicei"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Atingeți pentru a afla mai multe."</string> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index f13435797101..40c85510bb48 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1587,8 +1587,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Рабочий режим отключен"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Включить рабочий профиль: приложения, фоновую синхронизацию и связанные функции."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Включить"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Пакет \"%1$s\" заблокирован"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Пакет заблокирован администратором компании \"%1$s\". Обратитесь к нему за дополнительной информацией."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Новые сообщения"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Чтобы просмотреть, откройте приложение для обмена SMS"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Некоторые функции недоступны"</string> @@ -1602,6 +1600,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Открепить"</string> <string name="app_info" msgid="6856026610594615344">"О приложении"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Сброс до заводских настроек в целях безопасности"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Нажмите, чтобы узнать больше."</string> </resources> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 9a6d3af92557..4f0c9713d901 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -1551,8 +1551,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"වැඩ ප්රකාරය ක්රියාවිරහිතයි"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"යෙදුම්, පසුබිම සමමුහුර්ත කිරීම, සහ සම්බන්ධිත විශේෂාංග ඇතුළුව, ක්රියා කිරීමට කාර්යාල පැතිකඩට ඉඩ දෙන්න"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ක්රියාත්මක කරන්න"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s අබල කරන ලදී"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s පරිපාලක විසින් අබල කරන ලදී. තව දැන ගැනීමට ඔවුන් අමතන්න."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"ඔබට නව පණිවිඩ තිබේ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"බැලීමට විවෘත SMS යෙදුම විවෘත කරන්න"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ඇතැම් ක්රියාකාරිත්ව සීමිත විය හැකිය"</string> @@ -1566,6 +1564,7 @@ <string name="unpin_target" msgid="3556545602439143442">"ගලවන්න"</string> <string name="app_info" msgid="6856026610594615344">"යෙදුම් තොරතුරු"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"මෙම උපාංගය සාමාන්ය ලෙස භාවිත කිරීමට කර්මාන්තශාලා යළි සැකසීම"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"තව දැන ගැනීමට ස්පර්ශ කරන්න."</string> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index f4794a6cacdb..46304349394d 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1587,8 +1587,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Pracovný režim je VYPNUTÝ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Povoľte fungovanie pracovného profilu vrátane aplikácií, synchronizácie na pozadí a súvisiacich funkcií."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Zapnúť"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Balík %1$s bol zakázaný"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Zakázané správcom %1$s. Ak chcete získať ďalšie informácie, kontaktujte ho."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Máte nové správy."</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Otvorte aplikáciu pre SMS a zobrazte správu"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Niektoré funkcie môžu byť obmedzené"</string> @@ -1602,6 +1600,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Uvoľniť"</string> <string name="app_info" msgid="6856026610594615344">"Info o aplikácii"</string> <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Ak chcete toto zariadenie používať normálnym spôsobom, obnovte na ňom továrenské nastavenia"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Klepnutím získate ďalšie informácie."</string> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 3e0cfaff83cf..bf6075239b16 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1587,8 +1587,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Delovni način IZKLOPLJEN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Dovoljeno delovanje delovnega profila, vključno z aplikacijami, sinhronizacijo v ozadju in povezanimi funkcijami."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Vklop"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s – onemogočeno"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Onemogočil skrbnik %1$s. Za več informacij se obrnite nanj."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Imate nova sporočila."</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Za ogled odprite aplikacijo za SMS-je"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Nekatere funkcije bodo omejene"</string> @@ -1602,6 +1600,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Odpenjanje"</string> <string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Napravo ponastavite na tovarniške nastavitve, če jo želite uporabljati brez težav"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Dotaknite se, če želite izvedeti več."</string> </resources> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index bc8bd2ba50e0..8b78c767efe6 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Modaliteti i punës është JOAKTIV"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Lejoje profilin e punës të funksionojë, duke përfshirë aplikacionet, sinkronizimin në sfond dhe funksionet e lidhura."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivizo"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s është çaktivizuar"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Çaktivizuar nga administratori i %1$s. Kontaktoje për të mësuar më shumë."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Ke mesazhe të reja"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Hap aplikacionin SMS për ta parë"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Disa funksione mund të jenë të kufizuara"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Zhgozhdo"</string> <string name="app_info" msgid="6856026610594615344">"Informacioni mbi aplikacionin"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Rivendos cilësimet e fabrikës për ta përdorur normalisht këtë pajisje"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Prek për të mësuar më shumë."</string> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index d14c166d71a9..c68ec8867957 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1568,8 +1568,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Режим за Work је ИСКЉУЧЕН"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Дозвољава профилу за Work да функционише, укључујући апликације, синхронизацију у позадини и сродне функције."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Укључи"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Пакет %1$s је онемогућен"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Онемогућио је администратор компаније %1$s. Контактирајте га да бисте сазнали више."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Имате нове поруке"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Отворите апликацију за SMS да бисте прегледали"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Неке функције су можда ограничене"</string> @@ -1583,6 +1581,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Откачи"</string> <string name="app_info" msgid="6856026610594615344">"Информације о апликацији"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Ресетујте уређај на фабричка подешавања да бисте га нормално користили"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Додирните да бисте сазнали више."</string> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 3eb4ae346ee6..46b1bf6d6f3d 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Arbetsläget är inaktiverat"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Tillåt att jobbprofilen är aktiv, inklusive appar, bakgrundssynkronisering och andra tillhörande funktioner."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivera"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s har inaktiverats"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Inaktiverat av administratören för %1$s. Kontakta administratören om du vill veta mer."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Du har nya meddelanden"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Öppna sms-appen och visa meddelandet"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Vissa funktioner är begränsade"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Lossa"</string> <string name="app_info" msgid="6856026610594615344">"Info om appen"</string> <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Återställ standardinställningarna om du vill använda enheten normalt"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Tryck här om du vill läsa mer."</string> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 04994d55a1ce..fa3d151316cf 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1551,8 +1551,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Hali ya kazi IMEZIMWA"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Ruhusu wasifu wa kazini utumike, ikiwa ni pamoja na programu, usawazishaji wa chini chini na vipengele vinavyohusiana."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Washa"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Imezimwa na %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Imezimwa na msimamizi wa %1$s. Wasiliana naye ili upate maelezo zaidi."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Una ujumbe mpya"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Fungua programu ya SMS ili uweze kuangalia"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Huenda baadhi ya utendaji ukawa vikwazo"</string> @@ -1566,6 +1564,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Bandua"</string> <string name="app_info" msgid="6856026610594615344">"Maelezo ya programu"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Rejesha mipangilio ya kiwandani katika kifaa hiki ili ukitumie kwa njia ya kawaida"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Gusa ili kupata maelezo zaidi."</string> </resources> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index 2cb08c9e2d96..57bde42a2f81 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"பணிப் பயன்முறை முடக்கப்பட்டது"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"செயல்பட, பணி சுயவிவரத்தை அனுமதி. இதில் பயன்பாடுகள், பின்னணி ஒத்திசைவு மற்றும் தொடர்புடைய அம்சங்கள் அடங்கும்."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"இயக்கு"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s முடக்கப்பட்டது"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s நிர்வாகி முடக்கியுள்ளார். மேலும் அறிய, அவரைத் தொடர்புகொள்ளவும்."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"புதிய செய்திகள் வந்துள்ளன"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"பார்க்க, SMS பயன்பாட்டைத் திறக்கவும்"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"சில செயல்பாடு வரம்பிடப்பட்டிருக்கலாம்"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"பின்னை அகற்று"</string> <string name="app_info" msgid="6856026610594615344">"பயன்பாட்டுத் தகவல்"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"சாதாரணமாக இந்தச் சாதனத்தைப் பயன்படுத்த, ஆரம்ப நிலைக்கு மீட்டமைக்கவும்"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"மேலும் அறிய தொடவும்."</string> </resources> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 4fd8aadd4b02..d2381fc0a729 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"కార్యాలయ మోడ్ ఆఫ్ చేయబడింది"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"అనువర్తనాలు, నేపథ్య సమకాలీకరణ మరియు సంబంధిత లక్షణాలతో సహా కార్యాలయ ప్రొఫైల్ను పని చేయడానికి అనుమతించండి."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ఆన్ చేయి"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$sని నిలిపివేసారు"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$sని నిర్వాహకుడు నిలిపివేసారు. మరింత తెలుసుకోవడానికి వారిని సంప్రదించండి."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"మీకు కొత్త సందేశాలు ఉన్నాయి"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"వీక్షించడానికి SMS అనువర్తనాన్ని తెరవండి"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"కొంత కార్యాచరణ పరిమితం కావచ్చు"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"అన్పిన్ చేయి"</string> <string name="app_info" msgid="6856026610594615344">"అనువర్తన సమాచారం"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"ఈ పరికరాన్ని సాధారణంగా ఉపయోగించడానికి ఫ్యాక్టరీ రీసెట్ చేయండి"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"మరింత తెలుసుకోవడానికి తాకండి."</string> </resources> diff --git a/core/res/res/values-television/config.xml b/core/res/res/values-television/config.xml index 3408c2117f85..58d3d9153013 100644 --- a/core/res/res/values-television/config.xml +++ b/core/res/res/values-television/config.xml @@ -33,5 +33,5 @@ <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, when the PIP is shown with Recents. --> - <string translatable="false" name="config_pictureInPictureBoundsInRecents">"1480 123 1760 303"</string> + <string translatable="false" name="config_pictureInPictureBoundsInRecents">"1484 96 1804 276"</string> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index fabecc39661b..1eedd0190766 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"โหมดทำงานปิดอยู่"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"อนุญาตให้โปรไฟล์งานทำงานได้ ซึ่งรวมถึงแอป การซิงค์ในพื้นหลัง และคุณลักษณะอื่นที่เกี่ยวข้อง"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"เปิด"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"ปิดใช้ %1$s แล้ว"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"ผู้ดูแลระบบ %1$s ได้ปิดใช้แล้ว โปรดสอบถามข้อมูลเพิ่มเติมจากเขา"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"คุณมีข้อความใหม่"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"เปิดแอป SMS เพื่อดู"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"อาจมีข้อจำกัดในบางฟังก์ชัน"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"เลิกปักหมุด"</string> <string name="app_info" msgid="6856026610594615344">"ข้อมูลแอป"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"รีเซ็ตเป็นค่าเริ่มต้นเพื่อใช้อุปกรณ์นี้ตามปกติ"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"แตะเพื่อเรียนรู้เพิ่มเติม"</string> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 981567d3c1f8..d785cf4f398b 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"NAKA-OFF ang work mode"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Payagang gumana ang profile sa trabaho, kasama na ang mga app, pag-sync sa background at mga may kaugnayang feature."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"I-on"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"Na-disable ang %1$s"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Na-disable ng administrator ng %1$s. Makipag-ugnayan sa administrator upang matuto nang higit pa."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Mayroon kang mga bagong mensahe"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Buksan ang SMS app upang tingnan"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Limitado ilang functionality"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"I-unpin"</string> <string name="app_info" msgid="6856026610594615344">"Impormasyon ng app"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Mag-factory reset upang magamit nang normal ang device na ito"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Pindutin upang matuto nang higit pa."</string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index af5652b5b3ec..d4f2891c9d01 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"İş modu KAPALI"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Uygulamalar, arka planda senkronizasyon ve ilgili özellikler dahil olmak üzere iş profilinin çalışmasına izin ver."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aç"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s devre dışı bırakıldı"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s yöneticisi tarafından devre dışı bırakıldı. Daha fazla bilgi edinmek için kendileriyle iletişime geçin."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Yeni mesajlarınız var"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Görüntülemek için SMS uygulamasını açın"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Bazı işlevler sınırlı olabilir"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Sabitlemeyi kaldır"</string> <string name="app_info" msgid="6856026610594615344">"Uygulama bilgileri"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Cihazı normal olarak kullanmak için fabrika ayarlarına sıfırlayın"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Daha fazla bilgi edinmek için dokunun."</string> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 344797f3245b..aba18b58b83b 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1153,7 +1153,7 @@ <string name="notification_listener_binding_label" msgid="2014162835481906429">"Служба читання сповіщень"</string> <string name="vr_listener_binding_label" msgid="4316591939343607306">"Обробник віртуальної реальності"</string> <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Постачальник умов"</string> - <string name="notification_ranker_binding_label" msgid="774540592299064747">"Служба позиціонування сповіщень"</string> + <string name="notification_ranker_binding_label" msgid="774540592299064747">"Служба встановлення пріоритетності сповіщень"</string> <string name="vpn_title" msgid="19615213552042827">"Мережу VPN активовано"</string> <string name="vpn_title_long" msgid="6400714798049252294">"Мережу VPN активовано програмою <xliff:g id="APP">%s</xliff:g>"</string> <string name="vpn_text" msgid="3011306607126450322">"Торкніться, щоб керувати мережею."</string> @@ -1587,8 +1587,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Робочий профіль ВИМКНЕНО"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Увімкнути робочий профіль, зокрема додатки, фонову синхронізацію та пов’язані функції."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Увімкнути"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s вимкнено"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Вимкнув адміністратор %1$s. Зв’яжіться з ним, щоб дізнатися більше."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"У вас є нові повідомлення"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Щоб переглянути, відкрийте додаток для SMS"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Деякі функції можуть не працювати"</string> @@ -1602,6 +1600,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Відкріпити"</string> <string name="app_info" msgid="6856026610594615344">"Про додаток"</string> <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Відновлення заводських налаштувань для належної роботи пристрою"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Торкніться, щоб дізнатися більше."</string> </resources> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index a58f5c282ce9..47e6e885e15f 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"کام موڈ آف ہے"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"دفتری پروفائل کو کام کرنے دیں، بشمول ایپس، پس منظر کی مطابقت پذیری اور متعلقہ خصوصیات۔"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"آن کریں"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s غیر فعال کردہ"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s منتظم کی جانب سے غیر فعال کر دیا گیا۔ مزید جاننے کیلئے ان سے رابطہ کریں۔"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"آپ کے پاس نئے پیغامات ہیں"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"دیکھنے کیلئے SMS ایپ کھولیں"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"کچھ فعالیت محدود ہو سکتی ہے"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"پن ہٹائیں"</string> <string name="app_info" msgid="6856026610594615344">"ایپ کی معلومات"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"اس آلہ کو معمولاً استعمال کرنے کیلئے فیکٹری ری سیٹ کریں"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"مزید جاننے کیلئے ٹچ کریں۔"</string> </resources> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index f95a37d62e05..88a417b5d531 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Ish rejimi O‘CHIQ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Ishchi profilini yoqish: ilovalar, fonda sinxronlash va bog‘liq funksiyalar."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Yoqish"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s o‘chirilgan"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"%1$s administratori tomonidan o‘chirilgan. Batafsil ma’lumot uchun bog‘laning."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Sizga yangi SMS keldi"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Ko‘rish uchun SMS ilovasini oching"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Ba’zi funksiyalar cheklanishi m-n"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Olib tashlash"</string> <string name="app_info" msgid="6856026610594615344">"Ilova haqida"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Bu qurilmadan odatdagidek foydalanish uchun zavod sozlamalarini tiklang"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Ko‘proq o‘rganish uchun bosing."</string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 283198f435df..b67008e02851 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Chế độ làm việc đang TẮT"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Cho phép hồ sơ công việc hoạt động, bao gồm ứng dụng, đồng bộ hóa trong nền và các tính năng liên quan."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Bật"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s đã bị tắt"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Đã bị quản trị viên %1$s tắt. Hãy liên hệ với quản trị viên để tìm hiểu thêm."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Bạn có tin nhắn mới"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Mở ứng dụng SMS để xem"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Một số chức năng có thể bị hạn chế"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Bỏ ghim"</string> <string name="app_info" msgid="6856026610594615344">"Thông tin ứng dụng"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Thiết lập cài đặt gốc để sử dụng thiết bị này một cách bình thường"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Chạm để tìm hiểu thêm."</string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 8dfbaed93296..d9e5a145ccd3 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"工作模式已关闭"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"启用工作资料,包括应用、后台同步和相关功能。"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"开启"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"%1$s已被禁用"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"该软件包已被%1$s管理员禁用。请与管理员联系以了解详情。"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"您有新消息"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"打开短信应用查看"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"部分功能可能会受到限制"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"取消固定"</string> <string name="app_info" msgid="6856026610594615344">"应用信息"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"恢复出厂设置即可正常使用此设备"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"触摸即可了解详情。"</string> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index c52d84371178..64de938faff0 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"工作模式已關閉"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"允許使用應用程式、背景同步及相關功能的工作設定檔。"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"開啟"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"已停用「%1$s」"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"「%1$s」管理員已停用此套件。請與管理員聯絡以瞭解詳情。"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"您有新的訊息"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"開啟短訊應用程式查看內容"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"部分功能可能會受到限制"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"取消固定"</string> <string name="app_info" msgid="6856026610594615344">"應用程式資料"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"將此裝置回復至原廠設定,方可正常使用"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"輕觸以瞭解詳情。"</string> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 8ff0fed42aaf..756c52d62d07 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Work 模式已關閉"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"啟用 Work 設定檔,包括應用程式、背景同步處理和相關功能。"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"開啟"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"已由「%1$s」停用"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"這個套件已由「%1$s」管理員停用。請與對方聯絡以瞭解詳情。"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"您有新訊息"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"開啟簡訊應用程式來查看內容"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"部分功能可能受到鎖定"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"取消固定"</string> <string name="app_info" msgid="6856026610594615344">"應用程式資訊"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"恢復原廠設定即可正常使用這個裝置"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"輕觸即可瞭解詳情。"</string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index fe2c8a61c8cd..6ff550b7e2a8 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1549,8 +1549,6 @@ <string name="work_mode_off_title" msgid="8954725060677558855">"Imodi yomsebenzi IVALIWE"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Vumela iphrofayela yomsebenzi ukuze isebenze, efaka izinhlelo zokusebenza, ukuvumelanisa kwangemuva, nezici ezisondelene."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Vula"</string> - <string name="suspended_package_title" msgid="3408150347778524435">"I-%1$s ikhutshaziwe"</string> - <string name="suspended_package_message" msgid="6341091587106868601">"Ikhutshazwe umlawuli we-%1$s. Xhumana nabo ukuze ufunde kabanzi."</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Unemilayezo emisha"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Vula uhlelo lokusebenza lwe-SMS ukuze ubuke"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Okunye ukusebenza kungakhawulelwe"</string> @@ -1564,6 +1562,7 @@ <string name="unpin_target" msgid="3556545602439143442">"Susa ukuphina"</string> <string name="app_info" msgid="6856026610594615344">"Ulwazi lohlelo lokusebenza"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="audit_safemode_notification" msgid="6351827251856877200">"Setha kabusha ngokwefekthri ukuze usebenzise le divayisi ngokuvamile"</string> + <!-- no translation found for audit_safemode_notification (6416076898350685856) --> + <skip /> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Thinta ukuze ufunde kabanzi."</string> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 17afd92b648a..5d083d7f43c7 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4188,10 +4188,6 @@ <string name="work_mode_off_message">Allow work profile to function, including apps, background sync, and related features.</string> <!-- Title for button to turn on work profile. [CHAR LIMIT=NONE] --> <string name="work_mode_turn_on">Turn on</string> - <!-- Title for dialog displayed when a packge is suspended by device admin. [CHAR LIMIT=30] --> - <string name="suspended_package_title">%1$s disabled</string> - <!-- Message for dialog displayed when a packge is suspended by device admin. [CHAR LIMIT=NONE] --> - <string name="suspended_package_message">Disabled by %1$s administrator. Contact them to learn more.</string> <!-- Notification title shown when new SMS/MMS is received while the device is locked [CHAR LIMIT=NONE] --> <string name="new_sms_notification_title">You have new messages</string> @@ -4229,7 +4225,7 @@ <string name="negative_duration">\u2212<xliff:g id="time" example="1:14">%1$s</xliff:g></string> <!-- Title of notification shown when device has been forced to safe mode after a security compromise. --> - <string name="audit_safemode_notification">Factory reset to use this device normally</string> + <string name="audit_safemode_notification">Factory reset to use this device without restrictions</string> <!-- Description of notification shown when device has been forced to safe mode after a security compromise. --> <string name="audit_safemode_notification_details">Touch to learn more.</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 32a0131879b0..f01cce320b08 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2508,8 +2508,6 @@ <java-symbol type="string" name="work_mode_off_title" /> <java-symbol type="string" name="work_mode_off_message" /> <java-symbol type="string" name="work_mode_turn_on" /> - <java-symbol type="string" name="suspended_package_title" /> - <java-symbol type="string" name="suspended_package_message" /> <!-- New SMS notification while phone is locked. --> <java-symbol type="string" name="new_sms_notification_title" /> diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml index cf7978c12bfe..c02a01a364bc 100644 --- a/core/res/res/xml/sms_short_codes.xml +++ b/core/res/res/xml/sms_short_codes.xml @@ -102,7 +102,7 @@ <!-- United Kingdom (Great Britain): 4-6 digits, common codes [5-8]xxxx, plus EU: http://www.short-codes.com/media/Co-regulatoryCodeofPracticeforcommonshortcodes170206.pdf, visual voicemail code for EE: 887 --> - <shortcode country="gb" pattern="\\d{4,6}" premium="[5-8]\\d{4}" free="116\\d{3}|887|83669|34664|40406" /> + <shortcode country="gb" pattern="\\d{4,6}" premium="[5-8]\\d{4}" free="116\\d{3}|2020|35890|61002|61202|887|83669|34664|40406" /> <!-- Georgia: 4 digits, known premium codes listed --> <shortcode country="ge" pattern="\\d{4}" premium="801[234]|888[239]" /> @@ -214,7 +214,7 @@ <!-- USA: 5-6 digits (premium codes from https://www.premiumsmsrefunds.com/ShortCodes.htm), visual voicemail code for T-Mobile: 122 --> - <shortcode country="us" pattern="\\d{5,6}" premium="20433|21(?:344|472)|22715|23(?:333|847)|24(?:15|28)0|25209|27(?:449|606|663)|28498|305(?:00|83)|32(?:340|941)|33(?:166|786|849)|34746|35(?:182|564)|37975|38(?:135|146|254)|41(?:366|463)|42335|43(?:355|500)|44(?:567|578|711|811)|45814|46(?:157|173|327)|46666|47553|48(?:221|277|669)|50(?:844|920)|51(?:062|368)|52944|54(?:723|892)|55928|56483|57370|59(?:182|187|252|342)|60339|61(?:266|982)|62478|64(?:219|898)|65(?:108|500)|69(?:208|388)|70877|71851|72(?:078|087|465)|73(?:288|588|882|909|997)|74(?:034|332|815)|76426|79213|81946|83177|84(?:103|685)|85797|86(?:234|236|666)|89616|90(?:715|842|938)|91(?:362|958)|94719|95297|96(?:040|666|835|969)|97(?:142|294|688)|99(?:689|796|807)" free="122|87902" /> + <shortcode country="us" pattern="\\d{5,6}" premium="20433|21(?:344|472)|22715|23(?:333|847)|24(?:15|28)0|25209|27(?:449|606|663)|28498|305(?:00|83)|32(?:340|941)|33(?:166|786|849)|34746|35(?:182|564)|37975|38(?:135|146|254)|41(?:366|463)|42335|43(?:355|500)|44(?:578|711|811)|45814|46(?:157|173|327)|46666|47553|48(?:221|277|669)|50(?:844|920)|51(?:062|368)|52944|54(?:723|892)|55928|56483|57370|59(?:182|187|252|342)|60339|61(?:266|982)|62478|64(?:219|898)|65(?:108|500)|69(?:208|388)|70877|71851|72(?:078|087|465)|73(?:288|588|882|909|997)|74(?:034|332|815)|76426|79213|81946|83177|84(?:103|685)|85797|86(?:234|236|666)|89616|90(?:715|842|938)|91(?:362|958)|94719|95297|96(?:040|666|835|969)|97(?:142|294|688)|99(?:689|796|807)" standard="44567" free="122|87902" /> <!-- Vietnam --> <shortcode country="vn" free="5001" /> diff --git a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java index 3d8fe69d1bb7..a37abf185097 100644 --- a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java +++ b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java @@ -32,6 +32,8 @@ import com.android.frameworks.coretests.R; /** * SuggestionsPopupWindowTest tests. + * + * TODO: Add tests for when there are no suggestions */ public class SuggestionsPopupWindowTest extends ActivityInstrumentationTestCase2<TextViewActivity> { diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index 844eadbae692..4a4727fd891f 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -47,6 +47,8 @@ import com.android.frameworks.coretests.R; import android.support.test.espresso.action.EspressoKey; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.SmallTest; +import android.text.Selection; +import android.text.Spannable; import android.view.KeyEvent; import static org.hamcrest.Matchers.anyOf; @@ -534,4 +536,68 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV .perform(dragHandle(textView, Handle.SELECTION_END, text.indexOf('i'))); onView(withId(R.id.textview)).check(hasSelection("hijk")); } + + @SmallTest + public void testSetSelectionAndActionMode() throws Exception { + final String text = "abc def"; + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + + final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + assertFloatingToolbarIsNotDisplayed(); + textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0, 3)); + getInstrumentation().waitForIdleSync(); + sleepForFloatingToolbarPopup(); + // Don't automatically start action mode. + assertFloatingToolbarIsNotDisplayed(); + // Make sure that "Select All" is included in the selection action mode when the entire text + // is not selected. + onView(withId(R.id.textview)).perform(doubleClickOnTextAtIndex(text.indexOf('e'))); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarIsDisplayed(); + // Changing the selection range by API should not interrupt the selection action mode. + textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0, 3)); + getInstrumentation().waitForIdleSync(); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarIsDisplayed(); + assertFloatingToolbarContainsItem( + getActivity().getString(com.android.internal.R.string.selectAll)); + // Make sure that "Select All" is no longer included when the entire text is selected by + // API. + textView.post( + () -> Selection.setSelection((Spannable) textView.getText(), 0, text.length())); + getInstrumentation().waitForIdleSync(); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarIsDisplayed(); + assertFloatingToolbarDoesNotContainItem( + getActivity().getString(com.android.internal.R.string.selectAll)); + // Make sure that shrinking the selection range to cursor (an empty range) by API + // terminates selection action mode and does not trigger the insertion action mode. + textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0)); + getInstrumentation().waitForIdleSync(); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarIsNotDisplayed(); + // Make sure that user click can trigger the insertion action mode. + onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length())); + onHandleView(com.android.internal.R.id.insertion_handle).perform(click()); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarIsDisplayed(); + // Make sure that an existing insertion action mode keeps alive after the insertion point is + // moved by API. + textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0)); + getInstrumentation().waitForIdleSync(); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarIsDisplayed(); + assertFloatingToolbarDoesNotContainItem( + getActivity().getString(com.android.internal.R.string.copy)); + // Make sure that selection action mode is started after selection is created by API when + // insertion action mode is active. + textView.post( + () -> Selection.setSelection((Spannable) textView.getText(), 1, text.length())); + getInstrumentation().waitForIdleSync(); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarIsDisplayed(); + assertFloatingToolbarContainsItem( + getActivity().getString(com.android.internal.R.string.copy)); + } } diff --git a/graphics/java/android/graphics/AvoidXfermode.java b/graphics/java/android/graphics/AvoidXfermode.java index 48ee6fae3879..683c15702427 100644 --- a/graphics/java/android/graphics/AvoidXfermode.java +++ b/graphics/java/android/graphics/AvoidXfermode.java @@ -19,6 +19,8 @@ package android.graphics; /** * AvoidXfermode xfermode will draw the src everywhere except on top of the * opColor or, depending on the Mode, draw only on top of the opColor. + * + * @removed */ @Deprecated public class AvoidXfermode extends Xfermode { @@ -53,9 +55,5 @@ public class AvoidXfermode extends Xfermode { if (tolerance < 0 || tolerance > 255) { throw new IllegalArgumentException("tolerance must be 0..255"); } - native_instance = nativeCreate(opColor, tolerance, mode.nativeInt); } - - private static native long nativeCreate(int opColor, int tolerance, - int nativeMode); } diff --git a/graphics/java/android/graphics/Outline.java b/graphics/java/android/graphics/Outline.java index d3124545ae84..3e86e6ff15d3 100644 --- a/graphics/java/android/graphics/Outline.java +++ b/graphics/java/android/graphics/Outline.java @@ -32,7 +32,7 @@ import android.graphics.drawable.Drawable; * @see Drawable#getOutline(Outline) */ public final class Outline { - private static final float RADIUS_UNDEFINED = -1.0f; + private static final float RADIUS_UNDEFINED = Float.NEGATIVE_INFINITY; /** @hide */ public Path mPath; @@ -196,11 +196,11 @@ public final class Outline { } /** - * Returns the rounded rect radius, if set, or {@code -1} if a path has + * Returns the rounded rect radius, if set, or a value less than 0 if a path has * been set via {@link #setConvexPath(Path)}. A return value of {@code 0} * indicates a non-rounded rect. * - * @return the rounded rect radius or {@code -1} + * @return the rounded rect radius, or value < 0 */ public float getRadius() { return mRadius; diff --git a/graphics/java/android/graphics/PixelXorXfermode.java b/graphics/java/android/graphics/PixelXorXfermode.java index 0080e6536d77..27884e07ecfb 100644 --- a/graphics/java/android/graphics/PixelXorXfermode.java +++ b/graphics/java/android/graphics/PixelXorXfermode.java @@ -17,17 +17,11 @@ package android.graphics; /** - * PixelXorXfermode implements a simple pixel xor (op ^ src ^ dst). - * This transformation does not follow premultiplied conventions, therefore - * this mode *always* returns an opaque color (alpha == 255). Thus it is - * not really usefull for operating on blended colors. + * @removed */ @Deprecated public class PixelXorXfermode extends Xfermode { public PixelXorXfermode(int opColor) { - native_instance = nativeCreate(opColor); } - - private static native long nativeCreate(int opColor); } diff --git a/graphics/java/android/graphics/Rect.java b/graphics/java/android/graphics/Rect.java index 0cde0b990456..93ef3f0c5f9b 100644 --- a/graphics/java/android/graphics/Rect.java +++ b/graphics/java/android/graphics/Rect.java @@ -30,6 +30,11 @@ import java.util.regex.Pattern; * These fields can be accessed directly. Use width() and height() to retrieve * the rectangle's width and height. Note: most methods do not check to see that * the coordinates are sorted correctly (i.e. left <= right and top <= bottom). + * <p> + * Note that the right and bottom coordinates are exclusive. This means a Rect + * being drawn untransformed onto a {@link android.graphics.Canvas} will draw + * into the column and row described by its left and top coordinates, but not + * those of its bottom and right. */ public final class Rect implements Parcelable { public int left; diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index 437ebaab7fd7..ae9ebc762d76 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -157,7 +157,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { private static final boolean DBG_ANIMATION_VECTOR_DRAWABLE = false; /** Local, mutable animator set. */ - private VectorDrawableAnimator mAnimatorSet = new VectorDrawableAnimatorRT(this); + private VectorDrawableAnimator mAnimatorSet = new VectorDrawableAnimatorUI(this); /** * The resources against which this drawable was created. Used to attempt diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index 8417a406f0b0..d9c3a02f02d7 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -89,7 +89,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { * @see #getLayerInsetStart(int) * @see #getLayerInsetEnd(int) */ - public static final int UNDEFINED_INSET = Integer.MIN_VALUE; + public static final int INSET_UNDEFINED = Integer.MIN_VALUE; LayerState mLayerState; @@ -759,7 +759,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { * @attr ref android.R.styleable#LayerDrawableItem_bottom */ public void setLayerInset(int index, int l, int t, int r, int b) { - setLayerInsetInternal(index, l, t, r, b, UNDEFINED_INSET, UNDEFINED_INSET); + setLayerInsetInternal(index, l, t, r, b, INSET_UNDEFINED, INSET_UNDEFINED); } /** @@ -874,7 +874,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { /** * @param index the index of the layer * @return the number of pixels to inset from the start bound, or - * {@link #UNDEFINED_INSET} if not specified + * {@link #INSET_UNDEFINED} if not specified * @attr ref android.R.styleable#LayerDrawableItem_start */ public int getLayerInsetStart(int index) { @@ -885,7 +885,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { /** * @param index the index of the layer to adjust * @param e number of pixels to inset from the end bound, or - * {@link #UNDEFINED_INSET} if not specified + * {@link #INSET_UNDEFINED} if not specified * @attr ref android.R.styleable#LayerDrawableItem_end */ public void setLayerInsetEnd(int index, int e) { @@ -1503,8 +1503,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { // insets. final int insetRtlL = isLayoutRtl ? r.mInsetE : r.mInsetS; final int insetRtlR = isLayoutRtl ? r.mInsetS : r.mInsetE; - final int insetL = insetRtlL == UNDEFINED_INSET ? r.mInsetL : insetRtlL; - final int insetR = insetRtlR == UNDEFINED_INSET ? r.mInsetR : insetRtlR; + final int insetL = insetRtlL == INSET_UNDEFINED ? r.mInsetL : insetRtlL; + final int insetR = insetRtlR == INSET_UNDEFINED ? r.mInsetR : insetRtlR; // Establish containing region based on aggregate padding and // requested insets for the current layer. @@ -1602,8 +1602,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { // left / right ones. final int insetRtlL = isLayoutRtl ? r.mInsetE : r.mInsetS; final int insetRtlR = isLayoutRtl ? r.mInsetS : r.mInsetE; - final int insetL = insetRtlL == UNDEFINED_INSET ? r.mInsetL : insetRtlL; - final int insetR = insetRtlR == UNDEFINED_INSET ? r.mInsetR : insetRtlR; + final int insetL = insetRtlL == INSET_UNDEFINED ? r.mInsetL : insetRtlL; + final int insetR = insetRtlR == INSET_UNDEFINED ? r.mInsetR : insetRtlR; // Don't apply padding and insets for children that don't have // an intrinsic dimension. @@ -1763,8 +1763,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { public int[] mThemeAttrs; public int mDensity = DisplayMetrics.DENSITY_DEFAULT; public int mInsetL, mInsetT, mInsetR, mInsetB; - public int mInsetS = UNDEFINED_INSET; - public int mInsetE = UNDEFINED_INSET; + public int mInsetS = INSET_UNDEFINED; + public int mInsetE = INSET_UNDEFINED; public int mWidth = -1; public int mHeight = -1; public int mGravity = Gravity.NO_GRAVITY; @@ -1833,10 +1833,10 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { mInsetT = Drawable.scaleFromDensity(mInsetT, sourceDensity, targetDensity, false); mInsetR = Drawable.scaleFromDensity(mInsetR, sourceDensity, targetDensity, false); mInsetB = Drawable.scaleFromDensity(mInsetB, sourceDensity, targetDensity, false); - if (mInsetS != UNDEFINED_INSET) { + if (mInsetS != INSET_UNDEFINED) { mInsetS = Drawable.scaleFromDensity(mInsetS, sourceDensity, targetDensity, false); } - if (mInsetE != UNDEFINED_INSET) { + if (mInsetE != INSET_UNDEFINED) { mInsetE = Drawable.scaleFromDensity(mInsetE, sourceDensity, targetDensity, false); } if (mWidth > 0) { diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index 2e3856fafb60..f7b38e33cae7 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -229,19 +229,25 @@ void FullPath::applyTrim() { // No trimming necessary. return; } + mTrimDirty = false; + mTrimmedSkPath.reset(); + if (mProperties.trimPathStart == mProperties.trimPathEnd) { + // Trimmed path should be empty. + return; + } SkPathMeasure measure(mSkPath, false); float len = SkScalarToFloat(measure.getLength()); float start = len * fmod((mProperties.trimPathStart + mProperties.trimPathOffset), 1.0f); float end = len * fmod((mProperties.trimPathEnd + mProperties.trimPathOffset), 1.0f); - mTrimmedSkPath.reset(); if (start > end) { measure.getSegment(start, len, &mTrimmedSkPath, true); - measure.getSegment(0, end, &mTrimmedSkPath, true); + if (end > 0) { + measure.getSegment(0, end, &mTrimmedSkPath, true); + } } else { measure.getSegment(start, end, &mTrimmedSkPath, true); } - mTrimDirty = false; } REQUIRE_COMPATIBLE_LAYOUT(FullPath::Properties); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 69d44872d86e..d179171a320e 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; +import android.app.NotificationManager; import android.app.PendingIntent; import android.bluetooth.BluetoothDevice; import android.content.ComponentName; @@ -1004,6 +1005,9 @@ public class AudioManager { * according to user settings. * <p>This method has no effect if the device implements a fixed volume policy * as indicated by {@link #isVolumeFixed()}. + * * <p>From N onward, ringer mode adjustments that would toggle Do Not Disturb are not allowed + * unless the app has been granted Do Not Disturb Access. + * See {@link NotificationManager#isNotificationPolicyAccessGranted()}. * @param ringerMode The ringer mode, one of {@link #RINGER_MODE_NORMAL}, * {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}. * @see #getRingerMode() @@ -1025,6 +1029,9 @@ public class AudioManager { * Sets the volume index for a particular stream. * <p>This method has no effect if the device implements a fixed volume policy * as indicated by {@link #isVolumeFixed()}. + * <p>From N onward, volume adjustments that would toggle Do Not Disturb are not allowed unless + * the app has been granted Do Not Disturb Access. + * See {@link NotificationManager#isNotificationPolicyAccessGranted()}. * @param streamType The stream whose volume index should be set. * @param index The volume index to set. See * {@link #getStreamMaxVolume(int)} for the largest valid value. @@ -1069,6 +1076,9 @@ public class AudioManager { * <p> * This method has no effect if the device implements a fixed volume policy * as indicated by {@link #isVolumeFixed()}. + * <p>From N onward, stream mute changes that would toggle Do Not Disturb are not allowed unless + * the app has been granted Do Not Disturb Access. + * See {@link NotificationManager#isNotificationPolicyAccessGranted()}. * <p> * This method was deprecated in API level 22. Prior to API level 22 this * method had significantly different behavior and should be used carefully. diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index ce12e76b6588..1fc236a2a6d3 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -824,7 +824,13 @@ public class ExifInterface { } // Process JPEG input stream - getJpegAttributes(in); + try { + getJpegAttributes(in); + } catch (IOException e) { + // Ignore exceptions in order to keep the compatibility with the old versions of + // ExifInterface. + Log.w(TAG, "Invalid JPEG", e); + } if (DEBUG) { printAttributes(); @@ -1197,8 +1203,9 @@ public class ExifInterface { } bytesRead += 2; int length = dataInputStream.readUnsignedShort() - 2; - if (length < 0) + if (length < 0) { throw new IOException("Invalid length"); + } bytesRead += length; switch (marker) { case MARKER_APP1: { @@ -1221,6 +1228,9 @@ public class ExifInterface { if (length <= 0) { throw new IOException("Invalid exif"); } + if (DEBUG) { + Log.d(TAG, "readExifSegment with a byte array (length: " + length + ")"); + } byte[] bytes = new byte[length]; if (dataInputStream.read(bytes) != length) { throw new IOException("Invalid exif"); @@ -1309,8 +1319,9 @@ public class ExifInterface { case MARKER_APP1: { // Rewrite EXIF segment int length = dataInputStream.readUnsignedShort() - 2; - if (length < 0) + if (length < 0) { throw new IOException("Invalid length"); + } bytesRead += 2; int read; while ((read = dataInputStream.read( @@ -1331,8 +1342,9 @@ public class ExifInterface { // Copy JPEG segment int length = dataInputStream.readUnsignedShort(); dataOutputStream.writeUnsignedShort(length); - if (length < 0) + if (length < 0) { throw new IOException("Invalid length"); + } length -= 2; bytesRead += 2; int read; @@ -1385,8 +1397,9 @@ public class ExifInterface { } firstIfdOffset -= 8; if (firstIfdOffset > 0) { - if (dataInputStream.skip(firstIfdOffset) != firstIfdOffset) + if (dataInputStream.skip(firstIfdOffset) != firstIfdOffset) { throw new IOException("Couldn't jump to first Ifd: " + firstIfdOffset); + } } // Read primary image TIFF image file directory. @@ -1582,8 +1595,16 @@ public class ExifInterface { // Reads image file directory, which is a tag group in EXIF. private void readImageFileDirectory(ByteOrderAwarenessDataInputStream dataInputStream, int hint) throws IOException { + if (dataInputStream.peek() + 2 > dataInputStream.mLength) { + // Return if there is no data from the offset. + return; + } // See JEITA CP-3451 Figure 5. page 9. short numberOfDirectoryEntry = dataInputStream.readShort(); + if (dataInputStream.peek() + 12 * numberOfDirectoryEntry > dataInputStream.mLength) { + // Return if the size of entries is too big. + return; + } if (DEBUG) { Log.d(TAG, "numberOfDirectoryEntry: " + numberOfDirectoryEntry); @@ -1595,10 +1616,25 @@ public class ExifInterface { int numberOfComponents = dataInputStream.readInt(); long nextEntryOffset = dataInputStream.peek() + 4; // next four bytes is for data // offset or value. + // Look up a corresponding tag from tag number + String tagName = (String) sExifTagMapsForReading[hint].get(tagNumber); if (DEBUG) { - Log.d(TAG, String.format("tagNumber: %d, dataFormat: %d, numberOfComponents: %d", - tagNumber, dataFormat, numberOfComponents)); + Log.d(TAG, String.format("hint: %d, tagNumber: %d, tagName: %s, dataFormat: %d," + + "numberOfComponents: %d", hint, tagNumber, tagName, dataFormat, + numberOfComponents)); + } + + if (tagName == null || dataFormat <= 0 || + dataFormat >= IFD_FORMAT_BYTES_PER_FORMAT.length) { + // Skip if the parsed tag number is not defined or invalid data format. + if (tagName == null) { + Log.w(TAG, "Skip the tag entry since tag number is not defined: " + tagNumber); + } else { + Log.w(TAG, "Skip the tag entry since data format is invalid: " + dataFormat); + } + dataInputStream.seek(nextEntryOffset); + continue; } // Read a value from data field or seek to the value offset which is stored in data @@ -1609,19 +1645,21 @@ public class ExifInterface { if (DEBUG) { Log.d(TAG, "seek to data offset: " + offset); } - dataInputStream.seek(offset); - } - - // Look up a corresponding tag from tag number - String tagName = (String) sExifTagMapsForReading[hint].get(tagNumber); - // Skip if the parsed tag number is not defined. - if (tagName == null) { - dataInputStream.seek(nextEntryOffset); - continue; + if (offset + byteCount <= dataInputStream.mLength) { + dataInputStream.seek(offset); + } else { + // Skip if invalid data offset. + Log.w(TAG, "Skip the tag entry since data offset is invalid: " + offset); + dataInputStream.seek(nextEntryOffset); + continue; + } } // Recursively parse IFD when a IFD pointer tag appears. int innerIfdHint = getIfdHintFromTagNumber(tagNumber); + if (DEBUG) { + Log.d(TAG, "innerIfdHint: " + innerIfdHint + " byteCount: " + byteCount); + } if (innerIfdHint >= 0) { long offset = -1L; // Get offset from data field @@ -1650,9 +1688,11 @@ public class ExifInterface { if (DEBUG) { Log.d(TAG, String.format("Offset: %d, tagName: %s", offset, tagName)); } - if (offset > 0L) { + if (offset > 0L && offset < dataInputStream.mLength) { dataInputStream.seek(offset); readImageFileDirectory(dataInputStream, innerIfdHint); + } else { + Log.w(TAG, "Skip jump into the IFD since its offset is invalid: " + offset); } dataInputStream.seek(nextEntryOffset); @@ -1683,14 +1723,17 @@ public class ExifInterface { } } - long nextIfdOffset = dataInputStream.readUnsignedInt(); - if (DEBUG) { - Log.d(TAG, String.format("nextIfdOffset: %d", nextIfdOffset)); - } - // The next IFD offset needs to be bigger than 8 since the first IFD offset is at least 8. - if (nextIfdOffset > 8) { - dataInputStream.seek(nextIfdOffset); - readImageFileDirectory(dataInputStream, IFD_THUMBNAIL_HINT); + if (dataInputStream.peek() + 4 <= dataInputStream.mLength) { + long nextIfdOffset = dataInputStream.readUnsignedInt(); + if (DEBUG) { + Log.d(TAG, String.format("nextIfdOffset: %d", nextIfdOffset)); + } + // The next IFD offset needs to be bigger than 8 + // since the first IFD offset is at least 8. + if (nextIfdOffset > 8 && nextIfdOffset < dataInputStream.mLength) { + dataInputStream.seek(nextIfdOffset); + readImageFileDirectory(dataInputStream, IFD_THUMBNAIL_HINT); + } } } @@ -1748,17 +1791,18 @@ public class ExifInterface { } StringBuilder stringBuilder = new StringBuilder(); - while (true) { + while (index < numberOfComponents) { int ch = bytes[index]; - if (ch == 0) + if (ch == 0) { break; - if (ch >= 32) + } + if (ch >= 32) { stringBuilder.append((char) ch); - else + } + else { stringBuilder.append('?'); + } ++index; - if (index == numberOfComponents) - break; } return stringBuilder.toString(); } @@ -1772,8 +1816,9 @@ public class ExifInterface { // Gets the corresponding IFD group index of the given tag number for writing Exif Tags. private static int getIfdHintFromTagNumber(int tagNumber) { for (int i = 0; i < IFD_POINTER_TAG_HINTS.length; ++i) { - if (IFD_POINTER_TAGS[i].number == tagNumber) + if (IFD_POINTER_TAGS[i].number == tagNumber) { return IFD_POINTER_TAG_HINTS[i]; + } } return -1; } @@ -2076,8 +2121,9 @@ public class ExifInterface { public void seek(long byteCount) throws IOException { mPosition = 0L; reset(); - if (skip(byteCount) != byteCount) + if (skip(byteCount) != byteCount) { throw new IOException("Couldn't seek up to the byteCount"); + } } public long peek() { @@ -2086,8 +2132,9 @@ public class ExifInterface { public void readFully(byte[] buffer) throws IOException { mPosition += buffer.length; - if (mPosition > mLength) + if (mPosition > mLength) { throw new EOFException(); + } if (super.read(buffer, 0, buffer.length) != buffer.length) { throw new IOException("Couldn't read up to the length of buffer"); } @@ -2095,22 +2142,26 @@ public class ExifInterface { public byte readByte() throws IOException { ++mPosition; - if (mPosition > mLength) + if (mPosition > mLength) { throw new EOFException(); + } int ch = super.read(); - if (ch < 0) + if (ch < 0) { throw new EOFException(); + } return (byte) ch; } public short readShort() throws IOException { mPosition += 2; - if (mPosition > mLength) + if (mPosition > mLength) { throw new EOFException(); + } int ch1 = super.read(); int ch2 = super.read(); - if ((ch1 | ch2) < 0) + if ((ch1 | ch2) < 0) { throw new EOFException(); + } if (mByteOrder == LITTLE_ENDIAN) { return (short) ((ch2 << 8) + (ch1)); } else if (mByteOrder == BIG_ENDIAN) { @@ -2121,14 +2172,16 @@ public class ExifInterface { public int readInt() throws IOException { mPosition += 4; - if (mPosition > mLength) + if (mPosition > mLength) { throw new EOFException(); + } int ch1 = super.read(); int ch2 = super.read(); int ch3 = super.read(); int ch4 = super.read(); - if ((ch1 | ch2 | ch3 | ch4) < 0) + if ((ch1 | ch2 | ch3 | ch4) < 0) { throw new EOFException(); + } if (mByteOrder == LITTLE_ENDIAN) { return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + ch1); } else if (mByteOrder == BIG_ENDIAN) { @@ -2146,12 +2199,14 @@ public class ExifInterface { public int readUnsignedShort() throws IOException { mPosition += 2; - if (mPosition > mLength) + if (mPosition > mLength) { throw new EOFException(); + } int ch1 = super.read(); int ch2 = super.read(); - if ((ch1 | ch2) < 0) + if ((ch1 | ch2) < 0) { throw new EOFException(); + } if (mByteOrder == LITTLE_ENDIAN) { return ((ch2 << 8) + (ch1)); } else if (mByteOrder == BIG_ENDIAN) { @@ -2166,8 +2221,9 @@ public class ExifInterface { public long readLong() throws IOException { mPosition += 8; - if (mPosition > mLength) + if (mPosition > mLength) { throw new EOFException(); + } int ch1 = super.read(); int ch2 = super.read(); int ch3 = super.read(); @@ -2176,8 +2232,9 @@ public class ExifInterface { int ch6 = super.read(); int ch7 = super.read(); int ch8 = super.read(); - if ((ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7 | ch8) < 0) + if ((ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7 | ch8) < 0) { throw new EOFException(); + } if (mByteOrder == LITTLE_ENDIAN) { return (((long) ch8 << 56) + ((long) ch7 << 48) + ((long) ch6 << 40) + ((long) ch5 << 32) + ((long) ch4 << 24) + ((long) ch3 << 16) diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index db0c5bbf42d8..2650ee0ee3b3 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -1070,16 +1070,15 @@ public final class MediaDrm { * A CryptoSession is obtained using {@link #getCryptoSession} */ public final class CryptoSession { - private MediaDrm mDrm; private byte[] mSessionId; - CryptoSession(@NonNull MediaDrm drm, @NonNull byte[] sessionId, - @NonNull String cipherAlgorithm, @NonNull String macAlgorithm) + CryptoSession(@NonNull byte[] sessionId, + @NonNull String cipherAlgorithm, + @NonNull String macAlgorithm) { mSessionId = sessionId; - mDrm = drm; - setCipherAlgorithmNative(drm, sessionId, cipherAlgorithm); - setMacAlgorithmNative(drm, sessionId, macAlgorithm); + setCipherAlgorithmNative(MediaDrm.this, sessionId, cipherAlgorithm); + setMacAlgorithmNative(MediaDrm.this, sessionId, macAlgorithm); } /** @@ -1092,7 +1091,7 @@ public final class MediaDrm { @NonNull public byte[] encrypt( @NonNull byte[] keyid, @NonNull byte[] input, @NonNull byte[] iv) { - return encryptNative(mDrm, mSessionId, keyid, input, iv); + return encryptNative(MediaDrm.this, mSessionId, keyid, input, iv); } /** @@ -1105,7 +1104,7 @@ public final class MediaDrm { @NonNull public byte[] decrypt( @NonNull byte[] keyid, @NonNull byte[] input, @NonNull byte[] iv) { - return decryptNative(mDrm, mSessionId, keyid, input, iv); + return decryptNative(MediaDrm.this, mSessionId, keyid, input, iv); } /** @@ -1116,7 +1115,7 @@ public final class MediaDrm { */ @NonNull public byte[] sign(@NonNull byte[] keyid, @NonNull byte[] message) { - return signNative(mDrm, mSessionId, keyid, message); + return signNative(MediaDrm.this, mSessionId, keyid, message); } /** @@ -1130,7 +1129,7 @@ public final class MediaDrm { */ public boolean verify( @NonNull byte[] keyid, @NonNull byte[] message, @NonNull byte[] signature) { - return verifyNative(mDrm, mSessionId, keyid, message, signature); + return verifyNative(MediaDrm.this, mSessionId, keyid, message, signature); } }; @@ -1158,7 +1157,7 @@ public final class MediaDrm { @NonNull byte[] sessionId, @NonNull String cipherAlgorithm, @NonNull String macAlgorithm) { - return new CryptoSession(this, sessionId, cipherAlgorithm, macAlgorithm); + return new CryptoSession(sessionId, cipherAlgorithm, macAlgorithm); } /** diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 0b0306c2c4fa..89e45772981c 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -19,6 +19,7 @@ package android.media.tv; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.graphics.Rect; import android.media.PlaybackParams; @@ -1241,6 +1242,7 @@ public final class TvInputManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void setParentalControlsEnabled(boolean enabled) { try { mService.setParentalControlsEnabled(enabled, mUserId); @@ -1292,6 +1294,7 @@ public final class TvInputManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void addBlockedRating(@NonNull TvContentRating rating) { Preconditions.checkNotNull(rating); try { @@ -1310,6 +1313,7 @@ public final class TvInputManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void removeBlockedRating(@NonNull TvContentRating rating) { Preconditions.checkNotNull(rating); try { @@ -1444,6 +1448,7 @@ public final class TvInputManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public List<TvInputHardwareInfo> getHardwareList() { try { return mService.getHardwareList(); @@ -1462,6 +1467,7 @@ public final class TvInputManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public Hardware acquireTvInputHardware(int deviceId, final HardwareCallback callback, TvInputInfo info) { try { @@ -1488,6 +1494,7 @@ public final class TvInputManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public void releaseTvInputHardware(int deviceId, Hardware hardware) { try { mService.releaseTvInputHardware(deviceId, hardware.getInterface(), mUserId); diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index bc20c1790de2..88be68609597 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -904,9 +904,7 @@ public abstract class TvInputService extends Service { * i.e. prefixed with a package name you own, so that different developers will * not create conflicting commands. * @param data Any data to include with the command. - * @hide */ - @SystemApi public void onAppPrivateCommand(@NonNull String action, Bundle data) { } @@ -1755,9 +1753,7 @@ public abstract class TvInputService extends Service { * i.e. prefixed with a package name you own, so that different developers will * not create conflicting commands. * @param data Any data to include with the command. - * @hide */ - @SystemApi public void onAppPrivateCommand(@NonNull String action, Bundle data) { } diff --git a/media/java/android/media/tv/TvRecordingClient.java b/media/java/android/media/tv/TvRecordingClient.java index d48ea21e07d9..da1002d650e7 100644 --- a/media/java/android/media/tv/TvRecordingClient.java +++ b/media/java/android/media/tv/TvRecordingClient.java @@ -200,16 +200,14 @@ public class TvRecordingClient { } /** - * Calls {@link TvInputService.RecordingSession#appPrivateCommand(String, Bundle)} for the - * current recording session. + * Sends a private command to the underlying TV input. This can be used to provide + * domain-specific features that are only known between certain clients and their TV inputs. * * @param action The name of the private command to send. This <em>must</em> be a scoped name, * i.e. prefixed with a package name you own, so that different developers will not * create conflicting commands. * @param data An optional bundle to send with the command. - * @hide */ - @SystemApi public void sendAppPrivateCommand(@NonNull String action, Bundle data) { if (TextUtils.isEmpty(action)) { throw new IllegalArgumentException("action cannot be null or an empty string"); diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java index 96230769762c..6ca6193cb0be 100644 --- a/media/java/android/media/tv/TvView.java +++ b/media/java/android/media/tv/TvView.java @@ -293,7 +293,7 @@ public class TvView extends ViewGroup { /** * Tunes to a given channel. This can be used to provide domain-specific features that are only - * known between certain TvView applications and their TV inputs. + * known between certain clients and their TV inputs. * * @param inputId The ID of TV input for the given channel. * @param channelUri The URI of a channel. @@ -550,16 +550,14 @@ public class TvView extends ViewGroup { } /** - * Calls {@link TvInputService.Session#onAppPrivateCommand(String, Bundle)} for the current - * session. + * Sends a private command to the underlying TV input. This can be used to provide + * domain-specific features that are only known between certain clients and their TV inputs. * * @param action The name of the private command to send. This <em>must</em> be a scoped name, * i.e. prefixed with a package name you own, so that different developers will not * create conflicting commands. * @param data An optional bundle to send with the command. - * @hide */ - @SystemApi public void sendAppPrivateCommand(@NonNull String action, Bundle data) { if (TextUtils.isEmpty(action)) { throw new IllegalArgumentException("action cannot be null or an empty string"); diff --git a/media/jni/android_media_Utils.cpp b/media/jni/android_media_Utils.cpp index 12833f4b357c..62685c94453c 100644 --- a/media/jni/android_media_Utils.cpp +++ b/media/jni/android_media_Utils.cpp @@ -307,6 +307,11 @@ status_t ConvertMessageToMap( AMessage::Type valueType; const char *key = msg->getEntryNameAt(i, &valueType); + if (!strncmp(key, "android._", 9)) { + // don't expose private keys (starting with android._) + continue; + } + jobject valueObj = NULL; switch (valueType) { @@ -460,6 +465,11 @@ status_t ConvertKeyValueArraysToMessage( env->ReleaseStringUTFChars((jstring)keyObj, tmp); tmp = NULL; + if (key.startsWith("android._")) { + // don't propagate private keys (starting with android._) + continue; + } + jobject valueObj = env->GetObjectArrayElement(values, i); if (env->IsInstanceOf(valueObj, stringClass.get())) { diff --git a/packages/DocumentsUI/res/layout/dialog_open_scoped_directory.xml b/packages/DocumentsUI/res/layout/dialog_open_scoped_directory.xml new file mode 100644 index 000000000000..bfb027149333 --- /dev/null +++ b/packages/DocumentsUI/res/layout/dialog_open_scoped_directory.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:theme="@style/Theme.AppCompat.Light.Dialog.Alert" + android:orientation="vertical" + android:paddingEnd="24dp" + android:paddingStart="24dp" > + + <TextView + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/message" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingEnd="24dp" + android:paddingStart="32dp" + android:paddingTop="24dp"> + </TextView> + + <CheckBox + android:id="@+id/do_not_ask_checkbox" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dip" + android:text="@string/never_ask_again" + android:textColor="?android:attr/textColorSecondary" + android:visibility="gone" /> +</LinearLayout>
\ No newline at end of file diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml index 6fff804f12dc..17e2c31aa6fb 100644 --- a/packages/DocumentsUI/res/values-af/strings.xml +++ b/packages/DocumentsUI/res/values-af/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Hernoem"</string> <string name="rename_error" msgid="4203041674883412606">"Kon nie dokument hernoem nie"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sommige lêers is omgeskakel"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Laat toe"</string> <string name="deny" msgid="2081879885755434506">"Weier"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml index c61db57b42ad..0cb68de1b21e 100644 --- a/packages/DocumentsUI/res/values-am/strings.xml +++ b/packages/DocumentsUI/res/values-am/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"እንደገና ሰይም"</string> <string name="rename_error" msgid="4203041674883412606">"ሰነዱን ዳግም መሰየም አልተሳካም"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"አንዳንድ ፋይሎች ተለውጠዋል"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"ይፍቀዱ"</string> <string name="deny" msgid="2081879885755434506">"ያስተባብሉ"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ar/strings.xml b/packages/DocumentsUI/res/values-ar/strings.xml index dcfef2ac6534..4a30257754b4 100644 --- a/packages/DocumentsUI/res/values-ar/strings.xml +++ b/packages/DocumentsUI/res/values-ar/strings.xml @@ -138,6 +138,10 @@ <string name="menu_rename" msgid="7678802479104285353">"إعادة تسمية"</string> <string name="rename_error" msgid="4203041674883412606">"أخفقت إعادة تسمية المستند."</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"تم تحويل بعض الملفات"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"السماح"</string> <string name="deny" msgid="2081879885755434506">"رفض"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-az-rAZ/strings.xml b/packages/DocumentsUI/res/values-az-rAZ/strings.xml index e1505f8531cf..b4326803975f 100644 --- a/packages/DocumentsUI/res/values-az-rAZ/strings.xml +++ b/packages/DocumentsUI/res/values-az-rAZ/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Adını dəyişdirin"</string> <string name="rename_error" msgid="4203041674883412606">"Sənəd adını dəyişmək uğursuz oldu"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Bəzi fayllar konvertasiya edilib"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"İcazə verin"</string> <string name="deny" msgid="2081879885755434506">"Rədd et"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml index b884a19a8c38..3e365036ed8c 100644 --- a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml +++ b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml @@ -117,6 +117,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Preimenuj"</string> <string name="rename_error" msgid="4203041674883412606">"Preimenovanje dokumenta nije uspelo"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Neke datoteke su konvertovane"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Dozvoli"</string> <string name="deny" msgid="2081879885755434506">"Odbij"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml index 94c34bdb93ae..a1ac5c95eeac 100644 --- a/packages/DocumentsUI/res/values-bg/strings.xml +++ b/packages/DocumentsUI/res/values-bg/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Преименуване"</string> <string name="rename_error" msgid="4203041674883412606">"Преименуването на документа не бе успешно"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Някои файлове бяха преобразувани"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Разрешаване"</string> <string name="deny" msgid="2081879885755434506">"Отказване"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-bn-rBD/strings.xml b/packages/DocumentsUI/res/values-bn-rBD/strings.xml index 215904429482..7b881949d062 100644 --- a/packages/DocumentsUI/res/values-bn-rBD/strings.xml +++ b/packages/DocumentsUI/res/values-bn-rBD/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"পুনঃনামকরণ"</string> <string name="rename_error" msgid="4203041674883412606">"দস্তাবেজের পুনঃনামকরণ ব্যর্থ হয়েছে৷"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"কিছু ফাইল রূপান্তরিত হয়েছে"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"অনুমতি দিন"</string> <string name="deny" msgid="2081879885755434506">"আস্বীকার করুন"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-bs-rBA/strings.xml b/packages/DocumentsUI/res/values-bs-rBA/strings.xml index f366ce8cf9d2..9daa80affdc8 100644 --- a/packages/DocumentsUI/res/values-bs-rBA/strings.xml +++ b/packages/DocumentsUI/res/values-bs-rBA/strings.xml @@ -117,6 +117,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Preimenuj"</string> <string name="rename_error" msgid="4203041674883412606">"Nije uspjelo preimenovanje dokumenta"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Neke od datoteka su pretvorene"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Dozvoli"</string> <string name="deny" msgid="2081879885755434506">"Odbijte"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml index 5af86b122a72..b7d887e64f1f 100644 --- a/packages/DocumentsUI/res/values-ca/strings.xml +++ b/packages/DocumentsUI/res/values-ca/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Canvia el nom"</string> <string name="rename_error" msgid="4203041674883412606">"No s\'ha pogut canviar el nom del document"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"S\'han convertit alguns fitxers"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Permet"</string> <string name="deny" msgid="2081879885755434506">"Denega"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml index 4e8b4403433a..d58615d2dbd4 100644 --- a/packages/DocumentsUI/res/values-cs/strings.xml +++ b/packages/DocumentsUI/res/values-cs/strings.xml @@ -124,6 +124,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Přejmenovat"</string> <string name="rename_error" msgid="4203041674883412606">"Dokument se nepodařilo přejmenovat."</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Některé soubory byly převedeny"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Povolit"</string> <string name="deny" msgid="2081879885755434506">"Odepřít"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml index ee5ba49a5426..99338f6c9d85 100644 --- a/packages/DocumentsUI/res/values-da/strings.xml +++ b/packages/DocumentsUI/res/values-da/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Omdøb"</string> <string name="rename_error" msgid="4203041674883412606">"Dokumentet kunne ikke omdøbes"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Nogle filer er konverteret"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Tillad"</string> <string name="deny" msgid="2081879885755434506">"Afvis"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml index a42e9554acd2..373b05825d8a 100644 --- a/packages/DocumentsUI/res/values-de/strings.xml +++ b/packages/DocumentsUI/res/values-de/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Umbenennen"</string> <string name="rename_error" msgid="4203041674883412606">"Dokument konnte nicht umbenannt werden"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Einige Dateien wurden konvertiert"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Zulassen"</string> <string name="deny" msgid="2081879885755434506">"Ablehnen"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml index e6839de1455f..539a7c632ad8 100644 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ b/packages/DocumentsUI/res/values-el/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Μετονομασία"</string> <string name="rename_error" msgid="4203041674883412606">"Αποτυχία μετονομασίας εγγράφου"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Ορισμένα αρχεία μετατράπηκαν"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Να επιτρέπεται"</string> <string name="deny" msgid="2081879885755434506">"Άρνηση"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-en-rAU/strings.xml b/packages/DocumentsUI/res/values-en-rAU/strings.xml index 8b46660b2329..1693bdb7984e 100644 --- a/packages/DocumentsUI/res/values-en-rAU/strings.xml +++ b/packages/DocumentsUI/res/values-en-rAU/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"rename"</string> <string name="rename_error" msgid="4203041674883412606">"Failed to rename document"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Some files were converted"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Allow"</string> <string name="deny" msgid="2081879885755434506">"Deny"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-en-rGB/strings.xml b/packages/DocumentsUI/res/values-en-rGB/strings.xml index 8b46660b2329..1693bdb7984e 100644 --- a/packages/DocumentsUI/res/values-en-rGB/strings.xml +++ b/packages/DocumentsUI/res/values-en-rGB/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"rename"</string> <string name="rename_error" msgid="4203041674883412606">"Failed to rename document"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Some files were converted"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Allow"</string> <string name="deny" msgid="2081879885755434506">"Deny"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-en-rIN/strings.xml b/packages/DocumentsUI/res/values-en-rIN/strings.xml index 8b46660b2329..1693bdb7984e 100644 --- a/packages/DocumentsUI/res/values-en-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-en-rIN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"rename"</string> <string name="rename_error" msgid="4203041674883412606">"Failed to rename document"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Some files were converted"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Allow"</string> <string name="deny" msgid="2081879885755434506">"Deny"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml index 8fd8381d8f18..8ad0439f9561 100644 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Cambiar nombre"</string> <string name="rename_error" msgid="4203041674883412606">"No se pudo cambiar el nombre del documento"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Se convirtieron algunos archivos"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Denegar"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml index 81fc59abb936..c3a4648aedf5 100644 --- a/packages/DocumentsUI/res/values-es/strings.xml +++ b/packages/DocumentsUI/res/values-es/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Cambiar nombre"</string> <string name="rename_error" msgid="4203041674883412606">"Error al cambiar el nombre del documento"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Se han convertido algunos archivos"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Denegar"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml index 7cf134e3ebd7..76f1ef79291f 100644 --- a/packages/DocumentsUI/res/values-et-rEE/strings.xml +++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Nimeta ümber"</string> <string name="rename_error" msgid="4203041674883412606">"Dokumendi ümbernimetamine ebaõnnestus"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Mõned failid teisendati"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Luba"</string> <string name="deny" msgid="2081879885755434506">"Keela"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-eu-rES/strings.xml b/packages/DocumentsUI/res/values-eu-rES/strings.xml index 23e407912120..ea776576c5e7 100644 --- a/packages/DocumentsUI/res/values-eu-rES/strings.xml +++ b/packages/DocumentsUI/res/values-eu-rES/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Aldatu izena"</string> <string name="rename_error" msgid="4203041674883412606">"Ezin izan zaio aldatu izena dokumentuari"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Artxibo batzuk bihurtu dira"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Onartu"</string> <string name="deny" msgid="2081879885755434506">"Ukatu"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml index 6aa56263126c..4c2a34211314 100644 --- a/packages/DocumentsUI/res/values-fa/strings.xml +++ b/packages/DocumentsUI/res/values-fa/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"تغییر نام"</string> <string name="rename_error" msgid="4203041674883412606">"نام سند تغییر نکرد"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"بعضی از فایلها تبدیل شدند"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"ارزیابیشده"</string> <string name="deny" msgid="2081879885755434506">"اجازه ندارد"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml index 8be6d6115883..a586f7c60d8b 100644 --- a/packages/DocumentsUI/res/values-fi/strings.xml +++ b/packages/DocumentsUI/res/values-fi/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Nimeä uudelleen"</string> <string name="rename_error" msgid="4203041674883412606">"Dokumentin nimen muuttaminen epäonnistui."</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Joitakin tiedostoja muunnettiin."</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Salli"</string> <string name="deny" msgid="2081879885755434506">"Kiellä"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index 0a3357076722..cb3a1236b676 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Renommer"</string> <string name="rename_error" msgid="4203041674883412606">"Impossible de renommer le document"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Certains fichiers ont été convertis"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Autoriser"</string> <string name="deny" msgid="2081879885755434506">"Refuser"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml index 478ea46b83ca..0cbc14153c2e 100644 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ b/packages/DocumentsUI/res/values-fr/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Renommer"</string> <string name="rename_error" msgid="4203041674883412606">"Échec du changement de nom du document."</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Certains fichiers ont été convertis"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Autoriser"</string> <string name="deny" msgid="2081879885755434506">"Refuser"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-gl-rES/strings.xml b/packages/DocumentsUI/res/values-gl-rES/strings.xml index c933faaf082e..1f8ecadf6d8e 100644 --- a/packages/DocumentsUI/res/values-gl-rES/strings.xml +++ b/packages/DocumentsUI/res/values-gl-rES/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Cambiar nome"</string> <string name="rename_error" msgid="4203041674883412606">"Non se puido cambiar o nome do documento"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Convertéronse algúns ficheiros"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Rexeitar"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-gu-rIN/strings.xml b/packages/DocumentsUI/res/values-gu-rIN/strings.xml index e9fda199d091..7fc21b6bbf89 100644 --- a/packages/DocumentsUI/res/values-gu-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-gu-rIN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"નામ બદલો"</string> <string name="rename_error" msgid="4203041674883412606">"દસ્તાવેજનું નામ બદલવામાં નિષ્ફળ થયાં"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"કેટલીક ફાઇલો રૂપાંતરિત કરી હતી"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"મંજૂરી આપો"</string> <string name="deny" msgid="2081879885755434506">"નકારો"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-hi/strings.xml b/packages/DocumentsUI/res/values-hi/strings.xml index 489bb98d34e8..87dfb5fc8246 100644 --- a/packages/DocumentsUI/res/values-hi/strings.xml +++ b/packages/DocumentsUI/res/values-hi/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"नाम बदलें"</string> <string name="rename_error" msgid="4203041674883412606">"दस्तावेज़ का नाम बदलना विफल रहा"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"कुछ फ़ाइलें रूपांतरित हो गई थीं"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"अनुमति दें"</string> <string name="deny" msgid="2081879885755434506">"अस्वीकारें"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml index 51b8673a9a91..f86877e67c6f 100644 --- a/packages/DocumentsUI/res/values-hr/strings.xml +++ b/packages/DocumentsUI/res/values-hr/strings.xml @@ -117,6 +117,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Promijeni naziv"</string> <string name="rename_error" msgid="4203041674883412606">"Naziv dokumenta nije promijenjen"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Neke su datoteke konvertirane"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Dopusti"</string> <string name="deny" msgid="2081879885755434506">"Odbij"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml index b7e74e024a87..14662ad377b0 100644 --- a/packages/DocumentsUI/res/values-hu/strings.xml +++ b/packages/DocumentsUI/res/values-hu/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Átnevezés"</string> <string name="rename_error" msgid="4203041674883412606">"Nem sikerült átnevezni a dokumentumot"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Egyes fájlokat konvertált a rendszer"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Engedélyezés"</string> <string name="deny" msgid="2081879885755434506">"Elutasítás"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index 4dbae9de21bd..ecd7669c1d2a 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Վերանվանել"</string> <string name="rename_error" msgid="4203041674883412606">"Չհաջողվեց վերանվանել փաստաթուղթը"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Որոշ ֆայլեր փոխարկվել են"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Թույլատրել"</string> <string name="deny" msgid="2081879885755434506">"Մերժել"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml index 73ed8bcd1c8e..b27674e4d82b 100644 --- a/packages/DocumentsUI/res/values-in/strings.xml +++ b/packages/DocumentsUI/res/values-in/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Ganti nama"</string> <string name="rename_error" msgid="4203041674883412606">"Gagal mengganti nama dokumen"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Beberapa file dikonversi"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Izinkan"</string> <string name="deny" msgid="2081879885755434506">"Tolak"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-is-rIS/strings.xml b/packages/DocumentsUI/res/values-is-rIS/strings.xml index 75831ed055d9..f351cb807ae7 100644 --- a/packages/DocumentsUI/res/values-is-rIS/strings.xml +++ b/packages/DocumentsUI/res/values-is-rIS/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Endurnefna"</string> <string name="rename_error" msgid="4203041674883412606">"Ekki tókst að endurnefna skjalið"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sumum skrám var umbreytt"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Leyfa"</string> <string name="deny" msgid="2081879885755434506">"Hafna"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml index cfd5611f345e..3eb14c0ee6ee 100644 --- a/packages/DocumentsUI/res/values-it/strings.xml +++ b/packages/DocumentsUI/res/values-it/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Rinomina"</string> <string name="rename_error" msgid="4203041674883412606">"Ridenominazione documento non riuscita"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alcuni file sono stati convertiti"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Consenti"</string> <string name="deny" msgid="2081879885755434506">"Nega"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml index 7d4cb9e99ee0..3b0aef8a56e9 100644 --- a/packages/DocumentsUI/res/values-iw/strings.xml +++ b/packages/DocumentsUI/res/values-iw/strings.xml @@ -124,6 +124,10 @@ <string name="menu_rename" msgid="7678802479104285353">"שנה שם"</string> <string name="rename_error" msgid="4203041674883412606">"ניסיון שינוי שם המסמך נכשל"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"קבצים מסוימים הומרו"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"אפשר"</string> <string name="deny" msgid="2081879885755434506">"דחה"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml index 9618d36b363e..23b7ab67ee5b 100644 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ b/packages/DocumentsUI/res/values-ja/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"名前を変更"</string> <string name="rename_error" msgid="4203041674883412606">"ドキュメントの名前を変更できませんでした"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"一部のファイルが変換されました"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"許可"</string> <string name="deny" msgid="2081879885755434506">"拒否"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml index ac8d267009ff..fc36bdbc868e 100644 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"გადარქმევა"</string> <string name="rename_error" msgid="4203041674883412606">"დოკუმენტის გადარქმევა ვერ მოხერხდა"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ზოგიერთი ფაილი გარდაქმნილია"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"უფლების მიცემა"</string> <string name="deny" msgid="2081879885755434506">"აკრძალვა"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml index 759506b34939..101392d3ab99 100644 --- a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml +++ b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Атын өзгерту"</string> <string name="rename_error" msgid="4203041674883412606">"Құжат қайта аталмады"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Кейбір файлдар түрлендірілді"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Рұқсат беру"</string> <string name="deny" msgid="2081879885755434506">"Бас тарту"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-km-rKH/strings.xml b/packages/DocumentsUI/res/values-km-rKH/strings.xml index d83c1d391c5a..2ee35fe45fd7 100644 --- a/packages/DocumentsUI/res/values-km-rKH/strings.xml +++ b/packages/DocumentsUI/res/values-km-rKH/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"ប្ដូរឈ្មោះ"</string> <string name="rename_error" msgid="4203041674883412606">"បានបរាជ័យក្នុងការប្តូរឈ្មោះឯកសារ"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ឯកសារមួយចំនួនត្រូវបានបម្លែង"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"អនុញ្ញាត"</string> <string name="deny" msgid="2081879885755434506">"បដិសេធ"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-kn-rIN/strings.xml b/packages/DocumentsUI/res/values-kn-rIN/strings.xml index 57ddd0b5ebb3..b74d6a20431b 100644 --- a/packages/DocumentsUI/res/values-kn-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-kn-rIN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"ಮರುಹೆಸರಿಸು"</string> <string name="rename_error" msgid="4203041674883412606">"ಡಾಕ್ಯುಮೆಂಟ್ ಮರುಹೆಸರಿಸಲು ವಿಫಲವಾಗಿದೆ"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ಕೆಲವು ಫೈಲ್ಗಳನ್ನು ಪರಿವರ್ತಿಸಲಾಗಿದೆ"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"ಅನುಮತಿಸು"</string> <string name="deny" msgid="2081879885755434506">"ನಿರಾಕರಿಸು"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml index 907802df36b4..3c2da975504c 100644 --- a/packages/DocumentsUI/res/values-ko/strings.xml +++ b/packages/DocumentsUI/res/values-ko/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"이름 바꾸기"</string> <string name="rename_error" msgid="4203041674883412606">"문서 이름을 변경하지 못했습니다."</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"일부 파일이 변환되었습니다."</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"허용"</string> <string name="deny" msgid="2081879885755434506">"거부"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ky-rKG/strings.xml b/packages/DocumentsUI/res/values-ky-rKG/strings.xml index 699e76a277bd..865e717ced16 100644 --- a/packages/DocumentsUI/res/values-ky-rKG/strings.xml +++ b/packages/DocumentsUI/res/values-ky-rKG/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Аталышын өзгөртүү"</string> <string name="rename_error" msgid="4203041674883412606">"Документтин аталышы өзгөртүлбөй калды"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Айрым файлдардын форматы өзгөртүлдү"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Уруксат берүү"</string> <string name="deny" msgid="2081879885755434506">"Жок"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml index 468853b99a9c..4f4a3753995a 100644 --- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml +++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"ປ່ຽນຊື່"</string> <string name="rename_error" msgid="4203041674883412606">"ປ່ຽນຊື່ເອກະສານບໍ່ສຳເລັດ"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ປ່ຽນແປງບາງໄຟລ໌ແລ້ວ"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"ອະນຸຍາດ"</string> <string name="deny" msgid="2081879885755434506">"ປະຕິເສດ"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml index a6297bec65dd..fa653fc96392 100644 --- a/packages/DocumentsUI/res/values-lt/strings.xml +++ b/packages/DocumentsUI/res/values-lt/strings.xml @@ -124,6 +124,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Pervardyti"</string> <string name="rename_error" msgid="4203041674883412606">"Nepavyko pervardyti dokumento"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Kai kurie failai buvo konvertuoti"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Leisti"</string> <string name="deny" msgid="2081879885755434506">"Atmesti"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml index 1a9b77c065d7..8fd73e4dd412 100644 --- a/packages/DocumentsUI/res/values-lv/strings.xml +++ b/packages/DocumentsUI/res/values-lv/strings.xml @@ -117,6 +117,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Pārdēvēt"</string> <string name="rename_error" msgid="4203041674883412606">"Neizdevās pārdēvēt dokumentu"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Daži faili tika pārveidoti."</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Atļaut"</string> <string name="deny" msgid="2081879885755434506">"Noraidīt"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-mk-rMK/strings.xml b/packages/DocumentsUI/res/values-mk-rMK/strings.xml index 5bbf8c5d5ee9..12455da1e7f6 100644 --- a/packages/DocumentsUI/res/values-mk-rMK/strings.xml +++ b/packages/DocumentsUI/res/values-mk-rMK/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Преименувај"</string> <string name="rename_error" msgid="4203041674883412606">"Не успеа да се преименува документот"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Некои датотеки беа конвертирани"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Дозволи"</string> <string name="deny" msgid="2081879885755434506">"Одбиј"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ml-rIN/strings.xml b/packages/DocumentsUI/res/values-ml-rIN/strings.xml index 264d196df594..0c0420d568fa 100644 --- a/packages/DocumentsUI/res/values-ml-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-ml-rIN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"പേരുമാറ്റുക"</string> <string name="rename_error" msgid="4203041674883412606">"ഡോക്യുമെന്റിന്റെ പേരുമാറ്റുന്നത് പരാജയപ്പെട്ടു"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ചില ഫയലുകൾ പരിവർത്തനം ചെയ്യപ്പെട്ടു"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"അനുവദിക്കുക"</string> <string name="deny" msgid="2081879885755434506">"നിരസിക്കുക"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml index 02c818b66590..2af8556ebd39 100644 --- a/packages/DocumentsUI/res/values-mn-rMN/strings.xml +++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Нэр өөрчлөх"</string> <string name="rename_error" msgid="4203041674883412606">"Баримт бичгийн нэрийн өөрчилж чадсангүй"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Зарим файлыг хөрвүүлсэн"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Зөвшөөрөх"</string> <string name="deny" msgid="2081879885755434506">"Татгалзах"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-mr-rIN/strings.xml b/packages/DocumentsUI/res/values-mr-rIN/strings.xml index 6fae5787212e..6256a9954380 100644 --- a/packages/DocumentsUI/res/values-mr-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-mr-rIN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"पुनर्नामित करा"</string> <string name="rename_error" msgid="4203041674883412606">"दस्तऐवज पुनर्नामित करण्यात अयशस्वी झाले"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"काही फायली रूपांतरित केल्या होत्या"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"अनुमती द्या"</string> <string name="deny" msgid="2081879885755434506">"नकार द्या"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml index 6f7c5256c8a2..df896a20bb99 100644 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Namakan semula"</string> <string name="rename_error" msgid="4203041674883412606">"Gagal menamakan semula dokumen"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sesetengah fail telah ditukarkan"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Benarkan"</string> <string name="deny" msgid="2081879885755434506">"Nafi"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-my-rMM/strings.xml b/packages/DocumentsUI/res/values-my-rMM/strings.xml index 9fb7f84cbdd7..14193b22f346 100644 --- a/packages/DocumentsUI/res/values-my-rMM/strings.xml +++ b/packages/DocumentsUI/res/values-my-rMM/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"အမည်ပြောင်းရန်"</string> <string name="rename_error" msgid="4203041674883412606">"စာရွက်စာတမ်းကို အမည်ပြောင်းခြင်း မအောင်မြင်ပါ"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"အချို့ဖိုင်များကို ပြောင်းလဲထားသည်"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"ခွင့်ပြုသည်"</string> <string name="deny" msgid="2081879885755434506">"ငြင်းပယ်သည်"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml index 0e48f0f29360..7d37078e11d1 100644 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ b/packages/DocumentsUI/res/values-nb/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Gi nytt navn"</string> <string name="rename_error" msgid="4203041674883412606">"Kunne ikke gi dokumentet nytt navn"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Noen filer er konvertert"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Tillat"</string> <string name="deny" msgid="2081879885755434506">"Avslå"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ne-rNP/strings.xml b/packages/DocumentsUI/res/values-ne-rNP/strings.xml index cc70c91d36f8..5a06cd266f17 100644 --- a/packages/DocumentsUI/res/values-ne-rNP/strings.xml +++ b/packages/DocumentsUI/res/values-ne-rNP/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"पुन: नामाकरण गर्नुहोस्"</string> <string name="rename_error" msgid="4203041674883412606">"कागजात पुन: नामाकरण गर्न असफल भयो"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"केही फाइलहरू परिवर्तन गरिएका थिए"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"अनुमति दिनुहोस्"</string> <string name="deny" msgid="2081879885755434506">"अस्वीकार गर्नुहोस्"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml index ebddf54cc27c..0e022af1ba2d 100644 --- a/packages/DocumentsUI/res/values-nl/strings.xml +++ b/packages/DocumentsUI/res/values-nl/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Naam wijzigen"</string> <string name="rename_error" msgid="4203041674883412606">"Kan naam van document niet wijzigen"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sommige bestanden zijn geconverteerd"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Toestaan"</string> <string name="deny" msgid="2081879885755434506">"Weigeren"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-pa-rIN/strings.xml b/packages/DocumentsUI/res/values-pa-rIN/strings.xml index a8c65e74e6ba..4cfe638860b6 100644 --- a/packages/DocumentsUI/res/values-pa-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-pa-rIN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"ਮੁੜ-ਨਾਮਕਰਨ ਕਰੋ"</string> <string name="rename_error" msgid="4203041674883412606">"ਦਸਤਾਵੇਜ਼ ਦਾ ਮੁੜ-ਨਾਮਕਰਨ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ਕੁਝ ਫ਼ਾਈਲਾਂ ਤਬਦੀਲ ਕੀਤੀਆਂ ਗਈਆਂ ਸਨ"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"ਆਗਿਆ ਦਿਓ"</string> <string name="deny" msgid="2081879885755434506">"ਅਸਵੀਕਾਰ ਕਰੋ"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml index e888fd7b4482..b10d8a25152c 100644 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ b/packages/DocumentsUI/res/values-pl/strings.xml @@ -124,6 +124,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Zmień nazwę"</string> <string name="rename_error" msgid="4203041674883412606">"Nie udało się zmienić nazwy dokumentu"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Niektóre pliki zostały przekonwertowane"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Zezwól"</string> <string name="deny" msgid="2081879885755434506">"Odmów"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-pt-rBR/strings.xml b/packages/DocumentsUI/res/values-pt-rBR/strings.xml index 213e76a5ed7d..26ec421e21b8 100644 --- a/packages/DocumentsUI/res/values-pt-rBR/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rBR/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Renomear"</string> <string name="rename_error" msgid="4203041674883412606">"Falha ao renomear documento"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns arquivos foram convertidos"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Negar"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml index 2c74e6776e1b..490c4d71e75c 100644 --- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Mudar o nome"</string> <string name="rename_error" msgid="4203041674883412606">"Falha ao mudar o nome do documento"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns ficheiros foram convertidos"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Recusar"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml index 213e76a5ed7d..26ec421e21b8 100644 --- a/packages/DocumentsUI/res/values-pt/strings.xml +++ b/packages/DocumentsUI/res/values-pt/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Renomear"</string> <string name="rename_error" msgid="4203041674883412606">"Falha ao renomear documento"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns arquivos foram convertidos"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Permitir"</string> <string name="deny" msgid="2081879885755434506">"Negar"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index e57d1ab47e32..ef34f3a20097 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -117,6 +117,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Redenumiți"</string> <string name="rename_error" msgid="4203041674883412606">"Documentul nu a putut fi redenumit"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Unele fișiere au fost convertite"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Permiteți"</string> <string name="deny" msgid="2081879885755434506">"Refuzați"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml index 9c0f03140eac..b94b2a5e7cdf 100644 --- a/packages/DocumentsUI/res/values-ru/strings.xml +++ b/packages/DocumentsUI/res/values-ru/strings.xml @@ -124,6 +124,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Переименовать"</string> <string name="rename_error" msgid="4203041674883412606">"Не удалось переименовать документ"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Формат некоторых файлов изменен"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Разрешить"</string> <string name="deny" msgid="2081879885755434506">"Отклонить"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml index a34aa88dc692..a0d764e336b9 100644 --- a/packages/DocumentsUI/res/values-si-rLK/strings.xml +++ b/packages/DocumentsUI/res/values-si-rLK/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"යළි නම් කරන්න"</string> <string name="rename_error" msgid="4203041674883412606">"ලේඛනය යළි නම් කිරීම අසාර්ථක විය"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"සමහර ගොනු පරිවර්තනය කරන ලදී"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"අවසර දෙන්න"</string> <string name="deny" msgid="2081879885755434506">"ප්රතික්ෂේප කරන්න"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml index 113381511ff6..06b7a10b482a 100644 --- a/packages/DocumentsUI/res/values-sk/strings.xml +++ b/packages/DocumentsUI/res/values-sk/strings.xml @@ -124,6 +124,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Premenovať"</string> <string name="rename_error" msgid="4203041674883412606">"Premenovanie dokumentu zlyhalo"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Niektoré súbory boli konvertované"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Povoliť"</string> <string name="deny" msgid="2081879885755434506">"Zamietnuť"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml index f2c691dfebc2..ee7bdc9aec91 100644 --- a/packages/DocumentsUI/res/values-sl/strings.xml +++ b/packages/DocumentsUI/res/values-sl/strings.xml @@ -124,6 +124,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Preimenuj"</string> <string name="rename_error" msgid="4203041674883412606">"Dokumenta ni bilo mogoče preimenovati"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Nekatere datoteke so bile pretvorjene"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Dovoli"</string> <string name="deny" msgid="2081879885755434506">"Zavrni"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-sq-rAL/strings.xml b/packages/DocumentsUI/res/values-sq-rAL/strings.xml index 80ae0007af2f..352da58dda7b 100644 --- a/packages/DocumentsUI/res/values-sq-rAL/strings.xml +++ b/packages/DocumentsUI/res/values-sq-rAL/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Riemërto"</string> <string name="rename_error" msgid="4203041674883412606">"Riemërtimi i dokumentit dështoi"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Disa skedarë u konvertuan"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Lejo"</string> <string name="deny" msgid="2081879885755434506">"Moho"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index be96db60e581..0ba3da1f8c30 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -117,6 +117,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Преименуј"</string> <string name="rename_error" msgid="4203041674883412606">"Преименовање документа није успело"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Неке датотеке су конвертоване"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Дозволи"</string> <string name="deny" msgid="2081879885755434506">"Одбиј"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml index 7fd4be072d8b..081c331e2ea7 100644 --- a/packages/DocumentsUI/res/values-sv/strings.xml +++ b/packages/DocumentsUI/res/values-sv/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Byt namn"</string> <string name="rename_error" msgid="4203041674883412606">"Det gick inte att byta namn på dokumentet"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Vissa filer konverterades"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Tillåt"</string> <string name="deny" msgid="2081879885755434506">"Neka"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml index 2730ce9b6c7d..fc4d555208e2 100644 --- a/packages/DocumentsUI/res/values-sw/strings.xml +++ b/packages/DocumentsUI/res/values-sw/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Badilisha jina"</string> <string name="rename_error" msgid="4203041674883412606">"Imeshindwa kubadilisha jina la hati"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Baadhi ya faili zimebadilishwa muundo"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Ruhusu"</string> <string name="deny" msgid="2081879885755434506">"Kataza"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ta-rIN/strings.xml b/packages/DocumentsUI/res/values-ta-rIN/strings.xml index 881e05a8305a..30bdc9dd588e 100644 --- a/packages/DocumentsUI/res/values-ta-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-ta-rIN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"மறுபெயரிடு"</string> <string name="rename_error" msgid="4203041674883412606">"ஆவணத்திற்கு மறுபெயரிடுவதில் தோல்வி"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"சில கோப்புகள் மாற்றப்பட்டன"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"அனுமதி"</string> <string name="deny" msgid="2081879885755434506">"நிராகரி"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-te-rIN/strings.xml b/packages/DocumentsUI/res/values-te-rIN/strings.xml index 0043ddc55e37..c11840a22201 100644 --- a/packages/DocumentsUI/res/values-te-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-te-rIN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"పేరు మార్చు"</string> <string name="rename_error" msgid="4203041674883412606">"పత్రం పేరు మార్చడంలో విఫలమైంది"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"కొన్ని పైల్లు మార్చబడ్డాయి"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"అనుమతించండి"</string> <string name="deny" msgid="2081879885755434506">"తిరస్కరించండి"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml index 8b24210dfe30..aba869c42895 100644 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ b/packages/DocumentsUI/res/values-th/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"เปลี่ยนชื่อ"</string> <string name="rename_error" msgid="4203041674883412606">"ไม่สามารถเปลี่ยนชื่อเอกสาร"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"แปลงบางไฟล์แล้ว"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"อนุญาต"</string> <string name="deny" msgid="2081879885755434506">"ปฏิเสธ"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index 9849b8597367..a76a30623ac7 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Palitan ang pangalan"</string> <string name="rename_error" msgid="4203041674883412606">"Hindi napalitan ang pangalan ng dokumento"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Na-convert ang ilang file"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Payagan"</string> <string name="deny" msgid="2081879885755434506">"Tanggihan"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index 8df52d205f56..f5e6258d88a6 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Yeniden Adlandır"</string> <string name="rename_error" msgid="4203041674883412606">"Dokümanın adı değiştirilemedi"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Bazı dosyalar dönüştürüldü"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"İzin Ver"</string> <string name="deny" msgid="2081879885755434506">"Reddet"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml index d5a1fcd36429..9c4b054406be 100644 --- a/packages/DocumentsUI/res/values-uk/strings.xml +++ b/packages/DocumentsUI/res/values-uk/strings.xml @@ -124,6 +124,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Перейменувати"</string> <string name="rename_error" msgid="4203041674883412606">"Не вдалося перейменувати документ"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Деякі файли конвертовано"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Дозвол."</string> <string name="deny" msgid="2081879885755434506">"Забор."</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml index 846555a5721a..2d4804c4b14c 100644 --- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml +++ b/packages/DocumentsUI/res/values-ur-rPK/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"نام تبدیل کریں"</string> <string name="rename_error" msgid="4203041674883412606">"دستاویز کا نام تبدیل کرنے میں ناکام"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"کچھ فائلوں کو تبدیل کیا گیا تھا"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"اجازت دیں"</string> <string name="deny" msgid="2081879885755434506">"مسترد کریں"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml index 0e1ac5aee187..0a0992176461 100644 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Qayta nomlash"</string> <string name="rename_error" msgid="4203041674883412606">"Hujjatni qayta nomlab bo‘lmadi"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Bir nechta fayllar o‘girildi"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Ruxsat berish"</string> <string name="deny" msgid="2081879885755434506">"Rad qilish"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> @@ -117,7 +121,7 @@ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta fayl o‘chirilsinmi?</item> </plurals> <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta tanlandi</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta tanlandi</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta belgilandi</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta belgilandi</item> </plurals> </resources> diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml index c3c16f44d4d1..9aca29f27acc 100644 --- a/packages/DocumentsUI/res/values-vi/strings.xml +++ b/packages/DocumentsUI/res/values-vi/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Đổi tên"</string> <string name="rename_error" msgid="4203041674883412606">"Không đổi được tên tài liệu"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Đã chuyển đổi một số tệp"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Cho phép"</string> <string name="deny" msgid="2081879885755434506">"Từ chối"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml index 7f479ff7646f..75dcfbc0aa10 100644 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"重命名"</string> <string name="rename_error" msgid="4203041674883412606">"无法重命名文档"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分文件已转换成其他格式"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"允许"</string> <string name="deny" msgid="2081879885755434506">"拒绝"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml index f22e27e7458a..b834a11e5c4d 100644 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"重新命名"</string> <string name="rename_error" msgid="4203041674883412606">"無法重新命名文件"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分檔案已轉換成其他格式"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"允許"</string> <string name="deny" msgid="2081879885755434506">"拒絕"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml index a5ede47a5fab..d6e270afb3b0 100644 --- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"重新命名"</string> <string name="rename_error" msgid="4203041674883412606">"無法重新命名文件"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分檔案已轉換成其他格式"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"允許"</string> <string name="deny" msgid="2081879885755434506">"拒絕"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml index b99ab8c173c6..35864a7cb4e4 100644 --- a/packages/DocumentsUI/res/values-zu/strings.xml +++ b/packages/DocumentsUI/res/values-zu/strings.xml @@ -110,6 +110,10 @@ <string name="menu_rename" msgid="7678802479104285353">"Qamba kabusha"</string> <string name="rename_error" msgid="4203041674883412606">"Yehlulekile ukuqamba kabusha idokhumenti"</string> <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Amanye amafayela aguqulelwe"</string> + <!-- no translation found for open_external_dialog_request (5789329484285817629) --> + <skip /> + <!-- no translation found for never_ask_again (4295278542972859268) --> + <skip /> <string name="allow" msgid="7225948811296386551">"Vumela"</string> <string name="deny" msgid="2081879885755434506">"Yala"</string> <plurals name="delete_confirmation_message" formatted="false" msgid="3519107568984207772"> diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml index e2d1870cb122..e7406e68302d 100644 --- a/packages/DocumentsUI/res/values/strings.xml +++ b/packages/DocumentsUI/res/values/strings.xml @@ -200,10 +200,12 @@ during a copy. [CHAR LIMIT=48] --> <string name="notification_copy_files_converted_title">Some files were converted</string> - <!-- DO NOT TRANSLATE - final phrase has not been decided yet (b/26750152) --> + <!-- Text in an alert dialog asking user to grant app access to a given directory in an external storage volume --> <string name="open_external_dialog_request">Grant <xliff:g id="appName" example="System Settings"><b>^1</b></xliff:g> - access to <xliff:g id="directory" example="Pictures"><i>^2</i></xliff:g> folder on + access to <xliff:g id="directory" example="Pictures"><i>^2</i></xliff:g> directory on <xliff:g id="storage" example="SD Card"><i>^3</i></xliff:g>?</string> + <!-- Checkbox that allows user to not be questioned about the directory access request again --> + <string name="never_ask_again">Don\'t ask again</string> <!-- Text in the button asking user to allow access to a given directory. --> <string name="allow">Allow</string> <!-- Text in the button asking user to deny access to a given directory. --> diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml index 21bdfd9ec53c..a548d89838f1 100644 --- a/packages/DocumentsUI/res/values/styles.xml +++ b/packages/DocumentsUI/res/values/styles.xml @@ -46,8 +46,4 @@ <item name="android:maxHeight">3dp</item> </style> - <!-- TODO: use the proper dialog and/or inline if not overriding --> - <style name="AlertDialogTheme" parent="@style/Theme.AppCompat.Light.Dialog.Alert"> - </style> - </resources> diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java index 1a8ce18ce03d..c51cbb3b723a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -670,7 +670,7 @@ public abstract class BaseActivity extends Activity private static final class HandleRootsChangedTask extends PairedTask<BaseActivity, RootInfo, RootInfo> { - DocumentInfo mHome; + DocumentInfo mDownloadsDocument; public HandleRootsChangedTask(BaseActivity activity) { super(activity); @@ -682,28 +682,28 @@ public abstract class BaseActivity extends Activity final RootInfo currentRoot = roots[0]; final Collection<RootInfo> cachedRoots = mOwner.mRoots.getRootsBlocking(); - RootInfo homeRoot = null; + RootInfo downloadsRoot = null; for (final RootInfo root : cachedRoots) { - if (root.isHome()) { - homeRoot = root; + if (root.isDownloads()) { + downloadsRoot = root; } if (root.getUri().equals(currentRoot.getUri())) { // We don't need to change the current root as the current root was not removed. return null; } } - assert(homeRoot != null); - mHome = mOwner.getRootDocumentBlocking(homeRoot); - return homeRoot; + assert(downloadsRoot != null); + mDownloadsDocument = mOwner.getRootDocumentBlocking(downloadsRoot); + return downloadsRoot; } @Override - protected void finish(RootInfo homeRoot) { - if (homeRoot != null && mHome != null) { + protected void finish(RootInfo downloadsRoot) { + if (downloadsRoot != null && mDownloadsDocument != null) { // Clear entire backstack and start in new root - mOwner.mState.onRootChanged(homeRoot); - mOwner.mSearchManager.update(homeRoot); - mOwner.openContainerDocument(mHome); + mOwner.mState.onRootChanged(downloadsRoot); + mOwner.mSearchManager.update(downloadsRoot); + mOwner.openContainerDocument(mDownloadsDocument); } } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java index c7c61c3189ac..8c4859f52a02 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java +++ b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java @@ -16,10 +16,20 @@ package com.android.documentsui; +import static com.android.documentsui.Shared.DEBUG; +import static com.android.documentsui.Shared.TAG; import static com.android.documentsui.State.MODE_UNKNOWN; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import android.annotation.IntDef; +import android.annotation.Nullable; import android.content.Context; +import android.content.SharedPreferences; +import android.os.UserHandle; import android.preference.PreferenceManager; +import android.util.Log; import com.android.documentsui.State.ViewMode; import com.android.documentsui.model.RootInfo; @@ -29,29 +39,73 @@ public class LocalPreferences { private static final String ROOT_VIEW_MODE_PREFIX = "rootViewMode-"; public static boolean getDisplayFileSize(Context context) { - return PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(KEY_FILE_SIZE, false); + return getPrefs(context).getBoolean(KEY_FILE_SIZE, false); } - public static @ViewMode int getViewMode( - Context context, RootInfo root, @ViewMode int fallback) { - return PreferenceManager.getDefaultSharedPreferences(context) - .getInt(createKey(root), fallback); + public static @ViewMode int getViewMode(Context context, RootInfo root, + @ViewMode int fallback) { + return getPrefs(context).getInt(createKey(root), fallback); } public static void setDisplayFileSize(Context context, boolean display) { - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putBoolean(KEY_FILE_SIZE, display).apply(); + getPrefs(context).edit().putBoolean(KEY_FILE_SIZE, display).apply(); } public static void setViewMode(Context context, RootInfo root, @ViewMode int viewMode) { assert(viewMode != MODE_UNKNOWN); - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putInt(createKey(root), viewMode).apply(); + getPrefs(context).edit().putInt(createKey(root), viewMode).apply(); + } + + private static SharedPreferences getPrefs(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context); } private static String createKey(RootInfo root) { return ROOT_VIEW_MODE_PREFIX + root.authority + root.rootId; } + + public static final int PERMISSION_ASK = 0; + public static final int PERMISSION_ASK_AGAIN = 1; + public static final int PERMISSION_NEVER_ASK = -1; + + @IntDef(flag = true, value = { + PERMISSION_ASK, + PERMISSION_ASK_AGAIN, + PERMISSION_NEVER_ASK, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface PermissionStatus {} + + /** + * Methods below are used to keep track of denied user requests on scoped directory access so + * the dialog is not offered when user checked the 'Do not ask again' box + * + * <p>It uses a shared preferences, whose key is: + * <ol> + * <li>{@code USER_ID|PACKAGE_NAME|VOLUME_UUID|DIRECTORY} for storage volumes that have a UUID + * (typically physical volumes like SD cards). + * <li>{@code USER_ID|PACKAGE_NAME||DIRECTORY} for storage volumes that do not have a UUID + * (typically the emulated volume used for primary storage + * </ol> + */ + static @PermissionStatus int getScopedAccessPermissionStatus(Context context, + String packageName, @Nullable String uuid, String directory) { + final String key = getScopedAccessDenialsKey(packageName, uuid, directory); + return getPrefs(context).getInt(key, PERMISSION_ASK); + } + + static void setScopedAccessPermissionStatus(Context context, String packageName, + @Nullable String uuid, String directory, @PermissionStatus int status) { + final String key = getScopedAccessDenialsKey(packageName, uuid, directory); + getPrefs(context).edit().putInt(key, status).apply(); + } + + private static String getScopedAccessDenialsKey(String packageName, String uuid, + String directory) { + final int userId = UserHandle.myUserId(); + return uuid == null + ? userId + "|" + packageName + "||" + directory + : userId + "|" + packageName + "|" + uuid + "|" + directory; + } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java index afd308cc97a7..deef1c278e63 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java @@ -411,11 +411,15 @@ public final class Metrics { 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; + public static final int SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST = 3; + public static final int SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED = 4; @IntDef(flag = true, value = { SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED, SCOPED_DIRECTORY_ACCESS_GRANTED, - SCOPED_DIRECTORY_ACCESS_DENIED + SCOPED_DIRECTORY_ACCESS_DENIED, + SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST, + SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED }) @Retention(RetentionPolicy.SOURCE) public @interface ScopedAccessGrant {} @@ -432,23 +436,34 @@ public final class Metrics { 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); + 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); + 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); + 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; + case SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST: + MetricsLogger.action(activity, MetricsEvent + .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_PACKAGE, packageName); + MetricsLogger.action(activity, MetricsEvent + .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_FOLDER, index); + break; + case SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED: + MetricsLogger.action(activity, MetricsEvent + .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_PACKAGE, packageName); + MetricsLogger.action(activity, MetricsEvent + .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_FOLDER, index); break; default: Log.wtf(TAG, "invalid ScopedAccessGrant: " + type); diff --git a/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java b/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java index dc529ceb18ec..2b6f3968e203 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java @@ -20,16 +20,24 @@ 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.LocalPreferences.getScopedAccessPermissionStatus; +import static com.android.documentsui.LocalPreferences.PERMISSION_ASK; +import static com.android.documentsui.LocalPreferences.PERMISSION_ASK_AGAIN; +import static com.android.documentsui.LocalPreferences.PERMISSION_NEVER_ASK; +import static com.android.documentsui.LocalPreferences.setScopedAccessPermissionStatus; +import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED; 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_DENIED_AND_PERSIST; 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 static com.android.documentsui.Metrics.logInvalidScopedAccessRequest; +import static com.android.documentsui.Metrics.logValidScopedAccessRequest; +import static com.android.documentsui.Shared.DEBUG; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityManager; import android.app.AlertDialog; @@ -38,7 +46,6 @@ import android.app.DialogFragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.ContentProviderClient; -import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; @@ -57,6 +64,11 @@ import android.os.storage.VolumeInfo; import android.provider.DocumentsContract; import android.text.TextUtils; import android.util.Log; +import android.view.View; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.TextView; import java.io.File; import java.io.IOException; @@ -72,12 +84,17 @@ public class OpenExternalDirectoryActivity extends Activity { private static final String EXTRA_FILE = "com.android.documentsui.FILE"; private static final String EXTRA_APP_LABEL = "com.android.documentsui.APP_LABEL"; private static final String EXTRA_VOLUME_LABEL = "com.android.documentsui.VOLUME_LABEL"; + private static final String EXTRA_VOLUME_UUID = "com.android.documentsui.VOLUME_UUID"; private ContentProviderClient mExternalStorageClient; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + if (DEBUG) Log.d(TAG, "activity.onCreateDialog(): reusing instance"); + return; + } final Intent intent = getIntent(); if (intent == null) { @@ -105,9 +122,18 @@ public class OpenExternalDirectoryActivity extends Activity { finish(); return; } + final StorageVolume volume = (StorageVolume) storageVolume; + if (getScopedAccessPermissionStatus(getApplicationContext(), getCallingPackage(), + volume.getUuid(), directoryName) == PERMISSION_NEVER_ASK) { + logValidScopedAccessRequest(this, directoryName, + SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED); + setResult(RESULT_CANCELED); + finish(); + return; + } final int userId = UserHandle.myUserId(); - if (!showFragment(this, userId, (StorageVolume) storageVolume, directoryName)) { + if (!showFragment(this, userId, volume, directoryName)) { setResult(RESULT_CANCELED); finish(); return; @@ -157,6 +183,7 @@ public class OpenExternalDirectoryActivity extends Activity { // Gets volume label and converted path. String volumeLabel = null; + String volumeUuid = null; final List<VolumeInfo> volumes = sm.getVolumes(); if (DEBUG) Log.d(TAG, "Number of volumes: " + volumes.size()); for (VolumeInfo volume : volumes) { @@ -166,6 +193,7 @@ public class OpenExternalDirectoryActivity extends Activity { if (DEBUG) Log.d(TAG, "Converting " + root + " to " + internalRoot); file = new File(internalRoot, directory); volumeLabel = sm.getBestVolumeDescription(volume); + volumeUuid = volume.getFsUuid(); break; } } @@ -197,6 +225,7 @@ public class OpenExternalDirectoryActivity extends Activity { final Bundle args = new Bundle(); args.putString(EXTRA_FILE, file.getAbsolutePath()); args.putString(EXTRA_VOLUME_LABEL, volumeLabel); + args.putString(EXTRA_VOLUME_UUID, volumeUuid); args.putString(EXTRA_APP_LABEL, appLabel); final FragmentManager fm = activity.getFragmentManager(); @@ -303,16 +332,21 @@ public class OpenExternalDirectoryActivity extends Activity { public static class OpenExternalDirectoryDialogFragment extends DialogFragment { private File mFile; + private String mVolumeUuid; private String mVolumeLabel; private String mAppLabel; + private CheckBox mDontAskAgain; private OpenExternalDirectoryActivity mActivity; + private AlertDialog mDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setRetainInstance(true); final Bundle args = getArguments(); if (args != null) { mFile = new File(args.getString(EXTRA_FILE)); + mVolumeUuid = args.getString(EXTRA_VOLUME_UUID); mVolumeLabel = args.getString(EXTRA_VOLUME_LABEL); mAppLabel = args.getString(EXTRA_APP_LABEL); } @@ -320,9 +354,28 @@ public class OpenExternalDirectoryActivity extends Activity { } @Override + public void onDestroyView() { + // Workaround for https://code.google.com/p/android/issues/detail?id=17423 + if (mDialog != null && getRetainInstance()) { + mDialog.setDismissMessage(null); + } + super.onDestroyView(); + } + + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { + if (mDialog != null) { + if (DEBUG) Log.d(TAG, "fragment.onCreateDialog(): reusing dialog"); + return mDialog; + } + if (mActivity != getActivity()) { + // Sanity check. + Log.wtf(TAG, "activity references don't match on onCreateDialog(): mActivity = " + + mActivity + " , getActivity() = " + getActivity()); + mActivity = (OpenExternalDirectoryActivity) getActivity(); + } final String directory = mFile.getName(); - final Activity activity = getActivity(); + final Context context = mActivity.getApplicationContext(); final OnClickListener listener = new OnClickListener() { @Override @@ -333,15 +386,25 @@ public class OpenExternalDirectoryActivity extends Activity { mActivity.getExternalStorageClient(), mFile); } if (which == DialogInterface.BUTTON_NEGATIVE || intent == null) { - logValidScopedAccessRequest(activity, directory, + logValidScopedAccessRequest(mActivity, directory, SCOPED_DIRECTORY_ACCESS_DENIED); - activity.setResult(RESULT_CANCELED); + final boolean checked = mDontAskAgain.isChecked(); + if (checked) { + logValidScopedAccessRequest(mActivity, directory, + SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST); + setScopedAccessPermissionStatus(context, mActivity.getCallingPackage(), + mVolumeUuid, directory, PERMISSION_NEVER_ASK); + } else { + setScopedAccessPermissionStatus(context, mActivity.getCallingPackage(), + mVolumeUuid, directory, PERMISSION_ASK_AGAIN); + } + mActivity.setResult(RESULT_CANCELED); } else { - logValidScopedAccessRequest(activity, directory, + logValidScopedAccessRequest(mActivity, directory, SCOPED_DIRECTORY_ACCESS_GRANTED); - activity.setResult(RESULT_OK, intent); + mActivity.setResult(RESULT_OK, intent); } - activity.finish(); + mActivity.finish(); } }; @@ -349,11 +412,31 @@ public class OpenExternalDirectoryActivity extends Activity { .expandTemplate( getText(R.string.open_external_dialog_request), mAppLabel, directory, mVolumeLabel); - return new AlertDialog.Builder(activity, R.style.AlertDialogTheme) - .setMessage(message) + @SuppressLint("InflateParams") + // It's ok pass null ViewRoot on AlertDialogs. + final View view = View.inflate(mActivity, R.layout.dialog_open_scoped_directory, null); + final TextView messageField = (TextView) view.findViewById(R.id.message); + messageField.setText(message); + mDialog = new AlertDialog.Builder(mActivity, R.style.Theme_AppCompat_Light_Dialog_Alert) + .setView(view) .setPositiveButton(R.string.allow, listener) .setNegativeButton(R.string.deny, listener) .create(); + + mDontAskAgain = (CheckBox) view.findViewById(R.id.do_not_ask_checkbox); + if (getScopedAccessPermissionStatus(context, mActivity.getCallingPackage(), + mVolumeUuid, directory) == PERMISSION_ASK_AGAIN) { + mDontAskAgain.setVisibility(View.VISIBLE); + mDontAskAgain.setOnCheckedChangeListener(new OnCheckedChangeListener() { + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(!isChecked); + } + }); + } + + return mDialog; } @Override diff --git a/packages/DocumentsUI/src/com/android/documentsui/Shared.java b/packages/DocumentsUI/src/com/android/documentsui/Shared.java index 26900a70fc06..b53942106875 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Shared.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Shared.java @@ -86,12 +86,6 @@ public final class Shared { */ public static final String EXTRA_IGNORE_STATE = "ignoreState"; - - /** - * String prefix used to indicate the document is a directory. - */ - public static final char DIR_PREFIX = '\001'; - private static final Collator sCollator; static { @@ -150,12 +144,6 @@ public final class Shared { if (leftEmpty) return -1; if (rightEmpty) return 1; - final boolean leftDir = (lhs.charAt(0) == DIR_PREFIX); - final boolean rightDir = (rhs.charAt(0) == DIR_PREFIX); - - if (leftDir && !rightDir) return -1; - if (rightDir && !leftDir) return 1; - return sCollator.compare(lhs, rhs); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index bfc8d71c3fdf..be704174a665 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -440,6 +440,7 @@ public class DirectoryFragment extends Fragment private Selection mSelected = new Selection(); private ActionMode mActionMode; + private int mNoCopyCount = 0; private int mNoDeleteCount = 0; private int mNoRenameCount = -1; private Menu mMenu; @@ -471,6 +472,9 @@ public class DirectoryFragment extends Fragment // triggered on "silent" selection updates (i.e. we might be reacting to unfinalized // selection changes here) final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); + if ((docFlags & Document.FLAG_PARTIAL) != 0) { + mNoCopyCount += selected ? 1 : -1; + } if ((docFlags & Document.FLAG_SUPPORTS_DELETE) == 0 && (docFlags & Document.FLAG_SUPPORTS_DELETE) == 0) { mNoDeleteCount += selected ? 1 : -1; @@ -537,19 +541,24 @@ public class DirectoryFragment extends Fragment return true; } - boolean canRenameSelection() { - return mNoRenameCount == 0 && mSelectionManager.getSelection().size() == 1; + boolean canCopySelection() { + return mNoCopyCount == 0; } boolean canDeleteSelection() { return mNoDeleteCount == 0; } + boolean canRenameSelection() { + return mNoRenameCount == 0 && mSelectionManager.getSelection().size() == 1; + } + private void updateActionMenu() { assert(mMenu != null); // Delegate update logic to our owning action, since specialized logic is desired. - mTuner.updateActionMenu(mMenu, mType, canDeleteSelection(), canRenameSelection()); + mTuner.updateActionMenu( + mMenu, mType, canCopySelection(), canDeleteSelection(), canRenameSelection()); Menus.disableHiddenItems(mMenu); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java index 0ee7623a3fe3..39fdf8e61765 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java @@ -58,9 +58,9 @@ public abstract class FragmentTuner { } } - public abstract void updateActionMenu( - Menu menu, @ResultType int dirType, boolean canDelete, boolean canRename); + Menu menu, @ResultType int dirType, + boolean canCopy, boolean canDelete, boolean canRename); // Subtly different from isDocumentEnabled. The reason may be illuminated as follows. // A folder is enabled such that it may be double clicked, even in settings @@ -140,7 +140,8 @@ public abstract class FragmentTuner { @Override public void updateActionMenu( - Menu menu, @ResultType int dirType, boolean canDelete, boolean canRename) { + Menu menu, @ResultType int dirType, + boolean canCopy, boolean canDelete, boolean canRename) { MenuItem open = menu.findItem(R.id.menu_open); MenuItem share = menu.findItem(R.id.menu_share); @@ -198,22 +199,28 @@ public abstract class FragmentTuner { @Override public void updateActionMenu( - Menu menu, @ResultType int dirType, boolean canDelete, boolean canRename) { + Menu menu, @ResultType int dirType, + boolean canCopy, boolean canDelete, boolean canRename) { MenuItem copy = menu.findItem(R.id.menu_copy_to_clipboard); MenuItem paste = menu.findItem(R.id.menu_paste_from_clipboard); - copy.setEnabled(dirType != DirectoryFragment.TYPE_RECENT_OPEN); + copy.setEnabled(canCopy); MenuItem rename = menu.findItem(R.id.menu_rename); + MenuItem moveTo = menu.findItem(R.id.menu_move_to); + MenuItem copyTo = menu.findItem(R.id.menu_copy_to); + + copyTo.setVisible(true); + moveTo.setVisible(true); rename.setVisible(true); + + copyTo.setEnabled(canCopy); + moveTo.setEnabled(canCopy && canDelete); rename.setEnabled(canRename); menu.findItem(R.id.menu_share).setVisible(true); menu.findItem(R.id.menu_delete).setVisible(canDelete); menu.findItem(R.id.menu_open).setVisible(false); - menu.findItem(R.id.menu_copy_to).setVisible(true); - menu.findItem(R.id.menu_move_to).setVisible(true); - menu.findItem(R.id.menu_move_to).setEnabled(canDelete); Menus.disableHiddenItems(menu, copy, paste); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java index ab4f5c4f90ad..68b1bcc411fc 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java @@ -20,10 +20,9 @@ import static com.android.documentsui.Shared.DEBUG; import static com.android.documentsui.State.SORT_ORDER_DISPLAY_NAME; 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 android.database.Cursor; +import android.database.MergeCursor; import android.os.Bundle; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; @@ -62,34 +61,17 @@ public class Model { private String mIds[] = new String[0]; private int mSortOrder = SORT_ORDER_DISPLAY_NAME; + private int mAuthorityIndex = -1; + private int mDocIdIndex = -1; + private int mMimeTypeIndex = -1; + private int mDisplayNameIndex = -1; + private int mColumnSizeIndex = -1; + private int mLastModifiedIndex = -1; + @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 - * string that can be used to identify the document referred to by the cursor. - * - * @param c A cursor that refers to a document. - */ - private static String createModelId(Cursor c) { - // TODO: Maybe more efficient to use just the document ID, in cases where there is only one - // authority (which should be the majority of cases). - return createModelId( - getCursorString(c, RootCursorWrapper.COLUMN_AUTHORITY), - getCursorString(c, Document.COLUMN_DOCUMENT_ID)); - } - - /** - * Generates a Model ID for a cursor entry that refers to a document. The Model ID is a unique - * string that can be used to identify the document referred to by the cursor. - * - * @param c A cursor that refers to a document. - */ - static String createModelId(String authority, String docId) { - return authority + "|" + docId; - } - private void notifyUpdateListeners() { for (UpdateListener listener: mUpdateListeners) { listener.onModelUpdate(this); @@ -127,6 +109,13 @@ public class Model { mCursor = result.cursor; mCursorCount = mCursor.getCount(); mSortOrder = result.sortOrder; + mAuthorityIndex = mCursor.getColumnIndex(RootCursorWrapper.COLUMN_AUTHORITY); + assert(mAuthorityIndex != -1); + mDocIdIndex = mCursor.getColumnIndex(Document.COLUMN_DOCUMENT_ID); + mMimeTypeIndex = mCursor.getColumnIndex(Document.COLUMN_MIME_TYPE); + mDisplayNameIndex = mCursor.getColumnIndex(Document.COLUMN_DISPLAY_NAME); + mColumnSizeIndex = mCursor.getColumnIndex(Document.COLUMN_SIZE); + doc = result.doc; updateModelData(); @@ -153,48 +142,61 @@ public class Model { private void updateModelData() { int[] positions = new int[mCursorCount]; mIds = new String[mCursorCount]; - String[] stringValues = new String[mCursorCount]; + boolean[] isDirs = new boolean[mCursorCount]; + String[] displayNames = null; long[] longValues = null; - if (mSortOrder == SORT_ORDER_LAST_MODIFIED || mSortOrder == SORT_ORDER_SIZE) { - longValues = new long[mCursorCount]; + switch (mSortOrder) { + case SORT_ORDER_DISPLAY_NAME: + displayNames = new String[mCursorCount]; + break; + case SORT_ORDER_LAST_MODIFIED: + case SORT_ORDER_SIZE: + longValues = new long[mCursorCount]; + break; } + String mimeType; + mCursor.moveToPosition(-1); for (int pos = 0; pos < mCursorCount; ++pos) { mCursor.moveToNext(); positions[pos] = pos; - mIds[pos] = createModelId(mCursor); - switch(mSortOrder) { + // Generates a Model ID for a cursor entry that refers to a document. The Model ID is a + // unique string that can be used to identify the document referred to by the cursor. + // If the cursor is a merged cursor over multiple authorities, then prefix the ids + // with the authority to avoid collisions. + if (mCursor instanceof MergeCursor) { + mIds[pos] = getString(mAuthorityIndex) + "|" + mCursor.getString(mDocIdIndex); + } else { + mIds[pos] = mCursor.getString(mDocIdIndex); + } + + mimeType = getString(mMimeTypeIndex); + isDirs[pos] = Document.MIME_TYPE_DIR.equals(mimeType); + + switch (mSortOrder) { case SORT_ORDER_DISPLAY_NAME: - final String mimeType = getCursorString(mCursor, Document.COLUMN_MIME_TYPE); - final String displayName = getCursorString( - mCursor, Document.COLUMN_DISPLAY_NAME); - if (Document.MIME_TYPE_DIR.equals(mimeType)) { - stringValues[pos] = Shared.DIR_PREFIX + displayName; - } else { - stringValues[pos] = displayName; - } + displayNames[pos] = getString(mDisplayNameIndex); break; case SORT_ORDER_LAST_MODIFIED: - longValues[pos] = getLastModified(mCursor); - stringValues[pos] = getCursorString(mCursor, Document.COLUMN_MIME_TYPE); + longValues[pos] = getLastModified(); break; case SORT_ORDER_SIZE: - longValues[pos] = getCursorLong(mCursor, Document.COLUMN_SIZE); - stringValues[pos] = getCursorString(mCursor, Document.COLUMN_MIME_TYPE); + longValues[pos] = mColumnSizeIndex != -1 + ? mCursor.getLong(mColumnSizeIndex) : 0; break; } } switch (mSortOrder) { case SORT_ORDER_DISPLAY_NAME: - binarySort(stringValues, positions, mIds); + binarySort(displayNames, isDirs, positions, mIds); break; case SORT_ORDER_LAST_MODIFIED: case SORT_ORDER_SIZE: - binarySort(longValues, stringValues, positions, mIds); + binarySort(longValues, isDirs, positions, mIds); break; } @@ -207,18 +209,20 @@ public class Model { /** * Sorts model data. Takes three columns of index-corresponded data. The first column is the - * sort key. Rows are sorted in ascending alphabetical order on the sort key. This code is based - * on TimSort.binarySort(). + * sort key. Rows are sorted in ascending alphabetical order on the sort key. + * Directories are always shown first. This code is based on TimSort.binarySort(). * * @param sortKey Data is sorted in ascending alphabetical order. + * @param isDirs Array saying whether an item is a directory or not. * @param positions Cursor positions to be sorted. * @param ids Model IDs to be sorted. */ - private static void binarySort(String[] sortKey, int[] positions, String[] ids) { + private static void binarySort(String[] sortKey, boolean[] isDirs, int[] positions, String[] ids) { final int count = positions.length; for (int start = 1; start < count; start++) { final int pivotPosition = positions[start]; final String pivotValue = sortKey[start]; + final boolean pivotIsDir = isDirs[start]; final String pivotId = ids[start]; int left = 0; @@ -227,9 +231,18 @@ public class Model { while (left < right) { int mid = (left + right) >>> 1; - final String lhs = pivotValue; - final String rhs = sortKey[mid]; - final int compare = Shared.compareToIgnoreCaseNullable(lhs, rhs); + // Directories always go in front. + int compare = 0; + final boolean rhsIsDir = isDirs[mid]; + if (pivotIsDir && !rhsIsDir) { + compare = -1; + } else if (!pivotIsDir && rhsIsDir) { + compare = 1; + } else { + final String lhs = pivotValue; + final String rhs = sortKey[mid]; + compare = Shared.compareToIgnoreCaseNullable(lhs, rhs); + } if (compare < 0) { right = mid; @@ -243,20 +256,24 @@ public class Model { case 2: positions[left + 2] = positions[left + 1]; sortKey[left + 2] = sortKey[left + 1]; + isDirs[left + 2] = isDirs[left + 1]; ids[left + 2] = ids[left + 1]; case 1: positions[left + 1] = positions[left]; sortKey[left + 1] = sortKey[left]; + isDirs[left + 1] = isDirs[left]; ids[left + 1] = ids[left]; break; default: System.arraycopy(positions, left, positions, left + 1, n); System.arraycopy(sortKey, left, sortKey, left + 1, n); + System.arraycopy(isDirs, left, isDirs, left + 1, n); System.arraycopy(ids, left, ids, left + 1, n); } positions[left] = pivotPosition; sortKey[left] = pivotValue; + isDirs[left] = pivotIsDir; ids[left] = pivotId; } } @@ -268,17 +285,17 @@ public class Model { * numerical order on the sort key. This code is based on TimSort.binarySort(). * * @param sortKey Data is sorted in descending numerical order. - * @param mimeTypes Corresponding mime types. Directories will be sorted ahead of documents. + * @param isDirs Array saying whether an item is a directory or not. * @param positions Cursor positions to be sorted. * @param ids Model IDs to be sorted. */ private static void binarySort( - long[] sortKey, String[] mimeTypes, int[] positions, String[] ids) { + long[] sortKey, boolean[] isDirs, int[] positions, String[] ids) { final int count = positions.length; for (int start = 1; start < count; start++) { final int pivotPosition = positions[start]; final long pivotValue = sortKey[start]; - final String pivotMime = mimeTypes[start]; + final boolean pivotIsDir = isDirs[start]; final String pivotId = ids[start]; int left = 0; @@ -287,13 +304,12 @@ public class Model { while (left < right) { int mid = ((left + right) >>> 1); - // First bucket by mime type. Directories always go in front. + // Directories always go in front. int compare = 0; - final boolean lhsIsDir = Document.MIME_TYPE_DIR.equals(pivotMime); - final boolean rhsIsDir = Document.MIME_TYPE_DIR.equals(mimeTypes[mid]); - if (lhsIsDir && !rhsIsDir) { + final boolean rhsIsDir = isDirs[mid]; + if (pivotIsDir && !rhsIsDir) { compare = -1; - } else if (!lhsIsDir && rhsIsDir) { + } else if (!pivotIsDir && rhsIsDir) { compare = 1; } else { final long lhs = pivotValue; @@ -323,35 +339,39 @@ public class Model { case 2: positions[left + 2] = positions[left + 1]; sortKey[left + 2] = sortKey[left + 1]; - mimeTypes[left + 2] = mimeTypes[left + 1]; + isDirs[left + 2] = isDirs[left + 1]; ids[left + 2] = ids[left + 1]; case 1: positions[left + 1] = positions[left]; sortKey[left + 1] = sortKey[left]; - mimeTypes[left + 1] = mimeTypes[left]; + isDirs[left + 1] = isDirs[left]; ids[left + 1] = ids[left]; break; default: System.arraycopy(positions, left, positions, left + 1, n); System.arraycopy(sortKey, left, sortKey, left + 1, n); - System.arraycopy(mimeTypes, left, mimeTypes, left + 1, n); + System.arraycopy(isDirs, left, isDirs, left + 1, n); System.arraycopy(ids, left, ids, left + 1, n); } positions[left] = pivotPosition; sortKey[left] = pivotValue; - mimeTypes[left] = pivotMime; + isDirs[left] = pivotIsDir; ids[left] = pivotId; } } + private String getString(int columnIndex) { + return columnIndex != -1 ? mCursor.getString(columnIndex) : null; + } + /** * @return Timestamp for the given document. Some docs (e.g. active downloads) have a null * timestamp - these will be replaced with MAX_LONG so that such files get sorted to the top * when sorting by date. */ - long getLastModified(Cursor cursor) { - long l = getCursorLong(mCursor, Document.COLUMN_LAST_MODIFIED); + private long getLastModified() { + long l = mCursor.getLong(mLastModifiedIndex); return (l == -1) ? Long.MAX_VALUE : l; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java index d5327f916bed..31ce8377ec76 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java @@ -74,7 +74,6 @@ public class DocumentInfo implements Durable, Parcelable { summary = null; size = -1; icon = 0; - derivedUri = null; } @@ -210,6 +209,7 @@ public class DocumentInfo implements Durable, Parcelable { + ", isContainer=" + isContainer() + ", isDirectory=" + isDirectory() + ", isArchive=" + isArchive() + + ", isPartial=" + isPartial() + ", isVirtualDocument=" + isVirtualDocument() + ", isDeleteSupported=" + isDeleteSupported() + ", isCreateSupported=" + isCreateSupported() @@ -249,6 +249,10 @@ public class DocumentInfo implements Durable, Parcelable { return (flags & Document.FLAG_ARCHIVE) != 0; } + public boolean isPartial() { + return (flags & Document.FLAG_PARTIAL) != 0; + } + public boolean isContainer() { return isDirectory() || isArchive(); } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelTest.java index c6ad5116d93b..3536593564af 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelTest.java @@ -284,7 +284,7 @@ public class ModelTest extends AndroidTestCase { String id = Integer.toString(i); row.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY); row.add(Document.COLUMN_DOCUMENT_ID, id); - currentDownloads.add(Model.createModelId(AUTHORITY, id)); + currentDownloads.add(id); } DirectoryResult r = new DirectoryResult(); diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestModel.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestModel.java index d8c29db81a77..2d819ffcdf07 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestModel.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestModel.java @@ -62,9 +62,7 @@ public class TestModel extends Model { update(r); } - // Note that model id includes authority qualifier and is distinct - // WRT documentId because of this. String idForPosition(int p) { - return createModelId(mAuthority, Integer.toString(p)); + return Integer.toString(p); } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java index d4d45912aecc..45822260fb5b 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -22,6 +22,7 @@ import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.database.Cursor; import android.database.MatrixCursor; +import android.database.sqlite.SQLiteDiskIOException; import android.graphics.Point; import android.media.MediaFile; import android.mtp.MtpConstants; @@ -36,7 +37,6 @@ import android.provider.DocumentsContract.Root; import android.provider.DocumentsContract; import android.provider.DocumentsProvider; import android.provider.Settings; -import android.provider.Settings.SettingNotFoundException; import android.util.Log; import com.android.internal.annotations.GuardedBy; @@ -48,6 +48,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeoutException; /** * DocumentsProvider for MTP devices. @@ -103,25 +104,33 @@ public class MtpDocumentsProvider extends DocumentsProvider { // Check boot count and cleans database if it's first time to launch MtpDocumentsProvider // after booting. - final int bootCount = Settings.Global.getInt(mResolver, Settings.Global.BOOT_COUNT, -1); - final int lastBootCount = mDatabase.getLastBootCount(); - if (bootCount != -1 && bootCount != lastBootCount) { - mDatabase.setLastBootCount(bootCount); - final List<UriPermission> permissions = mResolver.getOutgoingPersistedUriPermissions(); - final Uri[] uris = new Uri[permissions.size()]; - for (int i = 0; i < permissions.size(); i++) { - uris[i] = permissions.get(i).getUri(); + try { + final int bootCount = Settings.Global.getInt(mResolver, Settings.Global.BOOT_COUNT, -1); + final int lastBootCount = mDatabase.getLastBootCount(); + if (bootCount != -1 && bootCount != lastBootCount) { + mDatabase.setLastBootCount(bootCount); + final List<UriPermission> permissions = + mResolver.getOutgoingPersistedUriPermissions(); + final Uri[] uris = new Uri[permissions.size()]; + for (int i = 0; i < permissions.size(); i++) { + uris[i] = permissions.get(i).getUri(); + } + mDatabase.cleanDatabase(uris); } - mDatabase.cleanDatabase(uris); + } catch (SQLiteDiskIOException error) { + // It can happen due to disk shortage. + Log.e(TAG, "Failed to clean database.", error); + return false; } // TODO: Mount AppFuse on demands. try { mAppFuse.mount(getContext().getSystemService(StorageManager.class)); - } catch (IOException e) { - Log.e(TAG, "Failed to start app fuse.", e); + } catch (IOException error) { + Log.e(TAG, "Failed to start app fuse.", error); return false; } + resume(); return true; } @@ -426,7 +435,7 @@ public class MtpDocumentsProvider extends DocumentsProvider { closeDeviceInternal(id); } mRootScanner.pause(); - } catch (InterruptedException|IOException e) { + } catch (InterruptedException | IOException | TimeoutException e) { // It should fail unit tests by throwing runtime exception. throw new RuntimeException(e); } finally { @@ -464,9 +473,6 @@ public class MtpDocumentsProvider extends DocumentsProvider { getDeviceToolkit(deviceId).close(); mDeviceToolkits.remove(deviceId); mMtpManager.closeDevice(deviceId); - if (mDeviceToolkits.size() == 0) { - mRootScanner.pause(); - } } private DeviceToolkit getDeviceToolkit(int deviceId) throws FileNotFoundException { diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java index 2f66c5cf17d7..2e9133bcb92f 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java @@ -27,6 +27,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; final class RootScanner { /** @@ -95,15 +96,19 @@ final class RootScanner { * Stops background thread and wait for its termination. * @throws InterruptedException */ - synchronized void pause() throws InterruptedException { + synchronized void pause() throws InterruptedException, TimeoutException { if (mExecutor == null) { return; } mExecutor.shutdownNow(); - if (!mExecutor.awaitTermination(AWAIT_TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS)) { - Log.e(MtpDocumentsProvider.TAG, "Failed to terminate RootScanner's background thread."); + try { + if (!mExecutor.awaitTermination(AWAIT_TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS)) { + throw new TimeoutException( + "Timeout for terminating RootScanner's background thread."); + } + } finally { + mExecutor = null; } - mExecutor = null; } /** @@ -173,6 +178,9 @@ final class RootScanner { } mFirstScanCompleted.countDown(); pollingCount++; + if (devices.length == 0) { + break; + } try { // 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. diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index d6ad0f3c630c..afcb45716c59 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -262,11 +262,9 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { null)); { mProvider.openDevice(0); - mProvider.resumeRootScanner(); mResolver.waitForNotification(ROOTS_URI, 1); mProvider.openDevice(1); - mProvider.resumeRootScanner(); mResolver.waitForNotification(ROOTS_URI, 2); final Cursor cursor = mProvider.queryRoots(null); diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java index cdddd8178dc9..a08d9ee39a44 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java @@ -48,6 +48,7 @@ public class PipeManagerTest extends AndroidTestCase { @Override protected void tearDown() throws Exception { assertTrue(mPipeManager.close()); + mDatabase.close(); } public void testReadDocument_basic() throws Exception { diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index a408c0820700..92374cbedec2 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Wys alle ANRe"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Wys Program reageer nie-dialoog vir agtergrond programme"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Programme verplig ekstern toegelaat"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Laat enige program na ekstern geskryf word, ongeag manifeswaardes"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Maak dat enige program in eksterne berging geskryf kan word, ongeag manifeswaardes"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Verplig verstelbare groottes vir aktiwiteite"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Maak die groottes van alle aktiwiteite verstelbaar vir veelvuldige vensters, ongeag manifeswaardes."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Aktiveer vormvrye-Windows"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 7ae97e2df5b5..386d697e0dbf 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"ሁሉንም ANRs አሳይ"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"ለዳራ መተግበሪያዎች ምላሽ የማይሰጥ መገናኛ ትግበራ አሳይ"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"በውጫዊ ላይ ሃይል ይፈቀዳል"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"አንጸባራቂ እሴቶች ግምት ውስጥ ሳይገቡ ማንኛውም መተግበሪያ ወደ ውጫዊ ማከማቻ ለመጻፍ ብቁ ያደርጋል።"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"የዝርዝር ሰነዶች እሴቶች ግምት ውስጥ ሳያስገባ ማንኛውም መተግበሪያ ወደ ውጫዊ ማከማቻው ለመጻፍ ብቁ ያደርጋል"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"እንቅስቃሴዎች ዳግመኛ እንዲመጣጠኑ አስገድድ"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"የዝርዝር ሰነድ እሴቶች ምንም ይሁኑ ምን ለበርካታ መስኮቶች ሁሉንም እንቅስቃሴዎች መጠናቸው የሚቀየሩ እንዲሆኑ ያደርጋቸዋል።"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"የነጻ ቅርጽ መስኮቶችን ያንቁ"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index eb76e1f7153d..2c8eda0e74e7 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"عرض جميع رسائل ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"عرض مربع الحوار \"التطبيق لا يستجيب\" مع تطبيقات الخلفية"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"فرض السماح للتطبيقات على الخارجي"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"تأهيل أي تطبيق بحيث تتم كتابته على سعة تخزين خارجية، بغض النظر عن قيم البيان"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"تأهيل أي تطبيق بحيث تتم كتابته على وحدة تخزين خارجية، بغض النظر عن قيم البيان"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"فرض إمكانية تغيير على الأنشطة"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"تمكين تغيير حجم جميع الأنشطة لتناسب تعدد النوافذ، بغض النظر عن قيم البيان."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"تمكين النوافذ الحرة"</string> diff --git a/packages/SettingsLib/res/values-az-rAZ/strings.xml b/packages/SettingsLib/res/values-az-rAZ/strings.xml index 9903397dc3ae..d62f472d7eef 100644 --- a/packages/SettingsLib/res/values-az-rAZ/strings.xml +++ b/packages/SettingsLib/res/values-az-rAZ/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Bütün ANRları göstər"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Arxa tətbiqlər dialoquna cavab verməyən tətbiqi göstər"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Tətbiqlərə xaricdən məcburi icazə"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Seçilmiş hər hansı tətbiqi bəyannamə dəyərlərindən aslı olmayaraq xarici yaddaşa yazılabilən edir."</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Seçilmiş hər hansı tətbiqi bəyannamə dəyərlərindən aslı olmayaraq xarici yaddaşa yazılabilən edir."</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Ölçü dəyişdirmək üçün məcburi fəaliyyətlər"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Bəyannamə dəyərlərindən aslı olmayaraq, bütün fəaliyyətləri çoxsaylı pəncərə üçün dəyişkən ölçülü edin."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Freeform windows aktiv edin"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index f570d093e813..eb050de44dfa 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaži dijalog Aplikacija ne reaguje za aplikacije u pozadini"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Prinudno dozvoli aplikacije u spoljnoj"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Omogućava upisivanje svih aplikacija u spoljnu memoriju, bez obzira na vrednosti manifesta"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava upisivanje svih aplikacija u spoljnu memoriju, bez obzira na vrednosti manifesta"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Prinudno omogući promenu veličine aktivnosti"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Omogući promenu veličine svih aktivnosti za režim sa više prozora, bez obzira na vrednosti manifesta."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Omogući prozore proizvoljnog formata"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 72652c9e570c..7640ffd0c0b5 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Всички нереагиращи прил."</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Диалог. прозорец „НП“ за приложения на заден план"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Външно хран.: Принуд. разрешаване на приложенията"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Позволява прилож. да се записват във външ. хранил. независимо от стойностите в манифеста"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Прави всички приложения да отговарят на условията да бъдат записвани във външното хранилище независимо от стойностите в манифеста"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Възможност за преоразмеряване на активностите"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Дава възможност за преоразмеряване на всички активности в режима за няколко прозореца независимо от стойностите в манифеста."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Активиране на прозорците в свободна форма"</string> diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml index b863773ef40d..a1063b96df07 100644 --- a/packages/SettingsLib/res/values-bn-rBD/strings.xml +++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"সব ANR দেখান"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"পশ্চাদপটের অ্যাপ্লিকেশানগুলির জন্য অ্যাপ্লিকেশান কোনো প্রতিক্রিয়া দিচ্ছে না এমন কথোপকথন দেখান"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"বহিরাগততে বলপূর্বক মঞ্জুরি"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"ম্যানিফেস্ট মানগুলি নির্বিশেষে যেকোনো অ্যাপ্লিকেশানকে বাহ্যিক সঞ্চয়স্থানে লেখার উপযুক্ত বানায়"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ম্যানিফেস্ট মানগুলি নির্বিশেষে যেকোনো অ্যাপ্লিকেশানকে বাহ্যিক সঞ্চয়স্থানে লেখার উপযুক্ত বানায়"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"আকার পরিবর্তনযোগ্য করার জন্য ক্রিয়াকলাপগুলিকে জোর করুন"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ম্যানিফেস্ট মানগুলির নির্বিশেষে মাল্টি-উইন্ডোর জন্য সমস্ত ক্রিয়াকলাপগুলির আকার পরিবর্তনযোগ্য করুন৷"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"ফ্রি-ফর্ম উইন্ডোগুলি সক্ষম করুন"</string> diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index 542c3ce6093c..7a87fda24395 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Prik. dijalog Aplikacija ne reagira za apl. u poz."</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Nametni aplikacije na vanjskoj pohrani"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Dozvoljava da bilo koja aplikacija bude upisana na vanjsku pohranu, bez obzira na vrijednosti manifesta."</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava da svaka aplikacija bude pogodna za upisivanje na vanjsku pohranu, bez obzira na prikazane vrijednosti"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Nametni aktivnostima mijenjanje veličina"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Neka sve aktivnosti budu takve da mogu mijenjati veličinu za prikaz sa više prozora, bez obzira na prikazane vrijednosti."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Omogući prozore nepravilnih oblika"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index e2c4495b7427..0249282a4223 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Tots els errors sense resposta"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que una aplicació en segon pla no respon"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Força permís d\'aplicacions a l\'emmagatzem. extern"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Permet que les aplicacions es puguin escriure en un dispositiu d’emmagatzematge extern, independentment dels valors definits"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permet que les aplicacions es puguin escriure en un dispositiu d’emmagatzematge extern, independentment dels valors definits"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Força l\'ajust de la mida de les activitats"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Permet ajustar la mida de totes les activitats per al mode multifinestra, independentment dels valors definits."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Activa les finestres de format lliure"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index f713ceb86bff..86f269d73a08 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Zobrazit všechny ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Zobrazovat dialog „Aplikace neodpovídá“ pro aplikace na pozadí"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Vynutit povolení aplikací na externím úložišti"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Každou aplikaci bude možné zapsat do externího úložiště, bez ohledu na hodnoty manifestu"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Každou aplikaci bude možné zapsat do externího úložiště, bez ohledu na hodnoty manifestu"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Vynutit možnost změny velikosti aktivit"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Umožnit změnu velikosti všech aktivit na několik oken (bez ohledu na hodnoty manifestu)"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Aktivovat okna s volným tvarem"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index d1d7b23bf3ce..720aeba6d93a 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Vis alle \"Appen svarer ikke\""</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Vis \"Appen svarer ikke\" for baggrundsapps"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Gennemtving tilladelse til eksternt lager"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Gør det muligt at overføre enhver app til et eksternt lager uafhængigt af manifestværdier"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gør det muligt at overføre enhver app til et eksternt lager uafhængigt af manifestværdier"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til at kunne tilpasses"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Tillad, at alle aktiviteter kan tilpasses flere vinduer uafhængigt af manifestværdier."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Aktivér vinduer i frit format"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index fbd1207979e8..ec8407bb3f30 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Alle ANRS anzeigen"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Dialogfeld \"App antwortet nicht\" für Hintergrund-Apps anzeigen"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Externe Speichernutzung von Apps erlauben"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Ermöglicht es jeder qualifizierten App, Daten auf externen Speicher zu schreiben, unabhängig von den Manifestwerten"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ermöglicht es jeder qualifizierten App, Daten auf externen Speicher zu schreiben, unabhängig von den Manifestwerten"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Anpassen der Größe von Aktivitäten erzwingen"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Größe aller Aktivitäten an den Mehrfenstermodus anpassen, unabhängig von den Manifestwerten."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Freiform-Fenster zulassen"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index dce2cf76b3c2..7db585374fb5 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Εμφάνιση όλων των ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Εμφ.του παραθ. \"Η εφαρμ.δεν αποκρ.\" για εφ.παρασκ."</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Να επιτρέπονται υποχρεωτικά εφαρμογές σε εξωτ.συσ."</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Κάνει κάθε εφαρμογή κατάλληλη για εγγραφή σε εξωτερικό χώρο αποθήκευσης, ανεξάρτητα από τις τιμές του μανιφέστου"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Κάνει κάθε εφαρμογή κατάλληλη για εγγραφή σε εξωτερικό αποθηκευτικό χώρο, ανεξάρτητα από τις τιμές του μανιφέστου"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Αναγκαστική δυνατότητα αλλαγής μεγέθους δραστηριοτήτων"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Να έχουν όλες οι δραστηριότητες δυνατότητα αλλαγής μεγέθους για την προβολή πολλαπλών παραθύρων, ανεξάρτητα από τις τιμές του μανιφέστου."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Ενεργοποίηση παραθύρων ελεύθερης μορφής"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 4821a719d1f3..28340313da16 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Make all activities resizable for multi-window, regardless of manifest values."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Enable freeform windows"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 4821a719d1f3..28340313da16 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Make all activities resizable for multi-window, regardless of manifest values."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Enable freeform windows"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 4821a719d1f3..28340313da16 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Make all activities resizable for multi-window, regardless of manifest values."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Enable freeform windows"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 2d0ce027caf0..5f7a4478af72 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Errores sin respuesta"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar diálogo cuando las aplic. en 2do plano no responden"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permisos en almacenamiento externo"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Cualquier aplicación puede escribirse en una memoria externa, independientemente de los valores del manifiesto."</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Cualquier app puede escribirse en un almacenamiento externo, sin importar los valores del manifiesto"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forzar actividades para que cambien de tamaño"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Permitir que todas las actividades puedan cambiar de tamaño para el modo multiventana, sin importar los valores del manifiesto."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Habilitar ventanas de forma libre"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 8dcf6ab8de87..0314f2ef88eb 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Errores sin respuesta"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Informar de que una aplicación en segundo plano no responde"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permiso de aplicaciones de forma externa"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Hace que cualquier aplicación se pueda escribir en un dispositivo de almacenamiento externo, independientemente de los valores definidos"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Hace que cualquier aplicación se pueda escribir en un dispositivo de almacenamiento externo, independientemente de los valores definidos"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forzar el ajuste de tamaño de las actividades"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Permite que se pueda ajustar el tamaño de todas las actividades para el modo multiventana, independientemente de los valores establecidos."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Habilitar ventanas de forma libre"</string> diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml index 62dd7ab70236..6420ccc6fe60 100644 --- a/packages/SettingsLib/res/values-et-rEE/strings.xml +++ b/packages/SettingsLib/res/values-et-rEE/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Näita kõiki ANR-e"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Kuva taustarakendustele dial. Rakendus ei reageeri"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Luba rakendused välises salvestusruumis"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Lubab rakendusi kirjutada välisesse salvestusruumi olenemata manifesti väärtustest"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Lubab mis tahes rakendusi kirjutada välisesse salvestusruumi manifesti väärtustest olenemata"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Muuda tegevuste suurused muudetavaks"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Muudetakse kõigi tegevuste suurused mitme aknaga vaates muudetavaks (manifesti väärtustest olenemata)."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Luba vabas vormis aknad"</string> diff --git a/packages/SettingsLib/res/values-eu-rES/strings.xml b/packages/SettingsLib/res/values-eu-rES/strings.xml index cb6f0b47ca36..30bab3c05fe4 100644 --- a/packages/SettingsLib/res/values-eu-rES/strings.xml +++ b/packages/SettingsLib/res/values-eu-rES/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Erakutsi ANR guztiak"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"\"Erantzunik ez\" mezua atz. planoko aplikazioetarako"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Behartu aplikazioak onartzea kanpoko biltegian"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Aplikazioek kanpoko memorian idatz dezakete, manifestuaren balioak kontuan izan gabe"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikazioek kanpoko memorian idatz dezakete, manifestuaren balioak kontuan izan gabe"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Behartu jardueren tamaina doitu ahal izatea"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Eman aukera jarduera guztien tamaina doitzeko, hainbat leihotan erabili ahal izan daitezen, manifestuan jartzen duena jartzen duela ere."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Gaitu estilo libreko leihoak"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index e7cbd1e05a5f..f1437d75ff8f 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"نمایش تمام ANRها"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"نمایش گفتگوی \"برنامه پاسخ نمیدهد\" برای برنامههای پسزمینه"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"اجازه اجباری به برنامههای دستگاه ذخیره خارجی"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"بدون توجه به مقادیر مانیفست، هر برنامهای را برای نوشتن در حافظه خارجی واجد شرایط میکند"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"بدون توجه به مقادیر مانیفست، هر برنامهای را برای نوشتن در حافظه خارجی واجد شرایط میکند"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"اجبار فعالیتها به قابل تغییر اندازه بودن"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"بدون توجه به مقادیر مانیفست، اندازه همه فعالیتها برای حالت چند پنجرهای میتواند تغییر کند."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"فعال کردن پنجرههای آزاد"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index bb3ad97e41f3..9717a7853dfb 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Näytä kaikki ANR:t"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Näytä Sovellus ei vastaa -ikkuna taustasovell."</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Salli aina ulkoinen tallennus"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Mahdollistaa sovellusten tallentamisen ulkoiseen tall.tilaan luettelosta riippumatta"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Mahdollistaa sovelluksen tietojen tallentamisen ulkoiseen tallennustilaan luetteloarvoista riippumatta."</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Pakota kaikki toiminnot hyväksymään koon muutos"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Pakota kaikki toiminnot hyväksymään koon muuttaminen usean ikkunan tilassa luettelon arvoista riippumatta."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Ota käyttöön vapaamuotoiset ikkunat"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 1f12f1866a68..80181f0d6001 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"Afficher tous les messages «L\'application ne répond pas»"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Afficher « L\'application ne répond plus » pour applis en arrière-plan"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forcer l\'autor. d\'applis sur stockage externe"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Permet enreg. d\'applis sur espace stockage externe"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"Forcer les activités à être redimensionnables"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Permet de redimensionner toutes les activités pour le mode multifenêtre, indépendamment des valeurs du fichier manifeste."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Activer les fenêtres de forme libre"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 3dc2a6a27eb0..b8ff857bb333 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Afficher tous les messages ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Afficher \"L\'application ne répond plus\" pour applis en arrière-plan"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forcer disponibilité stockage externe pour applis"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Rend possible enregistrement de toute appli sur espace stockage externe, indépendamment valeurs fichier manifeste."</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste."</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forcer possibilité de redimensionner les activités"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Permettre de redimensionner toutes les activités pour le mode multifenêtre, indépendamment des valeurs du fichier manifeste."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Activer les fenêtres de forme libre"</string> diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml index 3715919525ea..2cde75237c25 100644 --- a/packages/SettingsLib/res/values-gl-rES/strings.xml +++ b/packages/SettingsLib/res/values-gl-rES/strings.xml @@ -248,9 +248,9 @@ <string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que aplicación segundo plano non responde"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permiso de aplicacións de forma externa"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Fai que calquera aplicación se poida escribir nun almacenamento externo, independentemente dos valores expresados"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permite que calquera aplicación apta se poida escribir nun almacenamento externo, independentemente dos valores expresados"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forzar o axuste do tamaño das actividades"</string> - <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Permite axustar o tamaño de todas as actividades para o modo de varias ventás, independentemente dos valores definidos."</string> + <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Permite axustar o tamaño de todas as actividades para o modo multiventá, independentemente dos valores definidos."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Activar ventás de forma libre"</string> <string name="enable_freeform_support_summary" msgid="8247310463288834487">"Activa a compatibilidade con ventás de forma libre experimentais."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Contrasinal para copias"</string> diff --git a/packages/SettingsLib/res/values-gu-rIN/strings.xml b/packages/SettingsLib/res/values-gu-rIN/strings.xml index c77aeb6776c0..9c25a0feab67 100644 --- a/packages/SettingsLib/res/values-gu-rIN/strings.xml +++ b/packages/SettingsLib/res/values-gu-rIN/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"બધા ANR બતાવો"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"પૃષ્ઠભૂમિ એપ્લિકેશનો માટે એપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ એપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"મૅનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, તમામ પ્રવૃત્તિઓને મલ્ટી-વિંડો માટે ફરીથી કદ બદલી શકે તેવી બનાવો."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"ફ્રિફોર્મ વિંડોઝ સક્ષમ કરો"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index e8a47cb69692..2e1b337ed37c 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"सभी ANR दिखाएं"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि ऐप्स के लिए ऐप्स प्रतिसाद नहीं दे रहा डॉयलॉग दिखाएं"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"ऐप्स को बाहरी मेमोरी पर बाध्य करें"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"इससे कोई भी ऐप मेनिफेस्ट मान अनदेखा करके, बाहरी मेमोरी पर लिखने योग्य बन जाता है"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"इससे कोई भी ऐप्लिकेशन, मेनिफेस्ट मानों को अनदेखा करके बाहरी मेमोरी पर लिखने योग्य बन जाता है"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"आकार बदले जाने के लिए गतिविधियों को बाध्य करें"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"सभी गतिविधियों को एकाधिक विंडो के लिए आकार बदलने योग्य बनाएं, चाहे मेनिफेस्ट मान कुछ भी हों."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"फ़्रीफ़ॉर्म विंडो सक्षम करें"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 320ebc17a4f6..f9dd6b731a78 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaz dijaloga o pozad. aplik. koja ne odgovara"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Prisilno dopusti aplikacije u vanjskoj pohrani"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Aplikacije se mogu zapisivati u vanjsku pohranu neovisno o manifestu"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikacije se mogu zapisivati u vanjsku pohranu neovisno o vrijednostima manifesta"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Nametni mogućnost promjene veličine za aktivnosti"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Omogući mijenjanje veličine svih aktivnosti za više prozora, neovisno o vrijednostima manifesta."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Omogući prozore slobodnog oblika"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 4ea452834838..94fa1bdd2ccc 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Összes ANR mutatása"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Az Alkalmazás nem válaszol ablak megjelenítése"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Külső tárhely alkalmazásainak engedélyezése"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Lehetővé teszi, hogy külső tárhelyre lehessen írni"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Lehetővé teszi bármely alkalmazás külső tárhelyre való írását a jegyzékértékektől függetlenül"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Tevékenységek átméretezésének kényszerítése"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Legyen az összes tevékenység átméretezhető a többablakos megjelenítés érdekében a jegyzékértékektől függetlenül."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Szabad formájú ablakok engedélyezése"</string> diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml index 046ea489b64a..e9232f52a9a3 100644 --- a/packages/SettingsLib/res/values-hy-rAM/strings.xml +++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Ցույց տալ բոլոր ANR-երը"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Ցուցադրել այն ծրագիրը, որը չի արձագանքում երկխոսությունը հետնաշերտի ծրագրերի համար"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Միշտ թույլատրել ծրագրեր արտաքին պահեստում"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Թույլ է տալիս պահել հավելվածը արտաքին սարքում՝ մանիֆեստի արժեքներից անկախ"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Թույլ է տալիս ցանկացած հավելված պահել արտաքին սարքում՝ մանիֆեստի արժեքներից անկախ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Ստիպել, որ ակտիվությունների չափերը լինեն փոփոխելի"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Բոլոր ակտիվությունների չափերը բազմապատուհան ռեժիմի համար դարձնել փոփոխելի՝ մանիֆեստի արժեքներից անկախ:"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Ակտիվացնել կամայական ձևի պատուհանները"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 02c747a1c1bb..397139845e33 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Tampilkan semua ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Tmplkn dialog Apl Tidak Merespons utk apl ltr blkg"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Paksa izinkan aplikasi di eksternal"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Membuat semua aplikasi dapat ditulis ke penyimpanan eksterna"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Membuat semua aplikasi dapat ditulis ke penyimpanan eksternal, terlepas dari nilai manifes"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Paksa aktivitas agar ukurannya dapat diubah"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Buat semua aktivitas dapat diubah ukurannya untuk banyak jendela, terlepas dari nilai manifes."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Aktifkan jendela berformat bebas"</string> diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml index 17a2f0802b85..7f9e7681a005 100644 --- a/packages/SettingsLib/res/values-is-rIS/strings.xml +++ b/packages/SettingsLib/res/values-is-rIS/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Öll forrit sem svara ekki"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Sýna „Forrit svarar ekki“ fyrir bakgrunnsforrit"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Þvinga fram leyfi forrita í ytri geymslu"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Gerir hvaða forriti sem er kleift að skrifa í ytri geymslu, burtséð frá gildum í upplýsingaskrá"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gerir öll forrit skrifanleg í ytra geymslurými, óháð gildum í upplýsingaskrá"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Þvinga breytanlega stærð virkni"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Gera stærð allrar virkni breytanlega svo að hún henti fyrir marga glugga, óháð gildum í upplýsingaskrá."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Virkja glugga með frjálsu sniði"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 9c75939c5dab..147ad4da75fa 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Mostra tutti errori ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Mostra finestra ANR per applicazioni in background"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forza autorizzazione app su memoria esterna"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Rende l\'app idonea all\'installaz. su mem. esterna, senza considerare i valori manifest"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Consente l\'installazione di qualsiasi app su memoria esterna, indipendentemente dai valori manifest"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Imponi formato modificabile alle attività"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Rendi il formato di tutte le attività modificabile per la modalità multi-finestra, indipendentemente dai valori manifest."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Attiva finestre a forma libera"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 429ce612e09d..4fce9b8e0a96 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"הצג את כל פריטי ה-ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"הצג תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"אילוץ הרשאה של אפליקציות באחסון חיצוני"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"אלץ יכולת קביעת גודל של הפעילויות"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"אפשר יכולת קביעת גודל של כל הפעילויות לריבוי חלונות, ללא קשר לערך המניפסט."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"הפעל את האפשרות לשנות את הגודל והמיקום של החלונות"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 6c42110d1b47..b2b36124d1ff 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"すべてのANRを表示"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"バックグラウンドアプリが応答しない場合に通知する"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"外部ストレージへのアプリの書き込みを許可"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"マニフェストの値に関係なく、すべてのアプリを外部ストレージに書き込めるようになります"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"アクティビティをサイズ変更可能にする"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"マニフェストの値に関係なく、マルチウィンドウですべてのアクティビティのサイズを変更できるようにします。"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"フリーフォーム ウィンドウの有効化"</string> diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml index 6dba53b38224..8c34c6384910 100644 --- a/packages/SettingsLib/res/values-ka-rGE/strings.xml +++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"ყველა ANR-ის ჩვენება"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"შეტყობინების ჩვენება, როცა ფონური აპლიკაცია არ პასუხობს"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"აპების დაშვება გარე მეხსიერებაში"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"აპები ჩაიწერ. გარე მეხს.-ზე აღწ. ფაილის მნიშვნ. მიუხედ."</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"აპები ჩაიწერება გარე მეხსიერებაზე აღწერის ფაილების მნიშვნელობების მიუხედავად"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"ზომაცვლადი აქტივობების იძულება"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"მანიფესტის მნიშვნელობების მიუხედავად, მრავალი ფანჯრის რეჟიმისთვის ყველა აქტივობის ზომაცვლადად გადაქცევა."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"თავისუფალი ფორმის მქონე ფანჯრების ჩართვა"</string> diff --git a/packages/SettingsLib/res/values-kk-rKZ/strings.xml b/packages/SettingsLib/res/values-kk-rKZ/strings.xml index 36843fd5bbc6..47d3458b6450 100644 --- a/packages/SettingsLib/res/values-kk-rKZ/strings.xml +++ b/packages/SettingsLib/res/values-kk-rKZ/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Барлық ANR (қолданба жауап бермеді) хабарларын көрсетіңіз"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Фондық қолданбалардың жауап бермегенін көрсету"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Сыртқыда қолданбаларға мәжбүрлеп рұқсат ету"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Манифест мәндеріне қарамастан кез келген қолданбаны сыртқы жадқа жазуға жарамды етеді"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест мәндеріне қарамастан кез келген қолданбаны сыртқы жадқа жазуға жарамды етеді"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Әрекеттерді өлшемін өзгертуге болатын етуге мәжбүрлеу"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Манифест мәндеріне қарамастан бірнеше терезе режимінде барлық әрекеттердің өлшемін өзгертуге рұқсат беру."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Еркін пішіндегі терезелерді қосу"</string> diff --git a/packages/SettingsLib/res/values-km-rKH/strings.xml b/packages/SettingsLib/res/values-km-rKH/strings.xml index 9985a1e1773c..3f2c6c308581 100644 --- a/packages/SettingsLib/res/values-km-rKH/strings.xml +++ b/packages/SettingsLib/res/values-km-rKH/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"បង្ហាញ ANRs ទាំងអស់"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"បង្ហាញប្រអប់កម្មវិធីមិនឆ្លើយតបសម្រាប់កម្មវិធីផ្ទៃខាងក្រោយ"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"បង្ខំឲ្យអនុញ្ញាតកម្មវិធីលើឧបករណ៍ផ្ទុកខាងក្រៅ"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"ធ្វើឲ្យកម្មវិធីទាំងឡាយមានសិទ្ធិសរសេរទៅកាន់ឧបករណ៍ផ្ទុកខាងក្រៅ ដោយមិនគិតពីតម្លៃជាក់លាក់"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"បង្ខំឲ្យសកម្មភាពអាចប្តូរទំហំបាន"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"កំណត់ឲ្យសកម្មភាពទាំងអស់អាចប្តូរទំហំបានសម្រាប់ពហុផ្ទាំងវិនដូ ដោយមិនគិតពីតម្លៃមេនីហ្វេស។"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"បើកដំណើរការផ្ទាំងវិនដូទម្រង់សេរី"</string> diff --git a/packages/SettingsLib/res/values-kn-rIN/strings.xml b/packages/SettingsLib/res/values-kn-rIN/strings.xml index 8ca9807cb93d..009b9f770076 100644 --- a/packages/SettingsLib/res/values-kn-rIN/strings.xml +++ b/packages/SettingsLib/res/values-kn-rIN/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"ಎಲ್ಲ ANR ಗಳನ್ನು ತೋರಿಸು"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ ಎಂಬ ಸಂಭಾಷಣೆ ತೋರಿಸು"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"ಬಾಹ್ಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಒತ್ತಾಯವಾಗಿ ಅನುಮತಿಸಿ"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳನ್ನು ಪರಿಗಣಿಸದೇ, ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳು ಯಾವುದೇ ಆಗಿದ್ದರೂ, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಒತ್ತಾಯ ಮಾಡಿ"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳನ್ನು ಪರಿಗಣಿಸದೇ, ಬಹು-ವಿಂಡೊಗೆ ಎಲ್ಲಾ ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಮಾಡಿ."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"ಮುಕ್ತಸ್ವರೂಪದ ವಿಂಡೊಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 31e037814168..4bfdbfd14416 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"모든 ANR 보기"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"백그라운드 앱에 대해 앱 응답 없음 대화상자 표시"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"외부에서 앱 강제 허용"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"매니페스트 값에 관계없이 앱을 외부 저장소에 작성"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"활동의 크기가 조정 가능하도록 설정"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"모든 활동을 매니페스트 값에 관계없이 멀티 윈도우용으로 크기 조정 가능하도록 설정"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"자유 형식 창 사용"</string> diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index fd2d905004f3..d06aec5c446b 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Бардык ANR\'лерди көрсөтүү"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Фондогу колдонмолорго Колдонмо Жооп Бербейт деп көрсөтүү"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Тышкы сактагычка сактоого уруксат берүү"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Манифест маанилерине карабастан бардык колдонмолорду тышкы сактагычка сактоого уруксат берет"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест маанилерине карабастан бардык колдонмолорду тышкы сактагычка сактоого уруксат берет"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Аракеттердин өлчөмүн өзгөртүүнү мажбурлоо"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Манифест маанилерине карабастан бардык аракеттерди мульти-терезеге өлчөмү өзгөртүлгүдөй кылуу."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Эркин формадагы терезелерди түзүүнү иштетүү"</string> diff --git a/packages/SettingsLib/res/values-lo-rLA/strings.xml b/packages/SettingsLib/res/values-lo-rLA/strings.xml index 605f4765ba4b..c5121a532a2e 100644 --- a/packages/SettingsLib/res/values-lo-rLA/strings.xml +++ b/packages/SettingsLib/res/values-lo-rLA/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"ສະແດງ ANRs ທັງຫມົດ"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"ສະແດງໜ້າຈໍແອັບຯທີ່ບໍ່ຕອບສະໜອງສຳລັບແອັບຯພື້ນຫຼັງ"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"ບັງຄັບອະນຸຍາດແອັບຢູ່ພາຍນອກ"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"ເຮັດໃຫ້ທຸກແອັບມີສິດໄດ້ຮັບການຂຽນໃສ່ບ່ອນຈັດເກັບພາຍນອກ, ໂດຍບໍ່ຄຳນຶງເຖິງຄ່າທີ່ຈະແຈ້ງ"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"ບັງຄັງໃຫ້ກິດຈະກຳປ່ຽນຂະໜາດໄດ້"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ເຮັດໃຫ້ທຸກກິດຈະກຳສາມາດປັບຂະໜາດໄດ້ສຳລັບຫຼາຍໜ້າຈໍ, ໂດຍບໍ່ຄຳນຶງເຖິງຄ່າ manifest."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"ເປີດໃຊ້ໜ້າຕ່າງຮູບແບບອິດສະຫຼະ"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 253eeb375af4..dd1ccc84d9c8 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Rodyti visus ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Fon. programose rodyti dialogo langą „Neatsako“"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Priverstinai leisti programas išorinėje atmintin."</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Vis. pr. gal. įr. į vid. saug. nepais. apr. vert."</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Nustatoma, kad visas programas būtų galima įrašyti į išorinę saugyklą, nepaisant aprašo verčių"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Priv. nust., kad veiksm. b. g. atl. kelių d. lang."</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Nustatyti, kad visus veiksmus būtų galima atlikti kelių dydžių languose, nepaisant aprašo verčių."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Įgalinti laisvos formos langus"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 3323cd99d164..009ccf6b113d 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Rādīt visus ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Rādīt fona lietotņu dialoglodz. Lietotne nereaģē"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Lietotņu piespiedu atļaušana ārējā krātuvē"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Ļauj jebkuru lietotni ierakstīt ārējā krātuvē neatkarīgi no manifesta vērtības."</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ļauj jebkuru lietotni ierakstīt ārējā krātuvē neatkarīgi no manifesta vērtības."</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Pielāgot darbības"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Pielāgot visas darbības vairāku logu režīmam neatkarīgi no vērtībām manifestā."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Iespējot brīvās formas logus"</string> diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml index 41c8600f892f..0c2ddf4cafdb 100644 --- a/packages/SettingsLib/res/values-mk-rMK/strings.xml +++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"Прикажи ги сите ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Прикажи „Апл. не реагира“ за. апл. во заднина"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Принуд. дозволете апликации на надворешна меморија"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Запишува апл. во надв.меморија, незав. од манифест"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"Принуди ги активностите да ја менуваат големината"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Направете сите активности да бидат со променлива големина за повеќе прозорци, без разлика на вредностите на манифестот."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Овозможи прозорци со слободна форма"</string> diff --git a/packages/SettingsLib/res/values-ml-rIN/strings.xml b/packages/SettingsLib/res/values-ml-rIN/strings.xml index 80cf43ecc49b..3b4acd2656b0 100644 --- a/packages/SettingsLib/res/values-ml-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ml-rIN/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"എല്ലാ ANR-കളും ദൃശ്യമാക്കുക"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"പശ്ചാത്തല അപ്ലിക്കേഷനുകൾക്ക് അപ്ലിക്കേഷൻ പ്രതികരിക്കുന്നില്ല എന്ന ഡയലോഗ് കാണിക്കുക"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"ബാഹ്യമായതിൽ നിർബന്ധിച്ച് അനുവദിക്കുക"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"മാനിഫെസ്റ്റ് മൂല്യങ്ങൾ പരിഗണിക്കാതെ, ബാഹ്യ സ്റ്റോറേജിലേക്ക് എഴുതപ്പെടുന്നതിന് ഏതൊരു ആപ്പിനെയും യോഗ്യമാക്കുന്നു"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"വലിപ്പം മാറ്റാൻ പ്രവർത്തനങ്ങളെ നിർബന്ധിക്കുക"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"മാനിഫെസ്റ്റ് മൂല്യങ്ങൾ പരിഗണിക്കാതെ, എല്ലാ ആക്ടിവിറ്റികളെയും മൾട്ടി-വിൻഡോയ്ക്കായി വലിപ്പം മാറ്റുക."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"ഫ്രീഫോം വിൻഡോകൾ പ്രവർത്തനക്ഷമമാക്കുക"</string> diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml index 5e7ea1544911..4473f7f18158 100644 --- a/packages/SettingsLib/res/values-mn-rMN/strings.xml +++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"Бүх ANRs харуулах"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Далд апп-уудад Апп Хариу Өгөхгүй байна гэснийг харуулах"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Апп-ыг гадаад санах ойд хадгалахыг зөвшөөрөх"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Манифест утгыг нь үл хамааран дурын апп-ыг гадаад санах ойд бичих боломжтой болгодог"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"Үйл ажиллагааны хэмжээг өөрчилж болохуйц болгох"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Тодорхойлогч файлын утгыг үл хамааран, бүх үйл ажиллагааны хэмжээг олон цонхонд өөрчилж болохуйц болгоно уу."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Чөлөөт хэлбэрийн цонхыг идэвхжүүлэх"</string> diff --git a/packages/SettingsLib/res/values-mr-rIN/strings.xml b/packages/SettingsLib/res/values-mr-rIN/strings.xml index 7a3d76db967c..d8075aa22380 100644 --- a/packages/SettingsLib/res/values-mr-rIN/strings.xml +++ b/packages/SettingsLib/res/values-mr-rIN/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"सर्व ANR दर्शवा"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"पार्श्वभूमी अॅप्ससाठी अॅप प्रतिसाद देत नाही संवाद दर्शवा"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यवर अॅप्सना अनुमती देण्याची सक्ती करा"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"मॅनिफेस्ट मूल्यांकडे दुर्लक्ष करून, कोणत्याही अॅपला बाह्य संचयनावर लेखन केले जाण्यासाठी पात्र बनविते"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"मॅनिफेस्ट मूल्यांकडे दुर्लक्ष करून, कोणत्याही अॅपला बाह्य संचयनावर लेखन केले जाण्यासाठी पात्र बनविते"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"क्रियाकलापाचा आकार बदलण्यायोग्य होण्याची सक्ती करा"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"मॅनिफेस्ट मूल्यांकडे दुर्लक्ष करून, एकाधिक-विंडोसाठी सर्व क्रियाकलापांचा आकार बदलण्यायोग्य करा."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"freeform विंडो सक्षम करा"</string> diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml index 3f2968711d7b..44ed1f6a068f 100644 --- a/packages/SettingsLib/res/values-ms-rMY/strings.xml +++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"Tunjukkan semua ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Tunjukkan dialog Aplikasi Tidak Memberi Maklum Balas untuk aplikasi latar belakang"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Benarkan apl secara paksa pada storan luaran"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Menjadikan sebarang apl layak ditulis ke storan luaran, walau apa juga nilai manifesnya"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"Paksa aktiviti supaya boleh diubah saiz"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Bolehkan semua saiz aktiviti diubah untuk berbilang tetingkap, tanpa mengambil kira nilai manifes."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Dayakan tetingkap bentuk bebas"</string> diff --git a/packages/SettingsLib/res/values-my-rMM/strings.xml b/packages/SettingsLib/res/values-my-rMM/strings.xml index 71862a308098..bf2ea80f4d01 100644 --- a/packages/SettingsLib/res/values-my-rMM/strings.xml +++ b/packages/SettingsLib/res/values-my-rMM/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"ANRsအားလုံးအား ပြသရန်"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"နောက်ခံအပ်ပလီကေးရှင်းအတွက်တုံ့ပြန်မှုမရှိပြရန်"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"အပြင်မှာ အတင်း ခွင့်ပြုရန်"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"ပြနေတဲ့ တန်ဖိုး ဘယ်လိုပဲရှိနေနေ၊ ဘယ် appကို မဆို အပြင် သိုလှောင်ခန်းသို့ ရေးသားခွင့် ပေးတယ်"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"တိကျစွာ သတ်မှတ်ထားသည့်တန်ဖိုးများရှိသော်လည်း၊ ပြင်ပသိုလှောင်ခန်းများသို့ မည်သည့်အက်ပ်ကိုမဆို သိမ်းဆည်းခွင့်ပြုပါ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"လုပ်ဆောင်ချက်များ ဆိုက်ညှိရနိုင်ရန် လုပ်ခိုင်းပါ"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"မန်နီးဖက်စ်တန်ဖိုးများ မည်မျှပင်ရှိစေကာမူ၊ ဝင်းဒိုးများအတွက် လှုပ်ရှားမှုများအားလုံးကို အရွယ်အစားချိန်ခြင်း ပြုလုပ်ပါ။"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"အခမဲ့ပုံစံ ဝင်းဒိုးကို ဖွင့်ပါ"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 2ad14dcbb197..94993d4bb14a 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Vis alle ANR-er"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Vis Appen svarer ikke-dialog for bakgrunnsapper"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Tving frem tillatelse for ekstern lagring av apper"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Gjør at apper kan skrives til ekstern lagring, uavhengig av manifestverdier"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Dette gjør at alle apper kan lagres på ekstern lagring – uavhengig av manifestverdier"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til å kunne endre størrelse"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Gjør at alle aktivitetene kan endre størrelse for flervindusmodus, uavhengig av manifestverdier."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Slå på vinduer i fritt format"</string> diff --git a/packages/SettingsLib/res/values-ne-rNP/strings.xml b/packages/SettingsLib/res/values-ne-rNP/strings.xml index 6c8dc59c8b9e..8d253154ec3b 100644 --- a/packages/SettingsLib/res/values-ne-rNP/strings.xml +++ b/packages/SettingsLib/res/values-ne-rNP/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"सबै ANRs देखाउनुहोस्"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि अनुप्रयोगका लागि जवाफ नदिइरहेका अनुप्रयोगहरू देखाउनुहोस्"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यमा बल प्रयोगको अनुमति प्राप्त अनुप्रयोगहरू"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"म्यानिफेेस्टको उपेक्षा गरी, कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न योग्य बनाउँछ"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"म्यानिफेेस्टका मानहरूको ख्याल नगरी कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न सकिने खाले बनाउँछ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"गतिविधिहरू रिसाइज गर्नको लागि बाध्य गर्नुहोस्"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"म्यानिफेेस्ट मानहरूको ख्याल नगरी, बहु-विन्डोको लागि सबै रिसाइज गर्न सकिने गतिविधिहरू बनाउनुहोस्।"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"फ्रिफर्म विन्डोहरू सक्रिय गर्नुहोस्"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 7f9df25cdf40..c60e9df610b5 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Alle ANR\'s weergeven"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"\'App reageert niet\' weerg. voor apps op achtergr."</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Toestaan van apps op externe opslag afdwingen"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Hierdoor komt een app in aanmerking om te worden geschreven naar externe opslag, ongeacht de manifestwaarden"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Formaat activiteiten geforceerd aanpasbaar maken"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Het formaat van alle activiteiten aanpasbaar maken, ongeacht de manifestwaarden."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Vensters met vrije vorm inschakelen"</string> diff --git a/packages/SettingsLib/res/values-pa-rIN/strings.xml b/packages/SettingsLib/res/values-pa-rIN/strings.xml index 10d57f426837..3771536bc887 100644 --- a/packages/SettingsLib/res/values-pa-rIN/strings.xml +++ b/packages/SettingsLib/res/values-pa-rIN/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"ਸਾਰੇ ANR ਦਿਖਾਓ"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"ਪਿਛੋਕੜ ਐਪਸ ਲਈ ਐਪਸ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੇ ਡਾਇਲੌਗ ਦਿਖਾਓ"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"ਐਪਸ ਨੂੰ ਬਾਹਰਲੇ ਤੇ ਜ਼ਬਰਦਸਤੀ ਆਗਿਆ ਦਿਓ"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"ਇੱਕ ਐਪ ਨੂੰ ਬਾਹਰਲੀ ਸਟੋਰੇਜ ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ, ਮੈਨੀਫੈਸਟ ਵੈਲਯੂਜ ਤੇ ਵਿਚਾਰ ਕੀਤੇ ਬਿਨਾਂ"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"ਮੁੜ-ਆਕਾਰ ਬਦਲਣ ਲਈ ਸਰਗਰਮੀਆਂ \'ਤੇ ਜ਼ੋਰ ਦਿਓ"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਮਲਟੀ-ਵਿੰਡੋ ਲਈ ਸਾਰੀਆਂ ਸਰਗਰਮੀਆਂ ਨੂੰ ਆਕਾਰ ਬਦਲਣਯੋਗ ਬਣਾਓ।"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"freeform windows ਨੂੰ ਯੋਗ ਬਣਾਓ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 3e8909408e19..cd4cc83bec89 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Pokaż wszystkie ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Pokaż okno Aplikacja Nie Reaguje dla aplikacji w tle"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Wymuś zezwalanie na aplikacje w pamięci zewn."</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Pozwala na zapis aplikacji w pamięci zewn. niezależnie od wartości w pliku manifestu"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Pozwala na zapis aplikacji w pamięci zewnętrznej niezależnie od wartości w pliku manifestu"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Wymuś zmianę rozmiaru okien aktywności"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Zezwól na zmianę rozmiaru wszystkich okien aktywności w trybie wielu okien niezależnie od ustawień w pliku manifestu."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Włącz dowolny rozmiar okien"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index c772ded4482a..64a97b9f0072 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANRS"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Exibir \"App não responde\" para app em 2º plano"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forçar permissão de apps em armazenamento externo"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Qualifica apps p/ gravação em armazenamento externo, independentemente de valores de manifestos"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Qualifica apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forçar atividades a serem redimensionáveis"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Tornar todas as atividades redimensionáveis para várias janelas, independentemente dos valores do manifesto."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Ativar janelas de forma livre"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 2b3dcc75032f..b648589f8b4a 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar erro \"Aplic. não Resp.\" p/ aplic. 2º plano"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forçar perm. de aplicações no armazenamento ext."</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Qualquer aplic. pode ser gravada no arm. ext., independ. dos valores do manif."</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Torna qualquer aplicação elegível para ser gravada no armazenamento externo, independentemente dos valores do manifesto"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forçar as atividades a serem redimensionáveis"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Tornar todas as atividades redimensionáveis para várias janelas, independentemente dos valores do manifesto."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Ativar janelas de forma livre"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index c772ded4482a..64a97b9f0072 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANRS"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Exibir \"App não responde\" para app em 2º plano"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forçar permissão de apps em armazenamento externo"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Qualifica apps p/ gravação em armazenamento externo, independentemente de valores de manifestos"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Qualifica apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forçar atividades a serem redimensionáveis"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Tornar todas as atividades redimensionáveis para várias janelas, independentemente dos valores do manifesto."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Ativar janelas de forma livre"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 0322f55af58d..b0c50649573a 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Afișați toate elem. ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Aplicații din fundal: afișați Aplicația nu răspunde"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forțați accesul aplicațiilor la stocarea externă"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Face orice aplicație eligibilă să fie scrisă în stocarea externă, indiferent de valorile manifestului"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Face orice aplicație eligibilă să fie scrisă în stocarea externă, indiferent de valorile manifestului"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forțați redimensionarea activităților"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Permiteți redimensionarea tuturor activităților pentru modul cu ferestre multiple, indiferent de valorile manifestului."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Activați ferestrele cu formă liberă"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 7548ace52c35..4aa4c1006c64 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Все ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Уведомлять о том, что приложение не отвечает"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Разрешить сохранение на внешние накопители"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Разрешает сохранение приложений на внешние накопители независимо от значения манифеста"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Разрешает сохранение приложений на внешних накопителях независимо от значений манифеста"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Изменение размера в многооконном режиме"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Разрешить изменение размера в многооконном режиме (независимо от значений манифеста)"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Разрешить создание окон произвольной формы"</string> diff --git a/packages/SettingsLib/res/values-si-rLK/strings.xml b/packages/SettingsLib/res/values-si-rLK/strings.xml index f3d6dc3686cd..b5053ddce0cf 100644 --- a/packages/SettingsLib/res/values-si-rLK/strings.xml +++ b/packages/SettingsLib/res/values-si-rLK/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"සියලුම ANR පෙන්වන්න"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"පසුබිම් යෙදුම් වලට යෙදුම ප්රතිචාර නොදක්වයි කවුළුව පෙන්වන්න"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"බාහිර මත යෙදුම් ඉඩ දීම බල කරන්න"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"මැනිෆෙස්ට් අගයන් නොසලකා, ඕනෑම යෙදුමක් අභ්යන්තර ගබඩාවට ලිවීමට සුදුසුකම් ලබා දෙයි"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"ක්රියාකාරකම් ප්රතිප්රමාණ කළ හැකි බවට බල කරන්න"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"මැනිෆෙස්ට් අගයන් නොසලකා, සියලු ක්රියාකාරකම් බහු-කවුළුව සඳහා ප්රතිප්රමාණ කළ හැකි බවට පත් කරන්න."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"අනියම් හැඩැති කවුළු සබල කරන්න"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 712c34893081..852bd9e34dba 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Zobrazovať všetky ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Zobrazovať dialóg „Aplikácia neodpovedá“ aj pre aplikácie na pozadí"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Vynútiť povolenie aplikácií na externom úložisku"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Umožňuje zapísať akúkoľvek aplikáciu do externého úložiska bez ohľadu na hodnoty v manifeste"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Umožňuje zapísať akúkoľvek aplikáciu do externého úložiska bez ohľadu na hodnoty v manifeste"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Vynútiť možnosť zmeny veľkosti aktivít"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Veľkosti všetkých aktivít bude možné zmeniť na niekoľko okien (bez ohľadu na hodnoty manifestu)."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Povoliť okná s voľným tvarom"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 2f23144ba46a..830399f48fb6 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Pokaži okna neodzivanj"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaz pogovornega okna za neodzivanje aplikacije v ozadju"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Vsili omogočanje aplikacij v zunanji shrambi"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsako aplikacijo zapisati v zunanjo shrambo"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsako aplikacijo zapisati v zunanjo shrambo"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Vsili povečanje velikosti za aktivnosti"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsem aktivnostim povečati velikost za način z več okni."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Omogočanje oken svobodne oblike"</string> diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml index 853dd2fb4d66..10b91346968c 100644 --- a/packages/SettingsLib/res/values-sq-rAL/strings.xml +++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Shfaq raportet ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Shfaq raportet ANR (Aplikacioni nuk përgjigjet) për aplikacionet në sfond"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Detyro lejimin në hapësirën e jashtme"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Bën që çdo aplikacion të jetë i përshtatshëm për t\'u shkruar në hapësirën ruajtëse të jashtme, pavarësisht nga vlerat e manifestit"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Bën që çdo aplikacion të jetë i përshtatshëm për t\'u shkruar në hapësirën ruajtëse të jashtme, pavarësisht nga vlerat e manifestit"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Detyro madhësinë e ndryshueshme për aktivitetet"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Bëj që të gjitha aktivitetet të kenë madhësi të ndryshueshme për përdorimin me shumë dritare, pavarësisht vlerave të manifestit."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Aktivizo dritaret me formë të lirë"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 094a405dce93..51b2b10ebf3c 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Прикажи све ANR-ове"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Прикажи дијалог Апликација не реагује за апликације у позадини"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Принудно дозволи апликације у спољној"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Омогућава уписивање свих апликација у спољну меморију, без обзира на вредности манифеста"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Омогућава уписивање свих апликација у спољну меморију, без обзира на вредности манифеста"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Принудно омогући промену величине активности"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Омогући промену величине свих активности за режим са више прозора, без обзира на вредности манифеста."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Омогући прозоре произвољног формата"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index e12d39445950..c19f7f46209f 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Visa alla som inte svarar"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Visa dialogrutan om att appen inte svarar för bakgrundsappar"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Tillåt appar i externt lagringsutrymme"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Appen kan skrivas till extern lagring, oavsett manifestvärden"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Allar appar kan skrivas till extern lagring, oavsett manifestvärden"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Framtvinga storleksanpassning för aktiviteter"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Gör det möjligt att ändra storleken på alla aktiviteter i flerfönsterläge, oavsett manifestvärden."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Aktivera frihandsfönster"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index d5a9d1b2989a..091a447f05d0 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Onyesha ANR zote"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Onyesha kisanduku kidadisi cha Programu Haiitikii kwa programu za usuli"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Lazima uruhusu programu kwenye hifadhi ya nje"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Huweka programu kwenye hifadhi ya nje, bila kujali maelezo"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Huruhusu programu yoyote iwekwe kwenye hifadhi ya nje, bila kujali thamani za faili ya maelezo"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Lazimisha shughuli ziweze kubadilishwa ukubwa"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Fanya shughuli zote ziweze kubadilishwa ukubwa kwenye madirisha mengi, bila kuzingatia thamani za faili ya maelezo."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Washa madirisha yenye muundo huru"</string> diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index 5c7732f81612..105b98003e38 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"எல்லா ANRகளையும் காட்டு"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"பின்புலப் பயன்பாடுகளுக்குப் பயன்பாடு பதிலளிக்கவில்லை என்ற உரையாடலைக் காட்டு"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"பயன்பாடுகளை வெளிப்புறச் சேமிப்பிடத்தில் அனுமதி"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"மேனிஃபெஸ்ட் மதிப்புகளை பொருட்படுத்தாமல், எந்தப் பயன்பாட்டையும் வெளிப்புற சேமிப்பிடத்தில் எழுத அனுமதிக்கும்"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"செயல்பாடுகளை அளவுமாறக்கூடியதாக அமை"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"மேனிஃபெஸ்ட் மதிப்புகளைப் பொருட்படுத்தாமல், பல சாளரத்திற்கு எல்லா செயல்பாடுகளையும் அளவுமாறக்கூடியதாக அமை."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"குறிப்பிட்ட வடிவமில்லாத சாளரங்களை இயக்கு"</string> diff --git a/packages/SettingsLib/res/values-te-rIN/strings.xml b/packages/SettingsLib/res/values-te-rIN/strings.xml index a74fc8207f32..91ee5fa9d2ca 100644 --- a/packages/SettingsLib/res/values-te-rIN/strings.xml +++ b/packages/SettingsLib/res/values-te-rIN/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"అన్ని ANRలను చూపు"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"నేపథ్య అనువర్తనాల కోసం అనువర్తనం ప్రతిస్పందించడం లేదు డైలాగ్ను చూపు"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"అనువర్తనాలను బాహ్య నిల్వలో నిర్బంధంగా అనుమతించు"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"ఏ అనువర్తనాన్ని అయినా మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా బాహ్య నిల్వలో వ్రాయగలిగేలా అనుమతిస్తుంది"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ఏ అనువర్తనాన్ని అయినా మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా బాహ్య నిల్వలో వ్రాయడానికి అనుమతిస్తుంది"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"కార్యాచరణలను పరిమాణం మార్చగలిగేలా నిర్బంధించు"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా అన్ని కార్యాచరణలను పలు రకాల విండోల్లో సరిపోయేట్లు పరిమాణం మార్చగలిగేలా చేస్తుంది."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"స్వతంత్ర రూప విండోలను ప్రారంభించండి"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 53caea574786..b5ec3d9ea381 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"แสดง ANR ทั้งหมด"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"แสดงหน้าต่างแอปไม่ตอบสนอง สำหรับแอปพื้นหลัง"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"บังคับให้แอปสามารถใช้ที่เก็บภายนอก"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"ให้สามารถเขียนแอปต่างๆ ไปยังที่เก็บภายนอกได้ โดยไม่คำนึงถึงค่าในไฟล์ Manifest"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"บังคับให้กิจกรรมปรับขนาดได้"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ทำให้กิจกรรมทั้งหมดปรับขนาดได้สำหรับหน้าต่างหลายบาน โดยไม่คำนึงถึงค่าในไฟล์ Manifest"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"เปิดใช้หน้าต่างรูปแบบอิสระ"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 0c1f1678e125..d3bcc5fde9b0 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"Ipakita ang lahat ng ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"App Not Responding dialog para sa background apps"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Pwersahang payagan ang mga app sa external"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Mara-write na sa external storage ang anumang app, anuman ang manifest value"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"Sapilitang gawing resizable ang mga aktibidad"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Gawing nare-resize ang lahat ng aktibidad para sa multi-window, anuman ang mga value ng manifest."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"I-enable ang mga freeform window"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 230da226301a..a8f26202d7d3 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"Tüm ANR\'leri göster"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Arka plan uygulamalar için Uygulama Yanıt Vermiyor mesajını göster"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Harici birimdeki uygulamalara izin vermeye zorla"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Bildirilen değerlerden bağımsız olarak uygulamaları harici depolamaya yazmak için uygun hale getirir"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"Etkinlikleri yeniden boyutlandırılabilmeye zorla"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Manifest değerlerinden bağımsız olarak, tüm etkinlikleri birden fazla pencerede yeniden boyutlandırılabilir yap."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Serbest biçimli pencereleri etkinleştir"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 01cedc6c03ad..d094ef7f5617 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Показувати всі ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Сповіщати, коли додаток не відповідає"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Примусово записувати додатки в зовнішню пам’ять"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Додатки можна записувати на зовнішню пам’ять незалежно від значень маніфесту"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Можна записувати додатки в зовнішню пам’ять, незалежно від значень у маніфесті"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Примусово масштабувати активність"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Масштабувати активність на кілька вікон, незалежно від значень у файлі маніфесту."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Увімкнути вікна довільного формату"</string> diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml index 878ff0cf29fc..27046dc6c60e 100644 --- a/packages/SettingsLib/res/values-ur-rPK/strings.xml +++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"سبھی ANRs کو دکھائیں"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"پس منظر کی ایپس کیلئے ایپ جواب نہیں دے رہی ہے ڈائلاگ دکھائیں"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"بیرونی پر ایپس کو زبردستی اجازت دیں"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"manifest اقدار سے قطع نظر، کسی بھی ایپ کو بیرونی اسٹوریج پر لکھے جانے کا اہل بناتا ہے"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"manifest اقدار سے قطع نظر، کسی بھی ایپ کو بیرونی اسٹوریج پر لکھے جانے کا اہل بناتا ہے"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"سرگرمیوں کو ری سائز ایبل بنائیں"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"manifest اقدار سے قطع نظر، ملٹی ونڈو کیلئے تمام سرگرمیوں کو ری سائز ایبل بنائیں۔"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"freeform ونڈوز فعال کریں"</string> diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml index d81a0414cb5b..031f8f7ce864 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Hamma ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Ilova javob bermayotgani haqida xabar qilish"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Tashqi xotira qurilmasidagi ilova dasturlariga majburiy ruxsat berish"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Manifest qiymatidan qat’i nazar istalgan ilovani tashqi xotiraga saqlash imkonini beradi"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Manifest qiymatidan qat’i nazar istalgan ilovani tashqi xotiraga saqlash imkonini beradi"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Harakatlarni moslashuvchan o‘lchamga keltirish"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Manifest qiymatidan qat’i nazar barcha harakatlarni ko‘p oynali rejimga moslashtirish."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Erkin shakldagi oynalarni yoqish"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 2b4bddd118c0..f3fb96a353a8 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"Hiển thị tất cả ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Hiện hộp thoại Ứng dụng ko đáp ứng cho ứng dụng nền"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Buộc cho phép các ứng dụng trên bộ nhớ ngoài"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Giúp ứng dụng bất kỳ đủ điều kiện được ghi vào bộ nhớ ngoài bất kể giá trị tệp kê khai là gì"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"Buộc các hoạt động có thể thay đổi kích thước"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Giúp tất cả hoạt động có thể thay đổi kích thước cho nhiều cửa sổ bất kể giá trị tệp kê khai là gì."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Bật cửa sổ dạng tự do"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 48f03b7616bb..348a319ebec6 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"显示所有“应用无响应”(ANR)"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"为后台应用显示“应用无响应”对话框"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"强制允许将应用写入外部存储设备"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"允许将任何应用写入外部存储设备(无论清单值是什么)"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"强制将活动设为可调整大小"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"将所有 Activity 设为可配合多窗口环境调整大小(忽略清单值)。"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"启用可自由调整的窗口"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 38656e570e2f..6adabc986f37 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"顯示所有 ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"顯示背景應用程式的「應用程式無回應」對話框"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"強制允許應用程式寫入到外部儲存空間"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"允許將所有應用程式寫入到外部儲存完間 (所有資訊清單值)"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"強制可變更活動尺寸"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"在任何資訊清單值下,允許系統配合多重視窗環境調整所有活動的尺寸。"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"啟用自由形態視窗"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index af83365e969e..f4aade029aa7 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -248,7 +248,8 @@ <string name="show_all_anrs" msgid="28462979638729082">"顯示所有無回應程式"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"為背景應用程式顯示「應用程式無回應」對話方塊"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"強制允許將應用程式寫入外部儲存空間"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"允許將任何應用程式寫入外部儲存空間 (無論資訊清單值為何)"</string> + <!-- no translation found for force_allow_on_external_summary (3640752408258034689) --> + <skip /> <string name="force_resizable_activities" msgid="8615764378147824985">"將活動強制設為可調整大小"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"將所有活動設為可配合多重視窗環境調整大小 (無論資訊清單值為何)。"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"啟用自由形式視窗"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 16841d3297df..268cdb2b809e 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -248,7 +248,7 @@ <string name="show_all_anrs" msgid="28462979638729082">"Bonisa wonke ama-ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Boniso idayalogi Yohlelo Lokusebenza Olungasabeli kwizinhlelo zokusebenza zasemuva"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Phoqelela ukuvumela izinhlelo zokusebenza ngaphandle"</string> - <string name="force_allow_on_external_summary" msgid="3191952505860343233">"Yenza noma uluphi uhlelo lokusebenza lifaneleke ukuthi libhalwe kusitoreji sangaphandle, ngaphandle kwamavelu we-manifest"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Yenza noma uluphi uhlelo lokusebenza lifaneleke ukuthi libhalwe kusitoreji sangaphandle, ngaphandle kwamavelu we-manifest"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Imisebenzi yamandla izonikezwa usayizi omusha"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Yenza yonke imisebenzi ibe nosayizi abasha kumawindi amaningi, ngokunganaki amavelu e-manifest."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Nika amandla amawindi e-freeform"</string> diff --git a/packages/Shell/res/layout/dialog_bugreport_info.xml b/packages/Shell/res/layout/dialog_bugreport_info.xml index b6b8d6bcf2b2..bb3084f5c10a 100644 --- a/packages/Shell/res/layout/dialog_bugreport_info.xml +++ b/packages/Shell/res/layout/dialog_bugreport_info.xml @@ -19,6 +19,7 @@ android:paddingTop="15dp" android:paddingStart="24dp" android:paddingEnd="24dp" + android:focusableInTouchMode="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView @@ -30,7 +31,6 @@ 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"/> diff --git a/packages/Shell/res/values-es/strings.xml b/packages/Shell/res/values-es/strings.xml index 68abf83b4ed8..730ae73cb1a5 100644 --- a/packages/Shell/res/values-es/strings.xml +++ b/packages/Shell/res/values-es/strings.xml @@ -19,13 +19,13 @@ <string name="app_label" msgid="3701846017049540910">"Shell"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Se está generando el informe de errores <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Informe de errores <xliff:g id="ID">#%d</xliff:g> capturado"</string> - <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Informe de errores <xliff:g id="ID">#%d</xliff:g> capturado (captura pendiente)"</string> + <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Informe <xliff:g id="ID">#%d</xliff:g> registrado (captura pantalla pendiente)"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Añadiendo detalles al informe de errores"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Espera…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Desliza el dedo hacia la izquierda para compartir el informe de error"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Toca para compartir el informe de errores"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Toca para compartir informe de errores sin captura de pantalla o espera a que se haga la captura."</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Toca para compartir informe de errores sin captura de pantalla o espera a que se haga la captura."</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Toca para compartir el informe de errores sin captura de pantalla o espera a que se haga la captura."</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Toca para compartir el informe de errores sin captura de pantalla o espera a que se haga la captura."</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Los informes de errores contienen datos de los distintos archivos de registro del sistema, incluida información personal y privada. Comparte los informes de errores únicamente con aplicaciones y usuarios en los que confíes."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostrar este mensaje la próxima vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes de error"</string> diff --git a/packages/Shell/res/values-gl-rES/strings.xml b/packages/Shell/res/values-gl-rES/strings.xml index e462ceefcfe2..d4610977ba4b 100644 --- a/packages/Shell/res/values-gl-rES/strings.xml +++ b/packages/Shell/res/values-gl-rES/strings.xml @@ -19,7 +19,7 @@ <string name="app_label" msgid="3701846017049540910">"Shell"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Estase xerando o informe de erros <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Rexistrouse o informe de erros <xliff:g id="ID">#%d</xliff:g>"</string> - <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Inf. erros rexistrado <xliff:g id="ID">#%d</xliff:g> e captura pantalla pendente"</string> + <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Inf. erros <xliff:g id="ID">#%d</xliff:g> rexistrado e captura pantalla pendente"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Engadindo detalles ao informe de erro"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Agarda..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Pasa o dedo á esquerda para compartir o teu informe de erros"</string> diff --git a/packages/Shell/res/values-it/strings.xml b/packages/Shell/res/values-it/strings.xml index d7d62e298680..5c4b8d3f324c 100644 --- a/packages/Shell/res/values-it/strings.xml +++ b/packages/Shell/res/values-it/strings.xml @@ -19,13 +19,13 @@ <string name="app_label" msgid="3701846017049540910">"Shell"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Generazione segnalazione di bug <xliff:g id="ID">#%d</xliff:g> in corso"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Segnalazione di bug <xliff:g id="ID">#%d</xliff:g> acquisita"</string> - <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Segnalazione di bug <xliff:g id="ID">#%d</xliff:g> acquisita, screenshot in attesa"</string> + <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Segnalazione bug <xliff:g id="ID">#%d</xliff:g> acquisita, screenshot in attesa"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Aggiunta di dettagli alla segnalazione di bug"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Attendi..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Scorri verso sinistra per condividere il rapporto sui bug"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Tocca per condividere la segnalazione di bug"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Tocca per condividere la segnalazione di bug senza screenshot o attendi che lo screenshot sia completo"</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tocca per condividere la segnalazione di bug senza screenshot o attendi che lo screenshot sia completo"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Tocca per inviare la segnalazione del bug senza screenshot o attendi che lo screenshot sia completo"</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tocca per inviare la segnalazione del bug senza screenshot o attendi che lo screenshot sia completo"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Le segnalazioni di bug contengono dati da vari file di log del sistema, incluse informazioni personali e private. Condividi le segnalazioni di bug solo con app e persone attendibili."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostra questo messaggio la prossima volta"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapporti sui bug"</string> diff --git a/packages/Shell/res/values-kk-rKZ/strings.xml b/packages/Shell/res/values-kk-rKZ/strings.xml index 9c2e4e73f346..90028ca462b3 100644 --- a/packages/Shell/res/values-kk-rKZ/strings.xml +++ b/packages/Shell/res/values-kk-rKZ/strings.xml @@ -19,13 +19,13 @@ <string name="app_label" msgid="3701846017049540910">"Қабыршық"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"<xliff:g id="ID">#%d</xliff:g> қате туралы есебі жасалуда"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"<xliff:g id="ID">#%d</xliff:g> қате туралы есебі жазып алынды"</string> - <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"<xliff:g id="ID">#%d</xliff:g> қате туралы есебі жазып алынды, бірақ скриншот күтуде"</string> + <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"<xliff:g id="ID">#%d</xliff:g> қате туралы есебі жазып алынды, бірақ скриншот әлі сақталған жоқ"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Қате туралы есепке мәліметтер қосылуда"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Күте тұрыңыз…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Қате туралы есепті бөлісу үшін солға жанаңыз"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Қате туралы есепті бөлісу үшін түртіңіз"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Қате туралы есепті скриншотсыз бөлісу үшін түртіңіз немесе скриншоттың аяқталуын күтіңіз"</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Қате туралы есепті скриншотсыз бөлісу үшін түртіңіз немесе скриншоттың аяқталуын күтіңіз"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Қате туралы есепті скриншотсыз бөлісу үшін түртіңіз немесе скриншот сақталып болғанша күтіңіз"</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Қате туралы есепті скриншотсыз бөлісу үшін түртіңіз немесе скриншот сақталып болғанша күтіңіз"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Вирус туралы баянатта жүйеде тіркелген әртүрлі файлдар туралы деректер болады, оған жеке және құпия ақпарат та кіреді. Вирус баянаттарын сенімді қолданбалар және сенімді адамдармен ғана бөлісіңіз."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Бұл хабарды келесі жолы көрсетіңіз"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Қате туралы баяндамалар"</string> diff --git a/packages/Shell/res/values-ky-rKG/strings.xml b/packages/Shell/res/values-ky-rKG/strings.xml index e4039fe8c78e..16a954931a6c 100644 --- a/packages/Shell/res/values-ky-rKG/strings.xml +++ b/packages/Shell/res/values-ky-rKG/strings.xml @@ -19,7 +19,7 @@ <string name="app_label" msgid="3701846017049540910">"Командалык кабык"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Мүчүлүштүк тууралуу билдирүү <xliff:g id="ID">#%d</xliff:g> түзүлүүдө"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Мүчүлүштүк тууралуу билдирүү <xliff:g id="ID">#%d</xliff:g> жаздырылды"</string> - <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Мүчүлүштүк тууралуу билдирүү <xliff:g id="ID">#%d</xliff:g> жаздырылды, бирок скриншот күтүлүүдө"</string> + <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Мүчүлүштүк тууралуу билдирүү <xliff:g id="ID">#%d</xliff:g> даяр, скриншот күтүлүүдө"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Мүчүлүштүк жөнүндө кабардын чоо-жайы кошулууда"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Күтө туруңуз…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Ката жөнүндө кабар менен бөлүшүү үчүн солго серпип коюңуз"</string> diff --git a/packages/Shell/res/values-ms-rMY/strings.xml b/packages/Shell/res/values-ms-rMY/strings.xml index e758745f4e78..46bc1a977038 100644 --- a/packages/Shell/res/values-ms-rMY/strings.xml +++ b/packages/Shell/res/values-ms-rMY/strings.xml @@ -24,8 +24,8 @@ <string name="bugreport_updating_wait" msgid="3322151947853929470">"Sila tunggu…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Leret ke kiri untuk berkongsi laporan pepijat anda"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Ketik untuk berkongsi laporan pepijat anda"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Ketik untuk berkongsi laporan pepijat anda tanpa tangkapan skrin atau tunggu sehingga tangkapan skrin selesai"</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Ketik untuk berkongsi laporan pepijat anda tanpa tangkapan skrin atau tunggu sehingga tangkapan skrin selesai"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Ketik untuk berkongsi laporan pepijat anda tanpa tangkapan skrin atau tunggu tangkapan skrin selesai"</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Ketik untuk berkongsi laporan pepijat anda tanpa tangkapan skrin atau tunggu tangkapan skrin selesai"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Laporan pepijat mengandungi data dari pelbagai fail log sistem, termasuk maklumat peribadi dan sulit. Kongsikan laporan pepijat hanya dengan apl dan orang yang anda percayai."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Tunjukkan mesej ini pada masa akan datang"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Laporan pepijat"</string> diff --git a/packages/Shell/res/values-ne-rNP/strings.xml b/packages/Shell/res/values-ne-rNP/strings.xml index 9fb1bcbb2bdd..906d82457abf 100644 --- a/packages/Shell/res/values-ne-rNP/strings.xml +++ b/packages/Shell/res/values-ne-rNP/strings.xml @@ -24,8 +24,8 @@ <string name="bugreport_updating_wait" msgid="3322151947853929470">"कृपया प्रतीक्षा गर्नुहोला..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"तपाईँको बग रिपोर्ट साझेदारी गर्न बायाँ स्वाइप गर्नुहोस्"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"तपाईंको बग रिपोर्टलाई साझेदारी गर्न ट्याप गर्नुहोस्"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"तपाईँको बग रिपोर्टलाई स्क्रिनसट बिना साझेदारी गर्नका लागि ट्याप गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुने प्रतीक्षा गर्नुहोस्"</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"तपाईँको बग रिपोर्टलाई स्क्रिनसट बिना साझेदारी गर्नका लागि ट्याप गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुने प्रतीक्षा गर्नुहोस्"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"तपाईँको बग रिपोर्टलाई स्क्रिनसट बिना साझेदारी गर्नका लागि ट्याप गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुन प्रतीक्षा गर्नुहोस्"</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"तपाईँको बग रिपोर्टलाई स्क्रिनसट बिना साझेदारी गर्नका लागि ट्याप गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुन प्रतीक्षा गर्नुहोस्"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"बग रिपोर्टहरूमा प्रणालीका विभिन्न लग फाइलहरूबाट व्यक्तिगत तथा नीजि सूचनासहितको डेटा रहन्छ। बग रिपोर्टहरू अनुप्रयोगहरू र तपाईँले विश्वास गरेका व्यक्तिहरूसँग मात्र साझेदारी गर्नुहोस्।"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"यो सन्देश अर्को पटक देखाउनुहोस्"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"बग रिपोर्टहरू"</string> diff --git a/packages/Shell/res/values-sk/strings.xml b/packages/Shell/res/values-sk/strings.xml index fa1732628867..7a78c433c2d3 100644 --- a/packages/Shell/res/values-sk/strings.xml +++ b/packages/Shell/res/values-sk/strings.xml @@ -19,7 +19,7 @@ <string name="app_label" msgid="3701846017049540910">"Prostredie"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Generuje sa hlásenie chyby <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Hlásenie chyby <xliff:g id="ID">#%d</xliff:g> bolo zaznamenané"</string> - <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Hlásenie chyby <xliff:g id="ID">#%d</xliff:g> bolo zaznamenané, ale čaká sa na snímku obrazovky"</string> + <string name="bugreport_finished_pending_screenshot_title" msgid="5460883450679439591">"Chyba <xliff:g id="ID">#%d</xliff:g> bola zaznamenaná, čaká sa na snímku obrazovky"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Pridanie podrobností o hlásení chyby"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Čakajte prosím…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Ak chcete hlásenie o chybe zdieľať, prejdite prstom doľava."</string> diff --git a/packages/Shell/res/values-uz-rUZ/strings.xml b/packages/Shell/res/values-uz-rUZ/strings.xml index c1a19480c0df..dd7f41b2dbb6 100644 --- a/packages/Shell/res/values-uz-rUZ/strings.xml +++ b/packages/Shell/res/values-uz-rUZ/strings.xml @@ -24,8 +24,8 @@ <string name="bugreport_updating_wait" msgid="3322151947853929470">"Iltimos, kuting…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Xatolik hisobotini yuborish uchun barmog‘ingiz bilan chapga suring"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Xatoliklar hisobotini ulashish uchun bosing"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Xatoliklar hisobotini darhol yuborish uchun bosing yoki skrinshot saqlanguncha kuting"</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Xatoliklar hisobotini darhol yuborish uchun bosing yoki skrinshot saqlanguncha kuting"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Xatoliklar hisobotini darhol yuborish uchun shu yerga bosing yoki skrinshot saqlanguncha kuting"</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Xatoliklar hisobotini darhol yuborish uchun shu yerga bosing yoki skrinshot saqlanguncha kuting"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Xatolik hisobotlari tizimdagi har xil jurnal fayllardagi ma’lumotlarni, shuningdek, shaxsiy hamda maxfiy ma’lumotlarni o‘z ichiga oladi. Xatolik hisobotlarini faqat ishonchli dasturlar va odamlar bilan bo‘lishing."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Ushbu xabar keyingi safar ko‘rsatilsin"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Xatoliklar hisoboti"</string> diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 10c541600d87..7fae0ee6b660 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -454,21 +454,15 @@ public class BugreportProgressService extends Service { final String name = info.name != null ? info.name : mContext.getString(R.string.bugreport_unnamed); - final Notification notification = new Notification.Builder(mContext) - .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) + final Notification notification = newBaseNotification(mContext) .setContentTitle(title) .setTicker(title) .setContentText(name) .setContentInfo(percentText) .setProgress(info.max, info.progress, false) .setOngoing(true) - .setLocalOnly(true) - .setColor(mContext.getColor( - com.android.internal.R.color.system_notification_accent_color)) .setContentIntent(infoPendingIntent) - .addAction(infoAction) - .addAction(screenshotAction) - .addAction(cancelAction) + .setActions(infoAction, screenshotAction, cancelAction) .build(); if (info.finished) { @@ -928,17 +922,13 @@ public class BugreportProgressService extends Service { title = context.getString(R.string.bugreport_finished_title, info.id); content = context.getString(R.string.bugreport_finished_text); } - final Notification.Builder builder = new Notification.Builder(context) - .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) + final Notification.Builder builder = newBaseNotification(context) .setContentTitle(title) .setTicker(title) .setContentText(content) .setContentIntent(PendingIntent.getService(context, info.id, shareIntent, PendingIntent.FLAG_UPDATE_CURRENT)) - .setDeleteIntent(newCancelIntent(context, info)) - .setLocalOnly(true) - .setColor(context.getColor( - com.android.internal.R.color.system_notification_accent_color)); + .setDeleteIntent(newCancelIntent(context, info)); if (!TextUtils.isEmpty(info.name)) { builder.setContentInfo(info.name); @@ -955,16 +945,21 @@ public class BugreportProgressService extends Service { */ private static void sendBugreportBeingUpdatedNotification(Context context, int id) { final String title = context.getString(R.string.bugreport_updating_title); - final Notification.Builder builder = new Notification.Builder(context) - .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) + final Notification.Builder builder = newBaseNotification(context) .setContentTitle(title) .setTicker(title) - .setContentText(context.getString(R.string.bugreport_updating_wait)) + .setContentText(context.getString(R.string.bugreport_updating_wait)); + Log.v(TAG, "Sending 'Updating zip' notification for ID " + id + ": " + title); + NotificationManager.from(context).notify(TAG, id, builder.build()); + } + + private static Notification.Builder newBaseNotification(Context context) { + return new Notification.Builder(context) + .setCategory(Notification.CATEGORY_SYSTEM) + .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) .setLocalOnly(true) .setColor(context.getColor( com.android.internal.R.color.system_notification_accent_color)); - Log.v(TAG, "Sending 'Updating zip' notification for ID " + id + ": " + title); - NotificationManager.from(context).notify(TAG, id, builder.build()); } /** @@ -1102,7 +1097,14 @@ public class BugreportProgressService extends Service { preferredDomain = "@" + preferredDomain; } - final Account[] accounts = am.getAccounts(); + final Account[] accounts; + try { + accounts = am.getAccounts(); + } catch (RuntimeException e) { + Log.e(TAG, "Could not get accounts for preferred domain " + preferredDomain, e); + return null; + } + if (DEBUG) Log.d(TAG, "Number of accounts: " + accounts.length); Account foundAccount = null; for (Account account : accounts) { if (Patterns.EMAIL_ADDRESS.matcher(account.name).matches()) { @@ -1281,9 +1283,6 @@ 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(); } }); diff --git a/packages/Shell/src/com/android/shell/BugreportReceiver.java b/packages/Shell/src/com/android/shell/BugreportReceiver.java index 9afa9005c43b..cbd17bfa3971 100644 --- a/packages/Shell/src/com/android/shell/BugreportReceiver.java +++ b/packages/Shell/src/com/android/shell/BugreportReceiver.java @@ -51,6 +51,7 @@ public class BugreportReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + Log.d(TAG, "onReceive: " + intent); // Clean up older bugreports in background cleanupOldFiles(this, intent, INTENT_BUGREPORT_FINISHED, MIN_KEEP_COUNT, MIN_KEEP_AGE); diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java index 47e3b3b8f8f3..17f6f6b5ac89 100644 --- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java +++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java @@ -291,6 +291,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { detailsUi.assertName(NAME); // Change name - it should have changed system property once focus is changed. + detailsUi.focusOnName(); detailsUi.nameField.setText(NEW_NAME); detailsUi.focusAwayFromName(); assertPropertyValue(NAME_PROPERTY, NEW_NAME); @@ -966,40 +967,44 @@ public class BugreportReceiverTest extends InstrumentationTestCase { cancelButton = mUiBot.getObjectById("android:id/button2"); } - private void assertField(String name, UiObject field, String expected) { - try { - String actual = field.getText().toString(); - assertEquals("Wrong value on field '" + name + "'", expected, actual); - } catch (UiObjectNotFoundException e) { - // Should not happen... - throw new IllegalStateException("field not found: " + name, e); - } + private void assertField(String name, UiObject field, String expected) + throws UiObjectNotFoundException { + String actual = field.getText().toString(); + assertEquals("Wrong value on field '" + name + "'", expected, actual); } - void assertName(String expected) { + void assertName(String expected) throws UiObjectNotFoundException { assertField("name", nameField, expected); } - void assertTitle(String expected) { + void assertTitle(String expected) throws UiObjectNotFoundException { assertField("title", titleField, expected); } - void assertDescription(String expected) { + void assertDescription(String expected) throws UiObjectNotFoundException { assertField("description", descField, expected); } /** + * Set focus on the name field so it can be validated once focus is lost. + */ + void focusOnName() throws UiObjectNotFoundException { + mUiBot.click(nameField, "name_field"); + assertTrue("name_field not focused", nameField.isFocused()); + } + + /** * Takes focus away from the name field so it can be validated. */ - void focusAwayFromName() { + void focusAwayFromName() throws UiObjectNotFoundException { mUiBot.click(titleField, "title_field"); // Change focus. mUiBot.pressBack(); // Dismiss keyboard. + assertFalse("name_field is focused", nameField.isFocused()); } void reOpen() { openProgressNotification(ID); mUiBot.click(detailsButton, "details_button"); - } void clickOk() { diff --git a/packages/SystemUI/res/drawable-hdpi/recents_empty.png b/packages/SystemUI/res/drawable-hdpi/recents_empty.png Binary files differnew file mode 100755 index 000000000000..dec97b62ae3b --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/recents_empty.png diff --git a/packages/SystemUI/res/drawable-mdpi/recents_empty.png b/packages/SystemUI/res/drawable-mdpi/recents_empty.png Binary files differnew file mode 100755 index 000000000000..d16763a2ccf5 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/recents_empty.png diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_empty.png b/packages/SystemUI/res/drawable-xhdpi/recents_empty.png Binary files differnew file mode 100755 index 000000000000..1e0284479222 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/recents_empty.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_empty.png b/packages/SystemUI/res/drawable-xxhdpi/recents_empty.png Binary files differnew file mode 100755 index 000000000000..9d94be7cfc49 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/recents_empty.png diff --git a/packages/SystemUI/res/drawable-xxxhdpi/recents_empty.png b/packages/SystemUI/res/drawable-xxxhdpi/recents_empty.png Binary files differnew file mode 100755 index 000000000000..24599c36e389 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxxhdpi/recents_empty.png diff --git a/packages/SystemUI/res/layout/recents_empty.xml b/packages/SystemUI/res/layout/recents_empty.xml index b2c03312c9d1..53d9cc53161d 100644 --- a/packages/SystemUI/res/layout/recents_empty.xml +++ b/packages/SystemUI/res/layout/recents_empty.xml @@ -16,10 +16,12 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" + android:drawableTop="@drawable/recents_empty" + android:drawablePadding="25dp" android:textSize="16sp" android:textColor="#ffffffff" android:text="@string/recents_empty_message" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 7d85ef67c059..090b8e6fcb3f 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -221,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Werkmodus is aan."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Werkmodus is afgeskakel."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Werkmodus is aangeskakel."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Databespaarder is afgeskakel."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Databespaarder is aangeskakel."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Skermhelderheid"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G-data is laat wag"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data is laat wag"</string> diff --git a/packages/SystemUI/res/values-af/strings_tv.xml b/packages/SystemUI/res/values-af/strings_tv.xml index adc1306b0af6..f595479c6059 100644 --- a/packages/SystemUI/res/values-af/strings_tv.xml +++ b/packages/SystemUI/res/values-af/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Speel"</string> <string name="pip_pause" msgid="8412075640017218862">"Laat wag"</string> <string name="pip_hold_home" msgid="340086535668778109">"Hou "<b>"TUIS"</b>" om PIP te beheer"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Druk en hou die TUIS-\nknoppie om PIP te beheer"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Druk en hou die TUIS-knoppie om PIP te beheer"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Het dit"</string> </resources> diff --git a/packages/SystemUI/res/values-am/strings_tv.xml b/packages/SystemUI/res/values-am/strings_tv.xml index 544ae0739a1e..95e480c3301a 100644 --- a/packages/SystemUI/res/values-am/strings_tv.xml +++ b/packages/SystemUI/res/values-am/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"አጫውት"</string> <string name="pip_pause" msgid="8412075640017218862">"ለአፍታ አቁም"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIPን ለመቆጣጠር "<b>"መነሻ"</b>"ን ይያዙ"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIPን ለመቆጣጠር የመነሻ\nአዝራሩን ይጫኑ እና ይያዙ"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIPን ለመቆጣጠር የመነሻ አዝራሩን ተጭነው ይያዙ"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"ገባኝ"</string> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 100bc632de04..4a4e004fa3cc 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -225,10 +225,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"وضع العمل قيد التشغيل."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"تم تعطيل وضع العمل."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"تم تشغيل وضع العمل."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"تم تعطيل توفير البيانات."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"تم تشغيل توفير البيانات."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"سطوع الشاشة"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"بيانات شبكات الجيل الثاني والثالث متوقفة مؤقتًا"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"تم إيقاف بيانات شبكة الجيل الرابع مؤقتًا"</string> diff --git a/packages/SystemUI/res/values-ar/strings_tv.xml b/packages/SystemUI/res/values-ar/strings_tv.xml index 99c413cf6bf8..a54e0ab86aa3 100644 --- a/packages/SystemUI/res/values-ar/strings_tv.xml +++ b/packages/SystemUI/res/values-ar/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"تشغيل"</string> <string name="pip_pause" msgid="8412075640017218862">"إيقاف مؤقت"</string> <string name="pip_hold_home" msgid="340086535668778109">"اضغط "<b>"الرئيسية"</b>" للتحكم في PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"اضغط مع الاستمرار على زر الرئيسية\nللتحكم في PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"اضغط مع الاستمرار على زر الشاشة الرئيسية للتحكم في PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"حسنًا"</string> </resources> diff --git a/packages/SystemUI/res/values-az-rAZ/strings_tv.xml b/packages/SystemUI/res/values-az-rAZ/strings_tv.xml index 6751bc9c16a6..b3ac6d403ea0 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings_tv.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Göstərin"</string> <string name="pip_pause" msgid="8412075640017218862">"Fasilə verin"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP idarı etmək üçün "<b>"Əsas səhifəni"</b>" tutub saxlayın"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP idarə etmək üçün Əsas səhifə\n düyməsini basıb saxlayın"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PİP nəzarət etmək üçün ƏSAS EKRAN düyməni basıb saxlayın"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Anladım"</string> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 1198950cb714..fff464df8a03 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -74,8 +74,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Snimak ekrana je napravljen."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Dodirnite da biste videli snimak ekrana."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Nije moguće napraviti snimak ekrana."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Došlo je do problema pri čuvanju snimka ekrana."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Čuvanje snimka ekrana nije uspelo zbog ograničenog memorijskog prostora."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Aplikacija ili organizacija ne dozvoljavaju pravljenje snimaka ekrana."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opcije USB prenosa datoteka"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings_tv.xml b/packages/SystemUI/res/values-b+sr+Latn/strings_tv.xml index 39a858cfc50a..d78f8d33ea30 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings_tv.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Pusti"</string> <string name="pip_pause" msgid="8412075640017218862">"Pauziraj"</string> <string name="pip_hold_home" msgid="340086535668778109"><b>"POČETNI EKRAN"</b>" kont. PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Pritisnite i zadržite dugme POČETNI EKRAN\n da biste kontrolisali PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Pritisnite i zadržite dugme POČETNI EKRAN da biste kontrolisali PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Važi"</string> </resources> diff --git a/packages/SystemUI/res/values-bg/strings_tv.xml b/packages/SystemUI/res/values-bg/strings_tv.xml index 38c10ab6b828..c5230a48749a 100644 --- a/packages/SystemUI/res/values-bg/strings_tv.xml +++ b/packages/SystemUI/res/values-bg/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Пускане"</string> <string name="pip_pause" msgid="8412075640017218862">"Пауза"</string> <string name="pip_hold_home" msgid="340086535668778109">"Контр. на PIP: Задр. "<b>"HOME"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"За контролиране на PIP\nнатиснете и задръжте HOME"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"За контролиране на PIP натиснете и задръжте бутона „HOME“"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Разбрах"</string> </resources> diff --git a/packages/SystemUI/res/values-bn-rBD/strings_tv.xml b/packages/SystemUI/res/values-bn-rBD/strings_tv.xml index 7a958155d505..6bb19f5a87b1 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings_tv.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"চালান"</string> <string name="pip_pause" msgid="8412075640017218862">"বিরাম দিন"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP নিয়ন্ত্রণ করতে "<b>"হোম"</b>" কী ধরে রাখুন"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP নিয়ন্ত্রণ করতে হোম\nবোতামটি টিপে ধরে রাখুন"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP নিয়ন্ত্রণ করতে HOME বোতামটিকে টিপুন ও ধরে থাকুন"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"বুঝেছি"</string> </resources> diff --git a/packages/SystemUI/res/values-bs-rBA/strings.xml b/packages/SystemUI/res/values-bs-rBA/strings.xml index 3befd442d719..0b72a066812f 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings.xml @@ -74,8 +74,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekran snimljen."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Dodirnite za prikaz snimka ekrana."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Došlo je do greške prilikom snimanja ekrana."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Došlo je do problema prilikom spašavanja snimka ekrana."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Snimak ekrana se ne može sačuvati zbog manjka prostora za pohranu."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Aplikacija ili vaša organizacija ne dopuštaju pravljenje snimaka ekrana."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opcije USB prijenosa fajlova"</string> diff --git a/packages/SystemUI/res/values-bs-rBA/strings_tv.xml b/packages/SystemUI/res/values-bs-rBA/strings_tv.xml index 17193189525d..dd4a518f6db3 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings_tv.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings_tv.xml @@ -27,6 +27,6 @@ <!-- no translation found for pip_pause (8412075640017218862) --> <skip /> <string name="pip_hold_home" msgid="340086535668778109">"Za kontr. PIP držite "<b>"HOME"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Za kontrolu PIP \n držite dugme POČETAK"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Za kontrolu PIP, pritisnite i držite dugme POČETAK"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Jasno mi je"</string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 42596fe2f927..6ddec67e88d8 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"S\'ha fet una captura de pantalla."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Toca per veure la captura de pantalla."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"No s\'ha pogut fer una captura de pantalla."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"S\'ha trobat un problema en desar la captura de pantalla."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"La captura de pantalla no es pot desar perquè no hi ha prou espai d\'emmagatzematge."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"L\'aplicació o l\'organització no permeten fer captures de pantalla."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opcions transf. fitxers USB"</string> diff --git a/packages/SystemUI/res/values-ca/strings_tv.xml b/packages/SystemUI/res/values-ca/strings_tv.xml index 1aed2b4af948..3634b994c105 100644 --- a/packages/SystemUI/res/values-ca/strings_tv.xml +++ b/packages/SystemUI/res/values-ca/strings_tv.xml @@ -23,7 +23,7 @@ <string name="pip_fullscreen" msgid="8604643018538487816">"Pantalla completa"</string> <string name="pip_play" msgid="674145557658227044">"Reprodueix"</string> <string name="pip_pause" msgid="8412075640017218862">"Posa en pausa"</string> - <string name="pip_hold_home" msgid="340086535668778109">"Prem "<b>"INICI"</b>" per contr. PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Mantén premut botó INICI\n per controlar PIP"</string> + <string name="pip_hold_home" msgid="340086535668778109">"Prem "<b>"INICI"</b>" per controlar PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Mantén premut el botó INICI per controlar PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"D\'acord"</string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 386767363cb1..e23f53fa39d7 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -75,8 +75,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Snímek obrazovky Snímek obrazovky pořízen."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Snímek obrazovky zobrazíte dotykem."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Snímek obrazovky se nepodařilo zachytit."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Při ukládání snímku obrazovky došlo k problému."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Snímek obrazovky nelze pořídit kvůli nedostatku místa v úložišti."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Aplikace nebo organizace zakazuje pořizování snímků obrazovky."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Možnosti přenosu souborů pomocí rozhraní USB"</string> @@ -224,10 +223,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Pracovní režim zapnutý"</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Pracovní režim je vypnutý."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Pracovní režim je zapnutý."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Spořič dat byl vypnut."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Spořič dat byl zapnut."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Jas displeje"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data 2G a 3G jsou pozastavena"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data 4G jsou pozastavena"</string> diff --git a/packages/SystemUI/res/values-cs/strings_tv.xml b/packages/SystemUI/res/values-cs/strings_tv.xml index 2480c3736443..b65b08e2254f 100644 --- a/packages/SystemUI/res/values-cs/strings_tv.xml +++ b/packages/SystemUI/res/values-cs/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Přehrát"</string> <string name="pip_pause" msgid="8412075640017218862">"Pozastavit"</string> <string name="pip_hold_home" msgid="340086535668778109">"Funkci PIP lze ovládat podržením tlačítka "<b>"PLOCHA"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Funkci PIP lze ovládat\npodržením tlačítka PLOCHA"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Funkci PIP lze ovládat podržením tlačítka PLOCHA"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Rozumím"</string> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 0356a18025fe..ba8898e5c64b 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skærmbilledet er gemt."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Tryk for at se dit skærmbillede."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Skærmbilledet kunne ikke tages."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Der opstod et problem ved lagringen af skærmbilledet."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Skærmbilledet kan ikke gemmes pga. begrænset lagerplads."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Appen eller din organisation tillader ikke, at du tager skærmbilleder."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Muligheder for USB-filoverførsel"</string> diff --git a/packages/SystemUI/res/values-da/strings_tv.xml b/packages/SystemUI/res/values-da/strings_tv.xml index 10a1ecd8a4b3..b51c5df95375 100644 --- a/packages/SystemUI/res/values-da/strings_tv.xml +++ b/packages/SystemUI/res/values-da/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Afspil"</string> <string name="pip_pause" msgid="8412075640017218862">"Pause"</string> <string name="pip_hold_home" msgid="340086535668778109">"Hold "<b>"HOME"</b>" nede for at styre PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Tryk på knappen HOME,\nog hold den nede for at styre PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Tryk på HOME-knappen, og hold den nede for at styre PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 7e7b2acf635a..345dbeddf95f 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Screenshot aufgenommen"</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Zum Ansehen berühren"</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Screenshot konnte nicht aufgenommen werden."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Beim Speichern des Screenshots ist ein Problem aufgetreten."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Speichern des Screenshots aufgrund von zu wenig Speicher nicht möglich."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Die App oder Ihr Unternehmen lässt das Erstellen von Screenshots nicht zu."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB-Dateiübertragungsoptionen"</string> diff --git a/packages/SystemUI/res/values-de/strings_tv.xml b/packages/SystemUI/res/values-de/strings_tv.xml index aa1a9b20de42..b96669b1c7c0 100644 --- a/packages/SystemUI/res/values-de/strings_tv.xml +++ b/packages/SystemUI/res/values-de/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Wiedergeben"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausieren"</string> <string name="pip_hold_home" msgid="340086535668778109"><b>"STARTBILDSCHIRMTASTE"</b>" drücken, um PIP zu steuern"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"STARTBILDSCHIRMTASTE\n gedrückt halten, um PIP zu steuern"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Halte die Taste für die Startseite gedrückt, um das Bild-in-Bild zu steuern"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 943c67d248fe..78cbb20dc113 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -221,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Η λειτουργία εργασίας είναι ενεργή."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Η λειτουργία εργασίας απενεργοποιήθηκε."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Η λειτουργία εργασίας ενεργοποιήθηκε."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Η Εξοικονόμηση δεδομένων είναι ανενεργή."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Η Εξοικονόμηση δεδομένων είναι ενεργή."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Φωτεινότητα οθόνης"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Τα δεδομένα 2G-3G τέθηκαν σε παύση"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Τα δεδομένα 4G τέθηκαν σε παύση"</string> diff --git a/packages/SystemUI/res/values-el/strings_tv.xml b/packages/SystemUI/res/values-el/strings_tv.xml index c96f852d1ab7..e72d579acdc8 100644 --- a/packages/SystemUI/res/values-el/strings_tv.xml +++ b/packages/SystemUI/res/values-el/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Αναπαραγωγή"</string> <string name="pip_pause" msgid="8412075640017218862">"Παύση"</string> <string name="pip_hold_home" msgid="340086535668778109">"Κρατήστε το πλήκτρο "<b>"HOME"</b>" πατημένο για έλεγχο του PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Πατήστε παρατεταμένα το κουμπί HOME\nγια έλεγχο του PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Πιέστε παρατεταμένα το κουμπί HOME, για να ελέγξετε τη λειτουργία PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Κατάλαβα"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings_tv.xml b/packages/SystemUI/res/values-en-rAU/strings_tv.xml index 6f3365569ab3..5711c352aa1a 100644 --- a/packages/SystemUI/res/values-en-rAU/strings_tv.xml +++ b/packages/SystemUI/res/values-en-rAU/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Play"</string> <string name="pip_pause" msgid="8412075640017218862">"Pause"</string> <string name="pip_hold_home" msgid="340086535668778109">"Hold "<b>"HOME"</b>" to control PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Press and hold the HOME\nbutton to control PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Press and hold the HOME button to control PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Understood"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings_tv.xml b/packages/SystemUI/res/values-en-rGB/strings_tv.xml index 6f3365569ab3..5711c352aa1a 100644 --- a/packages/SystemUI/res/values-en-rGB/strings_tv.xml +++ b/packages/SystemUI/res/values-en-rGB/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Play"</string> <string name="pip_pause" msgid="8412075640017218862">"Pause"</string> <string name="pip_hold_home" msgid="340086535668778109">"Hold "<b>"HOME"</b>" to control PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Press and hold the HOME\nbutton to control PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Press and hold the HOME button to control PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Understood"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings_tv.xml b/packages/SystemUI/res/values-en-rIN/strings_tv.xml index 6f3365569ab3..5711c352aa1a 100644 --- a/packages/SystemUI/res/values-en-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-en-rIN/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Play"</string> <string name="pip_pause" msgid="8412075640017218862">"Pause"</string> <string name="pip_hold_home" msgid="340086535668778109">"Hold "<b>"HOME"</b>" to control PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Press and hold the HOME\nbutton to control PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Press and hold the HOME button to control PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Understood"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index e60fd2e47c39..4769e20df73e 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Se guardó la captura de pantalla."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Toca para ver tu captura de pantalla."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"No se pudo guardar la captura de pantalla."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Se produjo un error al guardar la captura de pantalla."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"No se puede guardar la captura de pantalla debido al almacenamiento limitado."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"La app o tu organización no permiten las capturas de pantalla."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opciones de transferencia de archivos por USB"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings_tv.xml b/packages/SystemUI/res/values-es-rUS/strings_tv.xml index 1df219d68aa0..99913e644cf8 100644 --- a/packages/SystemUI/res/values-es-rUS/strings_tv.xml +++ b/packages/SystemUI/res/values-es-rUS/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Reproducir"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausar"</string> <string name="pip_hold_home" msgid="340086535668778109">"Mantén presionado "<b>"INICIO"</b>" para controlar PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Mantén presionado botón\nINICIO para controlar PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Mantén presionado el botón INICIO para controlar PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Entendido"</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index e3870197f520..e89125e2a21a 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captura guardada"</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Toca para ver la captura de pantalla"</string> <string name="screenshot_failed_title" msgid="705781116746922771">"No se ha podido guardar la captura de pantalla."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Se ha detectado un problema al guardar la captura de pantalla."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"No se puede guardar la captura de pantalla porque no hay espacio de almacenamiento suficiente."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"La aplicación o tu organización no permiten que se realicen capturas de pantalla."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opciones de transferencia de archivos por USB"</string> diff --git a/packages/SystemUI/res/values-es/strings_tv.xml b/packages/SystemUI/res/values-es/strings_tv.xml index fcc839e7421b..200410cee2c8 100644 --- a/packages/SystemUI/res/values-es/strings_tv.xml +++ b/packages/SystemUI/res/values-es/strings_tv.xml @@ -23,7 +23,7 @@ <string name="pip_fullscreen" msgid="8604643018538487816">"Pantalla completa"</string> <string name="pip_play" msgid="674145557658227044">"Reproducir"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausar"</string> - <string name="pip_hold_home" msgid="340086535668778109"><b>"INICIO"</b>" pulsado: control PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"INICIO pulsado:\ncontrol PIP"</string> + <string name="pip_hold_home" msgid="340086535668778109">"Mantén el botón "<b>"INICIO"</b>" pulsado para control de PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Mantén el botón de INICIO pulsado para controlar el modo PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Entendido"</string> </resources> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index 7e687576e3c3..cad44d9b6d90 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekraanipilt on jäädvustatud."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Puudutage kuvatõmmise vaatamiseks."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Kuvatõmmist ei saanud jäädvustada."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Ekraanipildi salvestamisel ilmnes probleem."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Piiratud salvestusruumi tõttu ei saa ekraanipilti salvestada."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Rakendus või teie organisatsioon ei luba ekraanipilte jäädvustada."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB-failiedastuse valikud"</string> diff --git a/packages/SystemUI/res/values-et-rEE/strings_tv.xml b/packages/SystemUI/res/values-et-rEE/strings_tv.xml index ae6cb30bf8b3..972083b4a100 100644 --- a/packages/SystemUI/res/values-et-rEE/strings_tv.xml +++ b/packages/SystemUI/res/values-et-rEE/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Esita"</string> <string name="pip_pause" msgid="8412075640017218862">"Peata"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP juht. hoidke all nuppu "<b>"AVAEKRAAN"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP juhtim. vajutage\npikalt nuppu AVAEKRAAN"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP juhtimiseks vajutage pikalt nuppu AVAEKRAAN"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Selge"</string> </resources> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index 6a358d425bcb..1dc6d687de4d 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Pantaila-argazkia atera da."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Pantaila-argazkia ikusteko, ukitu ezazu."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Ezin izan da pantaila-argazkia atera."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Arazo bat izan da pantaila-argazkia gordetzean."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Ezin da atera pantaila-argazkia ez delako tokirik geratzen."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Aplikazioak edo erakundeak ez du onartzen pantaila-argazkiak ateratzea."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB fitxategiak transferitzeko aukerak"</string> diff --git a/packages/SystemUI/res/values-eu-rES/strings_tv.xml b/packages/SystemUI/res/values-eu-rES/strings_tv.xml index 80feff6b5f01..a312ea48bd4a 100644 --- a/packages/SystemUI/res/values-eu-rES/strings_tv.xml +++ b/packages/SystemUI/res/values-eu-rES/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Erreproduzitu"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausatu"</string> <string name="pip_hold_home" msgid="340086535668778109"><b>"HASIERA"</b>" PIP kontrolatzeko"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Eduki sakatuta HASIERA\nPIPa kontrolatzeko"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Eduki sakatuta hasierako botoia pantaila txikia kontrolatzeko"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Ados"</string> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 2477a12698de..dfe1d544f9b5 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"هنگام ذخیره عکس صفحهنمایش مشکلی رخ داد."</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> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"حالت کار روشن."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"حالت کار خاموش شد."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"حالت کار روشن شد."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"صرفهجویی داده خاموش شد."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"صرفهجویی داده روشن شد."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"روشنایی نمایشگر"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"داده 2G-3G موقتاً متوقف شده است"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"داده 4G موقتاً متوقف شده است"</string> diff --git a/packages/SystemUI/res/values-fa/strings_tv.xml b/packages/SystemUI/res/values-fa/strings_tv.xml index 5130b5085825..cf37db108277 100644 --- a/packages/SystemUI/res/values-fa/strings_tv.xml +++ b/packages/SystemUI/res/values-fa/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"پخش"</string> <string name="pip_pause" msgid="8412075640017218862">"مکث"</string> <string name="pip_hold_home" msgid="340086535668778109">"کنترل PIP با نگهداشتن "<b>"HOME"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"برای کنترل PIP دکمه صفحه\nاصلی را فشار دهید و نگهدارید"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"برای کنترل PIP دکمه صفحه اصلی را فشار داده و نگهدارید"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"متوجه شدم"</string> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 6199536cc3c9..e5d513fabae5 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Kuvakaappaus tallennettu"</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Katso kuvakaappaus koskettamalla."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Kuvakaappausta ei voitu tallentaa"</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Kuvakaappausta tallennettaessa tapahtui virhe."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Kuvakaappauksen tallentaminen epäonnistui, sillä tallennustilaa ei ole riittävästi."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Sovellus tai organisaatiosi ei salli kuvakaappauksien tallentamista."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB-tiedostonsiirtoasetukset"</string> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Työtila on käytössä."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Työtila poistettiin käytöstä."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Työtila otettiin käyttöön."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Data Saver poistettiin käytöstä."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Data Saver otettiin käyttöön."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Näytön kirkkaus"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G-tiedonsiirto keskeytettiin"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-tiedonsiirto keskeytettiin"</string> diff --git a/packages/SystemUI/res/values-fi/strings_tv.xml b/packages/SystemUI/res/values-fi/strings_tv.xml index a42c23139ae1..94c780628ad9 100644 --- a/packages/SystemUI/res/values-fi/strings_tv.xml +++ b/packages/SystemUI/res/values-fi/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Toista"</string> <string name="pip_pause" msgid="8412075640017218862">"Keskeytä"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP: paina pitkään "<b>"aloituspain"</b>"."</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Hallinnoi PIP:tä: paina\naloitusnäyttöpainiketta pitkään."</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Hallinnoi PIP-tilaa painamalla ALOITUSNÄYTTÖ-painiketta pitkään."</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Selvä"</string> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 6ed42edfd3aa..223274f555c1 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Capture d\'écran réussie"</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Appuyez pour afficher votre capture d\'écran."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Impossible de réaliser une capture d\'écran"</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Une erreur s\'est produite lors de l\'enregistrement de la saisie d\'écran."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Impossible d\'enregistrer la saisie d\'écran, car l\'espace de stockage est limité."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"L\'application ou votre organisation n\'autorise pas les saisies d\'écran."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Options transfert fichiers USB"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings_tv.xml b/packages/SystemUI/res/values-fr-rCA/strings_tv.xml index 29e94c6d2b0d..48bbb269b3ba 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings_tv.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"Lecture"</string> <string name="pip_pause" msgid="8412075640017218862">"Interrompre"</string> <string name="pip_hold_home" msgid="340086535668778109">"Maint. enf. "<b>"ACC."</b>" pr gér. mode IDI"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Maint. enf. \nACCUEIL pr gér. mode IDI"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index c08958d5624d..474a24055ace 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Capture d\'écran réussie"</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Appuyez pour afficher votre capture d\'écran."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Impossible de réaliser une capture d\'écran"</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Erreur lors de l\'enregistrement de la capture d\'écran."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Impossible d\'enregistrer la capture d\'écran, car l\'espace de stockage est limité."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Les captures d\'écran ne sont pas autorisées par l\'application ou par votre organisation."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Options transfert fichiers USB"</string> diff --git a/packages/SystemUI/res/values-fr/strings_tv.xml b/packages/SystemUI/res/values-fr/strings_tv.xml index 8504a8ea3bab..27c62fb50c41 100644 --- a/packages/SystemUI/res/values-fr/strings_tv.xml +++ b/packages/SystemUI/res/values-fr/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Lire"</string> <string name="pip_pause" msgid="8412075640017218862">"Suspendre"</string> <string name="pip_hold_home" msgid="340086535668778109">"Appui long "<b>"ACCUEIL"</b>" pour contrôler PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Appui long bouton ACCUEIL\npour contrôler PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Appuyez de manière prolongée sur le bouton ACCUEIL pour contrôler le mode PIP."</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 7cb3cb1bdfe0..a675c217166d 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captura de pantalla gardada."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Toca para ver a captura de pantalla."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Non se puido facer a captura de pantalla."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Produciuse un problema ao gardar a captura de pantalla."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Non se pode gardar a captura de pantalla porque o espazo de almacenamento é limitado."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"A aplicación ou a túa organización non permite realizar capturas de pantalla."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opcións de transferencia USB"</string> diff --git a/packages/SystemUI/res/values-gl-rES/strings_tv.xml b/packages/SystemUI/res/values-gl-rES/strings_tv.xml index 6aab613923a5..b0343e16ebdb 100644 --- a/packages/SystemUI/res/values-gl-rES/strings_tv.xml +++ b/packages/SystemUI/res/values-gl-rES/strings_tv.xml @@ -23,7 +23,7 @@ <string name="pip_fullscreen" msgid="8604643018538487816">"Pantalla completa"</string> <string name="pip_play" msgid="674145557658227044">"Reproducir"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausar"</string> - <string name="pip_hold_home" msgid="340086535668778109">"Premido "<b>"INICIO"</b>" para PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Premido INICIO\npara PIP"</string> + <string name="pip_hold_home" msgid="340086535668778109">"Manter premido "<b>"INICIO"</b>" para controlar PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Mantén premido o botón de INICIO para controlar PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"De acordo"</string> </resources> diff --git a/packages/SystemUI/res/values-gu-rIN/strings_tv.xml b/packages/SystemUI/res/values-gu-rIN/strings_tv.xml index 56f0298d4ee3..3f2f68a93520 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"ચલાવો"</string> <string name="pip_pause" msgid="8412075640017218862">"થોભાવો"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP નિયંત્રિત કરવા માટે "<b>"હોમ"</b>" પકડી રાખો"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP નિયંત્રિત કરવા માટે હોમ\n બટન દબાવો અને પકડી રાખો"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP નિયંત્રિત કરવા માટે હોમ બટન દબાવો અને પકડી રાખો"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"સમજાઈ ગયું"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 7618c021ab56..43331fd09160 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"स्क्रीनशॉट सहेजते समय समस्या आई"</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> diff --git a/packages/SystemUI/res/values-hi/strings_tv.xml b/packages/SystemUI/res/values-hi/strings_tv.xml index c4bb26baa418..cf259ddc9012 100644 --- a/packages/SystemUI/res/values-hi/strings_tv.xml +++ b/packages/SystemUI/res/values-hi/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"चलाएं"</string> <string name="pip_pause" msgid="8412075640017218862">"रोकें"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP नियंत्रण हेतु "<b>"HOME"</b>" होल्ड करें"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP नियंत्रण हेतु HOME\nबटन दबाए रखें"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP नियंत्रण के लिए HOME बटन को दबाए रखें"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"समझ लिया"</string> </resources> diff --git a/packages/SystemUI/res/values-hr/strings_tv.xml b/packages/SystemUI/res/values-hr/strings_tv.xml index 2a72055867b3..424c68b06ce5 100644 --- a/packages/SystemUI/res/values-hr/strings_tv.xml +++ b/packages/SystemUI/res/values-hr/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Reproduciraj"</string> <string name="pip_pause" msgid="8412075640017218862">"Pauziraj"</string> <string name="pip_hold_home" msgid="340086535668778109">"Držite "<b>"POČETNI"</b>" za PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Pritisnite i držite POČETNI\nza upravljanje PIP-om"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Pritisnite i zadržite tipku POČETNI ZASLON da biste upravljali slikom u slici"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Shvaćam"</string> </resources> diff --git a/packages/SystemUI/res/values-hu/strings_tv.xml b/packages/SystemUI/res/values-hu/strings_tv.xml index ff4d37cea08a..5271a4a24102 100644 --- a/packages/SystemUI/res/values-hu/strings_tv.xml +++ b/packages/SystemUI/res/values-hu/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Lejátszás"</string> <string name="pip_pause" msgid="8412075640017218862">"Szüneteltetés"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP vezérlése a "<b>"HOME"</b>"-mal"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"A PIP vezérléséhez\ntartsa nyomva a HOME-ot"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"A PIP vezérléséhez tartsa nyomva a HOME gombot"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Rendben"</string> </resources> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index bf9f80d38053..6338d8e5abf8 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Էկրանի պատկերը պահելիս խնդիր առաջացավ:"</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> diff --git a/packages/SystemUI/res/values-hy-rAM/strings_tv.xml b/packages/SystemUI/res/values-hy-rAM/strings_tv.xml index 0ddb715f7a0b..280d733afd80 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings_tv.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Նվագարկել"</string> <string name="pip_pause" msgid="8412075640017218862">"Դադարեցնել"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP-ն կառավարելու համար սեղմած պահեք "<b>"HOME"</b>" կոճակը"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP-ն կառավարելու համար սեղմեք և պահեք HOME\n կոճակը"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP-ն կառավարելու համար սեղմեք և պահեք HOME կոճակը"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Պարզ է"</string> </resources> diff --git a/packages/SystemUI/res/values-in/strings_tv.xml b/packages/SystemUI/res/values-in/strings_tv.xml index f6315139626c..c12fa9c92a76 100644 --- a/packages/SystemUI/res/values-in/strings_tv.xml +++ b/packages/SystemUI/res/values-in/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Putar"</string> <string name="pip_pause" msgid="8412075640017218862">"Jeda"</string> <string name="pip_hold_home" msgid="340086535668778109">"Tahan "<b>"LAYAR UTAMA"</b>" untuk mengontrol PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Tekan dan tahan tombol LAYAR UTAMA\nuntuk mengontrol PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Tekan dan tahan tombol LAYAR UTAMA untuk mengontrol PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Mengerti"</string> </resources> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index 6b4f1910ae36..57756e086329 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skjámynd var tekin."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Snertu til að skoða skjámyndina."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Ekki tókst að taka skjámynd."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Upp kom vandamál við að vista skjámynd."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Ekki tókst að vista skjámynd vegna takmarkaðs geymslupláss."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Forritið eða fyrirtækið þitt leyfir ekki að teknar séu skjámyndir."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Valkostir USB-skráaflutnings"</string> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Kveikt á vinnustillingu."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Slökkt á vinnustillingu."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Kveikt á vinnustillingu."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Slökkt var á gagnasparnaði."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Kveikt var á gagnasparnaði."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Birtustig skjás"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Slökkt er á 2G- og 3G-gögnum"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Slökkt er á 4G-gögnum"</string> diff --git a/packages/SystemUI/res/values-is-rIS/strings_tv.xml b/packages/SystemUI/res/values-is-rIS/strings_tv.xml index b44aaf0ca1df..9c3db2f9ea9c 100644 --- a/packages/SystemUI/res/values-is-rIS/strings_tv.xml +++ b/packages/SystemUI/res/values-is-rIS/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Spila"</string> <string name="pip_pause" msgid="8412075640017218862">"Hlé"</string> <string name="pip_hold_home" msgid="340086535668778109">"Haltu "<b>"HOME"</b>"-hnappinum inni til að stjórna innfelldri mynd"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Haltu HOME\n-hnappinum inni til að stjórna innfelldri mynd"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Haltu „Home“-hnappinum inni til að stjórna innfelldri mynd"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Ég skil"</string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 6fc814a5f46d..b4f473a4bbde 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Screenshot acquisito."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Tocca per visualizzare il tuo screenshot."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Impossibile acquisire lo screenshot."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Si è verificato un problema durante il salvataggio dello screenshot."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Impossibile salvare lo screenshot a causa dello spazio di archiviazione limitato."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"L\'acquisizione di screenshot non è consentita dall\'app o dall\'organizzazione."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opzioni trasferimento file USB"</string> diff --git a/packages/SystemUI/res/values-it/strings_tv.xml b/packages/SystemUI/res/values-it/strings_tv.xml index 08f2b67a5f17..dc79802aeb45 100644 --- a/packages/SystemUI/res/values-it/strings_tv.xml +++ b/packages/SystemUI/res/values-it/strings_tv.xml @@ -19,11 +19,11 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="pip_close" msgid="3480680679023423574">"Chiudi visualizzazione PIP"</string> + <string name="pip_close" msgid="3480680679023423574">"Chiudi PIP"</string> <string name="pip_fullscreen" msgid="8604643018538487816">"Schermo intero"</string> <string name="pip_play" msgid="674145557658227044">"Riproduci"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausa"</string> - <string name="pip_hold_home" msgid="340086535668778109">"Tieni premuto "<b>"HOME"</b>" per controllare la visualizzazione PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Premi e tieni premuto HOME\nper controllare la visualizzazione PIP"</string> + <string name="pip_hold_home" msgid="340086535668778109">"Tieni premuto "<b>"HOME"</b>" per controllare PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Tieni premuto il pulsante HOME per controllare PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 2eda0e44f11a..2ace8e887bef 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -75,8 +75,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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"התגלתה בעיה בשמירת צילום מסך."</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> diff --git a/packages/SystemUI/res/values-iw/strings_tv.xml b/packages/SystemUI/res/values-iw/strings_tv.xml index 74297e42d695..77deaf613e6c 100644 --- a/packages/SystemUI/res/values-iw/strings_tv.xml +++ b/packages/SystemUI/res/values-iw/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"הפעל"</string> <string name="pip_pause" msgid="8412075640017218862">"השהה"</string> <string name="pip_hold_home" msgid="340086535668778109">"לחץ לחיצה ארוכה על "<b>"דף הבית"</b>" כדי לשלוט ב-PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"לחץ לחיצה ארוכה על לחצן דף הבית\nכדי לשלוט ב-PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"לחץ לחיצה ממושכת על לחצן דף הבית כדי לשלוט ב-PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"הבנתי"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings_tv.xml b/packages/SystemUI/res/values-ja/strings_tv.xml index be6693bc2329..e045fd6d0917 100644 --- a/packages/SystemUI/res/values-ja/strings_tv.xml +++ b/packages/SystemUI/res/values-ja/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"再生"</string> <string name="pip_pause" msgid="8412075640017218862">"一時停止"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP を管理するには ["<b>"ホーム"</b>"] を押し続けます"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP を管理するには\n[ホーム] ボタンを押し続けます"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"閉じる"</string> </resources> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 41da19150da1..14f9406e1adb 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"ეკრანის ანაბეჭდის შენახვისას წარმოიქმნა პრობლემა."</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> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"სამსახურის რეჟიმი ჩართულია."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"სამსახურის რეჟიმი გამორთულია."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"სამსახურის რეჟიმი ჩართულია."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"მონაცემთა დამზოგველი გამორთულია."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"მონაცემთა დამზოგველი ჩართულია."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"ეკრანის სიკაშკაშე"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G მონაცემები შეჩერებულია"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G მონაცემები შეჩერებულია"</string> diff --git a/packages/SystemUI/res/values-ka-rGE/strings_tv.xml b/packages/SystemUI/res/values-ka-rGE/strings_tv.xml index 97944c3c0112..e525eba29588 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings_tv.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"დაკვრა"</string> <string name="pip_pause" msgid="8412075640017218862">"პაუზა"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP-ის სამართავად, გეჭიროთ "<b>"მთავარ ღილაკზე"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP-ის სამართავად, ხანგრძლივად\nდააჭირეთ მთავარ ღილაკს"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP-ის სამართავად, ხანგრძლივად დააჭირეთ მთავარ ღილაკს"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"გასაგებია"</string> </resources> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index bc56c8e0b5e3..07c95c82ecc8 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -221,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Жұмыс режимі қосулы."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Жұмыс режимі өшірілді."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Жұмыс режимі қосылды."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Дерек сақтағыш өшірілді."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Дерек сақтағыш қосылды."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Дисплей жарықтығы"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G деректері кідіртілді"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G деректері кідіртілді"</string> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings_tv.xml b/packages/SystemUI/res/values-kk-rKZ/strings_tv.xml index f67157c669b6..e7e7bfd96bf8 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings_tv.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings_tv.xml @@ -23,7 +23,7 @@ <string name="pip_fullscreen" msgid="8604643018538487816">"Толық экран"</string> <string name="pip_play" msgid="674145557658227044">"Ойнату"</string> <string name="pip_pause" msgid="8412075640017218862">"Кідірту"</string> - <string name="pip_hold_home" msgid="340086535668778109">"PIP бас. үшін "<b>"HOME"</b>" түй. ұс. тұр."</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP бас. үшін HOME\n түй. бас., ұс. тұр."</string> + <string name="pip_hold_home" msgid="340086535668778109">"PIP басқару үшін "<b>"HOME"</b>" басып тұрыңыз"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP функциясын басқару үшін НЕГІЗГІ БЕТ түймесін басып тұрыңыз"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Түсіндім"</string> </resources> diff --git a/packages/SystemUI/res/values-km-rKH/strings_tv.xml b/packages/SystemUI/res/values-km-rKH/strings_tv.xml index cc0a8b0e32a3..2d40468d7100 100644 --- a/packages/SystemUI/res/values-km-rKH/strings_tv.xml +++ b/packages/SystemUI/res/values-km-rKH/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"ចាក់"</string> <string name="pip_pause" msgid="8412075640017218862">"ផ្អាក"</string> <string name="pip_hold_home" msgid="340086535668778109">"សង្កត់ប៊ូតុង "<b>"ដើម"</b>" ដើម្បីគ្រប់គ្រង PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"ចុច និងសង្កត់ប៊ូតុង ដើម\nដើម្បីគ្រប់គ្រង PIP"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"យល់ហើយ"</string> </resources> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 62a1235f40d0..11d239ca8d5a 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸುವಲ್ಲಿ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ."</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> diff --git a/packages/SystemUI/res/values-kn-rIN/strings_tv.xml b/packages/SystemUI/res/values-kn-rIN/strings_tv.xml index 09d7b07e3b05..5ed77050ae29 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"ಪ್ಲೇ"</string> <string name="pip_pause" msgid="8412075640017218862">"ವಿರಾಮ"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP ನಿಯಂತ್ರಿಸಲು "<b>"HOME"</b>" ಕೀಯನ್ನು ಹಿಡಿದುಕೊಳ್ಳಿ"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP ನಿಯಂತ್ರಿಸಲು HOME\n ಬಟನ್ ಒತ್ತಿರಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP ನಿಯಂತ್ರಿಸಲು HOME ಬಟನ್ ಒತ್ತಿರಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"ಅರ್ಥವಾಯಿತು"</string> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index fca1dba068fa..30d421643381 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"스크린샷을 저장하는 중 문제가 발생했습니다."</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> diff --git a/packages/SystemUI/res/values-ko/strings_tv.xml b/packages/SystemUI/res/values-ko/strings_tv.xml index ea12d5e6a6cc..2846e55c0375 100644 --- a/packages/SystemUI/res/values-ko/strings_tv.xml +++ b/packages/SystemUI/res/values-ko/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"재생"</string> <string name="pip_pause" msgid="8412075640017218862">"일시중지"</string> <string name="pip_hold_home" msgid="340086535668778109"><b>"HOME"</b>"을 눌러 PIP 제어"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"HOME\n버튼을 길게 눌러 PIP 제어"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"확인"</string> </resources> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index 88948202bc37..653dded1a4e3 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Скриншотту сактоо учурунда көйгөй чыкты."</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> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Иштөө режими күйүк."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Иштөө режими өчүрүлдү."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Иштөө режими күйгүзүлдү."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Дайындарды үнөмдөгүч өчүрүлдү."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Дайындарды үнөмдөгүч күйгүзүлдү."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Жарыктыгын көрсөтүү"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G дайындары тындырылды."</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G дайындары тындырылды"</string> diff --git a/packages/SystemUI/res/values-ky-rKG/strings_tv.xml b/packages/SystemUI/res/values-ky-rKG/strings_tv.xml index e95bc8912282..2da47ea689c9 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings_tv.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings_tv.xml @@ -23,7 +23,7 @@ <string name="pip_fullscreen" msgid="8604643018538487816">"Толук экран"</string> <string name="pip_play" msgid="674145557658227044">"Ойнотуу"</string> <string name="pip_pause" msgid="8412075640017218862">"Тындыруу"</string> - <string name="pip_hold_home" msgid="340086535668778109">"PIP\'ти көзөмөлдөө үчүн "<b>"БАШКЫ БЕТ"</b>" баскычын кармап туруңуз"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP\'ти көзөмөлдөө үчүн БАШКЫ БЕТ\nбаскычын басып, кармап туруңуз"</string> + <string name="pip_hold_home" msgid="340086535668778109"><b>"БАШКЫ БЕТ"</b>" басып туруп PIP\'ти башкарыңыз"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP көзөмөлдөө үчүн БАШКЫ БЕТ баскычын басып, кармап туруңуз"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Түшүндүм"</string> </resources> diff --git a/packages/SystemUI/res/values-lo-rLA/strings_tv.xml b/packages/SystemUI/res/values-lo-rLA/strings_tv.xml index f6bc833363aa..e4116f855a50 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings_tv.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"ຫຼິ້ນ"</string> <string name="pip_pause" msgid="8412075640017218862">"ຢຸດຊົ່ວຄາວ"</string> <string name="pip_hold_home" msgid="340086535668778109">"ກົດ "<b>"HOME"</b>" ຄ້າງໄວ້ເພື່ອຄວບຄຸມ PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"ກົດປຸ່ມ HOME\nຄ້າງໄວ້ເພື່ອຄວບຄຸມ PIP"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"ເຂົ້າໃຈແລ້ວ"</string> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 4299efa0c784..3c7af5c63721 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -75,8 +75,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekrano kopija užfiksuota."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Palieskite, kad peržiūrėtumėte ekrano kopiją."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Nepavyko užfiksuoti ekrano kopijos."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Išsaugant ekrano kopiją iškilo problemų."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Negalima išsaugoti ekrano kopijos dėl ribotos saugyklos vietos."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Jūsų organizacijoje arba naudojant šią programą neleidžiama daryti ekrano kopijų"</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB failo perdavimo parinktys"</string> diff --git a/packages/SystemUI/res/values-lt/strings_tv.xml b/packages/SystemUI/res/values-lt/strings_tv.xml index 140b55ddd62a..8c60970b8c78 100644 --- a/packages/SystemUI/res/values-lt/strings_tv.xml +++ b/packages/SystemUI/res/values-lt/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Leisti"</string> <string name="pip_pause" msgid="8412075640017218862">"Pristabdyti"</string> <string name="pip_hold_home" msgid="340086535668778109">"Kad vald. PIP, pal. pasp. m. "<b>"PAGRINDINIS"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Kad vald. PIP, pal.\npasp. m. PAGRINDINIS"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Jei norite valdyti PIP, paspauskite ir palaikykite pagrindinio puslapio mygtuką"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Supratau"</string> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index ad00ad0e5359..bafad80fb99d 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -74,8 +74,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekrānuzņēmums ir uzņemts."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Pieskarieties, lai skatītu ekrānuzņēmumu."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Nevarēja uzņemt ekrānuzņēmumu."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Saglabājot ekrānuzņēmumu, radās problēma."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Nevar saglabāt ekrānuzņēmumu, jo krātuvē nepietiek vietas."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Lietotne vai jūsu organizācija neatļauj veikt ekrānuzņēmumus."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB failu pārsūtīšanas opcijas"</string> diff --git a/packages/SystemUI/res/values-lv/strings_tv.xml b/packages/SystemUI/res/values-lv/strings_tv.xml index d7ca3704f00c..397376a2700a 100644 --- a/packages/SystemUI/res/values-lv/strings_tv.xml +++ b/packages/SystemUI/res/values-lv/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Atskaņot"</string> <string name="pip_pause" msgid="8412075640017218862">"Apturēt"</string> <string name="pip_hold_home" msgid="340086535668778109">"Turiet taustiņu "<b>"SĀKUMS"</b>", lai kontrolētu PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Nospiediet un turiet pogu SĀKUMS,\n lai kontrolētu PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Nospiediet un turiet pogu SĀKUMS, lai kontrolētu PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Labi"</string> </resources> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 4116b6ff6df6..490200618b63 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Се појави проблем при зачувување на сликата од екранот."</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">"Пренос на датотека со УСБ"</string> diff --git a/packages/SystemUI/res/values-mk-rMK/strings_tv.xml b/packages/SystemUI/res/values-mk-rMK/strings_tv.xml index 5f88cb5c4dce..acb04be8fbb9 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings_tv.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"Пушти"</string> <string name="pip_pause" msgid="8412075640017218862">"Пауза"</string> <string name="pip_hold_home" msgid="340086535668778109">"Задржете "<b>"ДОМА"</b>" за кон. PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Притиснете и задржете го копчето\nДОМА за контролирање PIP"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"Разбрав"</string> </resources> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index f861a0022cd4..9bbc3ad8e810 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്ന സമയത്ത് പ്രശ്നം നേരിട്ടു."</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> diff --git a/packages/SystemUI/res/values-ml-rIN/strings_tv.xml b/packages/SystemUI/res/values-ml-rIN/strings_tv.xml index 0094bb6704e0..3d6250d3ec59 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"പ്ലേ ചെയ്യുക"</string> <string name="pip_pause" msgid="8412075640017218862">"തൽക്കാലം നിർത്തൂ"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP നിയന്ത്രിക്കാൻ "<b>"ഹോം"</b>" പിടിക്കുക"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP നിയന്ത്രിക്കാൻ ഹോം\nബട്ടൺ അമർത്തിപ്പിടിക്കുക"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"മനസ്സിലായി"</string> </resources> diff --git a/packages/SystemUI/res/values-mn-rMN/strings_tv.xml b/packages/SystemUI/res/values-mn-rMN/strings_tv.xml index 78b7cc859e6d..334a9f115c56 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings_tv.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"Тоглуулах"</string> <string name="pip_pause" msgid="8412075640017218862">"Түр зогсоох"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP-г удирдахын тулд "<b>"HOME"</b>" товчлуурыг дарна уу"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP-г удирдахын тулд HOME\nтовчлуурыг дараад хүлээнэ үү"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"Ойлголоо"</string> </resources> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index a3cb7361092a..a37365c94c7f 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"स्क्रीनशॉट जतन करताना समस्या आली."</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> diff --git a/packages/SystemUI/res/values-mr-rIN/strings_tv.xml b/packages/SystemUI/res/values-mr-rIN/strings_tv.xml index fd76c531356b..2f56b0aa0178 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"प्ले करा"</string> <string name="pip_pause" msgid="8412075640017218862">"विराम द्या"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP नियंत्रित करण्यासाठी "<b>"मुख्यपृष्ठ"</b>" धरून ठेवा"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP नियंत्रित करण्यासाठी\nमुख्यपृष्ठ बटण धरून ठेवा"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP नियंत्रित करण्यासाठी मुख्यपृष्ठ बटण दाबा आणि धरून ठेवा"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"समजले"</string> </resources> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index 75fdf62485aa..e2175e53399c 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Tangkapan skrin ditangkap."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Sentuh untuk melihat tangkapan skrin anda."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Tidak dapat menangkap tangkapan skrin."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Berlaku masalah semasa menyimpan tangkapan skrin."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Tidak dapat menyimpan tangkapan skrin kerana ruang storan terhad."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Apl atau organisasi anda tidak membenarkan pengambilan tangkapan skrin."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Pilihan pemindahan fail USB"</string> diff --git a/packages/SystemUI/res/values-ms-rMY/strings_tv.xml b/packages/SystemUI/res/values-ms-rMY/strings_tv.xml index 5fc98b9a1f25..83dee5ae9a37 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings_tv.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"Main"</string> <string name="pip_pause" msgid="8412075640017218862">"Jeda"</string> <string name="pip_hold_home" msgid="340086535668778109">"Thn "<b>"SKRN UTMA"</b>" utk kwl PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Tkn & thn butang SKRIN UTAMA\nutk mengawal PIP"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index d7597a598ea0..d6362f332ab5 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -221,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"အလုပ် မုဒ်ကို ဖွင့်ထားပါသည်။"</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"အလုပ် မုဒ်ကို ပိတ်ထားပါသည်။"</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"အလုပ် မုဒ်ကို ဖွင့်ထားပါသည်။"</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ဒေတာချွေတာမှု ပိတ်ထားသည်။"</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ဒေတာချွေတာမှု ဖွင့်ထားသည်။"</string> <string name="accessibility_brightness" msgid="8003681285547803095">"တောက်ပမှုကို ပြရန်"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ဒေတာ ခေတ္တရပ်တန့်သည်"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data ခေတ္တရပ်တန့်သည်"</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings_tv.xml b/packages/SystemUI/res/values-my-rMM/strings_tv.xml index 8491e371604a..616acda0b567 100644 --- a/packages/SystemUI/res/values-my-rMM/strings_tv.xml +++ b/packages/SystemUI/res/values-my-rMM/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"ဖွင့်ပါ"</string> <string name="pip_pause" msgid="8412075640017218862">"ဆိုင်းငံ့ပါ"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP ကိုထိန်းချုပ်ရန် "<b>"ပင်မ"</b>" ခလုတ်ကို ဖိထားပါ"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP ကိုထိန်းချုပ်ရန် ပင်မ\nခလုတ်ကို နှိပ်ပြီးဖိထားပါ"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP ကိုထိန်းချုပ်ရန် ပင်မခလုတ်ကို နှိပ်ပြီးဖိထားပါ"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"ရပါပြီ"</string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 5b0c6eb92497..a2b09c556d54 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skjermdumpen er lagret."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Trykk for å se skjermdumpen."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Kan ikke lagre skjermdumpen."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Det oppsto et problem under lagring av skjermdumpen."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Kan ikke lagre skjermdumpen på grunn av begrenset lagringsplass."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Appen eller organisasjonen din tillater ikke at du tar skjermdumper."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Altern. for USB-filoverføring"</string> diff --git a/packages/SystemUI/res/values-nb/strings_tv.xml b/packages/SystemUI/res/values-nb/strings_tv.xml index 8574d66a3129..921744e575cf 100644 --- a/packages/SystemUI/res/values-nb/strings_tv.xml +++ b/packages/SystemUI/res/values-nb/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Spill av"</string> <string name="pip_pause" msgid="8412075640017218862">"Sett på pause"</string> <string name="pip_hold_home" msgid="340086535668778109">"Hold inne "<b>"STARTSIDE"</b>" for å kontrollere PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Trykk og hold STARTSIDE-\nknappen for å kontrollere PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Trykk og hold inne STARTSIDE-knappen for å kontrollere PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Greit"</string> </resources> diff --git a/packages/SystemUI/res/values-ne-rNP/strings_tv.xml b/packages/SystemUI/res/values-ne-rNP/strings_tv.xml index 68c86ca79fe0..adfb4433d361 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings_tv.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"प्ले गर्नुहोस्"</string> <string name="pip_pause" msgid="8412075640017218862">"रोक्नुहोस्"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP लाई नियन्त्रण गर्न "<b>"गृह"</b>" कुञ्जीलाई थिचिरहनुहोस्"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP लाई नियन्त्रण गर्न गृह\nबटनलाई थिचेर होल्ड गर्नुहोस्"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"IP लाई नियन्त्रण गर्न गृह बटनलाई थिची होल्ड गर्नुहोस्"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"बुझेँ"</string> </resources> diff --git a/packages/SystemUI/res/values-nl/strings_tv.xml b/packages/SystemUI/res/values-nl/strings_tv.xml index c116f817da3d..8ccf464e5b04 100644 --- a/packages/SystemUI/res/values-nl/strings_tv.xml +++ b/packages/SystemUI/res/values-nl/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Afspelen"</string> <string name="pip_pause" msgid="8412075640017218862">"Onderbreken"</string> <string name="pip_hold_home" msgid="340086535668778109">"Bedien PIP met "<b>"HOME"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Houd HOME ingedrukt\nom PIP te bedienen"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Houd HOME ingedrukt om PIP te bedienen"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-pa-rIN/strings_tv.xml b/packages/SystemUI/res/values-pa-rIN/strings_tv.xml index 1bf28af27ebe..fafcd622c545 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"ਚਲਾਓ"</string> <string name="pip_pause" msgid="8412075640017218862">"ਰੋਕੋ"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP ਕੰਟਰੋਲ ਕਰਨ ਲਈ "<b>"ਹੋਮ"</b>" ਦਬਾਈ ਰੱਖੋ"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਹੋਮ\nਬਟਨ ਦਬਾਈ ਰੱਖੋ"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP ਨੂੰ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਹੋਮ ਬਟਨ ਨੂੰ ਦੱਬੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"ਸਮਝ ਲਿਆ"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 8a1fff6e0f2c..5a4a320e0dc5 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -75,8 +75,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Wykonano zrzut ekranu."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Dotknij, aby wyświetlić zrzut ekranu."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Nie udało się wykonać zrzutu ekranu."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Podczas zapisywania zrzutu ekranu wystąpił błąd."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Nie można zapisać zrzutu ekranu, bo brakuje miejsca w pamięci."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Nie możesz wykonać zrzutu ekranu, bo nie zezwala na to aplikacja lub Twoja organizacja."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB – opcje przesyłania plików"</string> diff --git a/packages/SystemUI/res/values-pl/strings_tv.xml b/packages/SystemUI/res/values-pl/strings_tv.xml index b804146643ab..d0371b05725a 100644 --- a/packages/SystemUI/res/values-pl/strings_tv.xml +++ b/packages/SystemUI/res/values-pl/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Odtwórz"</string> <string name="pip_pause" msgid="8412075640017218862">"Wstrzymaj"</string> <string name="pip_hold_home" msgid="340086535668778109">"Przytrzymaj "<b>"EKRAN GŁÓWNY"</b>", by sterować PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Przytrzymaj EKRAN GŁÓWNY,\nby sterować PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Przytrzymaj przycisk EKRAN GŁÓWNY, by sterować PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 1cf0ed98b635..089fa7527d44 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captura de tela obtida."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Toque para visualizar a captura de tela."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Não foi possível obter a captura de tela."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Problema encontrado ao salvar captura de tela."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Não é possível salvar a captura de tela, porque não há espaço suficiente."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Capturas de tela não são permitidas pelo app ou por sua organização."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opções transf. arq. por USB"</string> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Modo de trabalho ativado."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Modo de trabalho desativado."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Modo de trabalho ativado."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Economia de dados desativada."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Economia de dados ativada."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Brilho da tela"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os dados 2G e 3G foram pausados"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os dados 4G foram pausados"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings_tv.xml b/packages/SystemUI/res/values-pt-rBR/strings_tv.xml index 21d36e09e425..36ba02db88ba 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings_tv.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Reproduzir"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausar"</string> <string name="pip_hold_home" msgid="340086535668778109">"Mantenha "<b>"INÍCIO"</b>" pressionado para controlar o PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Mantenha o botão INÍCIO\npressionado para controlar o PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Mantenha a tecla \"HOME\" pressionada para controlar o PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Entendi"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 520abc45a4a7..166067020253 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -221,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Modo de trabalho ativado."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"O modo de trabalho foi desativado."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"O modo de trabalho foi ativado."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Poupança de dados desativada."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Poupança de dados ativada."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Brilho do visor"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Dados 2G-3G em pausa"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Dados 4G em pausa"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings_tv.xml b/packages/SystemUI/res/values-pt-rPT/strings_tv.xml index 8b1b032eb3ff..b588c7bf7691 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings_tv.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Reproduzir"</string> <string name="pip_pause" msgid="8412075640017218862">"Interromper"</string> <string name="pip_hold_home" msgid="340086535668778109">"Prima sem soltar o botão "<b>"HOME"</b>" para controlar o PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Prima sem soltar o botão HOME\npara controlar o PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Prima sem soltar o botão HOME para controlar o PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Compreendi"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 1cf0ed98b635..089fa7527d44 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captura de tela obtida."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Toque para visualizar a captura de tela."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Não foi possível obter a captura de tela."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Problema encontrado ao salvar captura de tela."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Não é possível salvar a captura de tela, porque não há espaço suficiente."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Capturas de tela não são permitidas pelo app ou por sua organização."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opções transf. arq. por USB"</string> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Modo de trabalho ativado."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Modo de trabalho desativado."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Modo de trabalho ativado."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Economia de dados desativada."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Economia de dados ativada."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Brilho da tela"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os dados 2G e 3G foram pausados"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os dados 4G foram pausados"</string> diff --git a/packages/SystemUI/res/values-pt/strings_tv.xml b/packages/SystemUI/res/values-pt/strings_tv.xml index 21d36e09e425..36ba02db88ba 100644 --- a/packages/SystemUI/res/values-pt/strings_tv.xml +++ b/packages/SystemUI/res/values-pt/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Reproduzir"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausar"</string> <string name="pip_hold_home" msgid="340086535668778109">"Mantenha "<b>"INÍCIO"</b>" pressionado para controlar o PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Mantenha o botão INÍCIO\npressionado para controlar o PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Mantenha a tecla \"HOME\" pressionada para controlar o PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Entendi"</string> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 113f2bc7907b..b7e0834c5dbc 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -74,8 +74,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captură de ecran realizată."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Atingeți pentru a vedea captura de ecran."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Captura de ecran nu a putut fi realizată."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Problemă întâmpinată la salvarea capturii de ecran."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Captura de ecran nu poate fi salvată din cauza spațiului de stocare limitat."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Crearea capturilor de ecran nu este permisă de aplicație sau de organizația dvs."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opțiuni pentru transferul de fișiere prin USB"</string> diff --git a/packages/SystemUI/res/values-ro/strings_tv.xml b/packages/SystemUI/res/values-ro/strings_tv.xml index e30b2f9fdf4e..0af2b39599d5 100644 --- a/packages/SystemUI/res/values-ro/strings_tv.xml +++ b/packages/SystemUI/res/values-ro/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Redați"</string> <string name="pip_pause" msgid="8412075640017218862">"Întrerupeți"</string> <string name="pip_hold_home" msgid="340086535668778109">"Apăsați lung "<b>"ACASĂ"</b>" pentru a controla PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Apăsați lung ACASĂ\npentru a controla PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Apăsați lung butonul ACASĂ pentru a controla PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Am înțeles"</string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index c131284ffa9b..f73ebf4397d2 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -75,8 +75,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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Не удалось сохранить скриншот."</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> diff --git a/packages/SystemUI/res/values-ru/strings_tv.xml b/packages/SystemUI/res/values-ru/strings_tv.xml index f25b460916d4..30f55cbca9c9 100644 --- a/packages/SystemUI/res/values-ru/strings_tv.xml +++ b/packages/SystemUI/res/values-ru/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Воспроизвести"</string> <string name="pip_pause" msgid="8412075640017218862">"Приостановить"</string> <string name="pip_hold_home" msgid="340086535668778109">"Управляйте кадром в кадре, удерживая кнопку "<b>"ГЛАВНАЯ"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Управляйте кадром в кадре,\nудерживая кнопку \"ГЛАВНАЯ\""</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Управляйте режимом \"Кадр в кадре\", удерживая кнопку ГЛАВНАЯ"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"ОК"</string> </resources> diff --git a/packages/SystemUI/res/values-si-rLK/strings_tv.xml b/packages/SystemUI/res/values-si-rLK/strings_tv.xml index b2c6485ac3a6..70884b032c02 100644 --- a/packages/SystemUI/res/values-si-rLK/strings_tv.xml +++ b/packages/SystemUI/res/values-si-rLK/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"ධාවනය කරන්න"</string> <string name="pip_pause" msgid="8412075640017218862">"විරාමය"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP පාලනයට "<b>"HOME"</b>" අල්ලාගන්න"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP පාලනයට HOME\nඔබා අල්ලාගන්න"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"හරි, තේරුණා"</string> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 26d6d2fbd9eb..edae154a8474 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -75,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Pri ukladaní snímky obrazovky sa vyskytol problém."</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> diff --git a/packages/SystemUI/res/values-sk/strings_tv.xml b/packages/SystemUI/res/values-sk/strings_tv.xml index 46f88f90b9c0..98a67f877d5c 100644 --- a/packages/SystemUI/res/values-sk/strings_tv.xml +++ b/packages/SystemUI/res/values-sk/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Prehrať"</string> <string name="pip_pause" msgid="8412075640017218862">"Pozastaviť"</string> <string name="pip_hold_home" msgid="340086535668778109">"Režim PIP ovládajte pomocou tlačidla "<b>"PLOCHA"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Režim PIP ovládajte stlačením a podržaním tlačidla PLOCHA\n"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Režim PIP ovládajte stlačením a podržaním tlačidla PLOCHA"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Dobre"</string> </resources> diff --git a/packages/SystemUI/res/values-sl/strings_tv.xml b/packages/SystemUI/res/values-sl/strings_tv.xml index e1d160413914..20de9c5fb30c 100644 --- a/packages/SystemUI/res/values-sl/strings_tv.xml +++ b/packages/SystemUI/res/values-sl/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Predvajanje"</string> <string name="pip_pause" msgid="8412075640017218862">"Zaustavitev"</string> <string name="pip_hold_home" msgid="340086535668778109">"Pridr. "<b>"HOME"</b>" za up. n. PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Pridržite gumb HOME\nza upravljanje načina PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Pridržite gumb HOME za upravljanje načina PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Razumem"</string> </resources> diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index b3e6ea8d2ee2..f657fb495976 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Pamja e ekranit u kap."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Prek për të parë pamjen e ekranit tënd."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Nuk mundi të kapte pamjen e ekranit."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"U has problem gjatë ruajtjes së pamjes së ekranit."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Pamja e ekranit nuk mund të ruhet për shkak të hapësirës ruajtëse të kufizuar."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Nxjerrja e pamjeve të ekranit nuk lejohet nga aplikacioni ose organizata jote."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Opsionet e transferimit të dosjeve të USB-së"</string> diff --git a/packages/SystemUI/res/values-sq-rAL/strings_tv.xml b/packages/SystemUI/res/values-sq-rAL/strings_tv.xml index 28bfbb5b3fe5..481662ffabd4 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings_tv.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Luaj"</string> <string name="pip_pause" msgid="8412075640017218862">"Pauzë"</string> <string name="pip_hold_home" msgid="340086535668778109">"Mbaj shtypur "<b>"HOME"</b>" për të kontrolluar PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Shtyp dhe mbaj shtypur butonin HOME\npër të kontrolluar PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Shtyp dhe mbaj shtypur butonin HOME për të kontrolluar PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"E kuptova"</string> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 9c26ebd85350..52d52e023211 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -74,8 +74,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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Дошло је до проблема при чувању снимка екрана."</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> diff --git a/packages/SystemUI/res/values-sr/strings_tv.xml b/packages/SystemUI/res/values-sr/strings_tv.xml index 4b03b6894a90..eed8f51c6d80 100644 --- a/packages/SystemUI/res/values-sr/strings_tv.xml +++ b/packages/SystemUI/res/values-sr/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Пусти"</string> <string name="pip_pause" msgid="8412075640017218862">"Паузирај"</string> <string name="pip_hold_home" msgid="340086535668778109"><b>"ПОЧЕТНИ ЕКРАН"</b>" конт. PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Притисните и задржите дугме ПОЧЕТНИ ЕКРАН\n да бисте контролисали PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Притисните и задржите дугме ПОЧЕТНИ ЕКРАН да бисте контролисали PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Важи"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 0fb5731d4edd..1c72fa96b220 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skärmdumpen har tagits."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Tryck här om du vill visa skärmdumpen."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Det gick inte att ta någon skärmdump."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Det gick inte att spara skärmdumpen."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Det går inte att spara skärmdumpen eftersom lagringsutrymmet inte räcker."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Appen eller organisationen tillåter inte att du tar skärmdumpar."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Överföringsalternativ"</string> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Arbetsläget aktiverat."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Arbetsläget har inaktiverats."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Arbetsläget har aktiverats."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Databesparing har inaktiverats."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Databesparing har aktiverats."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Skärmens ljusstyrka"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G- och 3G-data har pausats"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data har pausats"</string> diff --git a/packages/SystemUI/res/values-sv/strings_tv.xml b/packages/SystemUI/res/values-sv/strings_tv.xml index dc65877621d7..2b2c5c282a4e 100644 --- a/packages/SystemUI/res/values-sv/strings_tv.xml +++ b/packages/SystemUI/res/values-sv/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Spela upp"</string> <string name="pip_pause" msgid="8412075640017218862">"Pausa"</string> <string name="pip_hold_home" msgid="340086535668778109">"Styr PIP med "<b>"startknappen"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Håll ned startknappen\n för att styra PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Styr bild-i-bild genom att hålla ned startsideknappen"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index a7162817c490..5fe6375771e4 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Picha ya skrini imenaswa."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Gusa ili kuona picha yako ya skrini."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Haikuweza kunasa picha ya skrini"</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Hitilafu imetokea wakati wa kuhifadhi picha ya skrini."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Haina nafasi ya kutosha kuhifadhi picha ya skrini."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Shirika au programu yako haikuruhusu upige picha za skrini."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Machaguo ya uhamisho wa faili la USB"</string> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Hali ya kazi imewashwa."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Hali ya kazi imezimwa."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Hali ya kazi imewashwa."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Kiokoa Data kimezimwa."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Kiokoa Data kimewashwa."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Ung\'aavu wa skrini"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data ya 2G-3G imesitishwa"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data ya 4G imesitishwa"</string> diff --git a/packages/SystemUI/res/values-sw/strings_tv.xml b/packages/SystemUI/res/values-sw/strings_tv.xml index 9b3799adde1b..337c1360f3cf 100644 --- a/packages/SystemUI/res/values-sw/strings_tv.xml +++ b/packages/SystemUI/res/values-sw/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Cheza"</string> <string name="pip_pause" msgid="8412075640017218862">"Sitisha"</string> <string name="pip_hold_home" msgid="340086535668778109">"Shikilia kitufe cha "<b>"HOME"</b>" ili udhibiti PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Bonyeza na ushikilie kitufe cha\nHOME ili udhibiti PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Bonyeza na ushikilie kitufe cha HOME ili kudhibiti PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Nimeelewa"</string> </resources> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 59fe9dd604c1..570aeae47e1a 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"ஸ்க்ரீன்ஷாட்டைச் சேமிக்கும் போது, பிழை ஏற்பட்டது."</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> diff --git a/packages/SystemUI/res/values-ta-rIN/strings_tv.xml b/packages/SystemUI/res/values-ta-rIN/strings_tv.xml index d4d661a31f25..b92af22109b6 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"இயக்கு"</string> <string name="pip_pause" msgid="8412075640017218862">"இடைநிறுத்து"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIPஐக் கட்டுப்படுத்த, "<b>"முகப்பைப்"</b>" பிடித்திருக்கவும்"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIPஐக் கட்டுப்படுத்த, முகப்புப்\nபொத்தானை அழுத்தவும், பிடிக்கவும்"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"சரி"</string> </resources> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index c7f9b424426b..f0e5c60146c5 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"స్క్రీన్షాట్ని సేవ్ చేస్తున్నప్పుడు సమస్య సంభవించింది."</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> diff --git a/packages/SystemUI/res/values-te-rIN/strings_tv.xml b/packages/SystemUI/res/values-te-rIN/strings_tv.xml index 4c18743006a0..7ce24cb4fdc1 100644 --- a/packages/SystemUI/res/values-te-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-te-rIN/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"ప్లే చేయి"</string> <string name="pip_pause" msgid="8412075640017218862">"పాజ్ చేయి"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP నియం. "<b>"HOME"</b>"నొక్కిఉంచండి"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIPని నియంత్రించడానికి HOME\nబటన్ను నొక్కి ఉంచండి"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIPని నియంత్రించడానికి హోమ్ బటన్ను నొక్కి పట్టుకోండి"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"అర్థమైంది"</string> </resources> diff --git a/packages/SystemUI/res/values-th/strings_tv.xml b/packages/SystemUI/res/values-th/strings_tv.xml index f1c24ec646a6..abc1a87c57b1 100644 --- a/packages/SystemUI/res/values-th/strings_tv.xml +++ b/packages/SystemUI/res/values-th/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"เล่น"</string> <string name="pip_pause" msgid="8412075640017218862">"หยุดชั่วคราว"</string> <string name="pip_hold_home" msgid="340086535668778109">"กด "<b>"HOME"</b>" ค้างไว้เพื่อควบคุม PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"กดปุ่ม HOME ค้างไว้\nเพื่อควบคุม PIP"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"รับทราบ"</string> </resources> diff --git a/packages/SystemUI/res/values-tl/strings_tv.xml b/packages/SystemUI/res/values-tl/strings_tv.xml index 85a4f5b662d0..e6aad6045f7f 100644 --- a/packages/SystemUI/res/values-tl/strings_tv.xml +++ b/packages/SystemUI/res/values-tl/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"I-play"</string> <string name="pip_pause" msgid="8412075640017218862">"I-pause"</string> <string name="pip_hold_home" msgid="340086535668778109">"I-hold ang "<b>"HOME"</b>" para makontrol ang PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"I-hold ang button na HOME\nupang makontrol ang PIP"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 12be4c34974d..039a63f5e84d 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekran görüntüsü alındı."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Ekran görüntünüzü izlemek için dokunun."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Ekran görüntüsü alınamadı."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Ekran görüntüsü kaydedilirken sorun oluştu."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Depolama alanı sınırlı olduğundan ekran görüntüsü kaydedilemiyor."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Uygulama veya kuruluşunuz, ekran görüntüsü alınmasına izin vermiyor."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB dosya aktarım seçenekleri"</string> diff --git a/packages/SystemUI/res/values-tr/strings_tv.xml b/packages/SystemUI/res/values-tr/strings_tv.xml index ea136b14fe1a..c6da011442d3 100644 --- a/packages/SystemUI/res/values-tr/strings_tv.xml +++ b/packages/SystemUI/res/values-tr/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"Oynat"</string> <string name="pip_pause" msgid="8412075640017218862">"Duraklat"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP\'yi kontrol etmek için "<b>"ANA EKRAN"</b>"\'ı basılı tutun"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP\'yi kontrol etmek için\nANA EKRAN düğmesini basılı tutun"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"Anladım"</string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index e7721f127d61..e2ca5c57d956 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -75,8 +75,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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Не вдалося зберегти знімок екрана."</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> diff --git a/packages/SystemUI/res/values-uk/strings_tv.xml b/packages/SystemUI/res/values-uk/strings_tv.xml index 22bcf52ba4aa..dcb7a52ccbad 100644 --- a/packages/SystemUI/res/values-uk/strings_tv.xml +++ b/packages/SystemUI/res/values-uk/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Відтворити"</string> <string name="pip_pause" msgid="8412075640017218862">"Призупинити"</string> <string name="pip_hold_home" msgid="340086535668778109">"Щоб керувати PIP, утримуйте кнопку "<b>"ГОЛОВНИЙ ЕКРАН"</b></string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Щоб керувати PIP,\nутримуйте кнопку \"ГОЛОВНИЙ ЕКРАН\""</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Щоб керувати PIP, утримуйте кнопку \"ГОЛОВНИЙ ЕКРАН\""</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index dd7682868141..866350c4a17f 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"اسکرین شاٹ محفوظ کرتے وقت مسئلہ پیش آ گیا۔"</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> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"کام موڈ آن ہے۔"</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"کام موڈ آف ہو گیا۔"</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"کام موڈ آن ہو گیا۔"</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ڈیٹا سیور آف ہو گیا۔"</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ڈیٹا سرور آن ہو گیا۔"</string> <string name="accessibility_brightness" msgid="8003681285547803095">"ڈسپلے کی چمک"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ڈیٹا موقوف کر دیا گیا"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ڈیٹا موقوف کر دیا گیا"</string> diff --git a/packages/SystemUI/res/values-ur-rPK/strings_tv.xml b/packages/SystemUI/res/values-ur-rPK/strings_tv.xml index 4929f81fbce6..4216e9e85d5e 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings_tv.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"چلائیں"</string> <string name="pip_pause" msgid="8412075640017218862">"موقوف کریں"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP کنٹرول کرنے کیلئے "<b>"ہوم"</b>" پکڑے رکھیں"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"PIP کنٹرول کرنے کیلئے\nہوم بٹن دبائیں اور پکڑے رکھیں"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"PIP کنٹرول کرنے کیلئے ہوم بٹن دبائیں اور پکڑے رکھیں"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"سمجھ آ گئی"</string> </resources> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 21400b305b1d..fb9a9e2856db 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skrinshot saqlandi."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Ko‘rish uchun bu yerga bosing."</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Skrinshot saqlanmadi."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Skrinshotni saqlashda muammo yuz berdi."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Xotirada joy kamligi uchun skrinshotni saqlab bo‘lmadi."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Ilova yoki tashkilotingiz skrinshot olishni taqiqlagan."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB fayl ko‘chirish moslamalari"</string> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Ish rejimi yoniq."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Ish rejimi o‘chirib qo‘yildi."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Ishchi rejim yoqildi."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Trafik tejash rejimi o‘chirib qo‘yildi."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Trafik tejash rejimi yoqildi."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Ekran yorqinligi"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G internet to‘xtatib qo‘yildi"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G internet to‘xtatib qo‘yildi"</string> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings_tv.xml b/packages/SystemUI/res/values-uz-rUZ/strings_tv.xml index d6ffb67f6b09..d9db7d233b3d 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings_tv.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings_tv.xml @@ -19,11 +19,11 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="pip_close" msgid="3480680679023423574">"PIP’ni yopish"</string> + <string name="pip_close" msgid="3480680679023423574">"Kadr ichida kadr – chiqish"</string> <string name="pip_fullscreen" msgid="8604643018538487816">"To‘liq ekran"</string> <string name="pip_play" msgid="674145557658227044">"Ijro"</string> <string name="pip_pause" msgid="8412075640017218862">"Pauza"</string> - <string name="pip_hold_home" msgid="340086535668778109"><b>"BOSHIGA"</b>" tugmasini bosib turib, PIP’ni boshqaring"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"BOSHIGA tugmasini bosib turib,\nPIP’ni boshqaring"</string> + <string name="pip_hold_home" msgid="340086535668778109">"“Kadr ichida kadr” rejimini boshqarish uchun "<b>"BOSHI"</b>" tugmasini bosib turing"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"“Kadr ichida kadr” rejimini boshqarish uchun BOSHIGA tugmasini bosib turing"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 8f947afcd5ff..7427bda4a5f4 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -221,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Chế độ làm việc bật."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Chế độ làm việc đã tắt."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Chế độ làm việc đã bật."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Đã tắt Trình tiết kiệm dữ liệu."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Đã bật Trình tiết kiệm dữ liệu."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Độ sáng màn hình"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Đã tạm dừng dữ liệu 2G-3G"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Đã tạm dừng dữ liệu 4G"</string> diff --git a/packages/SystemUI/res/values-vi/strings_tv.xml b/packages/SystemUI/res/values-vi/strings_tv.xml index 48ba4440082f..727dcb89fae6 100644 --- a/packages/SystemUI/res/values-vi/strings_tv.xml +++ b/packages/SystemUI/res/values-vi/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"Phát"</string> <string name="pip_pause" msgid="8412075640017218862">"Tạm dừng"</string> <string name="pip_hold_home" msgid="340086535668778109">"Giữ "<b>"HOME"</b>" để đ.khiển PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Nhấn và giữ nút HOME\nđể điều khiển PIP"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"OK"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings_tv.xml b/packages/SystemUI/res/values-zh-rCN/strings_tv.xml index 860df351ded2..87b62a03b1ea 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings_tv.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings_tv.xml @@ -19,11 +19,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="pip_close" msgid="3480680679023423574">"关闭 PIP"</string> + <string name="pip_close" msgid="3480680679023423574">"关闭画中画"</string> <string name="pip_fullscreen" msgid="8604643018538487816">"全屏"</string> <string name="pip_play" msgid="674145557658227044">"播放"</string> <string name="pip_pause" msgid="8412075640017218862">"暂停"</string> - <string name="pip_hold_home" msgid="340086535668778109">"按住"<b>"主屏幕"</b>"即可控制 PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"按住主屏幕\n按钮即可控制 PIP"</string> + <string name="pip_hold_home" msgid="340086535668778109">"按住"<b>"主屏幕"</b>"按钮即可控制画中画功能"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"知道了"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index c7b2fffeea30..602089e68e4c 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -221,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"工作模式已開啟。"</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"已關閉工作模式。"</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"已開啟工作模式。"</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"已關閉數據節省模式。"</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"已開啟數據節省模式。"</string> <string name="accessibility_brightness" msgid="8003681285547803095">"顯示光暗度"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"已暫停 2G-3G 數據"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"已暫停 4G 數據"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings_tv.xml b/packages/SystemUI/res/values-zh-rHK/strings_tv.xml index 8e5a2df9743c..e419aa190da4 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings_tv.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"播放"</string> <string name="pip_pause" msgid="8412075640017218862">"暫停"</string> <string name="pip_hold_home" msgid="340086535668778109">"按住"<b>"主按鈕"</b>"即可控制 PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"按住主按鈕\n即可控制 PIP"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"知道了"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 636f2fb87b17..189f404d3ed8 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -73,8 +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> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"儲存螢幕擷圖時發生問題。"</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> diff --git a/packages/SystemUI/res/values-zh-rTW/strings_tv.xml b/packages/SystemUI/res/values-zh-rTW/strings_tv.xml index 60edac232e1f..94a83b939121 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings_tv.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings_tv.xml @@ -24,6 +24,7 @@ <string name="pip_play" msgid="674145557658227044">"播放"</string> <string name="pip_pause" msgid="8412075640017218862">"暫停"</string> <string name="pip_hold_home" msgid="340086535668778109">"按住「主畫面」"<b></b>"按鈕即可控制子母畫面"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"按住「主畫面」按鈕\n即可控制子母畫面"</string> + <!-- no translation found for pip_onboarding_description (2882896641362814195) --> + <skip /> <string name="pip_onboarding_button" msgid="3957426748484904611">"我知道了"</string> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 8d2a51bfa7bf..60c4479bfb4c 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -73,8 +73,7 @@ <string name="screenshot_saved_title" msgid="6461865960961414961">"Umfanekiso weskrini uqoshiwe"</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Thinta ukubona imifanekiso yakho yeskrini"</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Yehlulekile ukulondoloza umfanekiso weskrini."</string> - <!-- no translation found for screenshot_failed_to_save_unknown_text (7887826345701753830) --> - <skip /> + <string name="screenshot_failed_to_save_unknown_text" msgid="7887826345701753830">"Inkinga ivelile ngenkathi ilondoloza isithombe sikrini."</string> <string name="screenshot_failed_to_save_text" msgid="2592658083866306296">"Ayikwazi ukulondoloza isithombe-skrini ngenxa yesikhala sesitoreji esikhawulelwe."</string> <string name="screenshot_failed_to_capture_text" msgid="7602391003979898374">"Ukuthatha izithombe-skrini akuvunyelwe uhlelo lokusebenza noma inhlangano yakho."</string> <string name="usb_preference_title" msgid="6551050377388882787">"Okukhethwa kokudluliswa kwefayela ye-USB"</string> @@ -222,10 +221,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Imodi yomsebenzi ivuliwe."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Imodi yomsebenzi ivaliwe."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Imodi yomsebenzi ivuliwe."</string> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> - <skip /> - <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> - <skip /> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Iseva yedatha ivaliwe."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Iseva yedatha ivuliwe."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Bonisa ukukhanya"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G idatha imisiwe"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G idatha imisiwe"</string> diff --git a/packages/SystemUI/res/values-zu/strings_tv.xml b/packages/SystemUI/res/values-zu/strings_tv.xml index b901f906b583..b0105560d877 100644 --- a/packages/SystemUI/res/values-zu/strings_tv.xml +++ b/packages/SystemUI/res/values-zu/strings_tv.xml @@ -24,6 +24,6 @@ <string name="pip_play" msgid="674145557658227044">"Dlala"</string> <string name="pip_pause" msgid="8412075640017218862">"Misa isikhashana"</string> <string name="pip_hold_home" msgid="340086535668778109">"Bamba "<b>"IKHAYA"</b>" ukuze ulawule i-PIP"</string> - <string name="pip_onboarding_description" msgid="2627737116380318292">"Cindezela uphinde ubambe inkinobho YASEKHAYA\nukuze ulawule i-PIP"</string> + <string name="pip_onboarding_description" msgid="2882896641362814195">"Cindezela futhi ubambe inkinobho EKHAYA ukuze ulawule i-PIP"</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"Ngiyezwa"</string> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 8af413c4816c..420a9393b4c7 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -715,7 +715,9 @@ <string name="quick_settings_work_mode_label">Work mode</string> <!-- Recents: The empty recents string. [CHAR LIMIT=NONE] --> - <string name="recents_empty_message">Your recent screens appear here</string> + <string name="recents_empty_message">No recent items</string> + <!-- Recents: The empty recents string after dismissing all tasks. [CHAR LIMIT=NONE] --> + <string name="recents_empty_message_dismissed_all">You\'ve cleared everything</string> <!-- Recents: The info panel app info button string. [CHAR LIMIT=NONE] --> <string name="recents_app_info_button_label">Application Info</string> <!-- Recents: The screen pinning button. [CHAR LIMIT=NONE] --> @@ -1184,11 +1186,6 @@ <!-- Option to use new paging layout in quick settings [CHAR LIMIT=60] --> <string name="qs_paging" translatable="false">Use the new Quick Settings</string> - <!-- Disables fast-toggling recents via the recents button. DO NOT TRANSLATE --> - <string name="overview_disable_fast_toggle_via_button">Disable fast toggle</string> - <!-- Description for the toggle for fast-toggling recents via the recents button. DO NOT TRANSLATE --> - <string name="overview_disable_fast_toggle_via_button_desc">Disable launch timeout while paging</string> - <!-- Toggle to enable the gesture to enter split-screen by swiping up from the Overview button. [CHAR LIMIT=60]--> <string name="overview_nav_bar_gesture">Enable split-screen swipe-up gesture</string> <!-- Description for the toggle to enable the gesture to enter split-screen by swiping up from the Overview button. [CHAR LIMIT=NONE]--> diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml index ddc03a39d3a7..a130cf9009a9 100644 --- a/packages/SystemUI/res/xml/tuner_prefs.xml +++ b/packages/SystemUI/res/xml/tuner_prefs.xml @@ -138,11 +138,6 @@ android:title="@string/other" > <com.android.systemui.tuner.TunerSwitch - android:key="overview_disable_fast_toggle_via_button" - android:title="@string/overview_disable_fast_toggle_via_button" - android:summary="@string/overview_disable_fast_toggle_via_button_desc" /> - - <com.android.systemui.tuner.TunerSwitch android:key="overview_nav_bar_gesture" android:title="@string/overview_nav_bar_gesture" android:summary="@string/overview_nav_bar_gesture_desc" /> diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java index 937f7d319432..0d822cba1070 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java @@ -166,7 +166,9 @@ public class FalsingManager implements SensorEventListener { */ public boolean isFalseTouch() { if (FalsingLog.ENABLED) { - if (!mSessionActive) { + // We're getting some false wtfs from touches that happen after the device went + // to sleep. Only report missing sessions that happen when the device is interactive. + if (!mSessionActive && mContext.getSystemService(PowerManager.class).isInteractive()) { FalsingLog.wtf("isFalseTouch", new StringBuilder() .append("Session is not active, yet there's a query for a false touch.") .append(" enabled=").append(isEnabled() ? 1 : 0) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 312d3c5dc650..02b860c493cd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -811,7 +811,7 @@ public class KeyguardViewMediator extends SystemUI { intent.putExtra("seq", mDelayedShowingSequence); PendingIntent sender = PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); - mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, sender); + mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, sender); if (DEBUG) Log.d(TAG, "setting alarm to turn off keyguard, seq = " + mDelayedShowingSequence); doKeyguardLaterForChildProfilesLocked(); @@ -828,7 +828,8 @@ public class KeyguardViewMediator extends SystemUI { lockIntent.putExtra(Intent.EXTRA_USER_ID, info.id); PendingIntent lockSender = PendingIntent.getBroadcast( mContext, 0, lockIntent, PendingIntent.FLAG_CANCEL_CURRENT); - mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, userWhen, lockSender); + mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, + userWhen, lockSender); } } } @@ -1542,13 +1543,22 @@ public class KeyguardViewMediator extends SystemUI { try { mStatusBarKeyguardViewManager.keyguardGoingAway(); + int flags = 0; + if (mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock() + || mWakeAndUnlocking) { + flags |= WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; + } + if (mStatusBarKeyguardViewManager.isGoingToNotificationShade()) { + flags |= WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; + } + if (mStatusBarKeyguardViewManager.isUnlockWithWallpaper()) { + flags |= WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; + } + // Don't actually hide the Keyguard at the moment, wait for window // manager until it tells us it's safe to do so with // startKeyguardExitAnimation. - ActivityManagerNative.getDefault().keyguardGoingAway( - mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock() - || mWakeAndUnlocking, - mStatusBarKeyguardViewManager.isGoingToNotificationShade()); + ActivityManagerNative.getDefault().keyguardGoingAway(flags); } catch (RemoteException e) { Log.e(TAG, "Error while calling WindowManager", e); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 88b6caa912f7..815c6797e0dd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -89,6 +89,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha public void setHost(QSTileHost qsh) { qsh.addCallback(this); + updateAnimators(); } @Override @@ -133,6 +134,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha TouchAnimator.Builder translationYBuilder = new Builder(); TouchAnimator.Builder lastRowBuilder = new Builder(); + if (mQsPanel.getHost() == null) return; Collection<QSTile<?>> tiles = mQsPanel.getHost().getTiles(); int count = 0; int[] loc1 = new int[2]; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index d0e034bc4890..ab901795f425 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -26,6 +26,8 @@ import android.widget.Space; import com.android.systemui.R; import com.android.systemui.qs.QSTile.SignalState; import com.android.systemui.qs.QSTile.State; +import com.android.systemui.qs.customize.QSCustomizer; +import com.android.systemui.statusbar.phone.QSTileHost; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; @@ -95,9 +97,17 @@ public class QuickQSPanel extends QSPanel { return new QSTileBaseView(mContext, tile.createTileView(mContext)); } + @Override + public void setHost(QSTileHost host, QSCustomizer customizer) { + super.setHost(host, customizer); + setTiles(mHost.getTiles()); + } + public void setMaxTiles(int maxTiles) { mMaxTiles = maxTiles; - setTiles(mHost.getTiles()); + if (mHost != null) { + setTiles(mHost.getTiles()); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index 473956fbe4d7..f33ef654eaf7 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -26,6 +26,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; @@ -361,7 +362,8 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); if (!loadPlan.hasTasks()) { - loader.preloadTasks(loadPlan, -1, launchState.launchedFromHome); + loader.preloadTasks(loadPlan, launchState.launchedToTaskId, + launchState.launchedFromHome); } RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options(); @@ -434,6 +436,13 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD } @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + EventBus.getDefault().send(new ConfigurationChangedEvent()); + } + + @Override protected void onStop() { super.onStop(); @@ -740,7 +749,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD public final void onBusEvent(AllTaskViewsDismissedEvent event) { SystemServicesProxy ssp = Recents.getSystemServices(); if (ssp.hasDockedTask()) { - mRecentsView.showEmptyView(); + mRecentsView.showEmptyView(R.string.recents_empty_message_dismissed_all); } else { // Just go straight home (no animation necessary because there are no more task views) dismissRecentsToHome(false /* animateTaskViews */); diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java index 6feda81bc60a..40bf6d3d2447 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java @@ -41,6 +41,8 @@ public class RecentsDebugFlags implements TunerService.Tunable { public static final boolean EnableHistory = false; // Overrides the Tuner flags and enables the timeout private static final boolean EnableFastToggleTimeout = false; + // Overrides the Tuner flags and enables the paging via the Recents button + private static final boolean EnablePaging = false; // Enables us to create mock recents tasks public static final boolean EnableMockTasks = false; @@ -54,10 +56,6 @@ public class RecentsDebugFlags implements TunerService.Tunable { public static final int MockTaskGroupsTaskCount = 12; } - private static final String KEY_ENABLE_PAGING = "overview_enable_paging"; - - private boolean mEnablePaging; - /** * We read the prefs once when we start the activity, then update them as the tuner changes * the flags. @@ -65,7 +63,6 @@ public class RecentsDebugFlags implements TunerService.Tunable { public RecentsDebugFlags(Context context) { // Register all our flags, this will also call onTuningChanged() for each key, which will // initialize the current state of each flag - TunerService.get(context).addTunable(this, KEY_ENABLE_PAGING); } /** @@ -83,16 +80,11 @@ public class RecentsDebugFlags implements TunerService.Tunable { * @return whether we are enabling paging. */ public boolean isPagingEnabled() { - return mEnablePaging; + return Static.EnablePaging; } @Override public void onTuningChanged(String key, String newValue) { - switch (key) { - case KEY_ENABLE_PAGING: - mEnablePaging = (newValue != null) && (Integer.parseInt(newValue) != 0); - break; - } EventBus.getDefault().send(new DebugFlagsChangedEvent()); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java index 5e1af1280400..ee4d95e2bf55 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java @@ -268,6 +268,14 @@ public class RecentsTaskLoader { BitmapDrawable mDefaultIcon; Bitmap mDefaultThumbnail; + private TaskKeyLruCache.EvictionCallback mClearActivityInfoOnEviction = + new TaskKeyLruCache.EvictionCallback() { + @Override + public void onEntryEvicted(Task.TaskKey key) { + mActivityInfoCache.remove(key.getComponent()); + } + }; + public RecentsTaskLoader(Context context) { Resources res = context.getResources(); mDefaultTaskBarBackgroundColor = @@ -292,10 +300,11 @@ public class RecentsTaskLoader { // Initialize the proxy, cache and loaders int numRecentTasks = ActivityManager.getMaxRecentTasksStatic(); mLoadQueue = new TaskResourceLoadQueue(); - mIconCache = new TaskKeyLruCache<>(iconCacheSize); + mIconCache = new TaskKeyLruCache<>(iconCacheSize, mClearActivityInfoOnEviction); mThumbnailCache = new TaskKeyLruCache<>(thumbnailCacheSize); - mActivityLabelCache = new TaskKeyLruCache<>(numRecentTasks); - mContentDescriptionCache = new TaskKeyLruCache<>(numRecentTasks); + mActivityLabelCache = new TaskKeyLruCache<>(numRecentTasks, mClearActivityInfoOnEviction); + mContentDescriptionCache = new TaskKeyLruCache<>(numRecentTasks, + mClearActivityInfoOnEviction); mActivityInfoCache = new LruCache(numRecentTasks); mLoader = new BackgroundTaskLoader(mLoadQueue, mIconCache, mThumbnailCache, mDefaultThumbnail, mDefaultIcon); @@ -375,7 +384,6 @@ public class RecentsTaskLoader { mIconCache.remove(t.key); mActivityLabelCache.remove(t.key); mContentDescriptionCache.remove(t.key); - mActivityInfoCache.remove(t.key.getComponent()); if (notifyTaskDataUnloaded) { t.notifyTaskDataUnloaded(null, mDefaultIcon); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskKeyLruCache.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskKeyLruCache.java index d433b6c00269..748d8ed75040 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskKeyLruCache.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskKeyLruCache.java @@ -30,16 +30,29 @@ import android.util.SparseArray; */ public class TaskKeyLruCache<V> { + public interface EvictionCallback { + public void onEntryEvicted(Task.TaskKey key); + } + private static final String TAG = "TaskKeyLruCache"; private final SparseArray<Task.TaskKey> mKeys = new SparseArray<>(); private final LruCache<Integer, V> mCache; + private final EvictionCallback mEvictionCallback; public TaskKeyLruCache(int cacheSize) { + this(cacheSize, null); + } + + public TaskKeyLruCache(int cacheSize, EvictionCallback evictionCallback) { + mEvictionCallback = evictionCallback; mCache = new LruCache<Integer, V>(cacheSize) { @Override protected void entryRemoved(boolean evicted, Integer taskId, V oldV, V newV) { + if (mEvictionCallback != null) { + mEvictionCallback.onEntryEvicted(mKeys.get(taskId)); + } mKeys.remove(taskId); } }; @@ -84,8 +97,9 @@ public class TaskKeyLruCache<V> { /** Removes a cache entry for a specific key. */ final void remove(Task.TaskKey key) { - mKeys.remove(key.id); + // Remove the key after the cache value because we need it to make the callback mCache.remove(key.id); + mKeys.remove(key.id); } /** Removes all the entries in the cache. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index 8342de547720..92356736763e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -97,7 +97,7 @@ public class RecentsView extends FrameLayout { private RecentsAppWidgetHostView mSearchBar; private TextView mHistoryButton; private TextView mHistoryClearAllButton; - private View mEmptyView; + private TextView mEmptyView; private RecentsHistoryView mHistoryView; private boolean mAwaitingFirstLayout = true; @@ -159,7 +159,7 @@ public class RecentsView extends FrameLayout { } }); } - mEmptyView = inflater.inflate(R.layout.recents_empty, this, false); + mEmptyView = (TextView) inflater.inflate(R.layout.recents_empty, this, false); addView(mEmptyView); setBackground(mBackgroundScrim); @@ -206,7 +206,7 @@ public class RecentsView extends FrameLayout { if (stack.getTaskCount() > 0) { hideEmptyView(); } else { - showEmptyView(); + showEmptyView(R.string.recents_empty_message); } } @@ -327,11 +327,12 @@ public class RecentsView extends FrameLayout { /** * Hides the task stack and shows the empty view. */ - public void showEmptyView() { + public void showEmptyView(int msgResId) { if (RecentsDebugFlags.Static.EnableSearchBar && (mSearchBar != null)) { mSearchBar.setVisibility(View.INVISIBLE); } mTaskStackView.setVisibility(View.INVISIBLE); + mEmptyView.setText(msgResId); mEmptyView.setVisibility(View.VISIBLE); mEmptyView.bringToFront(); if (RecentsDebugFlags.Static.EnableHistory) { @@ -400,8 +401,8 @@ public class RecentsView extends FrameLayout { // Measure the empty view to the full size of the screen if (mEmptyView.getVisibility() != GONE) { - measureChild(mEmptyView, MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + measureChild(mEmptyView, MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); } if (RecentsDebugFlags.Static.EnableHistory) { @@ -449,7 +450,13 @@ public class RecentsView extends FrameLayout { // Layout the empty view if (mEmptyView.getVisibility() != GONE) { - mEmptyView.layout(left, top, right, bottom); + int leftRightInsets = mSystemInsets.left + mSystemInsets.right; + int topBottomInsets = mSystemInsets.top + mSystemInsets.bottom; + int childWidth = mEmptyView.getMeasuredWidth(); + int childHeight = mEmptyView.getMeasuredHeight(); + int childLeft = left + Math.max(0, (right - left - leftRightInsets - childWidth)) / 2; + int childTop = top + Math.max(0, (bottom - top - topBottomInsets - childHeight)) / 2; + mEmptyView.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight); } if (RecentsDebugFlags.Static.EnableHistory) { diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 6c410c3981c6..93b5b6c12904 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -61,6 +61,7 @@ import com.android.systemui.recents.events.activity.EnterRecentsTaskStackAnimati import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationCompletedEvent; import com.android.systemui.recents.events.activity.HideHistoryButtonEvent; import com.android.systemui.recents.events.activity.HideHistoryEvent; +import com.android.systemui.recents.events.activity.HideRecentsEvent; import com.android.systemui.recents.events.activity.IterateRecentsEvent; import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent; import com.android.systemui.recents.events.activity.LaunchTaskEvent; @@ -113,6 +114,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal private static final int DRAG_SCALE_DURATION = 175; private static final float DRAG_SCALE_FACTOR = 1.05f; + private static final int LAUNCH_NEXT_SCROLL_BASE_DURATION = 200; + private static final int LAUNCH_NEXT_SCROLL_INCR_DURATION = 32; + private static final ArraySet<Task.TaskKey> EMPTY_TASK_SET = new ArraySet<>(); LayoutInflater mInflater; @@ -1618,12 +1622,34 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal mUIDozeTrigger.stopDozing(); cancelAllTaskViewAnimations(); - Task launchTask = mStack.getStackTasks().get(launchTaskIndex); - EventBus.getDefault().send(new LaunchTaskEvent(getChildViewForTask(launchTask), - launchTask, null, INVALID_STACK_ID, false /* screenPinningRequested */)); + final Task launchTask = mStack.getStackTasks().get(launchTaskIndex); + if (getChildViewForTask(launchTask) == null) { + List<TaskView> taskViews = getTaskViews(); + int lastTaskIndex = !taskViews.isEmpty() + ? mStack.indexOfStackTask(taskViews.get(taskViews.size() - 1).getTask()) + : mStack.getTaskCount() - 1; + int duration = LAUNCH_NEXT_SCROLL_BASE_DURATION + + Math.abs(mStack.indexOfStackTask(launchTask) - lastTaskIndex) + * LAUNCH_NEXT_SCROLL_INCR_DURATION; + mStackScroller.animateScroll(mLayoutAlgorithm.getStackScrollForTask(launchTask), + duration, new Runnable() { + @Override + public void run() { + EventBus.getDefault().send(new LaunchTaskEvent( + getChildViewForTask(launchTask), launchTask, null, + INVALID_STACK_ID, false /* screenPinningRequested */)); + } + }); + } else { + EventBus.getDefault().send(new LaunchTaskEvent(getChildViewForTask(launchTask), + launchTask, null, INVALID_STACK_ID, false /* screenPinningRequested */)); + } MetricsLogger.action(getContext(), MetricsEvent.OVERVIEW_LAUNCH_PREVIOUS_TASK, launchTask.key.getComponent().toString()); + } else if (mStack.getTaskCount() == 0) { + // If there are no tasks, then just hide recents back to home. + EventBus.getDefault().send(new HideRecentsEvent(false, true)); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java index ad46abd74f7d..9be3542bf59e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java @@ -179,6 +179,13 @@ public class TaskStackViewScroller { /** Animates the stack scroll */ void animateScroll(float newScroll, final Runnable postRunnable) { + int duration = mContext.getResources().getInteger( + R.integer.recents_animate_task_stack_scroll_duration); + animateScroll(newScroll, duration, postRunnable); + } + + /** Animates the stack scroll */ + void animateScroll(float newScroll, int duration, final Runnable postRunnable) { // Finish any current scrolling animations if (mScrollAnimator != null && mScrollAnimator.isRunning()) { setStackScroll(mFinalAnimatedScroll); @@ -190,8 +197,7 @@ public class TaskStackViewScroller { if (Float.compare(mStackScrollP, newScroll) != 0) { mFinalAnimatedScroll = newScroll; mScrollAnimator = ObjectAnimator.ofFloat(this, STACK_SCROLL, getStackScroll(), newScroll); - mScrollAnimator.setDuration(mContext.getResources().getInteger( - R.integer.recents_animate_task_stack_scroll_duration)); + mScrollAnimator.setDuration(duration); mScrollAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); mScrollAnimator.addListener(new AnimatorListenerAdapter() { @Override 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 906bd0ff4b57..bf5861107b09 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1887,10 +1887,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mBackdrop.getVisibility() != View.VISIBLE) { mBackdrop.setVisibility(View.VISIBLE); if (allowEnterAnimation) { - mBackdrop.animate().alpha(1f); + mBackdrop.animate().alpha(1f).withEndAction(new Runnable() { + @Override + public void run() { + mStatusBarWindowManager.setBackdropShowing(true); + } + }); } else { mBackdrop.animate().cancel(); mBackdrop.setAlpha(1f); + mStatusBarWindowManager.setBackdropShowing(true); } metaDataChanged = true; if (DEBUG_MEDIA) { @@ -1948,7 +1954,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // We are unlocking directly - no animation! mBackdrop.setVisibility(View.GONE); mBackdropBack.setImageDrawable(null); + mStatusBarWindowManager.setBackdropShowing(false); } else { + mStatusBarWindowManager.setBackdropShowing(false); mBackdrop.animate() // Never let the alpha become zero - otherwise the RenderNode // won't draw anything and uninitialized memory will show through diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 2ba1562c39e4..117e2b325ef7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -227,6 +227,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mStatusBarWindowManager.setKeyguardNeedsInput(needsInput); } + public boolean isUnlockWithWallpaper() { + return mStatusBarWindowManager.isShowingWallpaper(); + } + public void setOccluded(boolean occluded) { if (occluded && !mOccluded && mShowing) { if (mPhoneStatusBar.isInLaunchTransition()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index 77ece9322583..ada745079fef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -100,12 +100,16 @@ public class StatusBarWindowManager implements RemoteInputController.Callback { private void applyKeyguardFlags(State state) { if (state.keyguardShowing) { - mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; mLpChanged.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; } else { - mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; } + + if (state.keyguardShowing && !state.backdropShowing) { + mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; + } else { + mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; + } } private void adjustScreenOrientation(State state) { @@ -255,6 +259,11 @@ public class StatusBarWindowManager implements RemoteInputController.Callback { apply(mCurrentState); } + public void setBackdropShowing(boolean showing) { + mCurrentState.backdropShowing = showing; + apply(mCurrentState); + } + public void setKeyguardFadingAway(boolean keyguardFadingAway) { mCurrentState.keyguardFadingAway = keyguardFadingAway; apply(mCurrentState); @@ -323,6 +332,10 @@ public class StatusBarWindowManager implements RemoteInputController.Callback { pw.println(mCurrentState); } + public boolean isShowingWallpaper() { + return !mCurrentState.backdropShowing; + } + private static class State { boolean keyguardShowing; boolean keyguardOccluded; @@ -338,6 +351,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback { boolean forceCollapsed; boolean forceDozeBrightness; boolean forceUserActivity; + boolean backdropShowing; /** * The {@link BaseStatusBar} state from the status bar. diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index d36a1d702701..d929519bddff 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -1996,6 +1996,22 @@ message MetricsEvent { // Logs that the user docks window via shortcut key. WINDOW_DOCK_SHORTCUTS = 352; + // User already denied access to the request folder; action takes an integer + // representing the folder's index on Environment.STANDARD_DIRECTORIES + ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_FOLDER = 353; + + // User already denied access to the request folder; action pass package name + // of calling package. + ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_PACKAGE = 354; + + // User denied access to the request folder and checked 'Do not ask again'; + // action takes an integer representing the folder's index on Environment.STANDARD_DIRECTORIES + ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_FOLDER = 355; + + // User denied access to the request folder and checked 'Do not ask again'; + // action pass package name of calling package. + ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_PACKAGE = 356; + // Add new aosp constants above this line. // END OF AOSP CONSTANTS } diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index 4e667c659133..e0f5934cab74 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -2071,6 +2071,8 @@ nScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, sc.array4End = 0; sca = ≻ + // sc_size is required, but unused, by the runtime and drivers. + sc_size = sizeof(sc); } rsScriptForEachMulti((RsContext)con, (RsScript)script, slot, diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 3659a40d9f6c..a4f85db949cb 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -210,6 +210,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku private final UserManager mUserManager; private final AppOpsManager mAppOpsManager; private final KeyguardManager mKeyguardManager; + private final DevicePolicyManagerInternal mDevicePolicyManagerInternal; private final SecurityPolicy mSecurityPolicy; @@ -232,6 +233,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); mKeyguardManager = (KeyguardManager) mContext.getSystemService(KEYGUARD_SERVICE); + mDevicePolicyManagerInternal = LocalServices.getService(DevicePolicyManagerInternal.class); mSaveStateHandler = BackgroundThread.getHandler(); mCallbackHandler = new CallbackHandler(mContext.getMainLooper()); mBackupRestoreController = new BackupRestoreController(); @@ -298,11 +300,9 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } private void registerOnCrossProfileProvidersChangedListener() { - DevicePolicyManagerInternal devicePolicyManager = LocalServices.getService( - DevicePolicyManagerInternal.class); // The device policy is an optional component. - if (devicePolicyManager != null) { - devicePolicyManager.addOnCrossProfileWidgetProvidersChangeListener(this); + if (mDevicePolicyManagerInternal != null) { + mDevicePolicyManagerInternal.addOnCrossProfileWidgetProvidersChangeListener(this); } } @@ -588,7 +588,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku try { UserInfo userInfo = mUserManager.getUserInfo(providerUserId); showBadge = userInfo.isManagedProfile(); - onClickIntent = UnlaunchableAppActivity.createPackageSuspendedDialogIntent( + onClickIntent = mDevicePolicyManagerInternal.createPackageSuspendedDialogIntent( providerPackage, providerUserId); } finally { Binder.restoreCallingIdentity(identity); @@ -3574,15 +3574,12 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } public boolean isProviderWhiteListed(String packageName, int profileId) { - DevicePolicyManagerInternal devicePolicyManager = LocalServices.getService( - DevicePolicyManagerInternal.class); - // If the policy manager is not available on the device we deny it all. - if (devicePolicyManager == null) { + if (mDevicePolicyManagerInternal == null) { return false; } - List<String> crossProfilePackages = devicePolicyManager + List<String> crossProfilePackages = mDevicePolicyManagerInternal .getCrossProfileWidgetProviders(profileId); return crossProfilePackages.contains(packageName); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 3c1357742f48..b7fca1a10ffc 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1784,6 +1784,38 @@ public class ConnectivityService extends IConnectivityManager.Stub return false; } + private void dumpNetworkDiagnostics(IndentingPrintWriter pw) { + final List<NetworkDiagnostics> netDiags = new ArrayList<NetworkDiagnostics>(); + final long DIAG_TIME_MS = 5000; + for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { + // Start gathering diagnostic information. + netDiags.add(new NetworkDiagnostics( + nai.network, + new LinkProperties(nai.linkProperties), // Must be a copy. + DIAG_TIME_MS)); + } + + for (NetworkDiagnostics netDiag : netDiags) { + pw.println(); + netDiag.waitForMeasurements(); + netDiag.dump(pw); + } + } + + private void dumpApf(IndentingPrintWriter pw) { + pw.println("APF filters:"); + pw.increaseIndent(); + for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { + if (nai.apfFilter != null) { + pw.println(nai.name() + ":"); + pw.increaseIndent(); + nai.apfFilter.dump(pw); + pw.decreaseIndent(); + } + } + pw.decreaseIndent(); + } + @Override protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); @@ -1796,23 +1828,13 @@ public class ConnectivityService extends IConnectivityManager.Stub return; } - final List<NetworkDiagnostics> netDiags = new ArrayList<NetworkDiagnostics>(); if (argsContain(args, "--diag")) { - final long DIAG_TIME_MS = 5000; - for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { - // Start gathering diagnostic information. - netDiags.add(new NetworkDiagnostics( - nai.network, - new LinkProperties(nai.linkProperties), // Must be a copy. - DIAG_TIME_MS)); - } - - for (NetworkDiagnostics netDiag : netDiags) { - pw.println(); - netDiag.waitForMeasurements(); - netDiag.dump(pw); - } + dumpNetworkDiagnostics(pw); + return; + } + if (argsContain(args, "apf")) { + dumpApf(pw); return; } @@ -1878,6 +1900,9 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.println(); mKeepaliveTracker.dump(pw); + pw.println(); + dumpApf(pw); + if (mInetLog != null && mInetLog.size() > 0) { pw.println(); pw.println("Inet condition reports:"); diff --git a/services/core/java/com/android/server/ContextHubSystemService.java b/services/core/java/com/android/server/ContextHubSystemService.java new file mode 100644 index 000000000000..1b85632b806c --- /dev/null +++ b/services/core/java/com/android/server/ContextHubSystemService.java @@ -0,0 +1,43 @@ +/* + * 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.hardware.location.ContextHubService; +import android.content.Context; +import android.util.Log; + +class ContextHubSystemService extends SystemService { + private static final String TAG = "ContextHubSystemService"; + private final ContextHubService mContextHubService; + + public ContextHubSystemService(Context context) { + super(context); + mContextHubService = new ContextHubService(context); + } + + @Override + public void onStart() { + } + + @Override + public void onBootPhase(int phase) { + if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { + Log.d(TAG, "onBootPhase: PHASE_SYSTEM_SERVICES_READY"); + publishBinderService(ContextHubService.CONTEXTHUB_SERVICE, mContextHubService); + } + } +} diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index 11888ff4705c..4198af96d5cd 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -67,7 +67,8 @@ public class Watchdog extends Thread { "/system/bin/audioserver", "/system/bin/mediaserver", "/system/bin/sdcard", - "/system/bin/surfaceflinger" + "/system/bin/surfaceflinger", + "media.log" }; static Watchdog sWatchdog; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f99d03521d6d..95dbd0f94f96 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -6497,15 +6497,13 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override - public void keyguardGoingAway(boolean disableWindowAnimations, - boolean keyguardGoingToNotificationShade) { + public void keyguardGoingAway(int flags) { enforceNotIsolatedCaller("keyguardGoingAway"); final long token = Binder.clearCallingIdentity(); try { synchronized (this) { if (DEBUG_LOCKSCREEN) logLockScreen(""); - mWindowManager.keyguardGoingAway(disableWindowAnimations, - keyguardGoingToNotificationShade); + mWindowManager.keyguardGoingAway(flags); if (mLockScreenShown == LOCK_SCREEN_SHOWN) { mLockScreenShown = LOCK_SCREEN_HIDDEN; updateSleepIfNeededLocked(); @@ -11198,7 +11196,6 @@ public final class ActivityManagerService extends ActivityManagerNative } void finishRunningVoiceLocked() { - Slog.d(TAG, "finishRunningVoiceLocked() >>>>"); if (mRunningVoice != null) { mRunningVoice = null; mVoiceWakeLock.release(); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 09542cbdf3e1..26eaa8a2b186 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2213,10 +2213,11 @@ final class ActivityStack { ActivityStack lastStack = mStackSupervisor.getLastStack(); if (next.app != null && next.app.thread != null) { - if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Resume running: " + next); + if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Resume running: " + next + + " stopped=" + next.stopped + " visible=" + next.visible); // This activity is now becoming visible. - if (!next.visible) { + if (!next.visible || next.stopped) { mWindowManager.setAppVisibility(next.appToken, true); } diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java index e4b4c2dcfad7..13d90e3f2672 100644 --- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java @@ -29,6 +29,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED; import android.app.KeyguardManager; +import android.app.admin.DevicePolicyManagerInternal; import android.content.IIntentSender; import android.content.Intent; import android.content.IntentSender; @@ -40,6 +41,7 @@ import android.os.UserHandle; import android.os.UserManager; import com.android.internal.app.UnlaunchableAppActivity; +import com.android.server.LocalServices; /** * A class that contains activity intercepting logic for {@link ActivityStarter#startActivityLocked} @@ -133,8 +135,10 @@ class ActivityStartInterceptor { (mAInfo.applicationInfo.flags & FLAG_SUSPENDED) == 0) { return false; } - mIntent = UnlaunchableAppActivity.createPackageSuspendedDialogIntent(mAInfo.packageName, - mUserId); + DevicePolicyManagerInternal devicePolicyManager = LocalServices.getService( + DevicePolicyManagerInternal.class); + mIntent = devicePolicyManager.createPackageSuspendedDialogIntent( + mAInfo.packageName, mUserId); mCallingPid = mRealCallingPid; mCallingUid = mRealCallingUid; mResolvedType = null; diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 83ad2a7ebfdd..fa62c9867168 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1327,19 +1327,31 @@ class ActivityStarter { intentActivity.setTaskToAffiliateWith(mSourceRecord.task); } mMovedHome = true; - final ActivityStack launchStack = - getLaunchStack(mStartActivity, mLaunchFlags, mStartActivity.task, - mOptions, true); - if (launchStack == null || launchStack == mTargetStack) { - // We only want to move to the front, if we aren't going to launch on a - // different stack. If we launch on a different stack, we will put the - // task on top there. - mTargetStack.moveTaskToFrontLocked(intentActivity.task, mNoAnimation, - mOptions, mStartActivity.appTimeTracker, "bringingFoundTaskToFront"); - mMovedToFront = true; + + // If the launch flags carry both NEW_TASK and CLEAR_TASK, the task's activities + // will be cleared soon by ActivityStarter in setTaskFromIntentActivity(). + // So no point resuming any of the activities here, it just wastes one extra + // resuming, plus enter AND exit transitions. + // Here we only want to bring the target stack forward. Transition will be applied + // to the new activity that's started after the old ones are gone. + final boolean willClearTask = + (mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) + == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK); + if (!willClearTask) { + final ActivityStack launchStack = getLaunchStack( + mStartActivity, mLaunchFlags, mStartActivity.task, mOptions, true); + if (launchStack == null || launchStack == mTargetStack) { + // We only want to move to the front, if we aren't going to launch on a + // different stack. If we launch on a different stack, we will put the + // task on top there. + mTargetStack.moveTaskToFrontLocked( + intentActivity.task, mNoAnimation, mOptions, + mStartActivity.appTimeTracker, "bringingFoundTaskToFront"); + mMovedToFront = true; + } + mOptions = null; } updateTaskReturnToType(intentActivity.task, mLaunchFlags, focusStack); - mOptions = null; } } if (!mMovedToFront && mDoResume) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d919737c28e2..e7580f4b0879 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -28,6 +28,7 @@ import android.app.ActivityManagerInternal; import android.app.ActivityManagerNative; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.NotificationManager; import android.bluetooth.BluetoothA2dp; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; @@ -40,6 +41,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; @@ -105,9 +107,6 @@ import android.util.MathUtils; import android.util.Slog; import android.util.SparseIntArray; import android.view.KeyEvent; -import android.view.OrientationEventListener; -import android.view.Surface; -import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; import com.android.internal.util.XmlUtils; @@ -557,6 +556,7 @@ public class AudioService extends IAudioService.Stub { private static Long mLastDeviceConnectMsgTime = new Long(0); + private NotificationManager mNm; private AudioManagerInternal.RingerModeDelegate mRingerModeDelegate; private VolumePolicy mVolumePolicy = VolumePolicy.DEFAULT; private long mLoweredFromNormalToVibrateTime; @@ -751,6 +751,8 @@ public class AudioService extends IAudioService.Stub { } } + mNm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + sendMsg(mAudioHandler, MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED, SENDMSG_REPLACE, @@ -1293,7 +1295,7 @@ public class AudioService extends IAudioService.Stub { // Check if the ringer mode handles this adjustment. If it does we don't // need to adjust the volume further. final int result = checkForRingerModeChange(aliasIndex, direction, step, - streamState.mIsMuted); + streamState.mIsMuted, caller); adjustVolume = (result & FLAG_ADJUST_VOLUME) != 0; // If suppressing a volume adjustment in silent mode, display the UI hint if ((result & AudioManager.FLAG_SHOW_SILENT_HINT) != 0) { @@ -1309,7 +1311,6 @@ public class AudioService extends IAudioService.Stub { && (mRingerModeMutedStreams & (1 << AudioSystem.STREAM_MUSIC)) != 0) { adjustVolume = false; } - int oldIndex = mStreamStates[streamType].getIndex(device); if (adjustVolume && (direction != AudioManager.ADJUST_SAME)) { @@ -1453,10 +1454,7 @@ public class AudioService extends IAudioService.Stub { } }; - private void onSetStreamVolume(int streamType, int index, int flags, int device, - String caller) { - final int stream = mStreamVolumeAlias[streamType]; - setStreamVolumeInt(stream, index, device, false, caller); + private int getNewRingerMode(int stream, int index, int flags) { // setting volume on ui sounds stream type also controls silent mode if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || (stream == getUiSoundsStreamType())) { @@ -1464,11 +1462,49 @@ public class AudioService extends IAudioService.Stub { if (index == 0) { newRingerMode = mHasVibrator ? AudioManager.RINGER_MODE_VIBRATE : mVolumePolicy.volumeDownToEnterSilent ? AudioManager.RINGER_MODE_SILENT - : AudioManager.RINGER_MODE_NORMAL; + : AudioManager.RINGER_MODE_NORMAL; } else { newRingerMode = AudioManager.RINGER_MODE_NORMAL; } - setRingerMode(newRingerMode, TAG + ".onSetStreamVolume", false /*external*/); + return newRingerMode; + } + return getRingerModeExternal(); + } + + private boolean isAndroidNPlus(String caller) { + try { + final ApplicationInfo applicationInfo = + mContext.getPackageManager().getApplicationInfoAsUser( + caller, 0, UserHandle.getUserId(Binder.getCallingUid())); + if (applicationInfo.targetSdkVersion >= Build.VERSION_CODES.N) { + return true; + } + return false; + } catch (PackageManager.NameNotFoundException e) { + return true; + } + } + + private boolean wouldToggleZenMode(int newMode) { + if (getRingerModeExternal() == AudioManager.RINGER_MODE_SILENT + && newMode != AudioManager.RINGER_MODE_SILENT) { + return true; + } else if (getRingerModeExternal() != AudioManager.RINGER_MODE_SILENT + && newMode == AudioManager.RINGER_MODE_SILENT) { + return true; + } + return false; + } + + private void onSetStreamVolume(int streamType, int index, int flags, int device, + String caller) { + final int stream = mStreamVolumeAlias[streamType]; + setStreamVolumeInt(stream, index, device, false, caller); + // setting volume on ui sounds stream type also controls silent mode + if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || + (stream == getUiSoundsStreamType())) { + setRingerMode(getNewRingerMode(stream, index, flags), + TAG + ".onSetStreamVolume", false /*external*/); } // setting non-zero volume for a muted stream unmutes the stream and vice versa mStreamStates[stream].mute(index == 0); @@ -1509,6 +1545,12 @@ public class AudioService extends IAudioService.Stub { return; } + if (isAndroidNPlus(callingPackage) + && wouldToggleZenMode(getNewRingerMode(streamTypeAlias, index, flags)) + && !mNm.isNotificationPolicyAccessGrantedForPackage(callingPackage)) { + throw new SecurityException("Not allowed to change Do Not Disturb state"); + } + synchronized (mSafeMediaVolumeState) { // reset any pending volume command mPendingVolumeCommand = null; @@ -2005,6 +2047,11 @@ public class AudioService extends IAudioService.Stub { } public void setRingerModeExternal(int ringerMode, String caller) { + if (isAndroidNPlus(caller) && wouldToggleZenMode(ringerMode) + && !mNm.isNotificationPolicyAccessGrantedForPackage(caller)) { + throw new SecurityException("Not allowed to change Do Not Disturb state"); + } + setRingerMode(ringerMode, caller, true /*external*/); } @@ -3328,7 +3375,8 @@ public class AudioService extends IAudioService.Stub { * adjusting volume. If so, this will set the proper ringer mode and volume * indices on the stream states. */ - private int checkForRingerModeChange(int oldIndex, int direction, int step, boolean isMuted) { + private int checkForRingerModeChange(int oldIndex, int direction, int step, boolean isMuted, + String caller) { final boolean isTv = mPlatformType == AudioSystem.PLATFORM_TELEVISION; int result = FLAG_ADJUST_VOLUME; int ringerMode = getRingerModeInternal(); @@ -3417,6 +3465,11 @@ public class AudioService extends IAudioService.Stub { break; } + if (isAndroidNPlus(caller) && wouldToggleZenMode(ringerMode) + && !mNm.isNotificationPolicyAccessGrantedForPackage(caller)) { + throw new SecurityException("Not allowed to change Do Not Disturb state"); + } + setRingerMode(ringerMode, TAG + ".checkForRingerModeChange", false /*external*/); mPrevVolDirection = direction; diff --git a/services/core/java/com/android/server/connectivity/ApfFilter.java b/services/core/java/com/android/server/connectivity/ApfFilter.java index 25c84e132804..8195319dd289 100644 --- a/services/core/java/com/android/server/connectivity/ApfFilter.java +++ b/services/core/java/com/android/server/connectivity/ApfFilter.java @@ -29,14 +29,19 @@ import android.util.Log; import android.util.Pair; import com.android.internal.util.HexDump; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.ConnectivityService; import java.io.FileDescriptor; import java.io.IOException; import java.lang.Thread; +import java.net.Inet6Address; +import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.net.UnknownHostException; import java.nio.ByteBuffer; +import java.nio.BufferUnderflowException; import java.util.ArrayList; import java.util.Arrays; @@ -85,6 +90,7 @@ public class ApfFilter { } private static final String TAG = "ApfFilter"; + private static final boolean VDBG = true; private final ConnectivityService mConnectivityService; private final NetworkAgentInfo mNai; @@ -152,9 +158,14 @@ public class ApfFilter { private static final int ETH_HEADER_LEN = 14; private static final int IPV6_HEADER_LEN = 40; + private static final int IPV6_SRC_ADDR_OFFSET = ETH_HEADER_LEN + 8; + private static final int IPV6_DST_ADDR_OFFSET = ETH_HEADER_LEN + 24; // From RFC4861: private static final int ICMP6_RA_HEADER_LEN = 16; + private static final int ICMP6_RA_CHECKSUM_OFFSET = + ETH_HEADER_LEN + IPV6_HEADER_LEN + 2; + private static final int ICMP6_RA_CHECKSUM_LEN = 2; private static final int ICMP6_RA_OPTION_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN + ICMP6_RA_HEADER_LEN; private static final int ICMP6_RA_ROUTER_LIFETIME_OFFSET = @@ -189,6 +200,66 @@ public class ApfFilter { // When the packet was last captured, in seconds since Unix Epoch long mLastSeen; + // For debugging only. Offsets into the packet where PIOs are. + private final ArrayList<Integer> mPrefixOptionOffsets; + // For debugging only. How many times this RA was seen. + int seenCount = 0; + + + private String IPv6AddresstoString(int pos) { + try { + byte[] array = mPacket.array(); + // Can't just call copyOfRange() and see if it throws, because if it reads past the + // end it pads with zeros instead of throwing. + if (pos < 0 || pos + 16 > array.length || pos + 16 < pos) { + return "???"; + } + byte[] addressBytes = Arrays.copyOfRange(array, pos, pos + 16); + InetAddress address = (Inet6Address) InetAddress.getByAddress(addressBytes); + return address.getHostAddress(); + } catch (UnsupportedOperationException e) { + // array() failed. Cannot happen, mPacket is array-backed and read-write. + return "???"; + } catch (ClassCastException | UnknownHostException e) { + // Cannot happen. + return "???"; + } + } + + // Can't be static because it's in a non-static inner class. + // TODO: Make this final once RA is its own class. + private int uint8(byte b) { + return b & 0xff; + } + + private int uint16(short s) { + return s & 0xffff; + } + + private long uint32(int s) { + return s & 0xffffffff; + } + + public String toString() { + try { + StringBuffer sb = new StringBuffer(); + sb.append(String.format("RA %s -> %s %d ", + IPv6AddresstoString(IPV6_SRC_ADDR_OFFSET), + IPv6AddresstoString(IPV6_DST_ADDR_OFFSET), + uint16(mPacket.getShort(ICMP6_RA_ROUTER_LIFETIME_OFFSET)))); + for (int i: mPrefixOptionOffsets) { + String prefix = IPv6AddresstoString(i + 16); + int length = uint8(mPacket.get(i + 2)); + long valid = mPacket.getInt(i + 4); + long preferred = mPacket.getInt(i + 8); + sb.append(String.format("%s/%d %d/%d ", prefix, length, valid, preferred)); + } + return sb.toString(); + } catch (BufferUnderflowException | IndexOutOfBoundsException e) { + return "<Malformed RA>"; + } + } + /** * Add a binary range of the packet that does not include a lifetime to mNonLifetimes. * Assumes mPacket.position() is as far as we've parsed the packet. @@ -216,10 +287,18 @@ public class ApfFilter { mPacket.clear(); mLastSeen = curTime(); + // Ignore the checksum. + int lastNonLifetimeStart = addNonLifetime(0, + ICMP6_RA_CHECKSUM_OFFSET, + ICMP6_RA_CHECKSUM_LEN); + // Parse router lifetime - int lastNonLifetimeStart = addNonLifetime(0, ICMP6_RA_ROUTER_LIFETIME_OFFSET, + lastNonLifetimeStart = addNonLifetime(lastNonLifetimeStart, + ICMP6_RA_ROUTER_LIFETIME_OFFSET, ICMP6_RA_ROUTER_LIFETIME_LEN); + // Parse ICMP6 options + mPrefixOptionOffsets = new ArrayList<>(); mPacket.position(ICMP6_RA_OPTION_OFFSET); while (mPacket.hasRemaining()) { int optionType = ((int)mPacket.get(mPacket.position())) & 0xff; @@ -234,6 +313,7 @@ public class ApfFilter { lastNonLifetimeStart = addNonLifetime(lastNonLifetimeStart, ICMP6_PREFIX_OPTION_PREFERRED_LIFETIME_OFFSET, ICMP6_PREFIX_OPTION_PREFERRED_LIFETIME_LEN); + mPrefixOptionOffsets.add(mPacket.position()); break; // These three options have the same lifetime offset and size, so process // together: @@ -282,6 +362,12 @@ public class ApfFilter { ByteBuffer byteBuffer = ByteBuffer.wrap(packet); for (int i = 0; (i + 1) < mNonLifetimes.size(); i++) { int offset = mNonLifetimes.get(i).first + mNonLifetimes.get(i).second; + + // The checksum is in mNonLifetimes, but it's not a lifetime. + if (offset == ICMP6_RA_CHECKSUM_OFFSET) { + continue; + } + int lifetimeLength = mNonLifetimes.get(i+1).first - offset; long val; switch (lifetimeLength) { @@ -329,6 +415,10 @@ public class ApfFilter { if ((i + 1) < mNonLifetimes.size()) { Pair<Integer, Integer> nextNonLifetime = mNonLifetimes.get(i + 1); int offset = nonLifetime.first + nonLifetime.second; + // Skip the checksum. + if (offset == ICMP6_RA_CHECKSUM_OFFSET) { + continue; + } int length = nextNonLifetime.first - offset; switch (length) { case 4: gen.addLoad32(Register.R0, offset); break; @@ -363,6 +453,9 @@ public class ApfFilter { // How long should the last installed filter program live for? In seconds. private long mLastInstalledProgramMinLifetime; + // For debugging only. The length in bytes of the last program. + private long mLastInstalledProgramLength; + private void installNewProgram() { if (mRas.size() == 0) return; final byte[] program; @@ -402,7 +495,12 @@ public class ApfFilter { } mLastTimeInstalledProgram = curTime(); mLastInstalledProgramMinLifetime = programMinLifetime; - hexDump("Installing filter: ", program, program.length); + mLastInstalledProgramLength = program.length; + if (VDBG) { + hexDump("Installing filter: ", program, program.length); + } else { + Log.d(TAG, "Installing filter length=" + program.length); + } mConnectivityService.pushApfProgramToNetwork(mNai, program); } @@ -421,16 +519,17 @@ public class ApfFilter { } private void processRa(byte[] packet, int length) { - hexDump("Read packet = ", packet, length); + if (VDBG) hexDump("Read packet = ", packet, length); // Have we seen this RA before? for (int i = 0; i < mRas.size(); i++) { Ra ra = mRas.get(i); if (ra.matches(packet, length)) { - log("matched RA"); + if (VDBG) log("matched RA " + ra); // Update lifetimes. ra.mLastSeen = curTime(); ra.mMinLifetime = ra.minLifetime(packet, length); + ra.seenCount++; // Keep mRas in LRU order so as to prioritize generating filters for recently seen // RAs. LRU prioritizes this because RA filters are generated in order from mRas @@ -448,7 +547,7 @@ public class ApfFilter { // Purge expired RAs. for (int i = 0; i < mRas.size();) { if (mRas.get(i).isExpired()) { - log("expired RA"); + log("Expired RA " + mRas.get(i)); mRas.remove(i); } else { i++; @@ -457,8 +556,9 @@ public class ApfFilter { // TODO: figure out how to proceed when we've received more then MAX_RAS RAs. if (mRas.size() >= MAX_RAS) return; try { - log("adding RA"); - mRas.add(new Ra(packet, length)); + Ra ra = new Ra(packet, length); + log("Adding " + ra); + mRas.add(ra); } catch (Exception e) { Log.e(TAG, "Error parsing RA: " + e); return; @@ -473,8 +573,8 @@ public class ApfFilter { public static void maybeInstall(ConnectivityService connectivityService, NetworkAgentInfo nai) { if (nai.networkMisc == null) return; if (nai.networkMisc.apfVersionSupported == 0) return; - if (nai.networkMisc.maximumApfProgramSize < 200) { - Log.e(TAG, "Uselessly small APF size limit: " + nai.networkMisc.maximumApfProgramSize); + if (nai.networkMisc.maximumApfProgramSize < 512) { + Log.e(TAG, "Unacceptably small APF limit: " + nai.networkMisc.maximumApfProgramSize); return; } // For now only support generating programs for Ethernet frames. If this restriction is @@ -491,9 +591,35 @@ public class ApfFilter { public void shutdown() { if (mReceiveThread != null) { - log("shuting down"); + log("shutting down"); mReceiveThread.halt(); // Also closes socket. mReceiveThread = null; } } + + public void dump(IndentingPrintWriter pw) { + pw.println("APF version: " + mNai.networkMisc.apfVersionSupported); + pw.println("Max program size: " + mNai.networkMisc.maximumApfProgramSize); + pw.println("Receive thread: " + (mReceiveThread != null ? "RUNNING" : "STOPPED")); + if (mLastTimeInstalledProgram == 0) { + pw.println("No program installed."); + return; + } + + pw.println(String.format( + "Last program length %d, installed %ds ago, lifetime %d", + mLastInstalledProgramLength, curTime() - mLastTimeInstalledProgram, + mLastInstalledProgramMinLifetime)); + + pw.println("RA filters:"); + pw.increaseIndent(); + for (Ra ra: mRas) { + pw.println(ra); + pw.increaseIndent(); + pw.println(String.format( + "Seen: %d, last %ds ago", ra.seenCount, curTime() - ra.mLastSeen)); + pw.decreaseIndent(); + } + pw.decreaseIndent(); + } } diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java index 8c12060abc06..603402e32bfb 100644 --- a/services/core/java/com/android/server/hdmi/Constants.java +++ b/services/core/java/com/android/server/hdmi/Constants.java @@ -218,6 +218,9 @@ final class Constants { // True by default. static final String PROPERTY_WAKE_ON_HOTPLUG = "ro.hdmi.wake_on_hotplug"; + // TODO(OEM): Set this to true to enable 'Set Menu Language' feature. False by default. + static final String PROPERTY_SET_MENU_LANGUAGE = "ro.hdmi.set_menu_language"; + // Set to false to allow playback device to go to suspend mode even // when it's an active source. True by default. static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake"; diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 39c6732861f9..a36e6710887e 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -46,6 +46,9 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice { private static final boolean WAKE_ON_HOTPLUG = SystemProperties.getBoolean(Constants.PROPERTY_WAKE_ON_HOTPLUG, true); + private static final boolean SET_MENU_LANGUAGE = + SystemProperties.getBoolean(Constants.PROPERTY_SET_MENU_LANGUAGE, false); + private boolean mIsActiveSource = false; // Used to keep the device awake while it is the active source. For devices that @@ -316,6 +319,9 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice { @ServiceThreadOnly protected boolean handleSetMenuLanguage(HdmiCecMessage message) { assertRunOnServiceThread(); + if (!SET_MENU_LANGUAGE) { + return false; + } try { String iso3Language = new String(message.getParams(), 0, 3, "US-ASCII"); @@ -345,6 +351,7 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice { Slog.w(TAG, "Can't handle <Set Menu Language> of " + iso3Language); return false; } catch (UnsupportedEncodingException e) { + Slog.w(TAG, "Can't handle <Set Menu Language>", e); return false; } } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 459c47f028b5..fed7e4b7a8f9 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -419,6 +419,7 @@ public final class HdmiControlService extends SystemService { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_SHUTDOWN); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); getContext().registerReceiver(mHdmiControlBroadcastReceiver, filter); diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java index bd06645b2b16..6ef425a57877 100644 --- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java +++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java @@ -185,7 +185,7 @@ public class ConnectivityController extends StateController implements pw.println("Conn."); pw.println("connected: " + mNetworkConnected + " unmetered: " + mNetworkUnmetered); for (JobStatus js: mTrackedJobs) { - pw.println(String.valueOf(js.hashCode()).substring(0, 3) + ".." + pw.println(String.valueOf(js.getJobId() + "," + js.getUid()) + ": C=" + js.hasConnectivityConstraint() + ", UM=" + js.hasUnmeteredConstraint()); } diff --git a/services/core/java/com/android/server/job/controllers/IdleController.java b/services/core/java/com/android/server/job/controllers/IdleController.java index 7638494eccb2..d9eb45c6026d 100644 --- a/services/core/java/com/android/server/job/controllers/IdleController.java +++ b/services/core/java/com/android/server/job/controllers/IdleController.java @@ -197,7 +197,7 @@ public class IdleController extends StateController { for (int i = 0; i < mTrackedTasks.size(); i++) { final JobStatus js = mTrackedTasks.get(i); pw.print(" "); - pw.print(String.valueOf(js.hashCode()).substring(0, 3)); + pw.print(String.valueOf(js.getJobId() + "," + js.getUid())); pw.println(".."); } } diff --git a/services/core/java/com/android/server/job/controllers/TimeController.java b/services/core/java/com/android/server/job/controllers/TimeController.java index 620800caaf67..36fa9ec68050 100644 --- a/services/core/java/com/android/server/job/controllers/TimeController.java +++ b/services/core/java/com/android/server/job/controllers/TimeController.java @@ -145,6 +145,9 @@ public class TimeController extends StateController { final long jobDeadline = job.getLatestRunTimeElapsed(); if (jobDeadline <= nowElapsedMillis) { + if (job.hasTimingDelayConstraint()) { + job.setTimingDelayConstraintSatisfied(true); + } job.setDeadlineConstraintSatisfied(true); mStateChangedListener.onRunJobNow(job); it.remove(); @@ -281,7 +284,7 @@ public class TimeController extends StateController { + "s"); pw.println("Tracking:"); for (JobStatus ts : mTrackedJobs) { - pw.println(String.valueOf(ts.hashCode()).substring(0, 3) + ".." + pw.println(String.valueOf(ts.getJobId() + "," + ts.getUid()) + ": (" + (ts.hasTimingDelayConstraint() ? ts.getEarliestRunTime() : "N/A") + ", " + (ts.hasDeadlineConstraint() ?ts.getLatestRunTimeElapsed() : "N/A") + ")"); diff --git a/services/core/java/com/android/server/notification/EventConditionProvider.java b/services/core/java/com/android/server/notification/EventConditionProvider.java index b13fec19cc66..5bc9b1c71f68 100644 --- a/services/core/java/com/android/server/notification/EventConditionProvider.java +++ b/services/core/java/com/android/server/notification/EventConditionProvider.java @@ -44,6 +44,8 @@ import com.android.server.notification.CalendarTracker.CheckEventResult; import com.android.server.notification.NotificationManagerService.DumpFilter; import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; /** * Built-in zen condition provider for calendar event-based conditions. @@ -96,10 +98,12 @@ public class EventConditionProvider extends SystemConditionProviderService { pw.print(" mRegistered="); pw.println(mRegistered); pw.print(" mBootComplete="); pw.println(mBootComplete); dumpUpcomingTime(pw, "mNextAlarmTime", mNextAlarmTime, System.currentTimeMillis()); - pw.println(" mSubscriptions="); - for (Uri conditionId : mSubscriptions) { - pw.print(" "); - pw.println(conditionId); + synchronized (mSubscriptions) { + pw.println(" mSubscriptions="); + for (Uri conditionId : mSubscriptions) { + pw.print(" "); + pw.println(conditionId); + } } pw.println(" mTrackers="); for (int i = 0; i < mTrackers.size(); i++) { @@ -142,19 +146,23 @@ public class EventConditionProvider extends SystemConditionProviderService { public void onSubscribe(Uri conditionId) { if (DEBUG) Slog.d(TAG, "onSubscribe " + conditionId); if (!ZenModeConfig.isValidEventConditionId(conditionId)) { - notifyCondition(conditionId, Condition.STATE_FALSE, "badCondition"); + notifyCondition(createCondition(conditionId, Condition.STATE_FALSE)); return; } - if (mSubscriptions.add(conditionId)) { - evaluateSubscriptions(); + synchronized (mSubscriptions) { + if (mSubscriptions.add(conditionId)) { + evaluateSubscriptions(); + } } } @Override public void onUnsubscribe(Uri conditionId) { if (DEBUG) Slog.d(TAG, "onUnsubscribe " + conditionId); - if (mSubscriptions.remove(conditionId)) { - evaluateSubscriptions(); + synchronized (mSubscriptions) { + if (mSubscriptions.remove(conditionId)) { + evaluateSubscriptions(); + } } } @@ -198,51 +206,61 @@ public class EventConditionProvider extends SystemConditionProviderService { return; } final long now = System.currentTimeMillis(); - for (int i = 0; i < mTrackers.size(); i++) { - mTrackers.valueAt(i).setCallback(mSubscriptions.isEmpty() ? null : mTrackerCallback); - } - setRegistered(!mSubscriptions.isEmpty()); - long reevaluateAt = 0; - for (Uri conditionId : mSubscriptions) { - final EventInfo event = ZenModeConfig.tryParseEventConditionId(conditionId); - if (event == null) { - notifyCondition(conditionId, Condition.STATE_FALSE, "badConditionId"); - continue; + List<Condition> conditionsToNotify = new ArrayList<>(); + synchronized (mSubscriptions) { + for (int i = 0; i < mTrackers.size(); i++) { + mTrackers.valueAt(i).setCallback( + mSubscriptions.isEmpty() ? null : mTrackerCallback); } - CheckEventResult result = null; - if (event.calendar == null) { // any calendar - // event could exist on any tracker - for (int i = 0; i < mTrackers.size(); i++) { - final CalendarTracker tracker = mTrackers.valueAt(i); - final CheckEventResult r = tracker.checkEvent(event, now); - if (result == null) { - result = r; - } else { - result.inEvent |= r.inEvent; - result.recheckAt = Math.min(result.recheckAt, r.recheckAt); + setRegistered(!mSubscriptions.isEmpty()); + long reevaluateAt = 0; + for (Uri conditionId : mSubscriptions) { + final EventInfo event = ZenModeConfig.tryParseEventConditionId(conditionId); + if (event == null) { + conditionsToNotify.add(createCondition(conditionId, Condition.STATE_FALSE)); + continue; + } + CheckEventResult result = null; + if (event.calendar == null) { // any calendar + // event could exist on any tracker + for (int i = 0; i < mTrackers.size(); i++) { + final CalendarTracker tracker = mTrackers.valueAt(i); + final CheckEventResult r = tracker.checkEvent(event, now); + if (result == null) { + result = r; + } else { + result.inEvent |= r.inEvent; + result.recheckAt = Math.min(result.recheckAt, r.recheckAt); + } + } + } else { + // event should exist on one tracker + final int userId = EventInfo.resolveUserId(event.userId); + final CalendarTracker tracker = mTrackers.get(userId); + if (tracker == null) { + Slog.w(TAG, "No calendar tracker found for user " + userId); + conditionsToNotify.add(createCondition(conditionId, Condition.STATE_FALSE)); + continue; } + result = tracker.checkEvent(event, now); } - } else { - // event should exist on one tracker - final int userId = EventInfo.resolveUserId(event.userId); - final CalendarTracker tracker = mTrackers.get(userId); - if (tracker == null) { - Slog.w(TAG, "No calendar tracker found for user " + userId); - notifyCondition(conditionId, Condition.STATE_FALSE, "badUserId"); + if (result.recheckAt != 0 + && (reevaluateAt == 0 || result.recheckAt < reevaluateAt)) { + reevaluateAt = result.recheckAt; + } + if (!result.inEvent) { + conditionsToNotify.add(createCondition(conditionId, Condition.STATE_FALSE)); continue; } - result = tracker.checkEvent(event, now); - } - if (result.recheckAt != 0 && (reevaluateAt == 0 || result.recheckAt < reevaluateAt)) { - reevaluateAt = result.recheckAt; + conditionsToNotify.add(createCondition(conditionId, Condition.STATE_TRUE)); } - if (!result.inEvent) { - notifyCondition(conditionId, Condition.STATE_FALSE, "!inEventNow"); - continue; + rescheduleAlarm(now, reevaluateAt); + } + for (Condition condition : conditionsToNotify) { + if (condition != null) { + notifyCondition(condition); } - notifyCondition(conditionId, Condition.STATE_TRUE, "inEventNow"); } - rescheduleAlarm(now, reevaluateAt); if (DEBUG) Slog.d(TAG, "evaluateSubscriptions took " + (System.currentTimeMillis() - now)); } @@ -266,12 +284,6 @@ public class EventConditionProvider extends SystemConditionProviderService { alarms.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent); } - private void notifyCondition(Uri conditionId, int state, String reason) { - if (DEBUG) Slog.d(TAG, "notifyCondition " + conditionId + " " - + Condition.stateToString(state) + " reason=" + reason); - notifyCondition(createCondition(conditionId, state)); - } - private Condition createCondition(Uri id, int state) { final String summary = NOT_SHOWN; final String line1 = NOT_SHOWN; diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index 6cf3940e004c..6d9fed46102b 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -238,7 +238,7 @@ abstract public class ManagedServices { rebuildRestoredPackages(); } // make sure we're still bound to any of our services who may have just upgraded - rebindServices(); + rebindServices(false); } } @@ -249,13 +249,13 @@ abstract public class ManagedServices { if (DEBUG) Slog.d(TAG, "Current profile IDs didn't change, skipping rebindServices()."); return; } - rebindServices(); + rebindServices(true); } public void onUserUnlocked(int user) { if (DEBUG) Slog.d(TAG, "onUserUnlocked u=" + user); rebuildRestoredPackages(); - rebindServices(); + rebindServices(false); } public ManagedServiceInfo getServiceFromTokenLocked(IInterface service) { @@ -543,7 +543,7 @@ abstract public class ManagedServices { * Called whenever packages change, the user switches, or the secure setting * is altered. (For example in response to USER_SWITCHED in our broadcast receiver) */ - private void rebindServices() { + private void rebindServices(boolean forceRebind) { if (DEBUG) Slog.d(TAG, "rebindServices"); final int[] userIds = mUserProfiles.getCurrentProfileIds(); final int nUserIds = userIds.length; @@ -559,15 +559,15 @@ abstract public class ManagedServices { final SparseArray<Set<ComponentName>> toAdd = new SparseArray<>(); synchronized (mMutex) { - // Potentially unbind automatically bound services, retain system services. + // Rebind to non-system services if user switched for (ManagedServiceInfo service : mServices) { if (!service.isSystem && !service.isGuest(this)) { removableBoundServices.add(service); } } - final ArraySet<ComponentName> newEnabled = new ArraySet<>(); - final ArraySet<String> newPackages = new ArraySet<>(); + mEnabledServicesForCurrentProfiles.clear(); + mEnabledServicesPackageNames.clear(); for (int i = 0; i < nUserIds; ++i) { // decode the list of components @@ -591,15 +591,13 @@ abstract public class ManagedServices { toAdd.put(userIds[i], add); - newEnabled.addAll(userComponents); + mEnabledServicesForCurrentProfiles.addAll(userComponents); for (int j = 0; j < userComponents.size(); j++) { final ComponentName component = userComponents.valueAt(j); - newPackages.add(component.getPackageName()); + mEnabledServicesPackageNames.add(component.getPackageName()); } } - mEnabledServicesForCurrentProfiles = newEnabled; - mEnabledServicesPackageNames = newPackages; } for (ManagedServiceInfo info : removableBoundServices) { @@ -607,11 +605,11 @@ abstract public class ManagedServices { final int oldUser = info.userid; final Set<ComponentName> allowedComponents = toAdd.get(info.userid); if (allowedComponents != null) { - if (allowedComponents.contains(component)) { + if (allowedComponents.contains(component) && !forceRebind) { // Already bound, don't need to bind again. allowedComponents.remove(component); } else { - // No longer allowed to be bound. + // No longer allowed to be bound, or must rebind. Slog.v(TAG, "disabling " + getCaption() + " for user " + oldUser + ": " + component); unregisterService(component, oldUser); @@ -622,8 +620,7 @@ abstract public class ManagedServices { for (int i = 0; i < nUserIds; ++i) { final Set<ComponentName> add = toAdd.get(userIds[i]); for (ComponentName component : add) { - Slog.v(TAG, "enabling " + getCaption() + " for user " + userIds[i] + ": " - + component); + Slog.v(TAG, "enabling " + getCaption() + " for " + userIds[i] + ": " + component); registerService(component, userIds[i]); } } @@ -859,7 +856,7 @@ abstract public class ManagedServices { if (uri == null || mSecureSettingsUri.equals(uri)) { if (DEBUG) Slog.d(TAG, "Setting changed: mSecureSettingsUri=" + mSecureSettingsUri + " / uri=" + uri); - rebindServices(); + rebindServices(false); rebuildRestoredPackages(); } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 516602e55e5c..3baf894a67f0 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -43,6 +43,7 @@ import static org.xmlpull.v1.XmlPullParser.END_TAG; import static org.xmlpull.v1.XmlPullParser.START_TAG; import android.Manifest; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AppGlobals; @@ -155,6 +156,7 @@ import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -218,7 +220,7 @@ public class NotificationManagerService extends SystemService { private IActivityManager mAm; AudioManager mAudioManager; AudioManagerInternal mAudioManagerInternal; - StatusBarManagerInternal mStatusBar; + @Nullable StatusBarManagerInternal mStatusBar; Vibrator mVibrator; private VrManagerInternal mVrManagerInternal; @@ -795,7 +797,9 @@ public class NotificationManagerService extends SystemService { } else if (action.equals(Intent.ACTION_USER_PRESENT)) { // turn off LED when user passes through lock screen mNotificationLight.turnOff(); - mStatusBar.notificationLightOff(); + if (mStatusBar != null) { + mStatusBar.notificationLightOff(); + } } else if (action.equals(Intent.ACTION_USER_SWITCHED)) { final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); // reload per-user settings @@ -859,7 +863,9 @@ public class NotificationManagerService extends SystemService { private final Runnable mBuzzBeepBlinked = new Runnable() { @Override public void run() { - mStatusBar.buzzBeepBlinked(); + if (mStatusBar != null) { + mStatusBar.buzzBeepBlinked(); + } } }; @@ -943,22 +949,12 @@ public class NotificationManagerService extends SystemService { // This is a MangedServices object that keeps track of the ranker. mRankerServices = new NotificationRankers(); // Find the updatable ranker and register it. - Set<ComponentName> rankerComponents = mRankerServices.queryPackageForServices( - mRankerServicePackageName, UserHandle.USER_SYSTEM, null); - Iterator<ComponentName> iterator = rankerComponents.iterator(); - if (iterator.hasNext()) { - ComponentName rankerComponent = iterator.next(); - if (iterator.hasNext()) { - Slog.e(TAG, "found multiple ranker services:" + rankerComponents); - } else { - mRankerServices.registerSystemService(rankerComponent, UserHandle.USER_SYSTEM); - } - } else { - Slog.w(TAG, "could not start ranker service: none found"); - } + mRankerServices.registerRanker(); mStatusBar = getLocalService(StatusBarManagerInternal.class); - mStatusBar.setNotificationDelegate(mNotificationDelegate); + if (mStatusBar != null) { + mStatusBar.setNotificationDelegate(mNotificationDelegate); + } final LightsManager lights = getLocalService(LightsManager.class); mNotificationLight = lights.getLight(LightsManager.LIGHT_ID_NOTIFICATIONS); @@ -1811,6 +1807,16 @@ public class NotificationManagerService extends SystemService { message); } + private void enforceSystemOrSystemUIOrSamePackage(String pkg, String message) { + try { + checkCallerIsSystemOrSameApp(pkg); + } catch (SecurityException e) { + getContext().enforceCallingPermission( + android.Manifest.permission.STATUS_BAR_SERVICE, + message); + } + } + private void enforcePolicyAccess(int uid, String method) { if (PackageManager.PERMISSION_GRANTED == getContext().checkCallingPermission( android.Manifest.permission.MANAGE_NOTIFICATIONS)) { @@ -1937,8 +1943,9 @@ public class NotificationManagerService extends SystemService { } @Override - public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) { - enforceSystemOrSystemUI("request policy access status for another package"); + public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) {; + enforceSystemOrSystemUIOrSamePackage(pkg, + "request policy access status for another package"); return checkPackagePolicyAccess(pkg); } @@ -3301,7 +3308,9 @@ public class NotificationManagerService extends SystemService { // Don't flash while we are in a call or screen is on if (ledNotification == null || mInCall || mScreenOn) { mNotificationLight.turnOff(); - mStatusBar.notificationLightOff(); + if (mStatusBar != null) { + mStatusBar.notificationLightOff(); + } } else { final Notification ledno = ledNotification.sbn.getNotification(); int ledARGB = ledno.ledARGB; @@ -3317,8 +3326,10 @@ public class NotificationManagerService extends SystemService { mNotificationLight.setFlashing(ledARGB, Light.LIGHT_FLASH_TIMED, ledOnMS, ledOffMS); } - // let SystemUI make an independent decision - mStatusBar.notificationLightPulse(ledARGB, ledOnMS, ledOffMS); + if (mStatusBar != null) { + // let SystemUI make an independent decision + mStatusBar.notificationLightPulse(ledARGB, ledOnMS, ledOffMS); + } } } @@ -3574,6 +3585,45 @@ public class NotificationManagerService extends SystemService { public boolean isEnabled() { return !mServices.isEmpty(); } + + @Override + public void onUserSwitched(int user) { + for (ManagedServiceInfo info : mServices) { + unregisterService(info.service, info.userid); + } + registerRanker(); + } + + @Override + public void onPackagesChanged(boolean queryReplace, String[] pkgList) { + if (DEBUG) Slog.d(TAG, "onPackagesChanged queryReplace=" + queryReplace + + " pkgList=" + (pkgList == null ? null : Arrays.asList(pkgList))); + + if (pkgList != null && (pkgList.length > 0)) { + for (String pkgName : pkgList) { + if (mRankerServicePackageName.equals(pkgName)) { + registerRanker(); + } + } + } + } + + protected void registerRanker() { + // Find the updatable ranker and register it. + Set<ComponentName> rankerComponents = queryPackageForServices( + mRankerServicePackageName, UserHandle.USER_SYSTEM, null); + Iterator<ComponentName> iterator = rankerComponents.iterator(); + if (iterator.hasNext()) { + ComponentName rankerComponent = iterator.next(); + if (iterator.hasNext()) { + Slog.e(TAG, "found multiple ranker services:" + rankerComponents); + } else { + registerSystemService(rankerComponent, UserHandle.USER_SYSTEM); + } + } else { + Slog.w(TAG, "could not start ranker service: none found"); + } + } } public class NotificationListeners extends ManagedServices { diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java index 538f95146efc..b853417ac0b3 100644 --- a/services/core/java/com/android/server/notification/NotificationUsageStats.java +++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java @@ -336,6 +336,13 @@ public class NotificationUsageStats { finalImportance = new ImportanceHistogram(context, "note_importance_"); } + public AggregatedStats getPrevious() { + if (mPrevious == null) { + mPrevious = new AggregatedStats(mContext, key); + } + return mPrevious; + } + public void countApiUse(NotificationRecord record) { final Notification n = record.getNotification(); if (n.actions != null) { @@ -411,67 +418,64 @@ public class NotificationUsageStats { } public void emit() { - if (mPrevious == null) { - mPrevious = new AggregatedStats(null, key); - } - - maybeCount("note_post", (numPostedByApp - mPrevious.numPostedByApp)); - maybeCount("note_update", (numUpdatedByApp - mPrevious.numUpdatedByApp)); - maybeCount("note_remove", (numRemovedByApp - mPrevious.numRemovedByApp)); - maybeCount("note_with_people", (numWithValidPeople - mPrevious.numWithValidPeople)); - maybeCount("note_with_stars", (numWithStaredPeople - mPrevious.numWithStaredPeople)); - maybeCount("people_cache_hit", (numPeopleCacheHit - mPrevious.numPeopleCacheHit)); - maybeCount("people_cache_miss", (numPeopleCacheMiss - mPrevious.numPeopleCacheMiss)); - maybeCount("note_blocked", (numBlocked - mPrevious.numBlocked)); - maybeCount("note_suspended", (numSuspendedByAdmin - mPrevious.numSuspendedByAdmin)); - maybeCount("note_with_actions", (numWithActions - mPrevious.numWithActions)); - maybeCount("note_private", (numPrivate - mPrevious.numPrivate)); - maybeCount("note_secret", (numSecret - mPrevious.numSecret)); - maybeCount("note_interupt", (numInterrupt - mPrevious.numInterrupt)); - maybeCount("note_big_text", (numWithBigText - mPrevious.numWithBigText)); - maybeCount("note_big_pic", (numWithBigPicture - mPrevious.numWithBigPicture)); - maybeCount("note_fg", (numForegroundService - mPrevious.numForegroundService)); - maybeCount("note_ongoing", (numOngoing - mPrevious.numOngoing)); - maybeCount("note_auto", (numAutoCancel - mPrevious.numAutoCancel)); - maybeCount("note_large_icon", (numWithLargeIcon - mPrevious.numWithLargeIcon)); - maybeCount("note_inbox", (numWithInbox - mPrevious.numWithInbox)); - maybeCount("note_media", (numWithMediaSession - mPrevious.numWithMediaSession)); - maybeCount("note_title", (numWithTitle - mPrevious.numWithTitle)); - maybeCount("note_text", (numWithText - mPrevious.numWithText)); - maybeCount("note_sub_text", (numWithSubText - mPrevious.numWithSubText)); - maybeCount("note_info_text", (numWithInfoText - mPrevious.numWithInfoText)); - noisyImportance.maybeCount(mPrevious.noisyImportance); - quietImportance.maybeCount(mPrevious.quietImportance); - finalImportance.maybeCount(mPrevious.finalImportance); - - mPrevious.numPostedByApp = numPostedByApp; - mPrevious.numUpdatedByApp = numUpdatedByApp; - mPrevious.numRemovedByApp = numRemovedByApp; - mPrevious.numPeopleCacheHit = numPeopleCacheHit; - mPrevious.numPeopleCacheMiss = numPeopleCacheMiss; - mPrevious.numWithStaredPeople = numWithStaredPeople; - mPrevious.numWithValidPeople = numWithValidPeople; - mPrevious.numBlocked = numBlocked; - mPrevious.numSuspendedByAdmin = numSuspendedByAdmin; - mPrevious.numWithActions = numWithActions; - mPrevious.numPrivate = numPrivate; - mPrevious.numSecret = numSecret; - mPrevious.numInterrupt = numInterrupt; - mPrevious.numWithBigText = numWithBigText; - mPrevious.numWithBigPicture = numWithBigPicture; - mPrevious.numForegroundService = numForegroundService; - mPrevious.numOngoing = numOngoing; - mPrevious.numAutoCancel = numAutoCancel; - mPrevious.numWithLargeIcon = numWithLargeIcon; - mPrevious.numWithInbox = numWithInbox; - mPrevious.numWithMediaSession = numWithMediaSession; - mPrevious.numWithTitle = numWithTitle; - mPrevious.numWithText = numWithText; - mPrevious.numWithSubText = numWithSubText; - mPrevious.numWithInfoText = numWithInfoText; - noisyImportance.update(mPrevious.noisyImportance); - quietImportance.update(mPrevious.quietImportance); - finalImportance.update(mPrevious.finalImportance); + AggregatedStats previous = getPrevious(); + maybeCount("note_post", (numPostedByApp - previous.numPostedByApp)); + maybeCount("note_update", (numUpdatedByApp - previous.numUpdatedByApp)); + maybeCount("note_remove", (numRemovedByApp - previous.numRemovedByApp)); + maybeCount("note_with_people", (numWithValidPeople - previous.numWithValidPeople)); + maybeCount("note_with_stars", (numWithStaredPeople - previous.numWithStaredPeople)); + maybeCount("people_cache_hit", (numPeopleCacheHit - previous.numPeopleCacheHit)); + maybeCount("people_cache_miss", (numPeopleCacheMiss - previous.numPeopleCacheMiss)); + maybeCount("note_blocked", (numBlocked - previous.numBlocked)); + maybeCount("note_suspended", (numSuspendedByAdmin - previous.numSuspendedByAdmin)); + maybeCount("note_with_actions", (numWithActions - previous.numWithActions)); + maybeCount("note_private", (numPrivate - previous.numPrivate)); + maybeCount("note_secret", (numSecret - previous.numSecret)); + maybeCount("note_interupt", (numInterrupt - previous.numInterrupt)); + maybeCount("note_big_text", (numWithBigText - previous.numWithBigText)); + maybeCount("note_big_pic", (numWithBigPicture - previous.numWithBigPicture)); + maybeCount("note_fg", (numForegroundService - previous.numForegroundService)); + maybeCount("note_ongoing", (numOngoing - previous.numOngoing)); + maybeCount("note_auto", (numAutoCancel - previous.numAutoCancel)); + maybeCount("note_large_icon", (numWithLargeIcon - previous.numWithLargeIcon)); + maybeCount("note_inbox", (numWithInbox - previous.numWithInbox)); + maybeCount("note_media", (numWithMediaSession - previous.numWithMediaSession)); + maybeCount("note_title", (numWithTitle - previous.numWithTitle)); + maybeCount("note_text", (numWithText - previous.numWithText)); + maybeCount("note_sub_text", (numWithSubText - previous.numWithSubText)); + maybeCount("note_info_text", (numWithInfoText - previous.numWithInfoText)); + noisyImportance.maybeCount(previous.noisyImportance); + quietImportance.maybeCount(previous.quietImportance); + finalImportance.maybeCount(previous.finalImportance); + + previous.numPostedByApp = numPostedByApp; + previous.numUpdatedByApp = numUpdatedByApp; + previous.numRemovedByApp = numRemovedByApp; + previous.numPeopleCacheHit = numPeopleCacheHit; + previous.numPeopleCacheMiss = numPeopleCacheMiss; + previous.numWithStaredPeople = numWithStaredPeople; + previous.numWithValidPeople = numWithValidPeople; + previous.numBlocked = numBlocked; + previous.numSuspendedByAdmin = numSuspendedByAdmin; + previous.numWithActions = numWithActions; + previous.numPrivate = numPrivate; + previous.numSecret = numSecret; + previous.numInterrupt = numInterrupt; + previous.numWithBigText = numWithBigText; + previous.numWithBigPicture = numWithBigPicture; + previous.numForegroundService = numForegroundService; + previous.numOngoing = numOngoing; + previous.numAutoCancel = numAutoCancel; + previous.numWithLargeIcon = numWithLargeIcon; + previous.numWithInbox = numWithInbox; + previous.numWithMediaSession = numWithMediaSession; + previous.numWithTitle = numWithTitle; + previous.numWithText = numWithText; + previous.numWithSubText = numWithSubText; + previous.numWithInfoText = numWithInfoText; + noisyImportance.update(previous.noisyImportance); + quietImportance.update(previous.quietImportance); + finalImportance.update(previous.finalImportance); } void maybeCount(String name, int value) { @@ -553,6 +557,7 @@ public class NotificationUsageStats { } public JSONObject dumpJson() throws JSONException { + AggregatedStats previous = getPrevious(); JSONObject dump = new JSONObject(); dump.put("key", key); dump.put("duration", SystemClock.elapsedRealtime() - mCreated); @@ -581,9 +586,9 @@ public class NotificationUsageStats { maybePut(dump, "numWithText", numWithText); maybePut(dump, "numWithSubText", numWithSubText); maybePut(dump, "numWithInfoText", numWithInfoText); - noisyImportance.maybePut(dump, mPrevious.noisyImportance); - quietImportance.maybePut(dump, mPrevious.quietImportance); - finalImportance.maybePut(dump, mPrevious.finalImportance); + noisyImportance.maybePut(dump, previous.noisyImportance); + quietImportance.maybePut(dump, previous.quietImportance); + finalImportance.maybePut(dump, previous.finalImportance); return dump; } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 6cc0544afb21..5b0ceca4cb9d 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -28,6 +28,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ILauncherApps; import android.content.pm.IOnAppsChangedListener; import android.content.pm.IPackageManager; +import android.content.pm.LauncherApps.ShortcutQuery; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -74,9 +75,20 @@ public class LauncherAppsService extends SystemService { @Override public void onStart() { + Binder.LOG_RUNTIME_EXCEPTION = true; publishBinderService(Context.LAUNCHER_APPS_SERVICE, mLauncherAppsImpl); } + static class BroadcastCookie { + public final UserHandle user; + public final String packageName; + + BroadcastCookie(UserHandle userHandle, String packageName) { + this.user = userHandle; + this.packageName = packageName; + } + } + @VisibleForTesting static class LauncherAppsImpl extends ILauncherApps.Stub { private static final boolean DEBUG = false; @@ -113,7 +125,8 @@ public class LauncherAppsService extends SystemService { * android.content.pm.IOnAppsChangedListener) */ @Override - public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException { + public void addOnAppsChangedListener(String callingPackage, IOnAppsChangedListener listener) + throws RemoteException { synchronized (mListeners) { if (DEBUG) { Log.d(TAG, "Adding listener from " + Binder.getCallingUserHandle()); @@ -125,7 +138,8 @@ public class LauncherAppsService extends SystemService { startWatchingPackageBroadcasts(); } mListeners.unregister(listener); - mListeners.register(listener, Binder.getCallingUserHandle()); + mListeners.register(listener, new BroadcastCookie(UserHandle.of(getCallingUserId()), + callingPackage)); } } @@ -490,41 +504,44 @@ public class LauncherAppsService extends SystemService { } } - - private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener { - - /** Checks if user is a profile of or same as listeningUser. - * and the user is enabled. */ - private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, - String debugMsg) { - if (user.getIdentifier() == listeningUser.getIdentifier()) { - if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg); - return true; - } - long ident = Binder.clearCallingIdentity(); - try { - UserInfo userInfo = mUm.getUserInfo(user.getIdentifier()); - UserInfo listeningUserInfo = mUm.getUserInfo(listeningUser.getIdentifier()); - if (userInfo == null || listeningUserInfo == null - || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID - || userInfo.profileGroupId != listeningUserInfo.profileGroupId - || !userInfo.isEnabled()) { - if (DEBUG) { - Log.d(TAG, "Not delivering msg from " + user + " to " + listeningUser + ":" - + debugMsg); - } - return false; - } else { - if (DEBUG) { - Log.d(TAG, "Delivering msg from " + user + " to " + listeningUser + ":" - + debugMsg); - } - return true; + /** Checks if user is a profile of or same as listeningUser. + * and the user is enabled. */ + boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, + String debugMsg) { + if (user.getIdentifier() == listeningUser.getIdentifier()) { + if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg); + return true; + } + long ident = Binder.clearCallingIdentity(); + try { + UserInfo userInfo = mUm.getUserInfo(user.getIdentifier()); + UserInfo listeningUserInfo = mUm.getUserInfo(listeningUser.getIdentifier()); + if (userInfo == null || listeningUserInfo == null + || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID + || userInfo.profileGroupId != listeningUserInfo.profileGroupId + || !userInfo.isEnabled()) { + if (DEBUG) { + Log.d(TAG, "Not delivering msg from " + user + " to " + listeningUser + ":" + + debugMsg); } - } finally { - Binder.restoreCallingIdentity(ident); + return false; + } else { + if (DEBUG) { + Log.d(TAG, "Delivering msg from " + user + " to " + listeningUser + ":" + + debugMsg); + } + return true; } + } finally { + Binder.restoreCallingIdentity(ident); } + } + + void postToPackageMonitor(Runnable r) { + mPackageMonitor.getRegisteredHandler().post(r); + } + + private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener { // TODO Simplify with lambdas. @@ -534,8 +551,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackageAdded")) continue; + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackageAdded")) continue; try { listener.onPackageAdded(user, packageName); } catch (RemoteException re) { @@ -553,8 +570,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackageRemoved")) continue; + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackageRemoved")) continue; try { listener.onPackageRemoved(user, packageName); } catch (RemoteException re) { @@ -572,8 +589,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackageModified")) continue; + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackageModified")) continue; try { listener.onPackageChanged(user, packageName); } catch (RemoteException re) { @@ -591,8 +608,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackagesAvailable")) continue; + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackagesAvailable")) continue; try { listener.onPackagesAvailable(user, packages, isReplacing()); } catch (RemoteException re) { @@ -610,8 +627,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnavailable")) continue; + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnavailable")) continue; try { listener.onPackagesUnavailable(user, packages, isReplacing()); } catch (RemoteException re) { @@ -629,8 +646,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackagesSuspended")) continue; + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackagesSuspended")) continue; try { listener.onPackagesSuspended(user, packages); } catch (RemoteException re) { @@ -648,8 +665,8 @@ public class LauncherAppsService extends SystemService { final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnsuspended")) continue; + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onPackagesUnsuspended")) continue; try { listener.onPackagesUnsuspended(user, packages); } catch (RemoteException re) { @@ -663,20 +680,39 @@ public class LauncherAppsService extends SystemService { @Override public void onShortcutChanged(@NonNull String packageName, - @NonNull List<ShortcutInfo> shortcuts, @UserIdInt int userId) { + @UserIdInt int userId) { + postToPackageMonitor(() -> onShortcutChangedInner(packageName, userId)); + } + + private void onShortcutChangedInner(@NonNull String packageName, + @UserIdInt int userId) { final UserHandle user = UserHandle.of(userId); final int n = mListeners.beginBroadcast(); for (int i = 0; i < n; i++) { IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onShortcutChanged")) continue; - - // STOPSHIP Skip if the receiver doesn't have the permission. + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, cookie.user, "onShortcutChanged")) continue; + // Make sure the caller has the permission. + if (!mShortcutServiceInternal.hasShortcutHostPermission(cookie.packageName, + cookie.user.getIdentifier())) { + continue; + } + // Each launcher has a different set of pinned shortcuts, so we need to do a + // query in here. + // (As of now, only one launcher has the permission at a time, so it's bit + // moot, but we may change the permission model eventually.) + final List<ShortcutInfo> list = + mShortcutServiceInternal.getShortcuts(cookie.packageName, + /* changedSince= */ 0, packageName, /* component= */ null, + ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY + | ShortcutQuery.FLAG_GET_PINNED + | ShortcutQuery.FLAG_GET_DYNAMIC + , userId); try { listener.onShortcutChanged(user, packageName, - new ParceledListSlice<>(shortcuts)); + new ParceledListSlice<>(list)); } catch (RemoteException re) { Slog.d(TAG, "Callback failed ", re); } diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 3791eb05ca82..06417494efdd 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -814,7 +814,7 @@ public class ShortcutService extends IShortcutService.Stub { return; } - final long token = Binder.clearCallingIdentity(); + final long token = injectClearCallingIdentity(); try { // Clear icon info on the shortcut. shortcut.setIconResourceId(0); @@ -891,7 +891,7 @@ public class ShortcutService extends IShortcutService.Stub { shortcut.clearIcon(); } } finally { - Binder.restoreCallingIdentity(token); + injectRestoreCallingIdentity(token); } } @@ -992,6 +992,10 @@ public class ShortcutService extends IShortcutService.Stub { } } + void postToHandler(Runnable r) { + mHandler.post(r); + } + /** * Throw if {@code numShortcuts} is bigger than {@link #mMaxDynamicShortcuts}. */ @@ -1011,17 +1015,16 @@ public class ShortcutService extends IShortcutService.Stub { } private void notifyListeners(@NonNull String packageName, @UserIdInt int userId) { - final ArrayList<ShortcutChangeListener> copy; - final List<ShortcutInfo> shortcuts = new ArrayList<>(); - synchronized (mLock) { - copy = new ArrayList<>(mListeners); - - getPackageShortcutsLocked(packageName, userId) - .findAll(shortcuts, /* query =*/ null, ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO); - } - for (int i = copy.size() - 1; i >= 0; i--) { - copy.get(i).onShortcutChanged(packageName, shortcuts, userId); - } + postToHandler(() -> { + final ArrayList<ShortcutChangeListener> copy; + synchronized (mLock) { + copy = new ArrayList<>(mListeners); + } + // Note onShortcutChanged() needs to be called with the system service permissions. + for (int i = copy.size() - 1; i >= 0; i--) { + copy.get(i).onShortcutChanged(packageName, userId); + } + }); } /** @@ -1799,6 +1802,16 @@ public class ShortcutService extends IShortcutService.Stub { return UserHandle.getUserId(injectBinderCallingUid()); } + // Injection point. + long injectClearCallingIdentity() { + return Binder.clearCallingIdentity(); + } + + // Injection point. + void injectRestoreCallingIdentity(long token) { + Binder.restoreCallingIdentity(token); + } + File injectSystemDataPath() { return Environment.getDataSystemDirectory(); } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 8206bdab255d..5fd196b4eb5b 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -641,7 +641,16 @@ public class UserManagerService extends IUserManager.Stub { @Override public UserInfo getUserInfo(int userId) { - checkManageUsersPermission("query user"); + int callingUserId = UserHandle.getCallingUserId(); + if (callingUserId != userId && !hasManageUsersPermission()) { + synchronized (mPackagesLock) { + if (!isSameProfileGroupLP(callingUserId, userId)) { + throw new SecurityException( + "You need MANAGE_USERS permission to: query users outside profile" + + " group"); + } + } + } synchronized (mUsersLock) { return getUserInfoLU(userId); } @@ -1196,18 +1205,28 @@ public class UserManagerService extends IUserManager.Stub { * * @param message used as message if SecurityException is thrown * @throws SecurityException if the caller is not system or root + * @see #hasManageUsersPermission() */ private static final void checkManageUsersPermission(String message) { - final int uid = Binder.getCallingUid(); - if (!UserHandle.isSameApp(uid, Process.SYSTEM_UID) && uid != Process.ROOT_UID - && ActivityManager.checkComponentPermission( - android.Manifest.permission.MANAGE_USERS, - uid, -1, true) != PackageManager.PERMISSION_GRANTED) { + if (!hasManageUsersPermission()) { throw new SecurityException("You need MANAGE_USERS permission to: " + message); } } /** + * @return whether the calling UID is system UID or root's UID or the calling app has the + * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS}. + */ + private static final boolean hasManageUsersPermission() { + final int callingUid = Binder.getCallingUid(); + return UserHandle.isSameApp(callingUid, Process.SYSTEM_UID) + || callingUid == Process.ROOT_UID + || ActivityManager.checkComponentPermission( + android.Manifest.permission.MANAGE_USERS, + callingUid, -1, true) == PackageManager.PERMISSION_GRANTED; + } + + /** * Enforces that only the system UID or root's UID (on any user) can make certain calls to the * UserManager. * diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index ffdd89ae364c..3cf95900edde 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -730,13 +730,27 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { public void systemRunning() { if (DEBUG) Slog.v(TAG, "systemReady"); WallpaperData wallpaper = mWallpaperMap.get(UserHandle.USER_SYSTEM); - // No crop file? Make sure we've finished the processing sequence if necessary - if (!wallpaper.cropExists()) { - generateCrop(wallpaper); - } - // Still nothing? Fall back to default. - if (!wallpaper.cropExists()) { - clearWallpaperLocked(false, FLAG_SET_SYSTEM, UserHandle.USER_SYSTEM, null); + // If we think we're going to be using the system image wallpaper imagery, make + // sure we have something to render + if (mImageWallpaper.equals(wallpaper.nextWallpaperComponent)) { + // No crop file? Make sure we've finished the processing sequence if necessary + if (!wallpaper.cropExists()) { + if (DEBUG) { + Slog.i(TAG, "No crop; regenerating from source"); + } + generateCrop(wallpaper); + } + // Still nothing? Fall back to default. + if (!wallpaper.cropExists()) { + if (DEBUG) { + Slog.i(TAG, "Unable to regenerate crop; resetting"); + } + clearWallpaperLocked(false, FLAG_SET_SYSTEM, UserHandle.USER_SYSTEM, null); + } + } else { + if (DEBUG) { + Slog.i(TAG, "Nondefault wallpaper component; gracefully ignoring"); + } } switchWallpaper(wallpaper, null); wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper); diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 2e424d036da7..e44b0f30d9b7 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -508,10 +508,11 @@ class WallpaperController { replacing = replacing || w.mWillReplaceWindow; - // If the app is executing an animation because the keyguard is going away, - // keep the wallpaper during the animation so it doesn't flicker out. + // If the app is executing an animation because the keyguard is going away (and the + // keyguard was showing the wallpaper) keep the wallpaper during the animation so it + // doesn't flicker out. final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0 - || (w.mAppToken != null && w.mWinAnimator.mKeyguardGoingAwayAnimation); + || (w.mAppToken != null && w.mWinAnimator.mKeyguardGoingAwayWithWallpaper); if (hasWallpaper && w.isOnScreen() && (mWallpaperTarget == w || w.isDrawFinishedLw())) { if (DEBUG_WALLPAPER) Slog.v(TAG, "Found wallpaper target: #" + i + "=" + w); result.setWallpaperTarget(w, i); diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 4698e4e173ae..f24376195eb8 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -22,6 +22,9 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; +import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; +import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; +import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEYGUARD; @@ -98,8 +101,7 @@ public class WindowAnimator { boolean mInitialized = false; boolean mKeyguardGoingAway; - boolean mKeyguardGoingAwayToNotificationShade; - boolean mKeyguardGoingAwayDisableWindowAnimations; + int mKeyguardGoingAwayFlags; /** Use one animation for all entering activities after keyguard is dismissed. */ Animation mPostKeyguardExitAnimation; @@ -243,6 +245,13 @@ public class WindowAnimator { final WindowList windows = mService.getWindowListLocked(displayId); + final boolean keyguardGoingAwayToShade = + (mKeyguardGoingAwayFlags & KEYGUARD_GOING_AWAY_FLAG_TO_SHADE) != 0; + final boolean keyguardGoingAwayNoAnimation = + (mKeyguardGoingAwayFlags & KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS) != 0; + final boolean keyguardGoingAwayWithWallpaper = + (mKeyguardGoingAwayFlags & KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER) != 0; + if (mKeyguardGoingAway) { for (int i = windows.size() - 1; i >= 0; i--) { WindowState win = windows.get(i); @@ -261,6 +270,8 @@ public class WindowAnimator { winAnimator.mAnimationIsEntrance = false; winAnimator.mAnimationStartTime = -1; winAnimator.mKeyguardGoingAwayAnimation = true; + winAnimator.mKeyguardGoingAwayWithWallpaper + = keyguardGoingAwayWithWallpaper; } } else { if (DEBUG_KEYGUARD) Slog.d(TAG, @@ -392,10 +403,13 @@ public class WindowAnimator { if (DEBUG_KEYGUARD) Slog.v(TAG, "Applying existing Keyguard exit animation to new window: win=" + win); - Animation a = mPolicy.createForceHideEnterAnimation( - false, mKeyguardGoingAwayToNotificationShade); + + Animation a = mPolicy.createForceHideEnterAnimation(false, + keyguardGoingAwayToShade); winAnimator.setAnimation(a, mPostKeyguardExitAnimation.getStartTime()); winAnimator.mKeyguardGoingAwayAnimation = true; + winAnimator.mKeyguardGoingAwayWithWallpaper + = keyguardGoingAwayWithWallpaper; } final WindowState currentFocus = mService.mCurrentFocus; if (currentFocus == null || currentFocus.mLayer < win.mLayer) { @@ -463,18 +477,20 @@ public class WindowAnimator { // being force-hidden, apply the appropriate animation to them if animations are not // disabled. if (unForceHiding != null) { - if (!mKeyguardGoingAwayDisableWindowAnimations) { + if (!keyguardGoingAwayNoAnimation) { boolean first = true; for (int i=unForceHiding.size()-1; i>=0; i--) { final WindowStateAnimator winAnimator = unForceHiding.get(i); Animation a = mPolicy.createForceHideEnterAnimation( wallpaperInUnForceHiding && !startingInUnForceHiding, - mKeyguardGoingAwayToNotificationShade); + keyguardGoingAwayToShade); if (a != null) { if (DEBUG_KEYGUARD) Slog.v(TAG, "Starting keyguard exit animation on window " + winAnimator.mWin); winAnimator.setAnimation(a); winAnimator.mKeyguardGoingAwayAnimation = true; + winAnimator.mKeyguardGoingAwayWithWallpaper + = keyguardGoingAwayWithWallpaper; if (first) { mPostKeyguardExitAnimation = a; mPostKeyguardExitAnimation.setStartTime(mCurrentTime); @@ -489,11 +505,10 @@ public class WindowAnimator { // Wallpaper is going away in un-force-hide motion, animate it as well. - if (!wallpaperInUnForceHiding && wallpaper != null - && !mKeyguardGoingAwayDisableWindowAnimations) { + if (!wallpaperInUnForceHiding && wallpaper != null && !keyguardGoingAwayNoAnimation) { if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: wallpaper animating away"); Animation a = mPolicy.createForceHideWallpaperExitAnimation( - mKeyguardGoingAwayToNotificationShade); + keyguardGoingAwayToShade); if (a != null) { wallpaper.mWinAnimator.setAnimation(a); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 755851de4c53..607a3e96ecba 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4255,16 +4255,12 @@ public class WindowManagerService extends IWindowManager.Stub wtoken.appDied = false; wtoken.removeAllWindows(); } else if (visible) { - if (DEBUG_ADD_REMOVE) Slog.v( - TAG_WM, "No longer Stopped: " + wtoken); - wtoken.mAppStopped = false; mOpeningApps.add(wtoken); wtoken.startingMoved = false; - // If the token is currently hidden (should be the - // common case), then we need to set up to wait for - // its windows to be ready. - if (wtoken.hidden) { + // If the token is currently hidden (should be the common case), or has been + // stopped, then we need to set up to wait for its windows to be ready. + if (wtoken.hidden || wtoken.mAppStopped) { wtoken.allDrawn = false; wtoken.deferClearAllDrawn = false; wtoken.waitingToShow = true; @@ -4280,6 +4276,9 @@ public class WindowManagerService extends IWindowManager.Stub wtoken.sendAppVisibilityToClients(); } } + if (DEBUG_ADD_REMOVE) Slog.v( + TAG_WM, "No longer Stopped: " + wtoken); + wtoken.mAppStopped = false; } // If we are preparing an app transition, then delay changing @@ -5179,18 +5178,16 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void keyguardGoingAway(boolean disableWindowAnimations, - boolean keyguardGoingToNotificationShade) { + public void keyguardGoingAway(int flags) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Requires DISABLE_KEYGUARD permission"); } - if (DEBUG_KEYGUARD) Slog.d(TAG_WM, "keyguardGoingAway: disableWinAnim=" - + disableWindowAnimations + " kgToNotifShade=" + keyguardGoingToNotificationShade); + if (DEBUG_KEYGUARD) Slog.d(TAG_WM, + "keyguardGoingAway: flags=0x" + Integer.toHexString(flags)); synchronized (mWindowMap) { mAnimator.mKeyguardGoingAway = true; - mAnimator.mKeyguardGoingAwayToNotificationShade = keyguardGoingToNotificationShade; - mAnimator.mKeyguardGoingAwayDisableWindowAnimations = disableWindowAnimations; + mAnimator.mKeyguardGoingAwayFlags = flags; mWindowPlacerLocked.requestTraversal(); } } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index bf8a62e5787d..252bc1e3d82e 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -160,6 +160,7 @@ class WindowStateAnimator { boolean mEnteringAnimation; boolean mKeyguardGoingAwayAnimation; + boolean mKeyguardGoingAwayWithWallpaper; /** The pixel format of the underlying SurfaceControl */ int mSurfaceFormat; @@ -250,6 +251,7 @@ class WindowStateAnimator { mAnimation.cancel(); mAnimation = null; mKeyguardGoingAwayAnimation = false; + mKeyguardGoingAwayWithWallpaper = false; } } @@ -381,6 +383,7 @@ class WindowStateAnimator { mAnimating = false; mKeyguardGoingAwayAnimation = false; + mKeyguardGoingAwayWithWallpaper = false; mLocalAnimating = false; if (mAnimation != null) { mAnimation.cancel(); @@ -1216,17 +1219,17 @@ class WindowStateAnimator { } // We don't apply the stack bounds crop if: - // 1. The window is currently animating docked mode or in freeform mode, otherwise the - // animating window will be suddenly (docked) or for whole animation (freeform) cut off. - // (Note that we still need to apply the crop if the task being docked is non-resizeable, - // in which case the task is running in fullscreen size but cropped to stack bounds.) + // 1. The window is currently animating in freeform mode, otherwise the animating window + // will be suddenly (docked) or for whole animation (freeform) cut off. // 2. The window that is being replaced during animation, because it was living in a // different stack. If we suddenly crop it to the new stack bounds, it might get cut off. // We don't want it to happen, so we let it ignore the stack bounds until it gets removed. // The window that will replace it will abide them. - if (isAnimating() && (w.mWillReplaceWindow - || (w.inDockedWorkspace() && task.isResizeable()) - || w.inFreeformWorkspace())) { + // TODO: identify animations where we don't want to apply docked stack crop to the docked + // task. For example, if the app is going from freeform to docked mode, we may not + // want to apply the crop during the animation, since it will make the app appear + // cropped prematurely. + if (isAnimating() && (w.mWillReplaceWindow || w.inFreeformWorkspace())) { return; } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index b48c185aa2a3..16e73fc12278 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -115,6 +115,7 @@ import android.security.IKeyChainService; import android.security.KeyChain; import android.security.KeyChain.KeyChainConnection; import android.service.persistentdata.PersistentDataBlockManager; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -306,6 +307,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final IPackageManager mIPackageManager; final UserManager mUserManager; final UserManagerInternal mUserManagerInternal; + final TelephonyManager mTelephonyManager; private final LockPatternUtils mLockPatternUtils; /** @@ -1354,6 +1356,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return LocalServices.getService(PowerManagerInternal.class); } + TelephonyManager getTelephonyManager() { + return TelephonyManager.from(mContext); + } + IWindowManager getIWindowManager() { return IWindowManager.Stub .asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)); @@ -1542,6 +1548,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mUserManager = Preconditions.checkNotNull(injector.getUserManager()); mUserManagerInternal = Preconditions.checkNotNull(injector.getUserManagerInternal()); mIPackageManager = Preconditions.checkNotNull(injector.getIPackageManager()); + mTelephonyManager = Preconditions.checkNotNull(injector.getTelephonyManager()); mLocalService = new LocalService(); mLockPatternUtils = injector.newLockPatternUtils(); @@ -1664,12 +1671,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } else { if (mOwners.hasDeviceOwner()) { mInjector.systemPropertiesSet(PROPERTY_DEVICE_OWNER_PRESENT, "true"); + Slog.i(LOG_TAG, "Set ro.device_owner property to true"); disableDeviceLoggingIfNotCompliant(); if (mInjector.securityLogGetLoggingEnabledProperty()) { mSecurityLogMonitor.start(); } } else { mInjector.systemPropertiesSet(PROPERTY_DEVICE_OWNER_PRESENT, "false"); + Slog.i(LOG_TAG, "Set ro.device_owner property to false"); } } } @@ -7893,6 +7902,29 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } return false; } + + @Override + public Intent createPackageSuspendedDialogIntent(String packageName, int userId) { + Intent intent = new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS); + intent.putExtra(Intent.EXTRA_USER_ID, userId); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + synchronized (DevicePolicyManagerService.this) { + ComponentName profileOwner = mOwners.getProfileOwnerComponent(userId); + if (profileOwner != null) { + intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, profileOwner); + return intent; + } + + if (mOwners.getDeviceOwnerUserId() == userId) { + ComponentName deviceOwner = mOwners.getDeviceOwnerComponent(); + if (deviceOwner != null) { + intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceOwner); + return intent; + } + } + } + return null; + } } /** @@ -8309,6 +8341,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } long ident = mInjector.binderClearCallingIdentity(); try { + // Make sure there are no ongoing calls on the device. + if (mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE) { + throw new IllegalStateException("Cannot be called with ongoing call on the device"); + } mInjector.powerManagerReboot(PowerManager.REBOOT_REQUESTED_BY_DEVICE_OWNER); } finally { mInjector.binderRestoreCallingIdentity(ident); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index e7daaa15d247..19c073ccf4dc 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -518,6 +518,16 @@ public final class SystemServer { boolean disableNetwork = SystemProperties.getBoolean("config.disable_network", false); boolean disableNetworkTime = SystemProperties.getBoolean("config.disable_networktime", false); boolean disableRtt = SystemProperties.getBoolean("config.disable_rtt", false); + boolean disableMediaProjection = SystemProperties.getBoolean("config.disable_mediaproj", + false); + boolean disableSerial = SystemProperties.getBoolean("config.disable_serial", false); + boolean disableSearchManager = SystemProperties.getBoolean("config.disable_searchmanager", + false); + boolean disableTrustManager = SystemProperties.getBoolean("config.disable_trustmanager", + false); + boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices", false); + boolean disableSamplingProfiler = SystemProperties.getBoolean("config.disable_samplingprof", + false); boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1"); try { @@ -761,7 +771,7 @@ public final class SystemServer { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } - if (!disableNonCoreServices) { + if (!disableNonCoreServices && !disableTextServices) { mSystemServiceManager.startService(TextServicesManagerService.Lifecycle.class); } @@ -912,7 +922,7 @@ public final class SystemServer { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } - if (!disableNonCoreServices) { + if (!disableNonCoreServices && !disableSearchManager) { traceBeginAndSlog("StartSearchManagerService"); try { mSystemServiceManager.startService(SEARCH_MANAGER_SERVICE_CLASS); @@ -974,15 +984,17 @@ public final class SystemServer { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } - traceBeginAndSlog("StartSerialService"); - try { - // Serial port support - serial = new SerialService(context); - ServiceManager.addService(Context.SERIAL_SERVICE, serial); - } catch (Throwable e) { - Slog.e(TAG, "Failure starting SerialService", e); + if (!disableSerial) { + traceBeginAndSlog("StartSerialService"); + try { + // Serial port support + serial = new SerialService(context); + ServiceManager.addService(Context.SERIAL_SERVICE, serial); + } catch (Throwable e) { + Slog.e(TAG, "Failure starting SerialService", e); + } + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } - Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartHardwarePropertiesManagerService"); @@ -1020,6 +1032,7 @@ public final class SystemServer { mSystemServiceManager.startService(GestureLauncherService.class); } mSystemServiceManager.startService(SensorNotificationService.class); + mSystemServiceManager.startService(ContextHubSystemService.class); } traceBeginAndSlog("StartDiskStatsService"); @@ -1030,18 +1043,20 @@ public final class SystemServer { } Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); - traceBeginAndSlog("StartSamplingProfilerService"); - try { - // need to add this service even if SamplingProfilerIntegration.isEnabled() - // is false, because it is this service that detects system property change and - // turns on SamplingProfilerIntegration. Plus, when sampling profiler doesn't work, - // there is little overhead for running this service. - ServiceManager.addService("samplingprofiler", - new SamplingProfilerService(context)); - } catch (Throwable e) { - reportWtf("starting SamplingProfiler Service", e); + if (!disableSamplingProfiler) { + traceBeginAndSlog("StartSamplingProfilerService"); + try { + // need to add this service even if SamplingProfilerIntegration.isEnabled() + // is false, because it is this service that detects system property change and + // turns on SamplingProfilerIntegration. Plus, when sampling profiler doesn't work, + // there is little overhead for running this service. + ServiceManager.addService("samplingprofiler", + new SamplingProfilerService(context)); + } catch (Throwable e) { + reportWtf("starting SamplingProfiler Service", e); + } + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } - Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); if (!disableNetwork && !disableNetworkTime) { traceBeginAndSlog("StartNetworkTimeUpdateService"); @@ -1122,7 +1137,9 @@ public final class SystemServer { } Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); - mSystemServiceManager.startService(TrustManagerService.class); + if (!disableTrustManager) { + mSystemServiceManager.startService(TrustManagerService.class); + } if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { mSystemServiceManager.startService(FingerprintService.class); @@ -1142,7 +1159,7 @@ public final class SystemServer { mSystemServiceManager.startService(LauncherAppsService.class); } - if (!disableNonCoreServices) { + if (!disableNonCoreServices && !disableMediaProjection) { mSystemServiceManager.startService(MediaProjectionManagerService.class); } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java index aaec1e9241cf..35777ce86c4a 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java @@ -29,6 +29,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.UserManagerInternal; import android.os.storage.StorageManager; +import android.telephony.TelephonyManager; import android.view.IWindowManager; import java.io.File; @@ -322,5 +323,10 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi boolean securityLogIsLoggingEnabled() { return context.settings.securityLogIsLoggingEnabled(); } + + @Override + TelephonyManager getTelephonyManager() { + return context.telephonyManager; + } } } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index e897e3d20edf..6c2bdda3e21a 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -33,6 +33,7 @@ import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.telephony.TelephonyManager; import android.test.MoreAsserts; import android.test.suitebuilder.annotation.SmallTest; import android.util.ArraySet; @@ -1491,7 +1492,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertEquals("11:22:33:44:55:66", dpm.getWifiMacAddress(admin1)); } - public void testRebootCanOnlyBeCalledByDeviceOwner() throws Exception { + public void testReboot() throws Exception { mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS); mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS); @@ -1524,6 +1525,29 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.clearProfileOwner(admin1); assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM)); + // admin1 is DO. + // Set current call state of device to ringing. + when(mContext.telephonyManager.getCallState()) + .thenReturn(TelephonyManager.CALL_STATE_RINGING); + try { + dpm.reboot(admin1); + fail("DPM.reboot() called when receiveing a call, should thrown IllegalStateException"); + } catch (IllegalStateException expected) { + MoreAsserts.assertContainsRegex("ongoing call on the device", expected.getMessage()); + } + + // Set current call state of device to dialing/active. + when(mContext.telephonyManager.getCallState()) + .thenReturn(TelephonyManager.CALL_STATE_OFFHOOK); + try { + dpm.reboot(admin1); + fail("DPM.reboot() called when dialing, should thrown IllegalStateException"); + } catch (IllegalStateException expected) { + MoreAsserts.assertContainsRegex("ongoing call on the device", expected.getMessage()); + } + + // Set current call state of device to idle. + when(mContext.telephonyManager.getCallState()).thenReturn(TelephonyManager.CALL_STATE_IDLE); dpm.reboot(admin1); } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java index b05309af49ab..8e2ef703f3c6 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java @@ -40,6 +40,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.UserManagerInternal; import android.os.storage.StorageManager; +import android.telephony.TelephonyManager; import android.test.mock.MockContentResolver; import android.test.mock.MockContext; import android.view.IWindowManager; @@ -262,6 +263,7 @@ public class DpmMockContext extends MockContext { public final WifiManager wifiManager; public final SettingsForMock settings; public final MockContentResolver contentResolver; + public final TelephonyManager telephonyManager; /** Note this is a partial mock, not a real mock. */ public final PackageManager packageManager; @@ -295,6 +297,7 @@ public class DpmMockContext extends MockContext { storageManager = mock(StorageManagerForMock.class); wifiManager = mock(WifiManager.class); settings = mock(SettingsForMock.class); + telephonyManager = mock(TelephonyManager.class); // Package manager is huge, so we use a partial mock instead. packageManager = spy(context.getPackageManager()); diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java index f978d843e6be..6bcaf4da05b1 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java @@ -15,15 +15,22 @@ */ package com.android.server.pm; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import android.annotation.NonNull; import android.annotation.UserIdInt; import android.app.Activity; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ILauncherApps; import android.content.pm.LauncherApps; import android.content.pm.LauncherApps.ShortcutQuery; @@ -40,10 +47,13 @@ import android.graphics.drawable.Icon; import android.os.BaseBundle; import android.os.Bundle; import android.os.FileUtils; +import android.os.Handler; +import android.os.Looper; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.UserHandle; import android.os.UserManager; -import android.test.AndroidTestCase; +import android.test.InstrumentationTestCase; import android.test.mock.MockContext; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; @@ -59,6 +69,7 @@ import com.android.server.pm.ShortcutService.FileOutputStreamWithPath; import libcore.io.IoUtils; import org.junit.Assert; +import org.mockito.ArgumentCaptor; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; @@ -92,7 +103,7 @@ import java.util.Set; * */ @SmallTest -public class ShortcutManagerTest extends AndroidTestCase { +public class ShortcutManagerTest extends InstrumentationTestCase { private static final String TAG = "ShortcutManagerTest"; /** @@ -118,7 +129,14 @@ public class ShortcutManagerTest extends AndroidTestCase { @Override public Resources getResources() { - return ShortcutManagerTest.this.getContext().getResources(); + return getTestContext().getResources(); + } + + @Override + public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, + IntentFilter filter, String broadcastPermission, Handler scheduler) { + // ignore. + return null; } } @@ -132,13 +150,24 @@ public class ShortcutManagerTest extends AndroidTestCase { /** Context used in the service side */ private final class ServiceContext extends BaseContext { + long injectClearCallingIdentity() { + final int prevCallingUid = mInjectedCallingUid; + mInjectedCallingUid = Process.SYSTEM_UID; + return prevCallingUid; + } + + void injectRestoreCallingIdentity(long token) { + mInjectedCallingUid = (int) token; + } } /** ShortcutService with injection override methods. */ private final class ShortcutServiceTestable extends ShortcutService { - public ShortcutServiceTestable(Context context) { - super(context); + final ServiceContext mContext; + public ShortcutServiceTestable(ServiceContext context) { + super(context); + mContext = context; } @Override @@ -154,6 +183,16 @@ public class ShortcutManagerTest extends AndroidTestCase { } @Override + long injectClearCallingIdentity() { + return mContext.injectClearCallingIdentity(); + } + + @Override + void injectRestoreCallingIdentity(long token) { + mContext.injectRestoreCallingIdentity(token); + } + + @Override int injectDipToPixel(int dip) { return dip; } @@ -204,6 +243,13 @@ public class ShortcutManagerTest extends AndroidTestCase { // Sort of hack; do a simpler check. return LAUNCHER_1.equals(callingPackage) || LAUNCHER_2.equals(callingPackage); } + + @Override + void postToHandler(Runnable r) { + final long token = mContext.injectClearCallingIdentity(); + r.run(); + mContext.injectRestoreCallingIdentity(token); + } } /** ShortcutManager with injection override methods. */ @@ -219,12 +265,20 @@ public class ShortcutManagerTest extends AndroidTestCase { } private class LauncherAppImplTestable extends LauncherAppsImpl { - public LauncherAppImplTestable(Context context) { + final ServiceContext mContext; + + public LauncherAppImplTestable(ServiceContext context) { super(context); + mContext = context; } @Override public void ensureInUserProfiles(UserHandle userToCheck, String message) { + if (getCallingUserId() == userToCheck.getIdentifier()) { + return; // okay + } + + assertEquals(Process.SYSTEM_UID, mInjectedCallingUid); // SKIP } @@ -232,6 +286,20 @@ public class ShortcutManagerTest extends AndroidTestCase { public void verifyCallingPackage(String callingPackage) { // SKIP } + + @Override + boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, String debugMsg) { + // This requires CROSS_USER + assertEquals(Process.SYSTEM_UID, mInjectedCallingUid); + return user.getIdentifier() == listeningUser.getIdentifier(); + } + + @Override + void postToPackageMonitor(Runnable r) { + final long token = mContext.injectClearCallingIdentity(); + r.run(); + mContext.injectRestoreCallingIdentity(token); + } } private class LauncherAppsTestable extends LauncherApps { @@ -289,6 +357,7 @@ public class ShortcutManagerTest extends AndroidTestCase { private static final String LAUNCHER_2 = "com.android.launcher.2"; private static final int LAUNCHER_UID_2 = 10012; + private static final int USER_0 = UserHandle.USER_SYSTEM; private static final int USER_10 = 10; private static final int USER_11 = 11; @@ -326,7 +395,7 @@ public class ShortcutManagerTest extends AndroidTestCase { mInjectedPackageUidMap.put(LAUNCHER_1, LAUNCHER_UID_1); mInjectedPackageUidMap.put(LAUNCHER_2, LAUNCHER_UID_2); - mInjectedFilePathRoot = new File(getContext().getCacheDir(), "test-files"); + mInjectedFilePathRoot = new File(getTestContext().getCacheDir(), "test-files"); // Empty the data directory. if (mInjectedFilePathRoot.exists()) { @@ -339,6 +408,10 @@ public class ShortcutManagerTest extends AndroidTestCase { setCaller(CALLING_PACKAGE_1); } + private Context getTestContext() { + return getInstrumentation().getContext(); + } + /** (Re-) init the manager and the service. */ private void initService() { LocalServices.removeServiceForTest(ShortcutServiceInternal.class); @@ -442,6 +515,10 @@ public class ShortcutManagerTest extends AndroidTestCase { + "/" + ShortcutService.FILENAME_USER_PACKAGES); } + private void waitOnMainThread() throws Throwable { + runTestOnUiThread(() -> {}); + } + private static Bundle makeBundle(Object... keysAndValues) { Preconditions.checkState((keysAndValues.length % 2) == 0); @@ -879,9 +956,9 @@ public class ShortcutManagerTest extends AndroidTestCase { } public void testSetDynamicShortcuts() { - final Icon icon1 = Icon.createWithResource(mContext, R.drawable.icon1); + final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( - mContext.getResources(), R.drawable.icon2)); + getTestContext().getResources(), R.drawable.icon2)); final ShortcutInfo si1 = makeShortcut( "shortcut1", @@ -1163,16 +1240,16 @@ public class ShortcutManagerTest extends AndroidTestCase { } public void testIcons() { - final Icon res32x32 = Icon.createWithResource(mContext, R.drawable.black_32x32); - final Icon res64x64 = Icon.createWithResource(mContext, R.drawable.black_64x64); - final Icon res512x512 = Icon.createWithResource(mContext, R.drawable.black_512x512); + final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32); + final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64); + final Icon res512x512 = Icon.createWithResource(getTestContext(), R.drawable.black_512x512); final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource( - mContext.getResources(), R.drawable.black_32x32)); + getTestContext().getResources(), R.drawable.black_32x32)); final Icon bmp64x64 = Icon.createWithBitmap(BitmapFactory.decodeResource( - mContext.getResources(), R.drawable.black_64x64)); + getTestContext().getResources(), R.drawable.black_64x64)); final Icon bmp512x512 = Icon.createWithBitmap(BitmapFactory.decodeResource( - mContext.getResources(), R.drawable.black_512x512)); + getTestContext().getResources(), R.drawable.black_512x512)); // Set from package 1 setCaller(CALLING_PACKAGE_1); @@ -1278,7 +1355,7 @@ public class ShortcutManagerTest extends AndroidTestCase { private void checkShrinkBitmap(int expectedWidth, int expectedHeight, int resId, int maxSize) { assertBitmapSize(expectedWidth, expectedHeight, ShortcutService.shrinkBitmap(BitmapFactory.decodeResource( - mContext.getResources(), resId), + getTestContext().getResources(), resId), maxSize)); } @@ -1433,7 +1510,7 @@ public class ShortcutManagerTest extends AndroidTestCase { runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { ShortcutInfo s2 = makeShortcutBuilder() .setId("s2") - .setIcon(Icon.createWithResource(mContext, R.drawable.black_32x32)) + .setIcon(Icon.createWithResource(getTestContext(), R.drawable.black_32x32)) .build(); ShortcutInfo s4 = makeShortcutBuilder() @@ -1802,6 +1879,125 @@ public class ShortcutManagerTest extends AndroidTestCase { // TODO Check extra, etc } + public void testLauncherCallback() throws Throwable { + LauncherApps.Callback c0 = mock(LauncherApps.Callback.class); + + + // Set listeners + + runWithCaller(LAUNCHER_1, USER_0, () -> { + mLauncherApps.registerCallback(c0, new Handler(Looper.getMainLooper())); + }); + + runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { + assertTrue(mManager.setDynamicShortcuts(Arrays.asList( + makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3")))); + }); + + waitOnMainThread(); + ArgumentCaptor<List> shortcuts = ArgumentCaptor.forClass(List.class); + verify(c0).onShortcutsChanged( + eq(CALLING_PACKAGE_1), + shortcuts.capture(), + eq(UserHandle.of(USER_0)) + ); + assertShortcutIds(assertAllDynamic(shortcuts.getValue()), + "s1", "s2", "s3"); + + // From different package. + reset(c0); + runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> { + assertTrue(mManager.setDynamicShortcuts(Arrays.asList( + makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3")))); + }); + waitOnMainThread(); + shortcuts = ArgumentCaptor.forClass(List.class); + verify(c0).onShortcutsChanged( + eq(CALLING_PACKAGE_2), + shortcuts.capture(), + eq(UserHandle.of(USER_0)) + ); + assertShortcutIds(assertAllDynamic(shortcuts.getValue()), + "s1", "s2", "s3"); + + // Different user, callback shouldn't be called. + reset(c0); + runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { + assertTrue(mManager.setDynamicShortcuts(Arrays.asList( + makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3")))); + }); + waitOnMainThread(); + verify(c0, times(0)).onShortcutsChanged( + anyString(), + any(List.class), + any(UserHandle.class) + ); + + // Test for addDynamicShortcut. + reset(c0); + runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { + assertTrue(mManager.addDynamicShortcut(makeShortcut("s4"))); + }); + + waitOnMainThread(); + shortcuts = ArgumentCaptor.forClass(List.class); + verify(c0).onShortcutsChanged( + eq(CALLING_PACKAGE_1), + shortcuts.capture(), + eq(UserHandle.of(USER_0)) + ); + assertShortcutIds(assertAllDynamic(shortcuts.getValue()), + "s1", "s2", "s3", "s4"); + + // Test for remove + reset(c0); + runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { + mManager.deleteDynamicShortcut("s1"); + }); + + waitOnMainThread(); + shortcuts = ArgumentCaptor.forClass(List.class); + verify(c0).onShortcutsChanged( + eq(CALLING_PACKAGE_1), + shortcuts.capture(), + eq(UserHandle.of(USER_0)) + ); + assertShortcutIds(assertAllDynamic(shortcuts.getValue()), + "s2", "s3", "s4"); + + // Test for update + reset(c0); + runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { + assertTrue(mManager.updateShortcuts(Arrays.asList( + makeShortcut("s1"), makeShortcut("s2")))); + }); + + waitOnMainThread(); + shortcuts = ArgumentCaptor.forClass(List.class); + verify(c0).onShortcutsChanged( + eq(CALLING_PACKAGE_1), + shortcuts.capture(), + eq(UserHandle.of(USER_0)) + ); + assertShortcutIds(assertAllDynamic(shortcuts.getValue()), + "s2", "s3", "s4"); + + // Test for deleteAll + reset(c0); + runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { + mManager.deleteAllDynamicShortcuts(); + }); + + waitOnMainThread(); + shortcuts = ArgumentCaptor.forClass(List.class); + verify(c0).onShortcutsChanged( + eq(CALLING_PACKAGE_1), + shortcuts.capture(), + eq(UserHandle.of(USER_0)) + ); + assertEquals(0, shortcuts.getValue().size()); + } + // === Test for persisting === public void testSaveAndLoadUser_empty() { @@ -1823,9 +2019,9 @@ public class ShortcutManagerTest extends AndroidTestCase { public void testSaveAndLoadUser() { // First, create some shortcuts and save. runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { - final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_64x16); + final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( - mContext.getResources(), R.drawable.icon2)); + getTestContext().getResources(), R.drawable.icon2)); final ShortcutInfo si1 = makeShortcut( "s1", @@ -1850,9 +2046,9 @@ public class ShortcutManagerTest extends AndroidTestCase { assertEquals(2, mManager.getRemainingCallCount()); }); runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> { - final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_16x64); + final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_16x64); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( - mContext.getResources(), R.drawable.icon2)); + getTestContext().getResources(), R.drawable.icon2)); final ShortcutInfo si1 = makeShortcut( "s1", @@ -1877,9 +2073,9 @@ public class ShortcutManagerTest extends AndroidTestCase { assertEquals(2, mManager.getRemainingCallCount()); }); runWithCaller(CALLING_PACKAGE_1, USER_10, () -> { - final Icon icon1 = Icon.createWithResource(mContext, R.drawable.black_64x64); + final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64); final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource( - mContext.getResources(), R.drawable.icon2)); + getTestContext().getResources(), R.drawable.icon2)); final ShortcutInfo si1 = makeShortcut( "s1", diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 10808da8785e..afb7d9394679 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -95,6 +95,19 @@ public final class Call { public static final int STATE_DISCONNECTING = 10; /** + * The state of an external call which is in the process of being pulled from a remote device to + * the local device. + * <p> + * A call can only be in this state if the {@link Details#PROPERTY_IS_EXTERNAL_CALL} property + * and {@link Details#CAPABILITY_CAN_PULL_CALL} capability are set on the call. + * <p> + * An {@link InCallService} will only see this state if it has the + * {@link TelecomManager#METADATA_INCLUDE_EXTERNAL_CALLS} metadata set to {@code true} in its + * manifest. + */ + public static final int STATE_PULLING_CALL = 11; + + /** * The key to retrieve the optional {@code PhoneAccount}s Telecom can bundle with its Call * extras. Used to pass the phone accounts to display on the front end to the user in order to * select phone accounts to (for example) place a call. @@ -226,8 +239,23 @@ public final class Call { */ public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 0x00400000; + /** + * When set for an external call, indicates that this {@code Call} can be pulled from a + * remote device to the current device. + * <p> + * Should only be set on a {@code Call} where {@link #PROPERTY_IS_EXTERNAL_CALL} is set. + * <p> + * An {@link InCallService} will only see calls with this capability if it has the + * {@link TelecomManager#METADATA_INCLUDE_EXTERNAL_CALLS} metadata set to {@code true} + * in its manifest. + * <p> + * See {@link Connection#CAPABILITY_CAN_PULL_CALL} and + * {@link Connection#CAPABILITY_IS_EXTERNAL_CALL}. + */ + public static final int CAPABILITY_CAN_PULL_CALL = 0x00800000; + //****************************************************************************************** - // Next CAPABILITY value: 0x00800000 + // Next CAPABILITY value: 0x01000000 //****************************************************************************************** /** @@ -261,8 +289,25 @@ public final class Call { */ public static final int PROPERTY_WORK_CALL = 0x00000020; + /** + * When set, indicates that this {@code Call} does not actually exist locally for the + * {@link ConnectionService}. + * <p> + * Consider, for example, a scenario where a user has two phones with the same phone number. + * When a user places a call on one device, the telephony stack can represent that call on + * the other device by adding it to the {@link ConnectionService} with the + * {@link Connection#CAPABILITY_IS_EXTERNAL_CALL} capability set. + * <p> + * An {@link InCallService} will only see calls with this property if it has the + * {@link TelecomManager#METADATA_INCLUDE_EXTERNAL_CALLS} metadata set to {@code true} + * in its manifest. + * <p> + * See {@link Connection#CAPABILITY_IS_EXTERNAL_CALL}. + */ + public static final int PROPERTY_IS_EXTERNAL_CALL = 0x00000040; + //****************************************************************************************** - // Next PROPERTY value: 0x00000040 + // Next PROPERTY value: 0x00000100 //****************************************************************************************** private final String mTelecomCallId; @@ -362,6 +407,9 @@ public final class Call { if (can(capabilities, CAPABILITY_CAN_PAUSE_VIDEO)) { builder.append(" CAPABILITY_CAN_PAUSE_VIDEO"); } + if (can(capabilities, CAPABILITY_CAN_PULL_CALL)) { + builder.append(" CAPABILITY_CAN_PULL_CALL"); + } builder.append("]"); return builder.toString(); } @@ -411,6 +459,9 @@ public final class Call { if (hasProperty(properties, PROPERTY_EMERGENCY_CALLBACK_MODE)) { builder.append(" PROPERTY_EMERGENCY_CALLBACK_MODE"); } + if (hasProperty(properties, PROPERTY_IS_EXTERNAL_CALL)) { + builder.append(" PROPERTY_IS_EXTERNAL_CALL"); + } builder.append("]"); return builder.toString(); } @@ -723,6 +774,17 @@ public final class Call { * conferenced. */ public void onConferenceableCallsChanged(Call call, List<Call> conferenceableCalls) {} + + /** + * Invoked when a call receives an event from its associated {@link Connection}. + * <p> + * See {@link Connection#sendConnectionEvent(String, Bundle)}. + * + * @param call The {@code Call} receiving the event. + * @param event The event. + * @param extras Extras associated with the connection event. + */ + public void onConnectionEvent(Call call, String event, Bundle extras) {} } /** @@ -889,6 +951,43 @@ public final class Call { } /** + * Initiates a request to the {@link ConnectionService} to pull an external call to the local + * device. + * <p> + * Calls to this method are ignored if the call does not have the + * {@link Call.Details#PROPERTY_IS_EXTERNAL_CALL} property set. + * <p> + * An {@link InCallService} will only see calls which support this method if it has the + * {@link TelecomManager#METADATA_INCLUDE_EXTERNAL_CALLS} metadata set to {@code true} + * in its manifest. + */ + public void pullExternalCall() { + // If this isn't an external call, ignore the request. + if (!mDetails.hasProperty(Details.PROPERTY_IS_EXTERNAL_CALL)) { + return; + } + + mInCallAdapter.pullExternalCall(mTelecomCallId); + } + + /** + * Sends a {@code Call} event from this {@code Call} to the associated {@link Connection} in + * the {@link ConnectionService}. + * <p> + * Events are exposed to {@link ConnectionService} implementations via + * {@link android.telecom.Connection#onCallEvent(String, Bundle)}. + * <p> + * No assumptions should be made as to how a {@link ConnectionService} will handle these events. + * Events should be fully qualified (e.g., com.example.event.MY_EVENT) to avoid conflicts. + * + * @param event The connection event. + * @param extras Bundle containing extra information associated with the event. + */ + public void sendCallEvent(String event, Bundle extras) { + mInCallAdapter.sendCallEvent(mTelecomCallId, event, extras); + } + + /** * Obtains the parent of this {@code Call} in a conference, if any. * * @return The parent {@code Call}, or {@code null} if this {@code Call} is not a @@ -1211,6 +1310,11 @@ public final class Call { } } + /** {@hide} */ + final void internalOnConnectionEvent(String event, Bundle extras) { + fireOnConnectionEvent(event, extras); + } + private void fireStateChanged(final int newState) { for (CallbackRecord<Callback> record : mCallbackRecords) { final Call call = this; @@ -1358,6 +1462,27 @@ public final class Call { } /** + * Notifies listeners of an incoming connection event. + * <p> + * Connection events are issued via {@link Connection#sendConnectionEvent(String, Bundle)}. + * + * @param event + * @param extras + */ + private void fireOnConnectionEvent(final String event, final Bundle extras) { + for (CallbackRecord<Callback> record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(new Runnable() { + @Override + public void run() { + callback.onConnectionEvent(call, event, extras); + } + }); + } + } + + /** * Determines if two bundles are equal. * * @param bundle The original bundle. diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 4547c6a6c153..51a65882b802 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -93,6 +93,15 @@ public abstract class Connection extends Conferenceable { public static final int STATE_DISCONNECTED = 6; /** + * The state of an external connection which is in the process of being pulled from a remote + * device to the local device. + * <p> + * A connection can only be in this state if the {@link #CAPABILITY_IS_EXTERNAL_CALL} and + * {@link #CAPABILITY_CAN_PULL_CALL} capability bits are set on the connection. + */ + public static final int STATE_PULLING_CALL = 7; + + /** * Connection can currently be put on hold or unheld. This is distinct from * {@link #CAPABILITY_SUPPORT_HOLD} in that although a connection may support 'hold' most times, * it does not at the moment support the function. This can be true while the call is in the @@ -251,7 +260,6 @@ public abstract class Connection extends Conferenceable { /** * Indicates that the connection itself wants to handle any sort of reply response, rather than * relying on SMS. - * @hide */ public static final int CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION = 0x00400000; @@ -270,8 +278,33 @@ public abstract class Connection extends Conferenceable { */ public static final int CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO = 0x00800000; + /** + * When set, indicates that the {@code Connection} does not actually exist locally for the + * {@link ConnectionService}. + * <p> + * Consider, for example, a scenario where a user has two devices with the same phone number. + * When a user places a call on one devices, the telephony stack can represent that call on the + * other device by adding is to the {@link ConnectionService} with the + * {@code CAPABILITY_IS_EXTERNAL_CALL} capability set. + * <p> + * An {@link ConnectionService} should not assume that all {@link InCallService}s will handle + * external connections. Only those {@link InCallService}s which have the + * {@link TelecomManager#METADATA_INCLUDE_EXTERNAL_CALLS} metadata set to {@code true} in its + * manifest will see external connections. + */ + public static final int CAPABILITY_IS_EXTERNAL_CALL = 0x01000000; + + /** + * When set for an external connection, indicates that this {@code Connection} can be pulled + * from a remote device to the current device. + * <p> + * Should only be set on a {@code Connection} where {@link #CAPABILITY_IS_EXTERNAL_CALL} + * is set. + */ + public static final int CAPABILITY_CAN_PULL_CALL = 0x02000000; + //********************************************************************************************** - // Next CAPABILITY value: 0x01000000 + // Next CAPABILITY value: 0x04000000 //********************************************************************************************** /** @@ -315,6 +348,18 @@ public abstract class Connection extends Conferenceable { public static final String EVENT_ON_HOLD_TONE_END = "android.telecom.event.ON_HOLD_TONE_END"; + /** + * Connection event used to inform {@link InCallService}s when pulling of an external call has + * failed. The user interface should inform the user of the error. + * <p> + * Expected to be used by the {@link ConnectionService} when the {@link Call#pullExternalCall()} + * API is called on a {@link Call} with the properties + * {@link Call.Details#PROPERTY_IS_EXTERNAL_CALL} and + * {@link Call.Details#CAPABILITY_CAN_PULL_CALL}, but the {@link ConnectionService} could not + * pull the external call due to an error condition. + */ + public static final String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED"; + // Flag controlling whether PII is emitted into the logs private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG); @@ -434,6 +479,12 @@ public abstract class Connection extends Conferenceable { if (can(capabilities, CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION)) { builder.append(" CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION"); } + if (can(capabilities, CAPABILITY_IS_EXTERNAL_CALL)) { + builder.append(" CAPABILITY_IS_EXTERNAL_CALL"); + } + if (can(capabilities, CAPABILITY_CAN_PULL_CALL)) { + builder.append(" CAPABILITY_CAN_PULL_CALL"); + } builder.append("]"); return builder.toString(); @@ -465,8 +516,7 @@ public abstract class Connection extends Conferenceable { public void onConferenceStarted() {} public void onConferenceMergeFailed(Connection c) {} public void onExtrasChanged(Connection c, Bundle extras) {} - /** @hide */ - public void onConnectionEvent(Connection c, String event) {} + public void onConnectionEvent(Connection c, String event, Bundle extras) {} } /** @@ -1836,9 +1886,8 @@ public abstract class Connection extends Conferenceable { public void onReject() {} /** - * Notifies ths Connection of a request reject with a message. - * - * @hide + * Notifies this Connection, which is in {@link #STATE_RINGING}, of + * a request to reject with a message. */ public void onReject(String replyMessage) {} @@ -1854,6 +1903,31 @@ public abstract class Connection extends Conferenceable { */ public void onPostDialContinue(boolean proceed) {} + /** + * Notifies this Connection of a request to pull an external call to the local device. + * <p> + * The {@link InCallService} issues a request to pull an external call to the local device via + * {@link Call#pullExternalCall()}. + * <p> + * For a Connection to be pulled, both the {@link Connection#CAPABILITY_CAN_PULL_CALL} and + * {@link Connection#CAPABILITY_IS_EXTERNAL_CALL} capability bits must be set. + * <p> + * For more information on external calls, see {@link Connection#CAPABILITY_IS_EXTERNAL_CALL}. + */ + public void onPullExternalCall() {} + + /** + * Notifies this Connection of a {@link Call} event initiated from an {@link InCallService}. + * <p> + * The {@link InCallService} issues a Call event via {@link Call#sendCallEvent(String, Bundle)}. + * <p> + * See also {@link Call#sendCallEvent(String, Bundle)}. + * + * @param event The call event. + * @param extras Extras associated with the call event. + */ + public void onCallEvent(String event, Bundle extras) {} + static String toLogSafePhoneNumber(String number) { // For unknown number, log empty string. if (number == null) { @@ -2008,14 +2082,20 @@ public abstract class Connection extends Conferenceable { } /** - * Sends a connection event to Telecom. + * Sends an event associated with this {@code Connection}, with associated event extras. + * + * Events are exposed to {@link InCallService} implementations via the + * {@link Call.Callback#onConnectionEvent(Call, String, Bundle)} API. + * + * No assumptions should be made as to how an In-Call UI or service will handle these events. + * Events should be fully qualified (e.g., com.example.event.MY_EVENT) to avoid conflicts. * * @param event The connection event. - * @hide + * @param extras Bundle containing extra information associated with the event. */ - protected void sendConnectionEvent(String event) { + public void sendConnectionEvent(String event, Bundle extras) { for (Listener l : mListeners) { - l.onConnectionEvent(this, event); + l.onConnectionEvent(this, event, null); } } } diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 5b62e03350b1..d18b31725aaa 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -103,6 +103,8 @@ public abstract class ConnectionService extends Service { private static final int MSG_SWAP_CONFERENCE = 19; private static final int MSG_REJECT_WITH_MESSAGE = 20; private static final int MSG_SILENCE = 21; + private static final int MSG_PULL_EXTERNAL_CALL = 22; + private static final int MSG_SEND_CALL_EVENT = 23; private static Connection sNullConnection; @@ -245,6 +247,20 @@ public abstract class ConnectionService extends Service { args.argi1 = proceed ? 1 : 0; mHandler.obtainMessage(MSG_ON_POST_DIAL_CONTINUE, args).sendToTarget(); } + + @Override + public void pullExternalCall(String callId) { + mHandler.obtainMessage(MSG_PULL_EXTERNAL_CALL, callId).sendToTarget(); + } + + @Override + public void sendCallEvent(String callId, String event, Bundle extras) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = callId; + args.arg2 = event; + args.arg3 = extras; + mHandler.obtainMessage(MSG_SEND_CALL_EVENT, args).sendToTarget(); + } }; private final Handler mHandler = new Handler(Looper.getMainLooper()) { @@ -382,6 +398,22 @@ public abstract class ConnectionService extends Service { } break; } + case MSG_PULL_EXTERNAL_CALL: { + pullExternalCall((String) msg.obj); + break; + } + case MSG_SEND_CALL_EVENT: { + SomeArgs args = (SomeArgs) msg.obj; + try { + String callId = (String) args.arg1; + String event = (String) args.arg2; + Bundle extras = (Bundle) args.arg3; + sendCallEvent(callId, event, extras); + } finally { + args.recycle(); + } + break; + } default: break; } @@ -615,10 +647,10 @@ public abstract class ConnectionService extends Service { } @Override - public void onConnectionEvent(Connection connection, String event) { + public void onConnectionEvent(Connection connection, String event, Bundle extras) { String id = mIdByConnection.get(connection); if (id != null) { - mAdapter.onConnectionEvent(id, event); + mAdapter.onConnectionEvent(id, event, extras); } } }; @@ -864,6 +896,39 @@ public abstract class ConnectionService extends Service { } } + /** + * Notifies a {@link Connection} of a request to pull an external call. + * + * See {@link Call#pullExternalCall()}. + * + * @param callId The ID of the call to pull. + */ + private void pullExternalCall(String callId) { + Log.d(this, "pullExternalCall(%s)", callId); + Connection connection = findConnectionForAction(callId, "pullExternalCall"); + if (connection != null) { + connection.onPullExternalCall(); + } + } + + /** + * Notifies a {@link Connection} of a call event. + * + * See {@link Call#sendCallEvent(String, Bundle)}. + * + * @param callId The ID of the call receiving the event. + * @param event The event. + * @param extras Extras associated with the event. + */ + private void sendCallEvent(String callId, String event, Bundle extras) { + Log.d(this, "sendCallEvent(%s, %s)", callId, event); + Connection connection = findConnectionForAction(callId, "sendCallEvent"); + if (connection != null) { + connection.onCallEvent(event, extras); + } + + } + private void onPostDialContinue(String callId, boolean proceed) { Log.d(this, "onPostDialContinue(%s)", callId); findConnectionForAction(callId, "stopDtmfTone").onPostDialContinue(proceed); diff --git a/telecomm/java/android/telecom/ConnectionServiceAdapter.java b/telecomm/java/android/telecom/ConnectionServiceAdapter.java index 30fc5ad1e4b6..e91128f1f7bc 100644 --- a/telecomm/java/android/telecom/ConnectionServiceAdapter.java +++ b/telecomm/java/android/telecom/ConnectionServiceAdapter.java @@ -418,12 +418,13 @@ final class ConnectionServiceAdapter implements DeathRecipient { * * @param callId The unique ID of the call. * @param event The event. + * @param extras Extras associated with the event. */ - void onConnectionEvent(String callId, String event) { + void onConnectionEvent(String callId, String event, Bundle extras) { Log.v(this, "onConnectionEvent: %s", event); for (IConnectionServiceAdapter adapter : mAdapters) { try { - adapter.onConnectionEvent(callId, event); + adapter.onConnectionEvent(callId, event, extras); } catch (RemoteException ignored) { } } diff --git a/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java b/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java index 6a8c1cb281ba..4b15e541d0dc 100644 --- a/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java +++ b/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java @@ -245,7 +245,8 @@ final class ConnectionServiceAdapterServant { case MSG_ON_CONNECTION_EVENT: { SomeArgs args = (SomeArgs) msg.obj; try { - mDelegate.onConnectionEvent((String) args.arg1, (String) args.arg2); + mDelegate.onConnectionEvent((String) args.arg1, (String) args.arg2, + (Bundle) args.arg3); } finally { args.recycle(); } @@ -432,10 +433,11 @@ final class ConnectionServiceAdapterServant { } @Override - public final void onConnectionEvent(String connectionId, String event) { + public final void onConnectionEvent(String connectionId, String event, Bundle extras) { SomeArgs args = SomeArgs.obtain(); args.arg1 = connectionId; args.arg2 = event; + args.arg3 = extras; mHandler.obtainMessage(MSG_ON_CONNECTION_EVENT, args).sendToTarget(); } }; diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java index 2eef7eeb6bd8..cf73d4f1453e 100644 --- a/telecomm/java/android/telecom/DisconnectCause.java +++ b/telecomm/java/android/telecom/DisconnectCause.java @@ -64,6 +64,17 @@ public final class DisconnectCause implements Parcelable { */ public static final int CONNECTION_MANAGER_NOT_SUPPORTED = 10; + /** + * Disconnected because the user did not locally answer the incoming call, but it was answered + * on another device where the call was ringing. + */ + public static final int ANSWERED_ELSEWHERE = 11; + + /** + * Disconnected because the call was pulled from the current device to another device. + */ + public static final int CALL_PULLED = 12; + private int mDisconnectCode; private CharSequence mDisconnectLabel; private CharSequence mDisconnectDescription; diff --git a/telecomm/java/android/telecom/InCallAdapter.java b/telecomm/java/android/telecom/InCallAdapter.java index 0cf7212ba55b..52ef4a705e05 100644 --- a/telecomm/java/android/telecom/InCallAdapter.java +++ b/telecomm/java/android/telecom/InCallAdapter.java @@ -16,6 +16,7 @@ package android.telecom; +import android.os.Bundle; import android.os.RemoteException; import com.android.internal.telecom.IInCallAdapter; @@ -251,6 +252,32 @@ public final class InCallAdapter { } /** + * Instructs Telecom to pull an external call to the local device. + * + * @param callId The callId to pull. + */ + public void pullExternalCall(String callId) { + try { + mAdapter.pullExternalCall(callId); + } catch (RemoteException ignored) { + } + } + + /** + * Intructs Telecom to send a call event. + * + * @param callId The callId to send the event for. + * @param event The event. + * @param extras Extras associated with the event. + */ + public void sendCallEvent(String callId, String event, Bundle extras) { + try { + mAdapter.sendCallEvent(callId, event, extras); + } catch (RemoteException ignored) { + } + } + + /** * Instructs Telecom to turn the proximity sensor on. */ public void turnProximitySensorOn() { diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java index 671399b6f842..df6715d41a3f 100644 --- a/telecomm/java/android/telecom/InCallService.java +++ b/telecomm/java/android/telecom/InCallService.java @@ -22,6 +22,7 @@ import android.app.Service; import android.content.Intent; import android.hardware.camera2.CameraManager; import android.net.Uri; +import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -74,6 +75,7 @@ public abstract class InCallService extends Service { private static final int MSG_BRING_TO_FOREGROUND = 6; private static final int MSG_ON_CAN_ADD_CALL_CHANGED = 7; private static final int MSG_SILENCE_RINGER = 8; + private static final int MSG_ON_CONNECTION_EVENT = 9; /** Default Handler used to consolidate binder method calls onto a single thread. */ private final Handler mHandler = new Handler(Looper.getMainLooper()) { @@ -118,6 +120,18 @@ public abstract class InCallService extends Service { case MSG_SILENCE_RINGER: mPhone.internalSilenceRinger(); break; + case MSG_ON_CONNECTION_EVENT: { + SomeArgs args = (SomeArgs) msg.obj; + try { + String callId = (String) args.arg1; + String event = (String) args.arg2; + Bundle extras = (Bundle) args.arg3; + mPhone.internalOnConnectionEvent(callId, event, extras); + } finally { + args.recycle(); + } + break; + } default: break; } @@ -174,6 +188,15 @@ public abstract class InCallService extends Service { public void silenceRinger() { mHandler.obtainMessage(MSG_SILENCE_RINGER).sendToTarget(); } + + @Override + public void onConnectionEvent(String callId, String event, Bundle extras) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = callId; + args.arg2 = event; + args.arg3 = extras; + mHandler.obtainMessage(MSG_ON_CONNECTION_EVENT, args).sendToTarget(); + } } private Phone.Listener mPhoneListener = new Phone.Listener() { @@ -426,6 +449,19 @@ public abstract class InCallService extends Service { } /** + * Called when a {@link Call} has received a connection event issued by the + * {@link ConnectionService}. + * <p> + * See {@link Connection#sendConnectionEvent(String, Bundle)}. + * + * @param call The call the event is associated with. + * @param event The event. + * @param extras Any associated extras. + */ + public void onConnectionEvent(Call call, String event, Bundle extras) { + } + + /** * Used to issue commands to the {@link Connection.VideoProvider} associated with a * {@link Call}. */ diff --git a/telecomm/java/android/telecom/Phone.java b/telecomm/java/android/telecom/Phone.java index d45938cb9b85..a4ef5601e551 100644 --- a/telecomm/java/android/telecom/Phone.java +++ b/telecomm/java/android/telecom/Phone.java @@ -17,6 +17,7 @@ package android.telecom; import android.annotation.SystemApi; +import android.os.Bundle; import android.util.ArrayMap; import java.util.Collections; @@ -190,6 +191,13 @@ public final class Phone { fireSilenceRinger(); } + final void internalOnConnectionEvent(String telecomId, String event, Bundle extras) { + Call call = mCallByTelecomCallId.get(telecomId); + if (call != null) { + call.internalOnConnectionEvent(event, extras); + } + } + /** * Called to destroy the phone and cleanup any lingering calls. */ diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java index 01858080d7d7..5b602eb49dca 100644 --- a/telecomm/java/android/telecom/RemoteConnection.java +++ b/telecomm/java/android/telecom/RemoteConnection.java @@ -212,12 +212,14 @@ public final class RemoteConnection { /** * Handles a connection event propagated to this {@link RemoteConnection}. + * <p> + * Connection events originate from {@link Connection#sendConnectionEvent(String, Bundle)}. * * @param connection The {@code RemoteConnection} invoking this method. * @param event The connection event. - * @hide + * @param extras Extras associated with the event. */ - public void onConnectionEvent(RemoteConnection connection, String event) {} + public void onConnectionEvent(RemoteConnection connection, String event, Bundle extras) {} } /** @@ -962,6 +964,20 @@ public final class RemoteConnection { } /** + * Instructs this {@link RemoteConnection} to pull itself to the local device. + * <p> + * See {@link Call#pullExternalCall()} for more information. + */ + public void pullExternalCall() { + try { + if (mConnected) { + mConnectionService.pullExternalCall(mConnectionId); + } + } catch (RemoteException ignored) { + } + } + + /** * Set the audio state of this {@code RemoteConnection}. * * @param state The audio state of this {@code RemoteConnection}. @@ -1301,14 +1317,14 @@ public final class RemoteConnection { } /** @hide */ - void onConnectionEvent(final String event) { + void onConnectionEvent(final String event, final Bundle extras) { for (CallbackRecord record : mCallbackRecords) { final RemoteConnection connection = this; final Callback callback = record.getCallback(); record.getHandler().post(new Runnable() { @Override public void run() { - callback.onConnectionEvent(connection, event); + callback.onConnectionEvent(connection, event, extras); } }); } diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java index b85382feae60..fa7183acc350 100644 --- a/telecomm/java/android/telecom/RemoteConnectionService.java +++ b/telecomm/java/android/telecom/RemoteConnectionService.java @@ -332,9 +332,10 @@ final class RemoteConnectionService { } @Override - public void onConnectionEvent(String callId, String event) { + public void onConnectionEvent(String callId, String event, Bundle extras) { if (mConnectionById.containsKey(callId)) { - findConnectionForAction(callId, "onConnectionEvent").onConnectionEvent(event); + findConnectionForAction(callId, "onConnectionEvent").onConnectionEvent(event, + extras); } } }; diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 8afb4556b97d..4fa8fe96a6a9 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -317,6 +317,18 @@ public class TelecomManager { "android.telecom.IN_CALL_SERVICE_RINGING"; /** + * A boolean meta-data value indicating whether an {@link InCallService} wants to be informed of + * calls which have the {@link Call.Details#PROPERTY_IS_EXTERNAL_CALL} property. An external + * call is one which a {@link ConnectionService} knows about, but is not connected to directly. + * Dialer implementations (see {@link #getDefaultDialerPackage()}) which would like to be + * informed of external calls should set this meta-data to {@code true} in the manifest + * registration of their {@link InCallService}. By default, the {@link InCallService} will NOT + * be informed of external calls. + */ + public static final String METADATA_INCLUDE_EXTERNAL_CALLS = + "android.telecom.INCLUDE_EXTERNAL_CALLS"; + + /** * The dual tone multi-frequency signaling character sent to indicate the dialing system should * pause for a predefined period. */ diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl index 8a54addcf06e..3ee0e9f94443 100644 --- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl +++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl @@ -75,4 +75,8 @@ oneway interface IConnectionService { void swapConference(String conferenceCallId); void onPostDialContinue(String callId, boolean proceed); + + void pullExternalCall(String callId); + + void sendCallEvent(String callId, String event, in Bundle extras); } diff --git a/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl b/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl index 569c24469368..dff1b1138741 100644 --- a/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl +++ b/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl @@ -87,5 +87,5 @@ oneway interface IConnectionServiceAdapter { void setExtras(String callId, in Bundle extras); - void onConnectionEvent(String callId, String event); + void onConnectionEvent(String callId, String event, in Bundle extras); } diff --git a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl index 863fff29d560..0678fe2c0aa4 100644 --- a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl +++ b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl @@ -16,6 +16,7 @@ package com.android.internal.telecom; +import android.os.Bundle; import android.telecom.PhoneAccountHandle; /** @@ -60,4 +61,8 @@ oneway interface IInCallAdapter { void turnOnProximitySensor(); void turnOffProximitySensor(boolean screenOnImmediately); + + void pullExternalCall(String callId); + + void sendCallEvent(String callId, String event, in Bundle extras); } diff --git a/telecomm/java/com/android/internal/telecom/IInCallService.aidl b/telecomm/java/com/android/internal/telecom/IInCallService.aidl index 0088e0cf6b64..3e43fe22cdfb 100644 --- a/telecomm/java/com/android/internal/telecom/IInCallService.aidl +++ b/telecomm/java/com/android/internal/telecom/IInCallService.aidl @@ -17,6 +17,7 @@ package com.android.internal.telecom; import android.app.PendingIntent; +import android.os.Bundle; import android.telecom.CallAudioState; import android.telecom.ParcelableCall; @@ -47,4 +48,6 @@ oneway interface IInCallService { void onCanAddCallChanged(boolean canAddCall); void silenceRinger(); + + void onConnectionEvent(String callId, String event, in Bundle extras); } diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index 62f91f761683..7f413480a3e4 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -492,8 +492,7 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void keyguardGoingAway(boolean disableWindowAnimations, - boolean keyguardGoingToNotificationShade) throws RemoteException { + public void keyguardGoingAway(int flags) throws RemoteException { } @Override diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index 13abaff8cdfe..87fc7fa367d2 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -1,5 +1,6 @@ package android.net.wifi; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.content.Context; import android.os.Bundle; @@ -14,6 +15,7 @@ import android.os.RemoteException; import android.util.Log; import android.util.SparseArray; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; @@ -275,12 +277,13 @@ public class RttManager { /** Implement the Parcelable interface {@hide} */ public static final Creator<RttCapabilities> CREATOR = new Creator<RttCapabilities>() { - public RttCapabilities createFromParcel(Parcel in) { + @Override + public RttCapabilities createFromParcel(Parcel in) { RttCapabilities capabilities = new RttCapabilities(); - capabilities.oneSidedRttSupported = in.readInt() == 1 ? true : false; - capabilities.twoSided11McRttSupported = in.readInt() == 1 ? true : false; - capabilities.lciSupported = in.readInt() == 1 ? true : false; - capabilities.lcrSupported = in.readInt() == 1 ? true : false; + capabilities.oneSidedRttSupported = (in.readInt() == 1); + capabilities.twoSided11McRttSupported = (in.readInt() == 1); + capabilities.lciSupported = (in.readInt() == 1); + capabilities.lcrSupported = (in.readInt() == 1); capabilities.preambleSupported = in.readInt(); capabilities.bwSupported = in.readInt(); capabilities.responderSupported = (in.readInt() == 1); @@ -464,58 +467,57 @@ public class RttManager { /** pseudo-private class used to parcel arguments */ public static class ParcelableRttParams implements Parcelable { + @NonNull public RttParams mParams[]; - ParcelableRttParams(RttParams[] params) { - mParams = params; + /** + * @hide + */ + @VisibleForTesting + public ParcelableRttParams(RttParams[] params) { + mParams = (params == null ? new RttParams[0] : params); } /** Implement the Parcelable interface {@hide} */ + @Override public int describeContents() { return 0; } /** Implement the Parcelable interface {@hide} */ + @Override public void writeToParcel(Parcel dest, int flags) { - if (mParams != null) { - dest.writeInt(mParams.length); - - for (RttParams params : mParams) { - dest.writeInt(params.deviceType); - dest.writeInt(params.requestType); - dest.writeByte(params.secure ? (byte) 1 : 0); - dest.writeString(params.bssid); - dest.writeInt(params.channelWidth); - dest.writeInt(params.frequency); - dest.writeInt(params.centerFreq0); - dest.writeInt(params.centerFreq1); - dest.writeInt(params.numberBurst); - dest.writeInt(params.interval); - dest.writeInt(params.numSamplesPerBurst); - dest.writeInt(params.numRetriesPerMeasurementFrame); - dest.writeInt(params.numRetriesPerFTMR); - dest.writeInt(params.LCIRequest ? 1 : 0); - dest.writeInt(params.LCRRequest ? 1 : 0); - dest.writeInt(params.burstTimeout); - dest.writeInt(params.preamble); - dest.writeInt(params.bandwidth); - } - } else { - dest.writeInt(0); + dest.writeInt(mParams.length); + + for (RttParams params : mParams) { + dest.writeInt(params.deviceType); + dest.writeInt(params.requestType); + dest.writeByte(params.secure ? (byte) 1 : 0); + dest.writeString(params.bssid); + dest.writeInt(params.channelWidth); + dest.writeInt(params.frequency); + dest.writeInt(params.centerFreq0); + dest.writeInt(params.centerFreq1); + dest.writeInt(params.numberBurst); + dest.writeInt(params.interval); + dest.writeInt(params.numSamplesPerBurst); + dest.writeInt(params.numRetriesPerMeasurementFrame); + dest.writeInt(params.numRetriesPerFTMR); + dest.writeInt(params.LCIRequest ? 1 : 0); + dest.writeInt(params.LCRRequest ? 1 : 0); + dest.writeInt(params.burstTimeout); + dest.writeInt(params.preamble); + dest.writeInt(params.bandwidth); } } /** Implement the Parcelable interface {@hide} */ public static final Creator<ParcelableRttParams> CREATOR = new Creator<ParcelableRttParams>() { + @Override public ParcelableRttParams createFromParcel(Parcel in) { int num = in.readInt(); - - if (num == 0) { - return new ParcelableRttParams(null); - } - RttParams params[] = new RttParams[num]; for (int i = 0; i < num; i++) { params[i] = new RttParams(); @@ -532,8 +534,8 @@ public class RttManager { params[i].numSamplesPerBurst = in.readInt(); params[i].numRetriesPerMeasurementFrame = in.readInt(); params[i].numRetriesPerFTMR = in.readInt(); - params[i].LCIRequest = in.readInt() == 1 ? true : false; - params[i].LCRRequest = in.readInt() == 1 ? true : false; + params[i].LCIRequest = (in.readInt() == 1); + params[i].LCRRequest = (in.readInt() == 1); params[i].burstTimeout = in.readInt(); params[i].preamble = in.readInt(); params[i].bandwidth = in.readInt(); @@ -543,6 +545,7 @@ public class RttManager { return parcelableParams; } + @Override public ParcelableRttParams[] newArray(int size) { return new ParcelableRttParams[size]; } @@ -715,11 +718,13 @@ public class RttManager { } /** Implement the Parcelable interface {@hide} */ + @Override public int describeContents() { return 0; } /** Implement the Parcelable interface {@hide} */ + @Override public void writeToParcel(Parcel dest, int flags) { if (mResults != null) { dest.writeInt(mResults.length); @@ -764,6 +769,7 @@ public class RttManager { /** Implement the Parcelable interface {@hide} */ public static final Creator<ParcelableRttResults> CREATOR = new Creator<ParcelableRttResults>() { + @Override public ParcelableRttResults createFromParcel(Parcel in) { int num = in.readInt(); @@ -816,6 +822,7 @@ public class RttManager { return parcelableResults; } + @Override public ParcelableRttResults[] newArray(int size) { return new ParcelableRttResults[size]; } |