diff options
406 files changed, 8345 insertions, 5273 deletions
diff --git a/api/current.txt b/api/current.txt index eb8befa286c5..1d891a6cae26 100644 --- a/api/current.txt +++ b/api/current.txt @@ -198,7 +198,6 @@ package android { public static final class R.attr { ctor public R.attr(); - field public static final int abiOverride = 16844054; // 0x1010516 field public static final int absListViewStyle = 16842858; // 0x101006a field public static final int accessibilityEventTypes = 16843648; // 0x1010380 field public static final int accessibilityFeedbackType = 16843650; // 0x1010382 @@ -1365,6 +1364,7 @@ package android { field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344 field public static final int unselectedAlpha = 16843278; // 0x101020e field public static final int updatePeriodMillis = 16843344; // 0x1010250 + field public static final int use32bitAbi = 16844054; // 0x1010516 field public static final int useDefaultMargins = 16843641; // 0x1010379 field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310 field public static final int useLevel = 16843167; // 0x101019f @@ -5225,6 +5225,7 @@ package android.app { public class NotificationManager { method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); @@ -5232,6 +5233,7 @@ package android.app { method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); + method public int getImportance(java.lang.String); method public android.app.NotificationManager.Policy getNotificationPolicy(); method public boolean isNotificationPolicyAccessGranted(); method public void notify(int, android.app.Notification); @@ -22998,7 +23000,7 @@ package android.media.tv { method public void notifyRecordingStopped(android.net.Uri); method public abstract void onConnect(android.net.Uri); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -23044,7 +23046,7 @@ package android.media.tv { ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler); method public void connect(java.lang.String, android.net.Uri); method public void disconnect(); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } @@ -34045,6 +34047,7 @@ package android.security.keystore { public final class KeyGenParameterSpec implements java.security.spec.AlgorithmParameterSpec { method public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec(); + method public byte[] getAttestationChallenge(); method public java.lang.String[] getBlockModes(); method public java.util.Date getCertificateNotAfter(); method public java.util.Date getCertificateNotBefore(); @@ -34069,6 +34072,7 @@ package android.security.keystore { ctor public KeyGenParameterSpec.Builder(java.lang.String, int); method public android.security.keystore.KeyGenParameterSpec build(); method public android.security.keystore.KeyGenParameterSpec.Builder setAlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec); + method public android.security.keystore.KeyGenParameterSpec.Builder setAttestationChallenge(byte[]); method public android.security.keystore.KeyGenParameterSpec.Builder setBlockModes(java.lang.String...); method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotAfter(java.util.Date); method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotBefore(java.util.Date); @@ -40661,6 +40665,21 @@ package android.view { method public static android.view.FocusFinder getInstance(); } + public final class FrameMetrics { + ctor public FrameMetrics(android.view.FrameMetrics); + method public long getMetric(int); + field public static final int ANIMATION_DURATION = 2; // 0x2 + field public static final int COMMAND_ISSUE_DURATION = 6; // 0x6 + field public static final int DRAW_DURATION = 4; // 0x4 + field public static final int FIRST_DRAW_FRAME = 9; // 0x9 + field public static final int INPUT_HANDLING_DURATION = 1; // 0x1 + field public static final int LAYOUT_MEASURE_DURATION = 3; // 0x3 + field public static final int SWAP_BUFFERS_DURATION = 7; // 0x7 + field public static final int SYNC_DURATION = 5; // 0x5 + field public static final int TOTAL_DURATION = 8; // 0x8 + field public static final int UNKNOWN_DELAY_DURATION = 0; // 0x0 + } + public abstract class FrameStats { ctor public FrameStats(); method public final long getEndTimeNano(); @@ -43164,6 +43183,7 @@ package android.view { ctor public Window(android.content.Context); method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams); method public void addFlags(int); + method public final void addFrameMetricsListener(android.view.Window.FrameMetricsListener, android.os.Handler); method public void clearFlags(int); method public abstract void closeAllPanels(); method public abstract void closePanel(int); @@ -43215,6 +43235,7 @@ package android.view { method public abstract boolean performContextMenuIdentifierAction(int, int); method public abstract boolean performPanelIdentifierAction(int, int, int); method public abstract boolean performPanelShortcut(int, int, android.view.KeyEvent, int); + method public final void removeFrameMetricsListener(android.view.Window.FrameMetricsListener); method public boolean requestFeature(int); method public abstract void restoreHierarchyState(android.os.Bundle); method public abstract android.os.Bundle saveHierarchyState(); @@ -43340,6 +43361,10 @@ package android.view { method public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int); } + public static abstract interface Window.FrameMetricsListener { + method public abstract void onMetricsAvailable(android.view.Window, android.view.FrameMetrics, int); + } + public static abstract interface Window.OnRestrictedCaptionAreaChangedListener { method public abstract void onRestrictedCaptionAreaChanged(android.graphics.Rect); } @@ -58016,8 +58041,11 @@ package java.util { method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); + method public static boolean isNull(java.lang.Object); + method public static boolean nonNull(java.lang.Object); method public static T requireNonNull(T); method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -59722,6 +59750,217 @@ package java.util.concurrent.locks { } +package java.util.function { + + public abstract interface BiConsumer { + method public abstract void accept(T, U); + method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); + } + + public abstract interface BiFunction { + method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T, U); + } + + public abstract interface BiPredicate { + method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); + method public default java.util.function.BiPredicate<T, U> negate(); + method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); + method public abstract boolean test(T, U); + } + + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + } + + public abstract interface BooleanSupplier { + method public abstract boolean getAsBoolean(); + } + + public abstract interface Consumer { + method public abstract void accept(T); + method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); + } + + public abstract interface DoubleBinaryOperator { + method public abstract double applyAsDouble(double, double); + } + + public abstract interface DoubleConsumer { + method public abstract void accept(double); + method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); + } + + public abstract interface DoubleFunction { + method public abstract R apply(double); + } + + public abstract interface DoublePredicate { + method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate); + method public default java.util.function.DoublePredicate negate(); + method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate); + method public abstract boolean test(double); + } + + public abstract interface DoubleSupplier { + method public abstract double getAsDouble(); + } + + public abstract interface DoubleToIntFunction { + method public abstract int applyAsInt(double); + } + + public abstract interface DoubleToLongFunction { + method public abstract long applyAsLong(double); + } + + public abstract interface DoubleUnaryOperator { + method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator); + method public abstract double applyAsDouble(double); + method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator); + method public static java.util.function.DoubleUnaryOperator identity(); + } + + public abstract interface Function { + method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T); + method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static java.util.function.Function<T, T> identity(); + } + + public abstract interface IntBinaryOperator { + method public abstract int applyAsInt(int, int); + } + + public abstract interface IntConsumer { + method public abstract void accept(int); + method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); + } + + public abstract interface IntFunction { + method public abstract R apply(int); + } + + public abstract interface IntPredicate { + method public default java.util.function.IntPredicate and(java.util.function.IntPredicate); + method public default java.util.function.IntPredicate negate(); + method public default java.util.function.IntPredicate or(java.util.function.IntPredicate); + method public abstract boolean test(int); + } + + public abstract interface IntSupplier { + method public abstract int getAsInt(); + } + + public abstract interface IntToDoubleFunction { + method public abstract double applyAsDouble(int); + } + + public abstract interface IntToLongFunction { + method public abstract long applyAsLong(int); + } + + public abstract interface IntUnaryOperator { + method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator); + method public abstract int applyAsInt(int); + method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator); + method public static java.util.function.IntUnaryOperator identity(); + } + + public abstract interface LongBinaryOperator { + method public abstract long applyAsLong(long, long); + } + + public abstract interface LongConsumer { + method public abstract void accept(long); + method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); + } + + public abstract interface LongFunction { + method public abstract R apply(long); + } + + public abstract interface LongPredicate { + method public default java.util.function.LongPredicate and(java.util.function.LongPredicate); + method public default java.util.function.LongPredicate negate(); + method public default java.util.function.LongPredicate or(java.util.function.LongPredicate); + method public abstract boolean test(long); + } + + public abstract interface LongSupplier { + method public abstract long getAsLong(); + } + + public abstract interface LongToDoubleFunction { + method public abstract double applyAsDouble(long); + } + + public abstract interface LongToIntFunction { + method public abstract int applyAsInt(long); + } + + public abstract interface LongUnaryOperator { + method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator); + method public abstract long applyAsLong(long); + method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator); + method public static java.util.function.LongUnaryOperator identity(); + } + + public abstract interface ObjDoubleConsumer { + method public abstract void accept(T, double); + } + + public abstract interface ObjIntConsumer { + method public abstract void accept(T, int); + } + + public abstract interface ObjLongConsumer { + method public abstract void accept(T, long); + } + + public abstract interface Predicate { + method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); + method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public default java.util.function.Predicate<T> negate(); + method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); + method public abstract boolean test(T); + } + + public abstract interface Supplier { + method public abstract T get(); + } + + public abstract interface ToDoubleBiFunction { + method public abstract double applyAsDouble(T, U); + } + + public abstract interface ToDoubleFunction { + method public abstract double applyAsDouble(T); + } + + public abstract interface ToIntBiFunction { + method public abstract int applyAsInt(T, U); + } + + public abstract interface ToIntFunction { + method public abstract int applyAsInt(T); + } + + public abstract interface ToLongBiFunction { + method public abstract long applyAsLong(T, U); + } + + public abstract interface ToLongFunction { + method public abstract long applyAsLong(T); + } + + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator<T> identity(); + } + +} + package java.util.jar { public class Attributes implements java.lang.Cloneable java.util.Map { diff --git a/api/system-current.txt b/api/system-current.txt index 287df85c7ca4..1ab5837c367e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -293,7 +293,6 @@ package android { public static final class R.attr { ctor public R.attr(); - field public static final int abiOverride = 16844054; // 0x1010516 field public static final int absListViewStyle = 16842858; // 0x101006a field public static final int accessibilityEventTypes = 16843648; // 0x1010380 field public static final int accessibilityFeedbackType = 16843650; // 0x1010382 @@ -1464,6 +1463,7 @@ package android { field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344 field public static final int unselectedAlpha = 16843278; // 0x101020e field public static final int updatePeriodMillis = 16843344; // 0x1010250 + field public static final int use32bitAbi = 16844054; // 0x1010516 field public static final int useDefaultMargins = 16843641; // 0x1010379 field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310 field public static final int useLevel = 16843167; // 0x101019f @@ -5357,6 +5357,7 @@ package android.app { public class NotificationManager { method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); @@ -5364,6 +5365,7 @@ package android.app { method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); + method public int getImportance(java.lang.String); method public android.app.NotificationManager.Policy getNotificationPolicy(); method public boolean isNotificationPolicyAccessGranted(); method public void notify(int, android.app.Notification); @@ -24750,7 +24752,7 @@ package android.media.tv { method public abstract void onConnect(android.net.Uri); method public void onConnect(android.net.Uri, android.os.Bundle); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -24802,7 +24804,7 @@ package android.media.tv { method public void connect(java.lang.String, android.net.Uri, android.os.Bundle); method public void disconnect(); method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } @@ -36528,6 +36530,7 @@ package android.security.keystore { public final class KeyGenParameterSpec implements java.security.spec.AlgorithmParameterSpec { method public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec(); + method public byte[] getAttestationChallenge(); method public java.lang.String[] getBlockModes(); method public java.util.Date getCertificateNotAfter(); method public java.util.Date getCertificateNotBefore(); @@ -36552,6 +36555,7 @@ package android.security.keystore { ctor public KeyGenParameterSpec.Builder(java.lang.String, int); method public android.security.keystore.KeyGenParameterSpec build(); method public android.security.keystore.KeyGenParameterSpec.Builder setAlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec); + method public android.security.keystore.KeyGenParameterSpec.Builder setAttestationChallenge(byte[]); method public android.security.keystore.KeyGenParameterSpec.Builder setBlockModes(java.lang.String...); method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotAfter(java.util.Date); method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotBefore(java.util.Date); @@ -43413,6 +43417,21 @@ package android.view { method public static android.view.FocusFinder getInstance(); } + public final class FrameMetrics { + ctor public FrameMetrics(android.view.FrameMetrics); + method public long getMetric(int); + field public static final int ANIMATION_DURATION = 2; // 0x2 + field public static final int COMMAND_ISSUE_DURATION = 6; // 0x6 + field public static final int DRAW_DURATION = 4; // 0x4 + field public static final int FIRST_DRAW_FRAME = 9; // 0x9 + field public static final int INPUT_HANDLING_DURATION = 1; // 0x1 + field public static final int LAYOUT_MEASURE_DURATION = 3; // 0x3 + field public static final int SWAP_BUFFERS_DURATION = 7; // 0x7 + field public static final int SYNC_DURATION = 5; // 0x5 + field public static final int TOTAL_DURATION = 8; // 0x8 + field public static final int UNKNOWN_DELAY_DURATION = 0; // 0x0 + } + public abstract class FrameStats { ctor public FrameStats(); method public final long getEndTimeNano(); @@ -45916,6 +45935,7 @@ package android.view { ctor public Window(android.content.Context); method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams); method public void addFlags(int); + method public final void addFrameMetricsListener(android.view.Window.FrameMetricsListener, android.os.Handler); method public void clearFlags(int); method public abstract void closeAllPanels(); method public abstract void closePanel(int); @@ -45967,6 +45987,7 @@ package android.view { method public abstract boolean performContextMenuIdentifierAction(int, int); method public abstract boolean performPanelIdentifierAction(int, int, int); method public abstract boolean performPanelShortcut(int, int, android.view.KeyEvent, int); + method public final void removeFrameMetricsListener(android.view.Window.FrameMetricsListener); method public boolean requestFeature(int); method public abstract void restoreHierarchyState(android.os.Bundle); method public abstract android.os.Bundle saveHierarchyState(); @@ -46093,6 +46114,10 @@ package android.view { method public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int); } + public static abstract interface Window.FrameMetricsListener { + method public abstract void onMetricsAvailable(android.view.Window, android.view.FrameMetrics, int); + } + public static abstract interface Window.OnRestrictedCaptionAreaChangedListener { method public abstract void onRestrictedCaptionAreaChanged(android.graphics.Rect); } @@ -61104,8 +61129,11 @@ package java.util { method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); + method public static boolean isNull(java.lang.Object); + method public static boolean nonNull(java.lang.Object); method public static T requireNonNull(T); method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -62810,6 +62838,217 @@ package java.util.concurrent.locks { } +package java.util.function { + + public abstract interface BiConsumer { + method public abstract void accept(T, U); + method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); + } + + public abstract interface BiFunction { + method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T, U); + } + + public abstract interface BiPredicate { + method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); + method public default java.util.function.BiPredicate<T, U> negate(); + method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); + method public abstract boolean test(T, U); + } + + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + } + + public abstract interface BooleanSupplier { + method public abstract boolean getAsBoolean(); + } + + public abstract interface Consumer { + method public abstract void accept(T); + method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); + } + + public abstract interface DoubleBinaryOperator { + method public abstract double applyAsDouble(double, double); + } + + public abstract interface DoubleConsumer { + method public abstract void accept(double); + method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); + } + + public abstract interface DoubleFunction { + method public abstract R apply(double); + } + + public abstract interface DoublePredicate { + method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate); + method public default java.util.function.DoublePredicate negate(); + method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate); + method public abstract boolean test(double); + } + + public abstract interface DoubleSupplier { + method public abstract double getAsDouble(); + } + + public abstract interface DoubleToIntFunction { + method public abstract int applyAsInt(double); + } + + public abstract interface DoubleToLongFunction { + method public abstract long applyAsLong(double); + } + + public abstract interface DoubleUnaryOperator { + method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator); + method public abstract double applyAsDouble(double); + method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator); + method public static java.util.function.DoubleUnaryOperator identity(); + } + + public abstract interface Function { + method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T); + method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static java.util.function.Function<T, T> identity(); + } + + public abstract interface IntBinaryOperator { + method public abstract int applyAsInt(int, int); + } + + public abstract interface IntConsumer { + method public abstract void accept(int); + method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); + } + + public abstract interface IntFunction { + method public abstract R apply(int); + } + + public abstract interface IntPredicate { + method public default java.util.function.IntPredicate and(java.util.function.IntPredicate); + method public default java.util.function.IntPredicate negate(); + method public default java.util.function.IntPredicate or(java.util.function.IntPredicate); + method public abstract boolean test(int); + } + + public abstract interface IntSupplier { + method public abstract int getAsInt(); + } + + public abstract interface IntToDoubleFunction { + method public abstract double applyAsDouble(int); + } + + public abstract interface IntToLongFunction { + method public abstract long applyAsLong(int); + } + + public abstract interface IntUnaryOperator { + method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator); + method public abstract int applyAsInt(int); + method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator); + method public static java.util.function.IntUnaryOperator identity(); + } + + public abstract interface LongBinaryOperator { + method public abstract long applyAsLong(long, long); + } + + public abstract interface LongConsumer { + method public abstract void accept(long); + method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); + } + + public abstract interface LongFunction { + method public abstract R apply(long); + } + + public abstract interface LongPredicate { + method public default java.util.function.LongPredicate and(java.util.function.LongPredicate); + method public default java.util.function.LongPredicate negate(); + method public default java.util.function.LongPredicate or(java.util.function.LongPredicate); + method public abstract boolean test(long); + } + + public abstract interface LongSupplier { + method public abstract long getAsLong(); + } + + public abstract interface LongToDoubleFunction { + method public abstract double applyAsDouble(long); + } + + public abstract interface LongToIntFunction { + method public abstract int applyAsInt(long); + } + + public abstract interface LongUnaryOperator { + method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator); + method public abstract long applyAsLong(long); + method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator); + method public static java.util.function.LongUnaryOperator identity(); + } + + public abstract interface ObjDoubleConsumer { + method public abstract void accept(T, double); + } + + public abstract interface ObjIntConsumer { + method public abstract void accept(T, int); + } + + public abstract interface ObjLongConsumer { + method public abstract void accept(T, long); + } + + public abstract interface Predicate { + method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); + method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public default java.util.function.Predicate<T> negate(); + method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); + method public abstract boolean test(T); + } + + public abstract interface Supplier { + method public abstract T get(); + } + + public abstract interface ToDoubleBiFunction { + method public abstract double applyAsDouble(T, U); + } + + public abstract interface ToDoubleFunction { + method public abstract double applyAsDouble(T); + } + + public abstract interface ToIntBiFunction { + method public abstract int applyAsInt(T, U); + } + + public abstract interface ToIntFunction { + method public abstract int applyAsInt(T); + } + + public abstract interface ToLongBiFunction { + method public abstract long applyAsLong(T, U); + } + + public abstract interface ToLongFunction { + method public abstract long applyAsLong(T); + } + + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator<T> identity(); + } + +} + package java.util.jar { public class Attributes implements java.lang.Cloneable java.util.Map { diff --git a/api/test-current.txt b/api/test-current.txt index e7f4336c0971..49b8ffe3f4bf 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -198,7 +198,6 @@ package android { public static final class R.attr { ctor public R.attr(); - field public static final int abiOverride = 16844054; // 0x1010516 field public static final int absListViewStyle = 16842858; // 0x101006a field public static final int accessibilityEventTypes = 16843648; // 0x1010380 field public static final int accessibilityFeedbackType = 16843650; // 0x1010382 @@ -1365,6 +1364,7 @@ package android { field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344 field public static final int unselectedAlpha = 16843278; // 0x101020e field public static final int updatePeriodMillis = 16843344; // 0x1010250 + field public static final int use32bitAbi = 16844054; // 0x1010516 field public static final int useDefaultMargins = 16843641; // 0x1010379 field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310 field public static final int useLevel = 16843167; // 0x101019f @@ -5225,6 +5225,7 @@ package android.app { public class NotificationManager { method public android.app.AutomaticZenRule addAutomaticZenRule(android.app.AutomaticZenRule); + method public boolean areNotificationsEnabled(); method public void cancel(int); method public void cancel(java.lang.String, int); method public void cancelAll(); @@ -5232,6 +5233,7 @@ package android.app { method public android.app.AutomaticZenRule getAutomaticZenRule(java.lang.String); method public java.util.List<android.app.AutomaticZenRule> getAutomaticZenRules(); method public final int getCurrentInterruptionFilter(); + method public int getImportance(java.lang.String); method public android.app.NotificationManager.Policy getNotificationPolicy(); method public boolean isNotificationPolicyAccessGranted(); method public void notify(int, android.app.Notification); @@ -23007,7 +23009,7 @@ package android.media.tv { method public void notifyRecordingStopped(android.net.Uri); method public abstract void onConnect(android.net.Uri); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -23053,7 +23055,7 @@ package android.media.tv { ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler); method public void connect(java.lang.String, android.net.Uri); method public void disconnect(); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } @@ -34060,6 +34062,7 @@ package android.security.keystore { public final class KeyGenParameterSpec implements java.security.spec.AlgorithmParameterSpec { method public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec(); + method public byte[] getAttestationChallenge(); method public java.lang.String[] getBlockModes(); method public java.util.Date getCertificateNotAfter(); method public java.util.Date getCertificateNotBefore(); @@ -34084,6 +34087,7 @@ package android.security.keystore { ctor public KeyGenParameterSpec.Builder(java.lang.String, int); method public android.security.keystore.KeyGenParameterSpec build(); method public android.security.keystore.KeyGenParameterSpec.Builder setAlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec); + method public android.security.keystore.KeyGenParameterSpec.Builder setAttestationChallenge(byte[]); method public android.security.keystore.KeyGenParameterSpec.Builder setBlockModes(java.lang.String...); method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotAfter(java.util.Date); method public android.security.keystore.KeyGenParameterSpec.Builder setCertificateNotBefore(java.util.Date); @@ -40678,6 +40682,21 @@ package android.view { method public static android.view.FocusFinder getInstance(); } + public final class FrameMetrics { + ctor public FrameMetrics(android.view.FrameMetrics); + method public long getMetric(int); + field public static final int ANIMATION_DURATION = 2; // 0x2 + field public static final int COMMAND_ISSUE_DURATION = 6; // 0x6 + field public static final int DRAW_DURATION = 4; // 0x4 + field public static final int FIRST_DRAW_FRAME = 9; // 0x9 + field public static final int INPUT_HANDLING_DURATION = 1; // 0x1 + field public static final int LAYOUT_MEASURE_DURATION = 3; // 0x3 + field public static final int SWAP_BUFFERS_DURATION = 7; // 0x7 + field public static final int SYNC_DURATION = 5; // 0x5 + field public static final int TOTAL_DURATION = 8; // 0x8 + field public static final int UNKNOWN_DELAY_DURATION = 0; // 0x0 + } + public abstract class FrameStats { ctor public FrameStats(); method public final long getEndTimeNano(); @@ -43181,6 +43200,7 @@ package android.view { ctor public Window(android.content.Context); method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams); method public void addFlags(int); + method public final void addFrameMetricsListener(android.view.Window.FrameMetricsListener, android.os.Handler); method public void clearFlags(int); method public abstract void closeAllPanels(); method public abstract void closePanel(int); @@ -43232,6 +43252,7 @@ package android.view { method public abstract boolean performContextMenuIdentifierAction(int, int); method public abstract boolean performPanelIdentifierAction(int, int, int); method public abstract boolean performPanelShortcut(int, int, android.view.KeyEvent, int); + method public final void removeFrameMetricsListener(android.view.Window.FrameMetricsListener); method public boolean requestFeature(int); method public abstract void restoreHierarchyState(android.os.Bundle); method public abstract android.os.Bundle saveHierarchyState(); @@ -43357,6 +43378,10 @@ package android.view { method public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback, int); } + public static abstract interface Window.FrameMetricsListener { + method public abstract void onMetricsAvailable(android.view.Window, android.view.FrameMetrics, int); + } + public static abstract interface Window.OnRestrictedCaptionAreaChangedListener { method public abstract void onRestrictedCaptionAreaChanged(android.graphics.Rect); } @@ -58033,8 +58058,11 @@ package java.util { method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); + method public static boolean isNull(java.lang.Object); + method public static boolean nonNull(java.lang.Object); method public static T requireNonNull(T); method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -59739,6 +59767,217 @@ package java.util.concurrent.locks { } +package java.util.function { + + public abstract interface BiConsumer { + method public abstract void accept(T, U); + method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); + } + + public abstract interface BiFunction { + method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T, U); + } + + public abstract interface BiPredicate { + method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); + method public default java.util.function.BiPredicate<T, U> negate(); + method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); + method public abstract boolean test(T, U); + } + + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + } + + public abstract interface BooleanSupplier { + method public abstract boolean getAsBoolean(); + } + + public abstract interface Consumer { + method public abstract void accept(T); + method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); + } + + public abstract interface DoubleBinaryOperator { + method public abstract double applyAsDouble(double, double); + } + + public abstract interface DoubleConsumer { + method public abstract void accept(double); + method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); + } + + public abstract interface DoubleFunction { + method public abstract R apply(double); + } + + public abstract interface DoublePredicate { + method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate); + method public default java.util.function.DoublePredicate negate(); + method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate); + method public abstract boolean test(double); + } + + public abstract interface DoubleSupplier { + method public abstract double getAsDouble(); + } + + public abstract interface DoubleToIntFunction { + method public abstract int applyAsInt(double); + } + + public abstract interface DoubleToLongFunction { + method public abstract long applyAsLong(double); + } + + public abstract interface DoubleUnaryOperator { + method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator); + method public abstract double applyAsDouble(double); + method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator); + method public static java.util.function.DoubleUnaryOperator identity(); + } + + public abstract interface Function { + method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T); + method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static java.util.function.Function<T, T> identity(); + } + + public abstract interface IntBinaryOperator { + method public abstract int applyAsInt(int, int); + } + + public abstract interface IntConsumer { + method public abstract void accept(int); + method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); + } + + public abstract interface IntFunction { + method public abstract R apply(int); + } + + public abstract interface IntPredicate { + method public default java.util.function.IntPredicate and(java.util.function.IntPredicate); + method public default java.util.function.IntPredicate negate(); + method public default java.util.function.IntPredicate or(java.util.function.IntPredicate); + method public abstract boolean test(int); + } + + public abstract interface IntSupplier { + method public abstract int getAsInt(); + } + + public abstract interface IntToDoubleFunction { + method public abstract double applyAsDouble(int); + } + + public abstract interface IntToLongFunction { + method public abstract long applyAsLong(int); + } + + public abstract interface IntUnaryOperator { + method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator); + method public abstract int applyAsInt(int); + method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator); + method public static java.util.function.IntUnaryOperator identity(); + } + + public abstract interface LongBinaryOperator { + method public abstract long applyAsLong(long, long); + } + + public abstract interface LongConsumer { + method public abstract void accept(long); + method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); + } + + public abstract interface LongFunction { + method public abstract R apply(long); + } + + public abstract interface LongPredicate { + method public default java.util.function.LongPredicate and(java.util.function.LongPredicate); + method public default java.util.function.LongPredicate negate(); + method public default java.util.function.LongPredicate or(java.util.function.LongPredicate); + method public abstract boolean test(long); + } + + public abstract interface LongSupplier { + method public abstract long getAsLong(); + } + + public abstract interface LongToDoubleFunction { + method public abstract double applyAsDouble(long); + } + + public abstract interface LongToIntFunction { + method public abstract int applyAsInt(long); + } + + public abstract interface LongUnaryOperator { + method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator); + method public abstract long applyAsLong(long); + method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator); + method public static java.util.function.LongUnaryOperator identity(); + } + + public abstract interface ObjDoubleConsumer { + method public abstract void accept(T, double); + } + + public abstract interface ObjIntConsumer { + method public abstract void accept(T, int); + } + + public abstract interface ObjLongConsumer { + method public abstract void accept(T, long); + } + + public abstract interface Predicate { + method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); + method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public default java.util.function.Predicate<T> negate(); + method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); + method public abstract boolean test(T); + } + + public abstract interface Supplier { + method public abstract T get(); + } + + public abstract interface ToDoubleBiFunction { + method public abstract double applyAsDouble(T, U); + } + + public abstract interface ToDoubleFunction { + method public abstract double applyAsDouble(T); + } + + public abstract interface ToIntBiFunction { + method public abstract int applyAsInt(T, U); + } + + public abstract interface ToIntFunction { + method public abstract int applyAsInt(T); + } + + public abstract interface ToLongBiFunction { + method public abstract long applyAsLong(T, U); + } + + public abstract interface ToLongFunction { + method public abstract long applyAsLong(T); + } + + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator<T> identity(); + } + +} + package java.util.jar { public class Attributes implements java.lang.Cloneable java.util.Map { diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 1954774e1177..99852b8db5e7 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2882,6 +2882,11 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeInt(isForeground ? 1 : 0); return true; } + case NOTIFY_PINNED_STACK_ANIMATION_ENDED_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + reply.writeNoException(); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -6732,5 +6737,15 @@ class ActivityManagerProxy implements IActivityManager return isForeground; }; + @Override + public void notifyPinnedStackAnimationEnded() throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + mRemote.transact(NOTIFY_PINNED_STACK_ANIMATION_ENDED_TRANSACTION, data, reply, 0); + data.recycle(); + reply.recycle(); + }; + private IBinder mRemote; } diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index c071162ca5b9..df4b7d1eb50d 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -429,6 +429,16 @@ public class ApplicationPackageManager extends PackageManager { } } + /** @hide */ + @Override + public @Nullable String getServicesSystemSharedLibraryPackageName() { + try { + return mPM.getServicesSystemSharedLibraryPackageName(); + } catch (RemoteException e) { + throw new RuntimeException("Package manager has died", e); + } + } + @Override public FeatureInfo[] getSystemAvailableFeatures() { try { diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index b5ca6ee5a343..98ce2734bc88 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -597,6 +597,8 @@ public interface IActivityManager extends IInterface { public boolean supportsLocalVoiceInteraction() throws RemoteException; + public void notifyPinnedStackAnimationEnded() throws RemoteException; + /* * Private non-Binder interfaces */ @@ -972,4 +974,5 @@ public interface IActivityManager extends IInterface { int START_LOCAL_VOICE_INTERACTION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 363; int STOP_LOCAL_VOICE_INTERACTION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 364; int SUPPORTS_LOCAL_VOICE_INTERACTION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 365; + int NOTIFY_PINNED_STACK_ANIMATION_ENDED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 366; } diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 40e58af57204..0d35cf04b4a6 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -46,6 +46,7 @@ interface INotificationManager void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled); boolean areNotificationsEnabledForPackage(String pkg, int uid); + boolean areNotificationsEnabled(String pkg); ParceledListSlice getTopics(String pkg, int uid); void setVisibilityOverride(String pkg, int uid, in Notification.Topic topic, int visibility); @@ -54,6 +55,7 @@ interface INotificationManager int getPriority(String pkg, int uid, in Notification.Topic topic); void setImportance(String pkg, int uid, in Notification.Topic topic, int importance); int getImportance(String pkg, int uid, in Notification.Topic topic); + int getTopicImportance(String pkg, String topicId); boolean doesAppUseTopics(String pkg, int uid); boolean hasBannedTopics(String pkg, int uid); diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index fa1123423e35..643255822cb9 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -30,4 +30,9 @@ oneway interface ITaskStackListener { * brought to the front or a new Intent is delivered to it. */ void onPinnedActivityRestartAttempt(); + + /** + * Called whenever the pinned stack is done animating a resize. + */ + void onPinnedStackAnimationEnded(); } diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index 9a88f2c67697..33fd1dbda63d 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -1842,13 +1842,10 @@ public class Instrumentation { * @see UiAutomation */ public UiAutomation getUiAutomation() { - if (mUiAutomationConnection != null) { - if (mUiAutomation == null) { - return getUiAutomation(0); - } - return mUiAutomation; + if ((mUiAutomation == null) || (mUiAutomation.isDestroyed())) { + return getUiAutomation(0); } - return null; + return mUiAutomation; } /** diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index da52c1e5ba1d..87173532ae51 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -447,7 +447,8 @@ public final class LoadedApk { IPackageManager pm = ActivityThread.getPackageManager(); android.content.pm.PackageInfo pi; try { - pi = pm.getPackageInfo(mPackageName, 0, UserHandle.myUserId()); + pi = pm.getPackageInfo(mPackageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.myUserId()); } catch (RemoteException e) { throw new IllegalStateException("Unable to get package info for " + mPackageName + "; is system dying?", e); diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index a83225d961b0..1f17024b1193 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -16,6 +16,8 @@ package android.app; +import com.android.internal.util.Preconditions; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; @@ -37,6 +39,7 @@ import android.os.StrictMode; import android.os.UserHandle; import android.provider.Settings.Global; import android.service.notification.IConditionListener; +import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; import android.util.ArraySet; @@ -503,6 +506,25 @@ public class NotificationManager return false; } + public int getImportance(String topicId) { + Preconditions.checkNotNull(topicId); + INotificationManager service = getService(); + try { + return service.getTopicImportance(mContext.getPackageName(), topicId); + } catch (RemoteException e) { + } + return NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED; + } + + public boolean areNotificationsEnabled() { + INotificationManager service = getService(); + try { + return service.areNotificationsEnabled(mContext.getPackageName()); + } catch (RemoteException e) { + } + return false; + } + /** * Checks the ability to read/modify notification policy for the calling package. * diff --git a/core/java/android/app/SearchableInfo.java b/core/java/android/app/SearchableInfo.java index c7d2140d042d..a95291514936 100644 --- a/core/java/android/app/SearchableInfo.java +++ b/core/java/android/app/SearchableInfo.java @@ -363,7 +363,8 @@ public final class SearchableInfo implements Parcelable { String suggestProviderPackage = null; if (mSuggestAuthority != null) { PackageManager pm = activityContext.getPackageManager(); - ProviderInfo pi = pm.resolveContentProvider(mSuggestAuthority, 0); + ProviderInfo pi = pm.resolveContentProvider(mSuggestAuthority, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING); if (pi != null) { suggestProviderPackage = pi.packageName; } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 02eb115175fd..83f9357d2909 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2570,6 +2570,11 @@ 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> + * <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. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param installerPackage The package name of the certificate installer which will be given @@ -3650,6 +3655,9 @@ public class DevicePolicyManager { * <p> * This permission is persistent until it is later cleared by calling this method with a * {@code null} value or uninstalling the managing package. + * <p> + * The supplied application restriction managing 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 packageName The package name which will be given access to application restrictions diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 593fe2aef1e1..386385790e49 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -534,4 +534,6 @@ interface IPackageManager { boolean isEphemeralApplication(String packageName, int userId); boolean setRequiredForSystemUser(String packageName, boolean systemUserApp); + + String getServicesSystemSharedLibraryPackageName(); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 08deedb9fb65..bf0d4ded17a9 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2327,6 +2327,28 @@ public abstract class PackageManager { public static final int MASK_PERMISSION_FLAGS = 0xFF; /** + * This is a library that contains components apps can invoke. For + * example, a services for apps to bind to, or standard chooser UI, + * etc. This library is versioned and backwards compatible. Clients + * should check its version via {@link android.ext.services.Version + * #getVersionCode()} and avoid calling APIs added in later versions. + * + * @hide + */ + public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services"; + + /** + * This is a library that contains components apps can dynamically + * load. For example, new widgets, helper classes, etc. This library + * is versioned and backwards compatible. Clients should check its + * version via {@link android.ext.shared.Version#getVersionCode()} + * and avoid calling APIs added in later versions. + * + * @hide + */ + public static final String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared"; + + /** * Retrieve overall information about an application package that is * installed on the system. * @@ -3365,6 +3387,15 @@ public abstract class PackageManager { public abstract String[] getSystemSharedLibraryNames(); /** + * Get the name of the package hosting the services shared library. + * + * @return The library host package. + * + * @hide + */ + public abstract @Nullable String getServicesSystemSharedLibraryPackageName(); + + /** * Get a list of features that are available on the * system. * diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 72ace1583b4a..5dddebd3cae7 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -337,7 +337,7 @@ public class PackageParser { public final boolean coreApp; public final boolean multiArch; - public final String abiOverride; + public final boolean use32bitAbi; public final boolean extractNativeLibs; public PackageLite(String codePath, ApkLite baseApk, String[] splitNames, @@ -354,7 +354,7 @@ public class PackageParser { this.splitRevisionCodes = splitRevisionCodes; this.coreApp = baseApk.coreApp; this.multiArch = baseApk.multiArch; - this.abiOverride = baseApk.abiOverride; + this.use32bitAbi = baseApk.use32bitAbi; this.extractNativeLibs = baseApk.extractNativeLibs; } @@ -382,12 +382,12 @@ public class PackageParser { public final Signature[] signatures; public final boolean coreApp; public final boolean multiArch; - public final String abiOverride; + public final boolean use32bitAbi; public final boolean extractNativeLibs; public ApkLite(String codePath, String packageName, String splitName, int versionCode, int revisionCode, int installLocation, List<VerifierInfo> verifiers, - Signature[] signatures, boolean coreApp, boolean multiArch, String abiOverride, + Signature[] signatures, boolean coreApp, boolean multiArch, boolean use32bitAbi, boolean extractNativeLibs) { this.codePath = codePath; this.packageName = packageName; @@ -399,7 +399,7 @@ public class PackageParser { this.signatures = signatures; this.coreApp = coreApp; this.multiArch = multiArch; - this.abiOverride = abiOverride; + this.use32bitAbi = use32bitAbi; this.extractNativeLibs = extractNativeLibs; } } @@ -843,8 +843,7 @@ public class PackageParser { } pkg.setCodePath(packageDir.getAbsolutePath()); - pkg.setCpuAbiOverride(lite.abiOverride); - + pkg.setUse32bitAbi(lite.use32bitAbi); return pkg; } finally { IoUtils.closeQuietly(assets); @@ -875,7 +874,7 @@ public class PackageParser { try { final Package pkg = parseBaseApk(apkFile, assets, flags); pkg.setCodePath(apkFile.getAbsolutePath()); - pkg.setCpuAbiOverride(lite.abiOverride); + pkg.setUse32bitAbi(lite.use32bitAbi); return pkg; } finally { IoUtils.closeQuietly(assets); @@ -1380,7 +1379,7 @@ public class PackageParser { int revisionCode = 0; boolean coreApp = false; boolean multiArch = false; - String abiOverride = null; + boolean use32bitAbi = false; boolean extractNativeLibs = true; for (int i = 0; i < attrs.getAttributeCount(); i++) { @@ -1421,8 +1420,8 @@ public class PackageParser { if ("multiArch".equals(attr)) { multiArch = attrs.getAttributeBooleanValue(i, false); } - if ("abiOverride".equals(attr)) { - abiOverride = attrs.getAttributeValue(i); + if ("use32bitAbi".equals(attr)) { + use32bitAbi = attrs.getAttributeBooleanValue(i, false); } if ("extractNativeLibs".equals(attr)) { extractNativeLibs = attrs.getAttributeBooleanValue(i, true); @@ -1433,7 +1432,7 @@ public class PackageParser { return new ApkLite(codePath, packageSplit.first, packageSplit.second, versionCode, revisionCode, installLocation, verifiers, signatures, coreApp, multiArch, - abiOverride, extractNativeLibs); + use32bitAbi, extractNativeLibs); } /** @@ -4740,6 +4739,12 @@ public class PackageParser { * and prods fields out of {@code this.applicationInfo}. */ public String cpuAbiOverride; + /** + * The install time abi override to choose 32bit abi's when multiple abi's + * are present. This is only meaningfull for multiarch applications. + * The use32bitAbi attribute is ignored if cpuAbiOverride is also set. + */ + public boolean use32bitAbi; public Package(String packageName) { this.packageName = packageName; @@ -4872,12 +4877,12 @@ public class PackageParser { } } - public void setCpuAbiOverride(String cpuAbiOverride) { - this.cpuAbiOverride = cpuAbiOverride; + public void setUse32bitAbi(boolean use32bitAbi) { + this.use32bitAbi = use32bitAbi; if (childPackages != null) { final int packageCount = childPackages.size(); for (int i = 0; i < packageCount; i++) { - childPackages.get(i).cpuAbiOverride = cpuAbiOverride; + childPackages.get(i).use32bitAbi = use32bitAbi; } } } diff --git a/core/java/android/security/IKeystoreService.aidl b/core/java/android/security/IKeystoreService.aidl index 7cf1d715e947..8689dce3fef5 100644 --- a/core/java/android/security/IKeystoreService.aidl +++ b/core/java/android/security/IKeystoreService.aidl @@ -19,6 +19,7 @@ package android.security; import android.security.keymaster.ExportResult; import android.security.keymaster.KeyCharacteristics; import android.security.keymaster.KeymasterArguments; +import android.security.keymaster.KeymasterCertificateChain; import android.security.keymaster.KeymasterBlob; import android.security.keymaster.OperationResult; import android.security.KeystoreArguments; @@ -74,4 +75,5 @@ interface IKeystoreService { int addAuthToken(in byte[] authToken); int onUserAdded(int userId, int parentId); int onUserRemoved(int userId); + int attestKey(String alias, in KeymasterArguments params, out KeymasterCertificateChain chain); } diff --git a/core/java/android/security/keymaster/KeymasterCertificateChain.aidl b/core/java/android/security/keymaster/KeymasterCertificateChain.aidl new file mode 100644 index 000000000000..dc1876aaaebd --- /dev/null +++ b/core/java/android/security/keymaster/KeymasterCertificateChain.aidl @@ -0,0 +1,20 @@ +/* + * 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.security.keymaster; + +/* @hide */ +parcelable KeymasterCertificateChain; diff --git a/core/java/android/security/keymaster/KeymasterCertificateChain.java b/core/java/android/security/keymaster/KeymasterCertificateChain.java new file mode 100644 index 000000000000..243b9fe5f7c6 --- /dev/null +++ b/core/java/android/security/keymaster/KeymasterCertificateChain.java @@ -0,0 +1,85 @@ +/* + * 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.security.keymaster; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Utility class for the Java side of keystore-generated certificate chains. + * + * Serialization code for this must be kept in sync with system/security/keystore + * @hide + */ +public class KeymasterCertificateChain implements Parcelable { + + private List<byte[]> mCertificates; + + public static final Parcelable.Creator<KeymasterCertificateChain> CREATOR = new + Parcelable.Creator<KeymasterCertificateChain>() { + public KeymasterCertificateChain createFromParcel(Parcel in) { + return new KeymasterCertificateChain(in); + } + public KeymasterCertificateChain[] newArray(int size) { + return new KeymasterCertificateChain[size]; + } + }; + + public KeymasterCertificateChain() { + mCertificates = null; + } + + public KeymasterCertificateChain(List<byte[]> mCertificates) { + this.mCertificates = mCertificates; + } + + private KeymasterCertificateChain(Parcel in) { + readFromParcel(in); + } + + public List<byte[]> getCertificates() { + return mCertificates; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + if (mCertificates == null) { + out.writeInt(0); + } else { + out.writeInt(mCertificates.size()); + for (byte[] arg : mCertificates) { + out.writeByteArray(arg); + } + } + } + + public void readFromParcel(Parcel in) { + int length = in.readInt(); + mCertificates = new ArrayList<byte[]>(length); + for (int i = 0; i < length; i++) { + mCertificates.add(in.createByteArray()); + } + } + + @Override + public int describeContents() { + return 0; + } +} diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java index 04d59522e40b..e01f2a044ea7 100644 --- a/core/java/android/security/keymaster/KeymasterDefs.java +++ b/core/java/android/security/keymaster/KeymasterDefs.java @@ -58,6 +58,8 @@ public final class KeymasterDefs { public static final int KM_TAG_BLOB_USAGE_REQUIREMENTS = KM_ENUM | 705; public static final int KM_TAG_RSA_PUBLIC_EXPONENT = KM_ULONG | 200; + public static final int KM_TAG_INCLUDE_UNIQUE_ID = KM_BOOL | 202; + public static final int KM_TAG_ACTIVE_DATETIME = KM_DATE | 400; public static final int KM_TAG_ORIGINATION_EXPIRE_DATETIME = KM_DATE | 401; public static final int KM_TAG_USAGE_EXPIRE_DATETIME = KM_DATE | 402; @@ -74,11 +76,12 @@ public final class KeymasterDefs { public static final int KM_TAG_ALL_APPLICATIONS = KM_BOOL | 600; public static final int KM_TAG_APPLICATION_ID = KM_BYTES | 601; - public static final int KM_TAG_APPLICATION_DATA = KM_BYTES | 700; public static final int KM_TAG_CREATION_DATETIME = KM_DATE | 701; public static final int KM_TAG_ORIGIN = KM_ENUM | 702; public static final int KM_TAG_ROLLBACK_RESISTANT = KM_BOOL | 703; public static final int KM_TAG_ROOT_OF_TRUST = KM_BYTES | 704; + public static final int KM_TAG_UNIQUE_ID = KM_BYTES | 707; + public static final int KM_TAG_ATTESTATION_CHALLENGE = KM_BYTES | 708; public static final int KM_TAG_ASSOCIATED_DATA = KM_BYTES | 1000; public static final int KM_TAG_NONCE = KM_BYTES | 1001; diff --git a/core/java/android/view/FrameMetrics.java b/core/java/android/view/FrameMetrics.java new file mode 100644 index 000000000000..8e66f86f421e --- /dev/null +++ b/core/java/android/view/FrameMetrics.java @@ -0,0 +1,281 @@ +/* + * 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.view; + +import android.annotation.IntDef; +import android.view.Window; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Class containing timing data for various milestones in a frame + * lifecycle reported by the rendering subsystem. + * <p> + * Supported metrics can be queried via their corresponding identifier. + * </p> + */ +public final class FrameMetrics { + + /** + * Metric identifier for unknown delay. + * <p> + * Represents the number of nanoseconds elapsed waiting for the + * UI thread to become responsive and process the frame. This + * should be 0 most of the time. + * </p> + */ + public static final int UNKNOWN_DELAY_DURATION = 0; + + /** + * Metric identifier for input handling duration. + * <p> + * Represents the number of nanoseconds elapsed issuing + * input handling callbacks. + * </p> + */ + public static final int INPUT_HANDLING_DURATION = 1; + + /** + * Metric identifier for animation callback duration. + * <p> + * Represents the number of nanoseconds elapsed issuing + * animation callbacks. + * </p> + */ + public static final int ANIMATION_DURATION = 2; + + /** + * Metric identifier for layout/measure duration. + * <p> + * Represents the number of nanoseconds elapsed measuring + * and laying out the invalidated pieces of the view hierarchy. + * </p> + */ + public static final int LAYOUT_MEASURE_DURATION = 3; + /** + * Metric identifier for draw duration. + * <p> + * Represents the number of nanoseconds elapsed computing + * DisplayLists for transformations applied to the view + * hierarchy. + * </p> + */ + public static final int DRAW_DURATION = 4; + + /** + * Metric identifier for sync duration. + * <p> + * Represents the number of nanoseconds elapsed + * synchronizing the computed display lists with the render + * thread. + * </p> + */ + public static final int SYNC_DURATION = 5; + + /** + * Metric identifier for command issue duration. + * <p> + * Represents the number of nanoseconds elapsed + * issuing draw commands to the GPU. + * </p> + */ + public static final int COMMAND_ISSUE_DURATION = 6; + + /** + * Metric identifier for swap buffers duration. + * <p> + * Represents the number of nanoseconds elapsed issuing + * the frame buffer for this frame to the display + * subsystem. + * </p> + */ + public static final int SWAP_BUFFERS_DURATION = 7; + + /** + * Metric identifier for total frame duration. + * <p> + * Represents the total time in nanoseconds this frame took to render + * and be issued to the display subsystem. + * </p> + * <p> + * Equal to the sum of the values of all other time-valued metric + * identifiers. + * </p> + */ + public static final int TOTAL_DURATION = 8; + + /** + * Metric identifier for a boolean value determining whether this frame was + * the first to draw in a new Window layout. + * <p> + * {@link #getMetric(int)} will return 0 for false, 1 for true. + * </p> + * <p> + * First draw frames are expected to be slow and should usually be exempt + * from display jank calculations as they do not cause skips in animations + * and are usually hidden by window animations or other tricks. + * </p> + */ + public static final int FIRST_DRAW_FRAME = 9; + + private static final int FRAME_INFO_FLAG_FIRST_DRAW = 1 << 0; + + /** + * Identifiers for metrics available for each frame. + * + * {@see {@link #getMetric(int)}} + * @hide + */ + @IntDef({ + UNKNOWN_DELAY_DURATION, + INPUT_HANDLING_DURATION, + ANIMATION_DURATION, + LAYOUT_MEASURE_DURATION, + DRAW_DURATION, + SYNC_DURATION, + COMMAND_ISSUE_DURATION, + SWAP_BUFFERS_DURATION, + TOTAL_DURATION, + FIRST_DRAW_FRAME, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface Metric {} + + /** + * Timestamp indices for frame milestones. + * + * May change from release to release. + * + * Must be kept in sync with frameworks/base/libs/hwui/FrameInfo.h. + * + * @hide + */ + @IntDef ({ + Index.FLAGS, + Index.INTENDED_VSYNC, + Index.VSYNC, + Index.OLDEST_INPUT_EVENT, + Index.NEWEST_INPUT_EVENT, + Index.HANDLE_INPUT_START, + Index.ANIMATION_START, + Index.PERFORM_TRAVERSALS_START, + Index.DRAW_START, + Index.SYNC_QUEUED, + Index.SYNC_START, + Index.ISSUE_DRAW_COMMANDS_START, + Index.SWAP_BUFFERS, + Index.FRAME_COMPLETED, + }) + @Retention(RetentionPolicy.SOURCE) + private @interface Index { + int FLAGS = 0; + int INTENDED_VSYNC = 1; + int VSYNC = 2; + int OLDEST_INPUT_EVENT = 3; + int NEWEST_INPUT_EVENT = 4; + int HANDLE_INPUT_START = 5; + int ANIMATION_START = 6; + int PERFORM_TRAVERSALS_START = 7; + int DRAW_START = 8; + int SYNC_QUEUED = 9; + int SYNC_START = 10; + int ISSUE_DRAW_COMMANDS_START = 11; + int SWAP_BUFFERS = 12; + int FRAME_COMPLETED = 13; + + int FRAME_STATS_COUNT = 14; // must always be last + } + + /* + * Bucket endpoints for each Metric defined above. + * + * Each defined metric *must* have a corresponding entry + * in this list. + */ + private static final int[] DURATIONS = new int[] { + // UNKNOWN_DELAY + Index.INTENDED_VSYNC, Index.HANDLE_INPUT_START, + // INPUT_HANDLING + Index.HANDLE_INPUT_START, Index.ANIMATION_START, + // ANIMATION + Index.ANIMATION_START, Index.PERFORM_TRAVERSALS_START, + // LAYOUT_MEASURE + Index.PERFORM_TRAVERSALS_START, Index.DRAW_START, + // DRAW + Index.DRAW_START, Index.SYNC_QUEUED, + // SYNC + Index.SYNC_START, Index.ISSUE_DRAW_COMMANDS_START, + // COMMAND_ISSUE + Index.ISSUE_DRAW_COMMANDS_START, Index.SWAP_BUFFERS, + // SWAP_BUFFERS + Index.SWAP_BUFFERS, Index.FRAME_COMPLETED, + // TOTAL_DURATION + Index.INTENDED_VSYNC, Index.FRAME_COMPLETED, + }; + + /* package */ final long[] mTimingData; + + /** + * Constructs a FrameMetrics object as a copy. + * <p> + * Use this method to copy out metrics reported by + * {@link Window.FrameMetricsListener#onMetricsAvailable(Window, FrameMetrics, int)} + * </p> + * @param other the FrameMetrics object to copy. + */ + public FrameMetrics(FrameMetrics other) { + mTimingData = new long[Index.FRAME_STATS_COUNT]; + System.arraycopy(other.mTimingData, 0, mTimingData, 0, mTimingData.length); + } + + /** + * @hide + */ + FrameMetrics() { + mTimingData = new long[Index.FRAME_STATS_COUNT]; + } + + /** + * Retrieves the value associated with Metric identifier {@code id} + * for this frame. + * <p> + * Boolean metrics are represented in [0,1], with 0 corresponding to + * false, and 1 corresponding to true. + * </p> + * @param id the metric to retrieve + * @return the value of the metric or -1 if it is not available. + */ + public long getMetric(@Metric int id) { + if (id < UNKNOWN_DELAY_DURATION || id > FIRST_DRAW_FRAME) { + return -1; + } + + if (mTimingData == null) { + return -1; + } + + if (id == FIRST_DRAW_FRAME) { + return (mTimingData[Index.FLAGS] & FRAME_INFO_FLAG_FIRST_DRAW) != 0 ? 1 : 0; + } + + int durationsIdx = 2 * id; + return mTimingData[DURATIONS[durationsIdx + 1]] + - mTimingData[DURATIONS[durationsIdx]]; + } +} + diff --git a/core/java/android/view/FrameMetricsObserver.java b/core/java/android/view/FrameMetricsObserver.java new file mode 100644 index 000000000000..f38f8b76a191 --- /dev/null +++ b/core/java/android/view/FrameMetricsObserver.java @@ -0,0 +1,75 @@ +/* + * 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.view; + +import android.annotation.NonNull; +import android.util.Log; +import android.os.Looper; +import android.os.MessageQueue; + +import com.android.internal.util.VirtualRefBasePtr; + +import java.lang.NullPointerException; +import java.lang.ref.WeakReference; +import java.lang.SuppressWarnings; + +/** + * Provides streaming access to frame stats information from the rendering + * subsystem to apps. + * + * @hide + */ +public class FrameMetricsObserver { + private MessageQueue mMessageQueue; + + private WeakReference<Window> mWindow; + + private FrameMetrics mFrameMetrics; + + /* package */ Window.FrameMetricsListener mListener; + /* package */ VirtualRefBasePtr mNative; + + /** + * Creates a FrameMetricsObserver + * + * @param looper the looper to use when invoking callbacks + */ + FrameMetricsObserver(@NonNull Window window, @NonNull Looper looper, + @NonNull Window.FrameMetricsListener listener) { + if (looper == null) { + throw new NullPointerException("looper cannot be null"); + } + + mMessageQueue = looper.getQueue(); + if (mMessageQueue == null) { + throw new IllegalStateException("invalid looper, null message queue\n"); + } + + mFrameMetrics = new FrameMetrics(); + mWindow = new WeakReference<>(window); + mListener = listener; + } + + // Called by native on the provided Handler + @SuppressWarnings("unused") + private void notifyDataAvailable(int dropCount) { + final Window window = mWindow.get(); + if (window != null) { + mListener.onMetricsAvailable(window, mFrameMetrics, dropCount); + } + } +} diff --git a/core/java/android/view/FrameStatsObserver.java b/core/java/android/view/FrameStatsObserver.java deleted file mode 100644 index 0add6072e827..000000000000 --- a/core/java/android/view/FrameStatsObserver.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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.view; - -import android.annotation.NonNull; -import android.util.Log; -import android.os.Looper; -import android.os.MessageQueue; - -import com.android.internal.util.VirtualRefBasePtr; - -import java.lang.NullPointerException; -import java.lang.ref.WeakReference; -import java.lang.SuppressWarnings; - -/** - * Provides streaming access to frame stats information from the rendering - * subsystem to apps. - * - * @hide - */ -public abstract class FrameStatsObserver { - private static final String TAG = "FrameStatsObserver"; - - private MessageQueue mMessageQueue; - private long[] mBuffer; - - private FrameStats mFrameStats; - - /* package */ ThreadedRenderer mRenderer; - /* package */ VirtualRefBasePtr mNative; - - /** - * Containing class for frame statistics reported - * by the rendering subsystem. - */ - public static class FrameStats { - /** - * Precise timing data for various milestones in a frame - * lifecycle. - * - * This data is exactly the same as what is returned by - * `adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats` - * - * The fields reported may change from release to release. - * - * @see {@link http://developer.android.com/training/testing/performance.html} - * for a description of the fields present. - */ - public long[] mTimingData; - } - - /** - * Creates a FrameStatsObserver - * - * @param looper the looper to use when invoking callbacks - */ - public FrameStatsObserver(@NonNull Looper looper) { - if (looper == null) { - throw new NullPointerException("looper cannot be null"); - } - - mMessageQueue = looper.getQueue(); - if (mMessageQueue == null) { - throw new IllegalStateException("invalid looper, null message queue\n"); - } - - mFrameStats = new FrameStats(); - } - - /** - * Called on provided looper when frame stats data is available - * for the previous frame. - * - * Clients of this class must do as little work as possible within - * this callback, as the buffer is shared between the producer and consumer. - * - * If the consumer is still executing within this method when there is new - * data available that data will be dropped. The producer cannot - * wait on the consumer. - * - * @param data the newly available data - */ - public abstract void onDataAvailable(FrameStats data); - - /** - * Returns the number of reports dropped as a result of a slow - * consumer. - */ - public long getDroppedReportCount() { - if (mRenderer == null) { - return 0; - } - - return mRenderer.getDroppedFrameReportCount(); - } - - public boolean isRegistered() { - return mRenderer != null && mNative != null; - } - - // === called by native === // - @SuppressWarnings("unused") - private void notifyDataAvailable() { - mFrameStats.mTimingData = mBuffer; - onDataAvailable(mFrameStats); - } -} diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 8b06ecf3bc8b..ca41d7867feb 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -354,8 +354,6 @@ public final class ThreadedRenderer { private boolean mEnabled; private boolean mRequested = true; - private HashSet<FrameStatsObserver> mFrameStatsObservers; - ThreadedRenderer(Context context, boolean translucent) { final TypedArray a = context.obtainStyledAttributes(null, R.styleable.Lighting, 0, 0); mLightY = a.getDimension(R.styleable.Lighting_lightY, 0); @@ -964,29 +962,14 @@ public final class ThreadedRenderer { } } - void addFrameStatsObserver(FrameStatsObserver fso) { - if (mFrameStatsObservers == null) { - mFrameStatsObservers = new HashSet<>(); - } - - long nativeFso = nAddFrameStatsObserver(mNativeProxy, fso); - fso.mRenderer = this; - fso.mNative = new VirtualRefBasePtr(nativeFso); - mFrameStatsObservers.add(fso); - } - - void removeFrameStatsObserver(FrameStatsObserver fso) { - if (!mFrameStatsObservers.remove(fso)) { - throw new IllegalArgumentException("attempt to remove FrameStatsObserver that was never added"); - } - - nRemoveFrameStatsObserver(mNativeProxy, fso.mNative.get()); - fso.mRenderer = null; - fso.mNative = null; + void addFrameMetricsObserver(FrameMetricsObserver observer) { + long nativeObserver = nAddFrameMetricsObserver(mNativeProxy, observer); + observer.mNative = new VirtualRefBasePtr(nativeObserver); } - long getDroppedFrameReportCount() { - return nGetDroppedFrameReportCount(mNativeProxy); + void removeFrameMetricsObserver(FrameMetricsObserver observer) { + nRemoveFrameMetricsObserver(mNativeProxy, observer.mNative.get()); + observer.mNative = null; } static native void setupShadersDiskCache(String cacheFile); @@ -1044,7 +1027,6 @@ public final class ThreadedRenderer { private static native void nSetContentDrawBounds(long nativeProxy, int left, int top, int right, int bottom); - private static native long nAddFrameStatsObserver(long nativeProxy, FrameStatsObserver fso); - private static native void nRemoveFrameStatsObserver(long nativeProxy, long nativeFso); - private static native long nGetDroppedFrameReportCount(long nativeProxy); + private static native long nAddFrameMetricsObserver(long nativeProxy, FrameMetricsObserver observer); + private static native void nRemoveFrameMetricsObserver(long nativeProxy, long nativeObserver); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f52b29077f27..2612ab2f8eaf 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3703,9 +3703,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private ViewPropertyAnimator mAnimator = null; /** - * List of FrameStatsObservers pending registration when mAttachInfo is null. + * List of registered FrameMetricsObservers. */ - private ArrayList<FrameStatsObserver> mPendingFrameStatsObservers; + private ArrayList<FrameMetricsObserver> mFrameMetricsObservers; /** * Flag indicating that a drag can cross window boundaries. When @@ -5479,19 +5479,29 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * * @hide */ - public void addFrameStatsObserver(FrameStatsObserver fso) { + public void addFrameMetricsListener(Window window, Window.FrameMetricsListener listener, + Handler handler) { if (mAttachInfo != null) { if (mAttachInfo.mHardwareRenderer != null) { - mAttachInfo.mHardwareRenderer.addFrameStatsObserver(fso); + if (mFrameMetricsObservers == null) { + mFrameMetricsObservers = new ArrayList<>(); + } + + FrameMetricsObserver fmo = new FrameMetricsObserver(window, + handler.getLooper(), listener); + mFrameMetricsObservers.add(fmo); + mAttachInfo.mHardwareRenderer.addFrameMetricsObserver(fmo); } else { Log.w(VIEW_LOG_TAG, "View not hardware-accelerated. Unable to observe frame stats"); } } else { - if (mPendingFrameStatsObservers == null) { - mPendingFrameStatsObservers = new ArrayList<>(); + if (mFrameMetricsObservers == null) { + mFrameMetricsObservers = new ArrayList<>(); } - mPendingFrameStatsObservers.add(fso); + FrameMetricsObserver fmo = new FrameMetricsObserver(window, + handler.getLooper(), listener); + mFrameMetricsObservers.add(fmo); } } @@ -5500,32 +5510,45 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * * @hide */ - public void removeFrameStatsObserver(FrameStatsObserver fso) { + public void removeFrameMetricsListener(Window.FrameMetricsListener listener) { ThreadedRenderer renderer = getHardwareRenderer(); - - if (mPendingFrameStatsObservers != null) { - mPendingFrameStatsObservers.remove(fso); + FrameMetricsObserver fmo = findFrameMetricsObserver(listener); + if (fmo == null) { + throw new IllegalArgumentException("attempt to remove FrameMetricsListener that was never added"); } - if (renderer != null) { - renderer.removeFrameStatsObserver(fso); + if (mFrameMetricsObservers != null) { + mFrameMetricsObservers.remove(fmo); + if (renderer != null) { + renderer.removeFrameMetricsObserver(fmo); + } } } - private void registerPendingFrameStatsObservers() { - if (mPendingFrameStatsObservers != null) { + private void registerPendingFrameMetricsObservers() { + if (mFrameMetricsObservers != null) { ThreadedRenderer renderer = getHardwareRenderer(); if (renderer != null) { - for (FrameStatsObserver fso : mPendingFrameStatsObservers) { - renderer.addFrameStatsObserver(fso); + for (FrameMetricsObserver fmo : mFrameMetricsObservers) { + renderer.addFrameMetricsObserver(fmo); } } else { Log.w(VIEW_LOG_TAG, "View not hardware-accelerated. Unable to observe frame stats"); } - mPendingFrameStatsObservers = null; } } + private FrameMetricsObserver findFrameMetricsObserver(Window.FrameMetricsListener listener) { + for (int i = 0; i < mFrameMetricsObservers.size(); i++) { + FrameMetricsObserver observer = mFrameMetricsObservers.get(i); + if (observer.mListener == listener) { + return observer; + } + } + + return null; + } + /** * Call this view's OnClickListener, if it is defined. Performs all normal * actions associated with clicking: reporting accessibility event, playing @@ -15160,7 +15183,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mFloatingTreeObserver = null; } - registerPendingFrameStatsObservers(); + registerPendingFrameMetricsObservers(); if ((mPrivateFlags&PFLAG_SCROLL_CONTAINER) != 0) { mAttachInfo.mScrollContainers.add(this); diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index c68a740b29a5..9f05990fd781 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -34,6 +34,7 @@ import android.graphics.drawable.Drawable; import android.media.session.MediaController; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.os.SystemProperties; @@ -604,6 +605,34 @@ public abstract class Window { void onRestrictedCaptionAreaChanged(Rect rect); } + /** + * Callback for clients that want frame timing information for each + * frame rendered by the Window. + */ + public interface FrameMetricsListener { + /** + * Called when information is available for the previously rendered frame. + * + * Reports can be dropped if this callback takes too + * long to execute, as the report producer cannot wait for the consumer to + * complete. + * + * It is highly recommended that clients copy the passed in FrameMetrics + * via {@link FrameMetrics#FrameMetrics(FrameMetrics)} within this method and defer + * additional computation or storage to another thread to avoid unnecessarily + * dropping reports. + * + * @param window The {@link Window} on which the frame was displayed. + * @param frameMetrics the available metrics. This object is reused on every call + * and thus <strong>this reference is not valid outside the scope of this method</strong>. + * @param dropCountSinceLastInvocation the number of reports dropped since the last time + * this callback was invoked. + */ + void onMetricsAvailable(Window window, FrameMetrics frameMetrics, + int dropCountSinceLastInvocation); + } + + public Window(Context context) { mContext = context; mFeatures = mLocalFeatures = getDefaultFeatures(context); @@ -798,33 +827,28 @@ public abstract class Window { * Set an observer to collect frame stats for each frame rendererd in this window. * * Must be in hardware rendering mode. - * @hide */ - public final void addFrameStatsObserver(@NonNull FrameStatsObserver fso) { + public final void addFrameMetricsListener(@NonNull FrameMetricsListener listener, + Handler handler) { final View decorView = getDecorView(); if (decorView == null) { throw new IllegalStateException("can't observe a Window without an attached view"); } - if (fso == null) { - throw new NullPointerException("FrameStatsObserver cannot be null"); + if (listener == null) { + throw new NullPointerException("listener cannot be null"); } - if (fso.isRegistered()) { - throw new IllegalStateException("FrameStatsObserver already registered on a Window."); - } - - decorView.addFrameStatsObserver(fso); + decorView.addFrameMetricsListener(this, listener, handler); } /** * Remove observer and stop listening to frame stats for this window. - * @hide */ - public final void removeFrameStatsObserver(FrameStatsObserver fso) { + public final void removeFrameMetricsListener(FrameMetricsListener listener) { final View decorView = getDecorView(); if (decorView != null) { - getDecorView().removeFrameStatsObserver(fso); + getDecorView().removeFrameMetricsListener(listener); } } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 6e38b3268683..947906bf4403 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -460,6 +460,11 @@ public interface WindowManagerPolicy { /** Unregister a system listener for touch events */ void unregisterPointerEventListener(PointerEventListener listener); + + /** + * @return The content insets of the docked divider window. + */ + int getDockedDividerInsetsLw(); } public interface PointerEventListener { diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java index 43306d094bda..d97f8af28c3c 100644 --- a/core/java/android/view/inputmethod/InputMethodInfo.java +++ b/core/java/android/view/inputmethod/InputMethodInfo.java @@ -38,7 +38,6 @@ import android.util.Printer; import android.util.Slog; import android.util.Xml; import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder; -import android.view.inputmethod.InputMethodSubtypeArray; import java.io.IOException; import java.util.ArrayList; @@ -122,7 +121,7 @@ public final class InputMethodInfo implements Parcelable { * @param context The Context in which we are parsing the input method. * @param service The ResolveInfo returned from the package manager about * this input method's component. - * @param additionalSubtypes additional subtypes being added to this InputMethodInfo + * @param additionalSubtypesMap additional subtypes being added to this InputMethodInfo * @hide */ public InputMethodInfo(Context context, ResolveInfo service, @@ -429,6 +428,18 @@ public final class InputMethodInfo implements Parcelable { } } + /** + * @return {@code true} if the {@link android.inputmethodservice.InputMethodService} is marked + * to be Encryption-Aware. + * @hide + */ + public boolean isEncryptionAware() { + if (mService == null || mService.serviceInfo == null) { + return false; + } + return mService.serviceInfo.encryptionAware; + } + public void dump(Printer pw, String prefix) { pw.println(prefix + "mId=" + mId + " mSettingsActivityName=" + mSettingsActivityName diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index b2ae835be358..88af920df2d4 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -86,6 +86,7 @@ import static android.view.Window.DECOR_CAPTION_SHADE_DARK; import static android.view.Window.DECOR_CAPTION_SHADE_LIGHT; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN; +import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; @@ -615,7 +616,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind if (h > 0) { heightMeasureSpec = MeasureSpec.makeMeasureSpec( Math.min(h, heightSize), EXACTLY); - } else if ((mWindow.getAttributes().flags & FLAG_FULLSCREEN) == 0) { + } else if ((mWindow.getAttributes().flags & FLAG_LAYOUT_IN_SCREEN) == 0) { heightMeasureSpec = MeasureSpec.makeMeasureSpec( heightSize - mFloatingInsets.top - mFloatingInsets.bottom, AT_MOST); mApplyFloatingVerticalInsets = true; @@ -890,10 +891,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind public WindowInsets onApplyWindowInsets(WindowInsets insets) { final WindowManager.LayoutParams attrs = mWindow.getAttributes(); mFloatingInsets.setEmpty(); - if ((attrs.flags & FLAG_FULLSCREEN) == 0) { + if ((attrs.flags & FLAG_LAYOUT_IN_SCREEN) == 0) { // For dialog windows we want to make sure they don't go over the status bar or nav bar. // We consume the system insets and we will reuse them later during the measure phase. - // We allow the app to ignore this and handle insets itself by using FLAG_FULLSCREEN. + // We allow the app to ignore this and handle insets itself by using + // FLAG_LAYOUT_IN_SCREEN. if (attrs.height == WindowManager.LayoutParams.WRAP_CONTENT) { mFloatingInsets.top = insets.getSystemWindowInsetTop(); mFloatingInsets.bottom = insets.getSystemWindowInsetBottom(); diff --git a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java index 597c5225f89f..84d0fc70b1ca 100644 --- a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java +++ b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java @@ -136,8 +136,7 @@ public class DividerSnapAlgorithm { / (mFirstSplitTarget.position - getStartInset()); } else if (position > mLastSplitTarget.position) { return (float) (position - mLastSplitTarget.position) - / (mDismissEndTarget.position - getEndInset() - - mLastSplitTarget.position - mDividerSize); + / (mDismissEndTarget.position - mLastSplitTarget.position - mDividerSize); } return 0f; } @@ -222,7 +221,8 @@ public class DividerSnapAlgorithm { addMiddleTarget(isHorizontalDivision); break; } - mTargets.add(new SnapTarget(dividerMax, SnapTarget.FLAG_DISMISS_END, 0.35f)); + int navBarSize = isHorizontalDivision ? mInsets.bottom : mInsets.right; + mTargets.add(new SnapTarget(dividerMax - navBarSize, SnapTarget.FLAG_DISMISS_END, 0.35f)); } private void addFixedDivisionTargets(boolean isHorizontalDivision) { diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index acd0501362b5..dd0e45636ee7 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -41,6 +41,7 @@ #include <Animator.h> #include <AnimationContext.h> #include <FrameInfo.h> +#include <FrameMetricsObserver.h> #include <IContextFactory.h> #include <JankTracker.h> #include <RenderNode.h> @@ -56,10 +57,11 @@ using namespace android::uirenderer; using namespace android::uirenderer::renderthread; struct { - jfieldID buffer; + jfieldID frameMetrics; + jfieldID timingDataBuffer; jfieldID messageQueue; - jmethodID notifyData; -} gFrameStatsObserverClassInfo; + jmethodID callback; +} gFrameMetricsObserverClassInfo; static JNIEnv* getenv(JavaVM* vm) { JNIEnv* env; @@ -239,31 +241,46 @@ public: mBuffer = buffer; } + void setDropCount(int dropCount) { + mDropCount = dropCount; + } + virtual void handleMessage(const Message& message); private: JavaVM* mVm; sp<ObserverProxy> mObserver; - BufferPool::Buffer* mBuffer; + BufferPool::Buffer* mBuffer = nullptr; + int mDropCount = 0; }; -class ObserverProxy : public FrameStatsObserver { +static jlongArray get_metrics_buffer(JNIEnv* env, jobject observer) { + jobject frameMetrics = env->GetObjectField( + observer, gFrameMetricsObserverClassInfo.frameMetrics); + LOG_ALWAYS_FATAL_IF(frameMetrics == nullptr, "unable to retrieve data sink object"); + jobject buffer = env->GetObjectField( + frameMetrics, gFrameMetricsObserverClassInfo.timingDataBuffer); + LOG_ALWAYS_FATAL_IF(buffer == nullptr, "unable to retrieve data sink buffer"); + return reinterpret_cast<jlongArray>(buffer); +} + +class ObserverProxy : public FrameMetricsObserver { public: - ObserverProxy(JavaVM *vm, jobject fso) : mVm(vm) { + ObserverProxy(JavaVM *vm, jobject observer) : mVm(vm) { JNIEnv* env = getenv(mVm); - jlongArray longArrayLocal = env->NewLongArray(kBufferSize); - LOG_ALWAYS_FATAL_IF(longArrayLocal == nullptr, - "OOM: can't allocate frame stats buffer"); - env->SetObjectField(fso, gFrameStatsObserverClassInfo.buffer, longArrayLocal); - - mFsoWeak = env->NewWeakGlobalRef(fso); - LOG_ALWAYS_FATAL_IF(mFsoWeak == nullptr, + mObserverWeak = env->NewWeakGlobalRef(observer); + LOG_ALWAYS_FATAL_IF(mObserverWeak == nullptr, "unable to create frame stats observer reference"); - jobject messageQueueLocal = - env->GetObjectField(fso, gFrameStatsObserverClassInfo.messageQueue); + jlongArray buffer = get_metrics_buffer(env, observer); + jsize bufferSize = env->GetArrayLength(reinterpret_cast<jarray>(buffer)); + LOG_ALWAYS_FATAL_IF(bufferSize != kBufferSize, + "Mismatched Java/Native FrameMetrics data format."); + + jobject messageQueueLocal = env->GetObjectField( + observer, gFrameMetricsObserverClassInfo.messageQueue); mMessageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueLocal); LOG_ALWAYS_FATAL_IF(mMessageQueue == nullptr, "message queue not available"); @@ -274,17 +291,18 @@ public: ~ObserverProxy() { JNIEnv* env = getenv(mVm); - env->DeleteWeakGlobalRef(mFsoWeak); + env->DeleteWeakGlobalRef(mObserverWeak); } - jweak getJavaObjectRef() { - return mFsoWeak; + jweak getObserverReference() { + return mObserverWeak; } - virtual void notify(BufferPool::Buffer* buffer) { + virtual void notify(BufferPool::Buffer* buffer, int dropCount) { buffer->incRef(); mMessageHandler->setBuffer(buffer); mMessageHandler->setObserver(this); + mMessageHandler->setDropCount(dropCount); mMessageQueue->getLooper()->sendMessage(mMessageHandler, mMessage); } @@ -292,26 +310,27 @@ private: static const int kBufferSize = static_cast<int>(FrameInfoIndex::NumIndexes); JavaVM* mVm; - jweak mFsoWeak; + jweak mObserverWeak; + jobject mJavaBufferGlobal; sp<MessageQueue> mMessageQueue; sp<NotifyHandler> mMessageHandler; Message mMessage; + }; void NotifyHandler::handleMessage(const Message& message) { JNIEnv* env = getenv(mVm); - jobject target = env->NewLocalRef(mObserver->getJavaObjectRef()); + jobject target = env->NewLocalRef(mObserver->getObserverReference()); if (target != nullptr) { - jobject javaBuffer = env->GetObjectField(target, gFrameStatsObserverClassInfo.buffer); - if (javaBuffer != nullptr) { - env->SetLongArrayRegion(reinterpret_cast<jlongArray>(javaBuffer), - 0, mBuffer->getSize(), mBuffer->getBuffer()); - env->CallVoidMethod(target, gFrameStatsObserverClassInfo.notifyData); - env->DeleteLocalRef(target); - } + jlongArray javaBuffer = get_metrics_buffer(env, target); + env->SetLongArrayRegion(javaBuffer, + 0, mBuffer->getSize(), mBuffer->getBuffer()); + env->CallVoidMethod(target, gFrameMetricsObserverClassInfo.callback, + mDropCount); + env->DeleteLocalRef(target); } mBuffer->release(); @@ -579,10 +598,10 @@ static void android_view_ThreadedRenderer_setContentDrawBounds(JNIEnv* env, } // ---------------------------------------------------------------------------- -// FrameStatsObserver +// FrameMetricsObserver // ---------------------------------------------------------------------------- -static jlong android_view_ThreadedRenderer_addFrameStatsObserver(JNIEnv* env, +static jlong android_view_ThreadedRenderer_addFrameMetricsObserver(JNIEnv* env, jclass clazz, jlong proxyPtr, jobject fso) { JavaVM* vm = nullptr; if (env->GetJavaVM(&vm) != JNI_OK) { @@ -593,25 +612,18 @@ static jlong android_view_ThreadedRenderer_addFrameStatsObserver(JNIEnv* env, renderthread::RenderProxy* renderProxy = reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); - FrameStatsObserver* observer = new ObserverProxy(vm, fso); - renderProxy->addFrameStatsObserver(observer); + FrameMetricsObserver* observer = new ObserverProxy(vm, fso); + renderProxy->addFrameMetricsObserver(observer); return reinterpret_cast<jlong>(observer); } -static void android_view_ThreadedRenderer_removeFrameStatsObserver(JNIEnv* env, jclass clazz, +static void android_view_ThreadedRenderer_removeFrameMetricsObserver(JNIEnv* env, jclass clazz, jlong proxyPtr, jlong observerPtr) { - FrameStatsObserver* observer = reinterpret_cast<FrameStatsObserver*>(observerPtr); + FrameMetricsObserver* observer = reinterpret_cast<FrameMetricsObserver*>(observerPtr); renderthread::RenderProxy* renderProxy = reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); - renderProxy->removeFrameStatsObserver(observer); -} - -static jint android_view_ThreadedRenderer_getDroppedFrameReportCount(JNIEnv* env, jclass clazz, - jlong proxyPtr) { - renderthread::RenderProxy* renderProxy = - reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); - return renderProxy->getDroppedFrameReportCount(); + renderProxy->removeFrameMetricsObserver(observer); } // ---------------------------------------------------------------------------- @@ -684,25 +696,26 @@ static const JNINativeMethod gMethods[] = { { "nRemoveRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_removeRenderNode}, { "nDrawRenderNode", "(JJ)V", (void*) android_view_ThreadedRendererd_drawRenderNode}, { "nSetContentDrawBounds", "(JIIII)V", (void*)android_view_ThreadedRenderer_setContentDrawBounds}, - { "nAddFrameStatsObserver", - "(JLandroid/view/FrameStatsObserver;)J", - (void*)android_view_ThreadedRenderer_addFrameStatsObserver }, - { "nRemoveFrameStatsObserver", + { "nAddFrameMetricsObserver", + "(JLandroid/view/FrameMetricsObserver;)J", + (void*)android_view_ThreadedRenderer_addFrameMetricsObserver }, + { "nRemoveFrameMetricsObserver", "(JJ)V", - (void*)android_view_ThreadedRenderer_removeFrameStatsObserver }, - { "nGetDroppedFrameReportCount", - "(J)J", - (void*)android_view_ThreadedRenderer_getDroppedFrameReportCount }, + (void*)android_view_ThreadedRenderer_removeFrameMetricsObserver }, }; int register_android_view_ThreadedRenderer(JNIEnv* env) { - jclass clazz = FindClassOrDie(env, "android/view/FrameStatsObserver"); - gFrameStatsObserverClassInfo.messageQueue = - GetFieldIDOrDie(env, clazz, "mMessageQueue", "Landroid/os/MessageQueue;"); - gFrameStatsObserverClassInfo.buffer = - GetFieldIDOrDie(env, clazz, "mBuffer", "[J"); - gFrameStatsObserverClassInfo.notifyData = - GetMethodIDOrDie(env, clazz, "notifyDataAvailable", "()V"); + jclass observerClass = FindClassOrDie(env, "android/view/FrameMetricsObserver"); + gFrameMetricsObserverClassInfo.frameMetrics = GetFieldIDOrDie( + env, observerClass, "mFrameMetrics", "Landroid/view/FrameMetrics;"); + gFrameMetricsObserverClassInfo.messageQueue = GetFieldIDOrDie( + env, observerClass, "mMessageQueue", "Landroid/os/MessageQueue;"); + gFrameMetricsObserverClassInfo.callback = GetMethodIDOrDie( + env, observerClass, "notifyDataAvailable", "(I)V"); + + jclass metricsClass = FindClassOrDie(env, "android/view/FrameMetrics"); + gFrameMetricsObserverClassInfo.timingDataBuffer = GetFieldIDOrDie( + env, metricsClass, "mTimingData", "[J"); return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 1db75e6337d1..99daab47bb41 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -425,6 +425,8 @@ <protected-broadcast android:name="android.intent.action.DYNAMIC_SENSOR_CHANGED" /> + <protected-broadcast android:name="android.intent.action.ACTION_RADIO_OFF" /> + <!-- ====================================================================== --> <!-- RUNTIME PERMISSIONS --> <!-- ====================================================================== --> diff --git a/core/res/res/layout/language_picker_section_header.xml b/core/res/res/layout/language_picker_section_header.xml index c4d3069c1918..b12ec8c00c85 100644 --- a/core/res/res/layout/language_picker_section_header.xml +++ b/core/res/res/layout/language_picker_section_header.xml @@ -19,7 +19,8 @@ style="?android:attr/preferenceCategoryStyle" android:layout_width="match_parent" android:layout_height="36dp" - android:paddingStart="12dp" - android:paddingEnd="12dp" + android:gravity="center_vertical" + android:paddingStart="18dp" + android:paddingEnd="18dp" android:textColor="?android:attr/colorAccent" tools:text="@string/language_picker_section_all"/> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 211346fa6803..e0271ecd3c55 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -1031,7 +1031,7 @@ <string name="sim_added_title" msgid="3719670512889674693">"SİM kart əlavə edildi"</string> <string name="sim_added_message" msgid="7797975656153714319">"Mobil şəbəkəyə giriş üçün cihazınızı sıfırlayın."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Yenidən başlat"</string> - <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Yeni SIM kartınızın düzgün işləməsi üçün, operatorunuzdan tətbiq yükləməli və açmalısınız."</string> + <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Yeni SIM kartınızın düzgün işləməsi üçün operatorunuzdan tətbiq yükləməli və açmalısınız."</string> <string name="carrier_app_dialog_button" msgid="7900235513678617329">"TƏTBİQİ ƏLDƏ EDİN"</string> <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"İNDİ YOX"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Yeni SIM kart taxılıb"</string> diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml index ed31fcec2ec3..beedc83ddcd0 100644 --- a/core/res/res/values-bs-rBA/strings.xml +++ b/core/res/res/values-bs-rBA/strings.xml @@ -397,7 +397,7 @@ <skip /> <!-- no translation found for bugreport_option_full_title (6354382025840076439) --> <skip /> - <string name="bugreport_option_full_summary" msgid="6687306111256813257">"Ta opcija vam omogućava minimalno ometanje sustava kad uređaj ne reagira ili je prespor ili kada su vam potrebni svi odjeljci izvještaja. Ne izrađuje se snimka ekrana i ne možete unijeti više detalja."</string> + <string name="bugreport_option_full_summary" msgid="6687306111256813257">"Koristite ovu opciju za minimalno ometanje sistema kad uređaj ne reaguje ili je prespor, ili kada su vam potrebni svi odjeljci izvještaja. Opcija ne uzima snimku ekrana i ne dozvoljava unošenje više detalja."</string> <!-- no translation found for bugreport_countdown (6878900193900090368) --> <!-- no translation found for global_action_toggle_silent_mode (8219525344246810925) --> <skip /> @@ -1694,7 +1694,7 @@ <!-- no translation found for noApplications (2991814273936504689) --> <skip /> <string name="aerr_application" msgid="250320989337856518">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> je zaustavljena"</string> - <string name="aerr_process" msgid="6201597323218674729">"Aplikacija <xliff:g id="PROCESS">%1$s</xliff:g> je zaustavljena"</string> + <string name="aerr_process" msgid="6201597323218674729">"<xliff:g id="PROCESS">%1$s</xliff:g> je zaustavljen"</string> <string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> se stalno zaustavlja"</string> <string name="aerr_process_repeated" msgid="6235302956890402259">"<xliff:g id="PROCESS">%1$s</xliff:g> se stalno zaustavlja"</string> <string name="aerr_restart" msgid="9001379185665886595">"Ponovo pokreni aplikaciju"</string> @@ -2854,8 +2854,8 @@ <skip /> <!-- no translation found for locale_search_menu (2560710726687249178) --> <skip /> - <string name="work_mode_off_title" msgid="8954725060677558855">"Radni način je ISKLJUČEN"</string> - <string name="work_mode_off_message" msgid="3286169091278094476">"Omogućava radnom profilu da funkcioniše, uključujući aplikacije, sinhronizaciju u pozadini i povezane funkcije."</string> + <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> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 7cd29d7d2029..bc5a04fb33e9 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -349,8 +349,8 @@ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Consente all\'applicazione di aggiungere, rimuovere, modificare gli eventi che puoi modificare sul tablet, inclusi quelli di amici o colleghi. Ciò potrebbe consentire all\'applicazione di inviare messaggi apparentemente provenienti dai proprietari del calendario o di modificare eventi all\'insaputa dei proprietari."</string> <string name="permdesc_writeCalendar" product="tv" msgid="1273290605500902507">"Consente all\'app di aggiungere, rimuovere o modificare eventi che è possibile modificare sulla TV, inclusi quelli di amici o colleghi. L\'app potrebbe inviare messaggi apparentemente provenienti dai proprietari del calendario o modificare eventi all\'insaputa dei proprietari."</string> <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Consente all\'applicazione di aggiungere, rimuovere, modificare gli eventi che puoi modificare sul telefono, inclusi quelli di amici o colleghi. Ciò potrebbe consentire all\'applicazione di inviare messaggi apparentemente provenienti dai proprietari del calendario o di modificare eventi all\'insaputa dei proprietari."</string> - <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accesso a comandi aggiuntivi del provider di localizz."</string> - <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Consente all\'app di accedere a ulteriori comandi del fornitore di posizione. Ciò potrebbe consentire all\'app di interferire con il funzionamento del GPS o di altre fonti di localizzazione."</string> + <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accesso a comandi aggiuntivi provider di geolocalizz."</string> + <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Consente all\'app di accedere a ulteriori comandi del fornitore di posizione. Ciò potrebbe consentire all\'app di interferire con il funzionamento del GPS o di altre fonti di geolocalizzazione."</string> <string name="permlab_accessFineLocation" msgid="251034415460950944">"accesso alla posizione esatta (basata su GPS e rete)"</string> <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Consente all\'applicazione di ottenere la tua posizione esatta utilizzando il sistema GPS (Global Positioning System) o fonti di geolocalizzazione delle reti come ripetitori di telefonia mobile e Wi-Fi. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul dispositivo per poter essere utilizzati dall\'applicazione. Le applicazioni potrebbero utilizzare questa autorizzazione per stabilire la tua posizione e potrebbero consumare ulteriore batteria."</string> <string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"accesso alla posizione approssimativa (basata sulla rete)"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 408d4431a8c9..37b5ed98c258 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1542,7 +1542,7 @@ <item quantity="other">На %d часа</item> </plurals> <string name="zen_mode_until" msgid="7336308492289875088">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> - <string name="zen_mode_alarm" msgid="9128205721301330797">"До следующего будильника в <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> + <string name="zen_mode_alarm" msgid="9128205721301330797">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (будильник)"</string> <string name="zen_mode_forever" msgid="7420011936770086993">"Пока я не отключу"</string> <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Пока вы не отключите режим \"Не беспокоить\""</string> <string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index d7e96e897f5b..280f4d45845b 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -1031,7 +1031,7 @@ <string name="sim_added_title" msgid="3719670512889674693">"சிம் கார்டு சேர்க்கப்பட்டது"</string> <string name="sim_added_message" msgid="7797975656153714319">"செல்லுலார் நெட்வொர்க்கை அணுக உங்கள் சாதனத்தை மறுதொடக்கம் செய்யவும்."</string> <string name="sim_restart_button" msgid="4722407842815232347">"மறுதொடக்கம்"</string> - <string name="carrier_app_dialog_message" msgid="7066156088266319533">"புதிய சிம் சரியாக இயங்குவதற்கு, நீங்கள் பயன்படுத்தும் மொபைல் நிறுவனத்திலிருந்து பயன்பாட்டை நிறுவி, திறக்கவும்."</string> + <string name="carrier_app_dialog_message" msgid="7066156088266319533">"புதிய சிம் சரியாக இயங்குவதற்கு, நீங்கள் பயன்படுத்தும் மொபைல் நிறுவனத்திலிருந்து ஒரு பயன்பாட்டை நிறுவி, திறக்க வேண்டும்."</string> <string name="carrier_app_dialog_button" msgid="7900235513678617329">"பயன்பாட்டைப் பெறுக"</string> <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"இப்போது வேண்டாம்"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"புதிய சிம் செருகப்பட்டது"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index cc60c8c51350..4655dee00f5a 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -864,7 +864,7 @@ <string name="Midnight" msgid="5630806906897892201">"Yarim tun"</string> <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> - <string name="selectAll" msgid="6876518925844129331">"Barchasini tanlash"</string> + <string name="selectAll" msgid="6876518925844129331">"Hammasini belgilash"</string> <string name="cut" msgid="3092569408438626261">"Kesish"</string> <string name="copy" msgid="2681946229533511987">"Nusxa olish"</string> <string name="paste" msgid="5629880836805036433">"Joylash"</string> @@ -977,12 +977,12 @@ <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringtonlar"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Noma’lum rington"</string> <plurals name="wifi_available" formatted="false" msgid="7900333017752027322"> - <item quantity="other">Wi-Fi tarmoqlari mavjud emas</item> - <item quantity="one">Wi-Fi tarmog‘i mavjud emas</item> + <item quantity="other">Wi-Fi tarmoqlari aniqlandi</item> + <item quantity="one">Wi-Fi tarmog‘i aniqlandi</item> </plurals> <plurals name="wifi_available_detailed" formatted="false" msgid="1140699367193975606"> - <item quantity="other">Ochiq Wi-Fi tarmoqlari mavjud</item> - <item quantity="one">Ochiq Wi-Fi tarmog‘i mavjud</item> + <item quantity="other">Ochiq Wi-Fi tarmoqlari aniqlandi</item> + <item quantity="one">Ochiq Wi-Fi tarmog‘i aniqlandi</item> </plurals> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi tarmoqqa kirish"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Tarmoqqa kirish"</string> @@ -1153,7 +1153,7 @@ <string name="submit" msgid="1602335572089911941">"Jo‘natish"</string> <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mashina usuli yoqilgan"</string> <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Avtomashina rejimidan chiqish uchun bosing."</string> - <string name="tethered_notification_title" msgid="3146694234398202601">"Modem yoki ulanish nuqtasi - faol"</string> + <string name="tethered_notification_title" msgid="3146694234398202601">"Modem rejimi yoniq"</string> <string name="tethered_notification_message" msgid="6857031760103062982">"Sozlash uchun bosing."</string> <string name="back_button_label" msgid="2300470004503343439">"Orqaga"</string> <string name="next_button_label" msgid="1080555104677992408">"Keyingi"</string> @@ -1167,7 +1167,7 @@ <string name="action_mode_done" msgid="7217581640461922289">"Tayyor"</string> <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB xotirasi tozalanmoqda…"</string> <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD xotira kartasi tozalanmoqda…"</string> - <string name="share" msgid="1778686618230011964">"Bo‘lishish"</string> + <string name="share" msgid="1778686618230011964">"Yuborish"</string> <string name="find" msgid="4808270900322985960">"Topish"</string> <string name="websearch" msgid="4337157977400211589">"Veb qidiruv"</string> <string name="find_next" msgid="5742124618942193978">"Keyingisini topish"</string> @@ -1212,8 +1212,8 @@ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Kiritish"</string> <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Ilovani tanlang"</string> <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ishga tushmadi"</string> - <string name="shareactionprovider_share_with" msgid="806688056141131819">"Bo‘lishish:"</string> - <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> bilan bo‘lishish"</string> + <string name="shareactionprovider_share_with" msgid="806688056141131819">"Ruxsat berish"</string> + <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilovasiga ruxsat berish"</string> <string name="content_description_sliding_handle" msgid="415975056159262248">"Surish uchun dastak. Bosing va ushlab turing."</string> <string name="description_target_unlock_tablet" msgid="3833195335629795055">"Qulfdan chiqarish uchun silang."</string> <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Parol kalitlarini eshitish uchun garnitura ulang."</string> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 3a5336cd05f1..1496d0926dc6 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -429,8 +429,10 @@ sets. --> <attr name="multiArch" format ="boolean" /> - <!-- Specify abiOverride for multiArch application. --> - <attr name="abiOverride" /> + <!-- Specify whether the 32 bit version of the ABI should be used in a + multiArch application. If both abioverride flag (i.e. using abi option of abd install) + and use32bitAbi are used, then use32bit is ignored.--> + <attr name="use32bitAbi" /> <!-- Specify whether a component is allowed to have multiple instances of itself running in different processes. Use with the activity diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 5c5aff0998fa..69d005cb6806 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2696,7 +2696,7 @@ <public type="attr" name="endX" /> <public type="attr" name="endY" /> <public type="attr" name="offset" /> - <public type="attr" name="abiOverride" /> + <public type="attr" name="use32bitAbi" /> <public type="attr" name="bitmap" /> <public type="attr" name="hotSpotX" /> <public type="attr" name="hotSpotY" /> diff --git a/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java b/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java index 605f067afebc..9ab62cc03bea 100644 --- a/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java +++ b/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java @@ -24,6 +24,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.NetworkScorerAppManager.NetworkScorerAppData; +import android.os.UserHandle; import android.test.InstrumentationTestCase; import android.util.Pair; @@ -116,14 +117,14 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase { } } - Mockito.when(mMockPm.queryBroadcastReceivers( + Mockito.when(mMockPm.queryBroadcastReceiversAsUser( Mockito.argThat(new ArgumentMatcher<Intent>() { @Override public boolean matches(Object object) { Intent intent = (Intent) object; return NetworkScoreManager.ACTION_SCORE_NETWORKS.equals(intent.getAction()); } - }), Mockito.eq(0))) + }), Mockito.eq(0), Mockito.eq(UserHandle.USER_SYSTEM))) .thenReturn(receivers); } diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java index d133a12cc141..93581db719d3 100644 --- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java @@ -20,11 +20,13 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.content.res.Configuration; import android.os.Parcel; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.LocaleList; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder; import android.view.inputmethod.InputMethodSubtype; @@ -230,7 +232,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_EN_US, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_EN_US)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(autoSubtype, result.get(0)); } @@ -251,8 +256,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_EN_US, imi); - assertEquals(1, result.size()); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_EN_US)) + .getResources(), + imi); verifyEquality(nonAutoEnUS, result.get(0)); } @@ -271,7 +278,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_EN_GB, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_EN_GB)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoEnGB, result.get(0)); } @@ -292,7 +302,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_FR, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_FR)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoFrCA, result.get(0)); } @@ -309,7 +322,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_FR_CA, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_FR_CA)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoFrCA, result.get(0)); } @@ -327,7 +343,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_JA_JP, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_JA_JP)) + .getResources(), + imi); assertEquals(3, result.size()); verifyEquality(nonAutoJa, result.get(0)); verifyEquality(nonAutoEnabledWhenDefaultIsNotAsciiCalableSubtype, result.get(1)); @@ -344,7 +363,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_FIL_PH, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_FIL_PH)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoFil, result.get(0)); } @@ -361,7 +383,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_FI, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_FI)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoJa, result.get(0)); } @@ -376,7 +401,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_IN, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_IN)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoIn, result.get(0)); } @@ -389,7 +417,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_ID, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_ID)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoIn, result.get(0)); } @@ -402,7 +433,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_IN, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_IN)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoId, result.get(0)); } @@ -415,7 +449,10 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT, subtypes); final ArrayList<InputMethodSubtype> result = - callGetImplicitlyApplicableSubtypesLockedWithLocale(LOCALE_ID, imi); + InputMethodUtils.getImplicitlyApplicableSubtypesLocked( + createTargetContextWithLocales(new LocaleList(LOCALE_ID)) + .getResources(), + imi); assertEquals(1, result.size()); verifyEquality(nonAutoId, result.get(0)); } @@ -568,24 +605,11 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { } } - private ArrayList<InputMethodSubtype> callGetImplicitlyApplicableSubtypesLockedWithLocale( - final Locale locale, final InputMethodInfo imi) { - final Context context = getInstrumentation().getTargetContext(); - final Locale initialLocale = context.getResources().getConfiguration().locale; - try { - context.getResources().getConfiguration().setLocale(locale); - return InputMethodUtils.getImplicitlyApplicableSubtypesLocked(context.getResources(), - imi); - } finally { - context.getResources().getConfiguration().setLocale(initialLocale); - } - } - private void assertDefaultEnabledImes(final ArrayList<InputMethodInfo> preinstalledImes, final Locale systemLocale, final boolean isSystemReady, String... expectedImeNames) { - final Context context = getInstrumentation().getTargetContext(); - final String[] actualImeNames = getPackageNames(callGetDefaultEnabledImesWithLocale( - context, isSystemReady, preinstalledImes, systemLocale)); + final Context context = createTargetContextWithLocales(new LocaleList(systemLocale)); + final String[] actualImeNames = getPackageNames( + InputMethodUtils.getDefaultEnabledImes(context, isSystemReady, preinstalledImes)); assertEquals(expectedImeNames.length, actualImeNames.length); for (int i = 0; i < expectedImeNames.length; ++i) { assertEquals(expectedImeNames[i], actualImeNames[i]); @@ -606,16 +630,12 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { } } - private static ArrayList<InputMethodInfo> callGetDefaultEnabledImesWithLocale( - final Context context, final boolean isSystemReady, - final ArrayList<InputMethodInfo> imis, final Locale locale) { - final Locale initialLocale = context.getResources().getConfiguration().locale; - try { - context.getResources().getConfiguration().setLocale(locale); - return InputMethodUtils.getDefaultEnabledImes(context, isSystemReady, imis); - } finally { - context.getResources().getConfiguration().setLocale(initialLocale); - } + private Context createTargetContextWithLocales(final LocaleList locales) { + final Configuration resourceConfiguration = new Configuration(); + resourceConfiguration.setLocales(locales); + return getInstrumentation() + .getTargetContext() + .createConfigurationContext(resourceConfiguration); } private String[] getPackageNames(final ArrayList<InputMethodInfo> imis) { diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index daf25815d1ac..bffbc751ee83 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -641,16 +641,22 @@ public class BitmapDrawable extends Drawable { @Override public void setTintList(ColorStateList tint) { - mBitmapState.mTint = tint; - mTintFilter = updateTintFilter(mTintFilter, tint, mBitmapState.mTintMode); - invalidateSelf(); + final BitmapState state = mBitmapState; + if (state.mTint != tint) { + state.mTint = tint; + mTintFilter = updateTintFilter(mTintFilter, tint, mBitmapState.mTintMode); + invalidateSelf(); + } } @Override public void setTintMode(PorterDuff.Mode tintMode) { - mBitmapState.mTintMode = tintMode; - mTintFilter = updateTintFilter(mTintFilter, mBitmapState.mTint, tintMode); - invalidateSelf(); + final BitmapState state = mBitmapState; + if (state.mTintMode != tintMode) { + state.mTintMode = tintMode; + mTintFilter = updateTintFilter(mTintFilter, mBitmapState.mTint, tintMode); + invalidateSelf(); + } } /** diff --git a/keystore/java/android/security/Credentials.java b/keystore/java/android/security/Credentials.java index c8333c87c69c..302b0bd73065 100644 --- a/keystore/java/android/security/Credentials.java +++ b/keystore/java/android/security/Credentials.java @@ -20,9 +20,11 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.util.Log; + import com.android.org.bouncycastle.util.io.pem.PemObject; import com.android.org.bouncycastle.util.io.pem.PemReader; import com.android.org.bouncycastle.util.io.pem.PemWriter; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -147,20 +149,23 @@ public class Credentials { Reader reader = new InputStreamReader(bai, StandardCharsets.US_ASCII); PemReader pr = new PemReader(reader); - CertificateFactory cf = CertificateFactory.getInstance("X509"); - - List<X509Certificate> result = new ArrayList<X509Certificate>(); - PemObject o; - while ((o = pr.readPemObject()) != null) { - if (o.getType().equals("CERTIFICATE")) { - Certificate c = cf.generateCertificate(new ByteArrayInputStream(o.getContent())); - result.add((X509Certificate) c); - } else { - throw new IllegalArgumentException("Unknown type " + o.getType()); + try { + CertificateFactory cf = CertificateFactory.getInstance("X509"); + + List<X509Certificate> result = new ArrayList<X509Certificate>(); + PemObject o; + while ((o = pr.readPemObject()) != null) { + if (o.getType().equals("CERTIFICATE")) { + Certificate c = cf.generateCertificate(new ByteArrayInputStream(o.getContent())); + result.add((X509Certificate) c); + } else { + throw new IllegalArgumentException("Unknown type " + o.getType()); + } } + return result; + } finally { + pr.close(); } - pr.close(); - return result; } private static Credentials singleton; diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index 1b87a419941d..3090ac1c6180 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -19,7 +19,6 @@ package android.security; import android.app.ActivityThread; import android.app.Application; import android.app.KeyguardManager; - import android.content.Context; import android.hardware.fingerprint.FingerprintManager; import android.os.Binder; @@ -32,6 +31,7 @@ import android.security.keymaster.ExportResult; import android.security.keymaster.KeyCharacteristics; import android.security.keymaster.KeymasterArguments; import android.security.keymaster.KeymasterBlob; +import android.security.keymaster.KeymasterCertificateChain; import android.security.keymaster.KeymasterDefs; import android.security.keymaster.OperationResult; import android.security.keystore.KeyExpiredException; @@ -615,6 +615,17 @@ public class KeyStore { return onUserPasswordChanged(UserHandle.getUserId(Process.myUid()), newPassword); } + public int attestKey( + String alias, KeymasterArguments params, KeymasterCertificateChain outChain) { + try { + return mBinder.attestKey(alias, params, outChain); + } catch (RemoteException e) { + Log.w(TAG, "Cannot connect to keystore", e); + return SYSTEM_ERROR; + } + } + + /** * Returns a {@link KeyStoreException} corresponding to the provided keystore/keymaster error * code. diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java index 65460b5ceb29..3a0ff1c44ad9 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java @@ -22,6 +22,7 @@ import android.security.KeyPairGeneratorSpec; import android.security.KeyStore; import android.security.keymaster.KeyCharacteristics; import android.security.keymaster.KeymasterArguments; +import android.security.keymaster.KeymasterCertificateChain; import android.security.keymaster.KeymasterDefs; import com.android.org.bouncycastle.asn1.ASN1EncodableVector; @@ -46,6 +47,8 @@ import com.android.org.bouncycastle.x509.X509V3CertificateGenerator; import libcore.util.EmptyArray; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.math.BigInteger; import java.security.InvalidAlgorithmParameterException; import java.security.KeyPair; @@ -57,14 +60,17 @@ import java.security.PublicKey; import java.security.SecureRandom; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateParsingException; import java.security.cert.X509Certificate; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.ECGenParameterSpec; import java.security.spec.RSAKeyGenParameterSpec; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -166,6 +172,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato mOriginalKeymasterAlgorithm = keymasterAlgorithm; } + @SuppressWarnings("deprecation") @Override public void initialize(int keysize, SecureRandom random) { throw new IllegalArgumentException( @@ -173,6 +180,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato + " required to initialize this KeyPairGenerator"); } + @SuppressWarnings("deprecation") @Override public void initialize(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { @@ -447,6 +455,69 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato + ", but the user has not yet entered the credential"); } + byte[] additionalEntropy = + KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng( + mRng, (mKeySizeBits + 7) / 8); + + Credentials.deleteAllTypesForAlias(mKeyStore, mEntryAlias, mEntryUid); + final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + mEntryAlias; + boolean success = false; + try { + generateKeystoreKeyPair( + privateKeyAlias, constructKeyGenerationArguments(), additionalEntropy, flags); + KeyPair keyPair = loadKeystoreKeyPair(privateKeyAlias); + + storeCertificateChain(flags, createCertificateChain(privateKeyAlias, keyPair)); + + success = true; + return keyPair; + } finally { + if (!success) { + Credentials.deleteAllTypesForAlias(mKeyStore, mEntryAlias, mEntryUid); + } + } + } + + private Iterable<byte[]> createCertificateChain(final String privateKeyAlias, KeyPair keyPair) + throws ProviderException { + byte[] challenge = mSpec.getAttestationChallenge(); + if (challenge != null) { + KeymasterArguments args = new KeymasterArguments(); + args.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_CHALLENGE, challenge); + return getAttestationChain(privateKeyAlias, keyPair, args); + } + + // Very short certificate chain in the non-attestation case. + return Collections.singleton(generateSelfSignedCertificateBytes(keyPair)); + } + + private void generateKeystoreKeyPair(final String privateKeyAlias, KeymasterArguments args, + byte[] additionalEntropy, final int flags) throws ProviderException { + KeyCharacteristics resultingKeyCharacteristics = new KeyCharacteristics(); + int errorCode = mKeyStore.generateKey(privateKeyAlias, args, additionalEntropy, + mEntryUid, flags, resultingKeyCharacteristics); + if (errorCode != KeyStore.NO_ERROR) { + throw new ProviderException( + "Failed to generate key pair", KeyStore.getKeyStoreException(errorCode)); + } + } + + private KeyPair loadKeystoreKeyPair(final String privateKeyAlias) throws ProviderException { + try { + KeyPair result = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore( + mKeyStore, privateKeyAlias, mEntryUid); + if (!mJcaKeyAlgorithm.equalsIgnoreCase(result.getPrivate().getAlgorithm())) { + throw new ProviderException( + "Generated key pair algorithm does not match requested algorithm: " + + result.getPrivate().getAlgorithm() + " vs " + mJcaKeyAlgorithm); + } + return result; + } catch (UnrecoverableKeyException e) { + throw new ProviderException("Failed to load generated key pair from keystore", e); + } + } + + private KeymasterArguments constructKeyGenerationArguments() { KeymasterArguments args = new KeymasterArguments(); args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, mKeySizeBits); args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, mKeymasterAlgorithm); @@ -466,73 +537,72 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato mSpec.getKeyValidityForConsumptionEnd()); addAlgorithmSpecificParameters(args); - byte[] additionalEntropy = - KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng( - mRng, (mKeySizeBits + 7) / 8); + if (mSpec.isUniqueIdIncluded()) + args.addBoolean(KeymasterDefs.KM_TAG_INCLUDE_UNIQUE_ID); - final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + mEntryAlias; - boolean success = false; - try { - Credentials.deleteAllTypesForAlias(mKeyStore, mEntryAlias, mEntryUid); - KeyCharacteristics resultingKeyCharacteristics = new KeyCharacteristics(); - int errorCode = mKeyStore.generateKey( - privateKeyAlias, - args, - additionalEntropy, - mEntryUid, - flags, - resultingKeyCharacteristics); - if (errorCode != KeyStore.NO_ERROR) { - throw new ProviderException( - "Failed to generate key pair", KeyStore.getKeyStoreException(errorCode)); - } + return args; + } - KeyPair result; - try { - result = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore( - mKeyStore, privateKeyAlias, mEntryUid); - } catch (UnrecoverableKeyException e) { - throw new ProviderException("Failed to load generated key pair from keystore", e); - } + private void storeCertificateChain(final int flags, Iterable<byte[]> iterable) + throws ProviderException { + Iterator<byte[]> iter = iterable.iterator(); + storeCertificate( + Credentials.USER_CERTIFICATE, iter.next(), flags, "Failed to store certificate"); - if (!mJcaKeyAlgorithm.equalsIgnoreCase(result.getPrivate().getAlgorithm())) { - throw new ProviderException( - "Generated key pair algorithm does not match requested algorithm: " - + result.getPrivate().getAlgorithm() + " vs " + mJcaKeyAlgorithm); - } + if (!iter.hasNext()) { + return; + } - final X509Certificate cert; - try { - cert = generateSelfSignedCertificate(result.getPrivate(), result.getPublic()); - } catch (Exception e) { - throw new ProviderException("Failed to generate self-signed certificate", e); - } + ByteArrayOutputStream certificateConcatenationStream = new ByteArrayOutputStream(); + while (iter.hasNext()) { + byte[] data = iter.next(); + certificateConcatenationStream.write(data, 0, data.length); + } - byte[] certBytes; - try { - certBytes = cert.getEncoded(); - } catch (CertificateEncodingException e) { - throw new ProviderException( - "Failed to obtain encoded form of self-signed certificate", e); - } + storeCertificate(Credentials.CA_CERTIFICATE, certificateConcatenationStream.toByteArray(), + flags, "Failed to store attestation CA certificate"); + } - int insertErrorCode = mKeyStore.insert( - Credentials.USER_CERTIFICATE + mEntryAlias, - certBytes, - mEntryUid, - flags); - if (insertErrorCode != KeyStore.NO_ERROR) { - throw new ProviderException("Failed to store self-signed certificate", - KeyStore.getKeyStoreException(insertErrorCode)); - } + private void storeCertificate(String prefix, byte[] certificateBytes, final int flags, + String failureMessage) throws ProviderException { + int insertErrorCode = mKeyStore.insert( + prefix + mEntryAlias, + certificateBytes, + mEntryUid, + flags); + if (insertErrorCode != KeyStore.NO_ERROR) { + throw new ProviderException(failureMessage, + KeyStore.getKeyStoreException(insertErrorCode)); + } + } - success = true; - return result; - } finally { - if (!success) { - Credentials.deleteAllTypesForAlias(mKeyStore, mEntryAlias, mEntryUid); - } + private byte[] generateSelfSignedCertificateBytes(KeyPair keyPair) throws ProviderException { + try { + return generateSelfSignedCertificate(keyPair.getPrivate(), keyPair.getPublic()) + .getEncoded(); + } catch (IOException | CertificateParsingException e) { + throw new ProviderException("Failed to generate self-signed certificate", e); + } catch (CertificateEncodingException e) { + throw new ProviderException( + "Failed to obtain encoded form of self-signed certificate", e); + } + } + + private Iterable<byte[]> getAttestationChain(String privateKeyAlias, + KeyPair keyPair, KeymasterArguments args) + throws ProviderException { + KeymasterCertificateChain outChain = new KeymasterCertificateChain(); + int errorCode = mKeyStore.attestKey(privateKeyAlias, args, outChain); + if (errorCode != KeyStore.NO_ERROR) { + throw new ProviderException("Failed to generate attestation certificate chain", + KeyStore.getKeyStoreException(errorCode)); + } + Collection<byte[]> chain = outChain.getCertificates(); + if (chain.size() < 2) { + throw new ProviderException("Attestation certificate chain contained " + + chain.size() + " entries. At least two are required."); } + return chain; } private void addAlgorithmSpecificParameters(KeymasterArguments keymasterArgs) { @@ -548,8 +618,8 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato } } - private X509Certificate generateSelfSignedCertificate( - PrivateKey privateKey, PublicKey publicKey) throws Exception { + private X509Certificate generateSelfSignedCertificate(PrivateKey privateKey, + PublicKey publicKey) throws CertificateParsingException, IOException { String signatureAlgorithm = getCertificateSignatureAlgorithm(mKeymasterAlgorithm, mKeySizeBits, mSpec); if (signatureAlgorithm == null) { @@ -587,7 +657,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato @SuppressWarnings("deprecation") private X509Certificate generateSelfSignedCertificateWithFakeSignature( - PublicKey publicKey) throws Exception { + PublicKey publicKey) throws IOException, CertificateParsingException { V3TBSCertificateGenerator tbsGenerator = new V3TBSCertificateGenerator(); ASN1ObjectIdentifier sigAlgOid; AlgorithmIdentifier sigAlgId; diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java index add199f139a0..f3fd1299354a 100644 --- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java +++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java @@ -250,6 +250,8 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { private final boolean mRandomizedEncryptionRequired; private final boolean mUserAuthenticationRequired; private final int mUserAuthenticationValidityDurationSeconds; + private final byte[] mAttestationChallenge; + private final boolean mUniqueIdIncluded; /** * @hide should be built with Builder @@ -273,7 +275,9 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { @KeyProperties.BlockModeEnum String[] blockModes, boolean randomizedEncryptionRequired, boolean userAuthenticationRequired, - int userAuthenticationValidityDurationSeconds) { + int userAuthenticationValidityDurationSeconds, + byte[] attestationChallenge, + boolean uniqueIdIncluded) { if (TextUtils.isEmpty(keyStoreAlias)) { throw new IllegalArgumentException("keyStoreAlias must not be empty"); } @@ -315,6 +319,8 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { mRandomizedEncryptionRequired = randomizedEncryptionRequired; mUserAuthenticationRequired = userAuthenticationRequired; mUserAuthenticationValidityDurationSeconds = userAuthenticationValidityDurationSeconds; + mAttestationChallenge = Utils.cloneIfNotNull(attestationChallenge); + mUniqueIdIncluded = uniqueIdIncluded; } /** @@ -539,6 +545,48 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { } /** + * Returns the attestation challenge value that will be placed in attestation certificate for + * this key pair. + * + * <p>If this method returns non-{@code null}, the public key certificate for this key pair will + * contain an extension that describes the details of the key's configuration and + * authorizations, including the content of the attestation challenge value. If the key is in + * secure hardware, and if the secure hardware supports attestation, the certificate will be + * signed by a chain of certificates rooted at a trustworthy CA key. Otherwise the chain will + * be rooted at an untrusted certificate. + * + * <p>If this method returns {@code null}, and the spec is used to generate an asymmetric (RSA + * or EC) key pair, the public key will have a self-signed certificate if it has purpose {@link + * KeyProperties#PURPOSE_SIGN} (see {@link #KeyGenParameterSpec(String, int)). If does not have + * purpose {@link KeyProperties#PURPOSE_SIGN}, it will have a fake certificate. + * + * <p>Symmetric keys, such as AES and HMAC keys, do not have public key certificates. If a + * {@link KeyGenParameterSpec} with {@link #hasAttestationCertificate()} returning + * non-{@code null} is used to generate a symmetric (AES or HMAC) key, + * {@link KeyGenerator#generateKey())} will throw + * {@link java.security.InvalidAlgorithmParameterException}. + * + * @see Builder#setAttestationChallenge(byte[]) + */ + /* + * TODO(swillden): Update this documentation to describe the hardware and software root keys, + * including information about CRL/OCSP services for discovering revocations, and to link to + * documentation of the extension format and content. + */ + public byte[] getAttestationChallenge() { + return Utils.cloneIfNotNull(mAttestationChallenge); + } + + /** + * @hide This is a system-only API + * + * Returns {@code true} if the attestation certificate will contain a unique ID field. + */ + public boolean isUniqueIdIncluded() { + return mUniqueIdIncluded; + } + + /** * Builder of {@link KeyGenParameterSpec} instances. */ public final static class Builder { @@ -562,6 +610,8 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { private boolean mRandomizedEncryptionRequired = true; private boolean mUserAuthenticationRequired; private int mUserAuthenticationValidityDurationSeconds = -1; + private byte[] mAttestationChallenge = null; + private boolean mUniqueIdIncluded = false; /** * Creates a new instance of the {@code Builder}. @@ -957,6 +1007,59 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { return this; } + /* + * TODO(swillden): Update this documentation to describe the hardware and software root + * keys, including information about CRL/OCSP services for discovering revocations, and to + * link to documentation of the extension format and content. + */ + /** + * Sets whether an attestation certificate will be generated for this key pair, and what + * challenge value will be placed in the certificate. The attestation certificate chain + * can be retrieved with with {@link java.security.KeyStore#getCertificateChain(String)}. + * + * <p>If {@code attestationChallenge} is not {@code null}, the public key certificate for + * this key pair will contain an extension that describes the details of the key's + * configuration and authorizations, including the {@code attestationChallenge} value. If + * the key is in secure hardware, and if the secure hardware supports attestation, the + * certificate will be signed by a chain of certificates rooted at a trustworthy CA key. + * Otherwise the chain will be rooted at an untrusted certificate. + * + * <p>The purpose of the challenge value is to enable relying parties to verify that the key + * was created in response to a specific request. If attestation is desired but no + * challenged is needed, any non-{@code null} value may be used, including an empty byte + * array. + * + * <p>If {@code attestationChallenge} is {@code null}, and this spec is used to generate an + * asymmetric (RSA or EC) key pair, the public key certificate will be self-signed if the + * key has purpose {@link KeyProperties#PURPOSE_SIGN} (see + * {@link #KeyGenParameterSpec(String, int)). If the key does not have purpose + * {@link KeyProperties#PURPOSE_SIGN}, it is not possible to use the key to sign a + * certificate, so the public key certificate will contain a dummy signature. + * + * <p>Symmetric keys, such as AES and HMAC keys, do not have public key certificates. If a + * {@code getAttestationChallenge} returns non-{@code null} and the spec is used to + * generate a symmetric (AES or HMAC) key, {@link KeyGenerator#generateKey()} will throw + * {@link java.security.InvalidAlgorithmParameterException}. + * + * @see Builder#setAttestationChallenge(String attestationChallenge) + */ + @NonNull + public Builder setAttestationChallenge(byte[] attestationChallenge) { + mAttestationChallenge = attestationChallenge; + return this; + } + + /** + * @hide Only system apps can use this method. + * + * Sets whether to include a temporary unique ID field in the attestation certificate. + */ + @NonNull + public Builder setUniqueIdIncluded(boolean uniqueIdIncluded) { + mUniqueIdIncluded = uniqueIdIncluded; + return this; + } + /** * Builds an instance of {@code KeyGenParameterSpec}. */ @@ -981,7 +1084,9 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { mBlockModes, mRandomizedEncryptionRequired, mUserAuthenticationRequired, - mUserAuthenticationValidityDurationSeconds); + mUserAuthenticationValidityDurationSeconds, + mAttestationChallenge, + mUniqueIdIncluded); } } } diff --git a/keystore/java/android/security/keystore/Utils.java b/keystore/java/android/security/keystore/Utils.java index 9bec6821c252..5722c7b53ef4 100644 --- a/keystore/java/android/security/keystore/Utils.java +++ b/keystore/java/android/security/keystore/Utils.java @@ -29,4 +29,8 @@ abstract class Utils { static Date cloneIfNotNull(Date value) { return (value != null) ? (Date) value.clone() : null; } + + static byte[] cloneIfNotNull(byte[] value) { + return (value != null) ? value.clone() : null; + } } diff --git a/libs/hwui/ClipArea.cpp b/libs/hwui/ClipArea.cpp index 9c08b4dd22ae..e368537f0b4f 100644 --- a/libs/hwui/ClipArea.cpp +++ b/libs/hwui/ClipArea.cpp @@ -361,17 +361,21 @@ const ClipBase* ClipArea::serializeClip(LinearAllocator& allocator) { "expect RectangleList to be trivially destructible"); if (mLastSerialization == nullptr) { + ClipBase* serialization = nullptr; switch (mMode) { case ClipMode::Rectangle: - mLastSerialization = allocator.create<ClipRect>(mClipRect); + serialization = allocator.create<ClipRect>(mClipRect); break; case ClipMode::RectangleList: - mLastSerialization = allocator.create<ClipRectList>(mRectangleList); + serialization = allocator.create<ClipRectList>(mRectangleList); + serialization->rect = mRectangleList.calculateBounds(); break; case ClipMode::Region: - mLastSerialization = allocator.create<ClipRegion>(mClipRegion); + serialization = allocator.create<ClipRegion>(mClipRegion); + serialization->rect.set(mClipRegion.getBounds()); break; } + mLastSerialization = serialization; } return mLastSerialization; } diff --git a/libs/hwui/FrameStatsObserver.h b/libs/hwui/FrameMetricsObserver.h index 7abc9f143a0b..2b42a80aca18 100644 --- a/libs/hwui/FrameStatsObserver.h +++ b/libs/hwui/FrameMetricsObserver.h @@ -23,9 +23,9 @@ namespace android { namespace uirenderer { -class FrameStatsObserver : public VirtualLightRefBase { +class FrameMetricsObserver : public VirtualLightRefBase { public: - virtual void notify(BufferPool::Buffer* buffer); + virtual void notify(BufferPool::Buffer* buffer, int dropCount); }; }; // namespace uirenderer diff --git a/libs/hwui/FrameStatsReporter.h b/libs/hwui/FrameMetricsReporter.h index b8a9432d6507..0831d24ccbd3 100644 --- a/libs/hwui/FrameStatsReporter.h +++ b/libs/hwui/FrameMetricsReporter.h @@ -21,7 +21,7 @@ #include "BufferPool.h" #include "FrameInfo.h" -#include "FrameStatsObserver.h" +#include "FrameMetricsObserver.h" #include <string.h> #include <vector> @@ -29,18 +29,18 @@ namespace android { namespace uirenderer { -class FrameStatsReporter { +class FrameMetricsReporter { public: - FrameStatsReporter() { + FrameMetricsReporter() { mBufferPool = new BufferPool(kBufferSize, kBufferCount); LOG_ALWAYS_FATAL_IF(mBufferPool.get() == nullptr, "OOM: unable to allocate buffer pool"); } - void addObserver(FrameStatsObserver* observer) { + void addObserver(FrameMetricsObserver* observer) { mObservers.push_back(observer); } - bool removeObserver(FrameStatsObserver* observer) { + bool removeObserver(FrameMetricsObserver* observer) { for (size_t i = 0; i < mObservers.size(); i++) { if (mObservers[i].get() == observer) { mObservers.erase(mObservers.begin() + i); @@ -54,7 +54,7 @@ public: return mObservers.size() > 0; } - void reportFrameStats(const int64_t* stats) { + void reportFrameMetrics(const int64_t* stats) { BufferPool::Buffer* statsBuffer = mBufferPool->acquire(); if (statsBuffer != nullptr) { @@ -63,11 +63,12 @@ public: // notify on requested threads for (size_t i = 0; i < mObservers.size(); i++) { - mObservers[i]->notify(statsBuffer); + mObservers[i]->notify(statsBuffer, mDroppedReports); } // drop our reference statsBuffer->release(); + mDroppedReports = 0; } else { mDroppedReports++; } @@ -79,7 +80,7 @@ private: static const size_t kBufferCount = 3; static const size_t kBufferSize = static_cast<size_t>(FrameInfoIndex::NumIndexes); - std::vector< sp<FrameStatsObserver> > mObservers; + std::vector< sp<FrameMetricsObserver> > mObservers; sp<BufferPool> mBufferPool; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index ea702c01694e..4f528b1a3cd1 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -507,8 +507,8 @@ void CanvasContext::draw() { mJankTracker.addFrame(*mCurrentFrameInfo); mRenderThread.jankTracker().addFrame(*mCurrentFrameInfo); - if (CC_UNLIKELY(mFrameStatsReporter.get() != nullptr)) { - mFrameStatsReporter->reportFrameStats(mCurrentFrameInfo->data()); + if (CC_UNLIKELY(mFrameMetricsReporter.get() != nullptr)) { + mFrameMetricsReporter->reportFrameMetrics(mCurrentFrameInfo->data()); } GpuMemoryTracker::onFrameCompleted(); diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 168166ef5b23..1f819705dc3a 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -20,7 +20,7 @@ #include "DamageAccumulator.h" #include "FrameInfo.h" #include "FrameInfoVisualizer.h" -#include "FrameStatsReporter.h" +#include "FrameMetricsReporter.h" #include "IContextFactory.h" #include "LayerUpdateQueue.h" #include "RenderNode.h" @@ -142,26 +142,26 @@ public: return mRenderThread.renderState(); } - void addFrameStatsObserver(FrameStatsObserver* observer) { - if (mFrameStatsReporter.get() == nullptr) { - mFrameStatsReporter.reset(new FrameStatsReporter()); + void addFrameMetricsObserver(FrameMetricsObserver* observer) { + if (mFrameMetricsReporter.get() == nullptr) { + mFrameMetricsReporter.reset(new FrameMetricsReporter()); } - mFrameStatsReporter->addObserver(observer); + mFrameMetricsReporter->addObserver(observer); } - void removeFrameStatsObserver(FrameStatsObserver* observer) { - if (mFrameStatsReporter.get() != nullptr) { - mFrameStatsReporter->removeObserver(observer); - if (!mFrameStatsReporter->hasObservers()) { - mFrameStatsReporter.reset(nullptr); + void removeFrameMetricsObserver(FrameMetricsObserver* observer) { + if (mFrameMetricsReporter.get() != nullptr) { + mFrameMetricsReporter->removeObserver(observer); + if (!mFrameMetricsReporter->hasObservers()) { + mFrameMetricsReporter.reset(nullptr); } } } long getDroppedFrameReportCount() { - if (mFrameStatsReporter.get() != nullptr) { - return mFrameStatsReporter->getDroppedReports(); + if (mFrameMetricsReporter.get() != nullptr) { + return mFrameMetricsReporter->getDroppedReports(); } return 0; @@ -215,7 +215,7 @@ private: std::string mName; JankTracker mJankTracker; FrameInfoVisualizer mProfiler; - std::unique_ptr<FrameStatsReporter> mFrameStatsReporter; + std::unique_ptr<FrameMetricsReporter> mFrameMetricsReporter; std::set<RenderNode*> mPrefetechedLayers; diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 7c6cd7e014ef..04223a7d5188 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -568,17 +568,17 @@ void RenderProxy::serializeDisplayListTree() { post(task); } -CREATE_BRIDGE2(addFrameStatsObserver, CanvasContext* context, - FrameStatsObserver* frameStatsObserver) { - args->context->addFrameStatsObserver(args->frameStatsObserver); +CREATE_BRIDGE2(addFrameMetricsObserver, CanvasContext* context, + FrameMetricsObserver* frameStatsObserver) { + args->context->addFrameMetricsObserver(args->frameStatsObserver); if (args->frameStatsObserver != nullptr) { args->frameStatsObserver->decStrong(args->context); } return nullptr; } -void RenderProxy::addFrameStatsObserver(FrameStatsObserver* observer) { - SETUP_TASK(addFrameStatsObserver); +void RenderProxy::addFrameMetricsObserver(FrameMetricsObserver* observer) { + SETUP_TASK(addFrameMetricsObserver); args->context = mContext; args->frameStatsObserver = observer; if (observer != nullptr) { @@ -587,17 +587,17 @@ void RenderProxy::addFrameStatsObserver(FrameStatsObserver* observer) { post(task); } -CREATE_BRIDGE2(removeFrameStatsObserver, CanvasContext* context, - FrameStatsObserver* frameStatsObserver) { - args->context->removeFrameStatsObserver(args->frameStatsObserver); +CREATE_BRIDGE2(removeFrameMetricsObserver, CanvasContext* context, + FrameMetricsObserver* frameStatsObserver) { + args->context->removeFrameMetricsObserver(args->frameStatsObserver); if (args->frameStatsObserver != nullptr) { args->frameStatsObserver->decStrong(args->context); } return nullptr; } -void RenderProxy::removeFrameStatsObserver(FrameStatsObserver* observer) { - SETUP_TASK(removeFrameStatsObserver); +void RenderProxy::removeFrameMetricsObserver(FrameMetricsObserver* observer) { + SETUP_TASK(removeFrameMetricsObserver); args->context = mContext; args->frameStatsObserver = observer; if (observer != nullptr) { @@ -606,16 +606,6 @@ void RenderProxy::removeFrameStatsObserver(FrameStatsObserver* observer) { post(task); } -CREATE_BRIDGE1(getDroppedFrameReportCount, CanvasContext* context) { - return (void*) args->context->getDroppedFrameReportCount(); -} - -long RenderProxy::getDroppedFrameReportCount() { - SETUP_TASK(getDroppedFrameReportCount); - args->context = mContext; - return (long) postAndWait(task); -} - void RenderProxy::post(RenderTask* task) { mRenderThread.queue(task); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 178724a85d04..8d65a8259513 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -29,7 +29,7 @@ #include <utils/StrongPointer.h> #include "../Caches.h" -#include "../FrameStatsObserver.h" +#include "../FrameMetricsObserver.h" #include "../IContextFactory.h" #include "CanvasContext.h" #include "DrawFrameTask.h" @@ -113,8 +113,8 @@ public: ANDROID_API void drawRenderNode(RenderNode* node); ANDROID_API void setContentDrawBounds(int left, int top, int right, int bottom); - ANDROID_API void addFrameStatsObserver(FrameStatsObserver* observer); - ANDROID_API void removeFrameStatsObserver(FrameStatsObserver* observer); + ANDROID_API void addFrameMetricsObserver(FrameMetricsObserver* observer); + ANDROID_API void removeFrameMetricsObserver(FrameMetricsObserver* observer); ANDROID_API long getDroppedFrameReportCount(); private: diff --git a/libs/hwui/tests/unit/ClipAreaTests.cpp b/libs/hwui/tests/unit/ClipAreaTests.cpp index 4cae737ab295..679569ef5a78 100644 --- a/libs/hwui/tests/unit/ClipAreaTests.cpp +++ b/libs/hwui/tests/unit/ClipAreaTests.cpp @@ -133,7 +133,7 @@ TEST(ClipArea, serializeClip) { ASSERT_NE(nullptr, serializedClip); ASSERT_EQ(ClipMode::Rectangle, serializedClip->mode); auto clipRect = reinterpret_cast<const ClipRect*>(serializedClip); - ASSERT_EQ(Rect(200, 200), clipRect->rect); + EXPECT_EQ(Rect(200, 200), clipRect->rect); EXPECT_EQ(serializedClip, area.serializeClip(allocator)) << "Requery of clip on unmodified ClipArea must return same pointer."; } @@ -147,7 +147,10 @@ TEST(ClipArea, serializeClip) { ASSERT_NE(nullptr, serializedClip); ASSERT_EQ(ClipMode::RectangleList, serializedClip->mode); auto clipRectList = reinterpret_cast<const ClipRectList*>(serializedClip); - ASSERT_EQ(2, clipRectList->rectList.getTransformedRectanglesCount()); + EXPECT_EQ(2, clipRectList->rectList.getTransformedRectanglesCount()); + EXPECT_FALSE(clipRectList->rect.isEmpty()); + EXPECT_FLOAT_EQ(199.87817f, clipRectList->rect.right) + << "Right side should be clipped by rotated rect"; EXPECT_EQ(serializedClip, area.serializeClip(allocator)) << "Requery of clip on unmodified ClipArea must return same pointer."; } @@ -161,8 +164,9 @@ TEST(ClipArea, serializeClip) { ASSERT_NE(nullptr, serializedClip); ASSERT_EQ(ClipMode::Region, serializedClip->mode); auto clipRegion = reinterpret_cast<const ClipRegion*>(serializedClip); - ASSERT_EQ(SkIRect::MakeWH(200, 200), clipRegion->region.getBounds()) + EXPECT_EQ(SkIRect::MakeWH(200, 200), clipRegion->region.getBounds()) << "Clip region should be 200x200"; + EXPECT_EQ(Rect(200, 200), clipRegion->rect); EXPECT_EQ(serializedClip, area.serializeClip(allocator)) << "Requery of clip on unmodified ClipArea must return same pointer."; } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 800b91497058..e342385f4c6c 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -1014,9 +1014,12 @@ public class AudioRecord implements AudioRouting * Reads audio data from the audio hardware for recording into a byte array. * The format specified in the AudioRecord constructor should be * {@link AudioFormat#ENCODING_PCM_8BIT} to correspond to the data in the array. + * The format can be {@link AudioFormat#ENCODING_PCM_16BIT}, but this is deprecated. * @param audioData the array to which the recorded audio data is written. - * @param offsetInBytes index in audioData from which the data is written expressed in bytes. + * @param offsetInBytes index in audioData to which the data is written expressed in bytes. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInBytes the number of requested bytes. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param readMode one of {@link #READ_BLOCKING}, {@link #READ_NON_BLOCKING}. * <br>With {@link #READ_BLOCKING}, the read will block until all the requested data * is read. @@ -1025,7 +1028,8 @@ public class AudioRecord implements AudioRouting * @return the number of bytes that were read or {@link #ERROR_INVALID_OPERATION} * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if * the parameters don't resolve to valid data and indexes. - * The number of bytes will not exceed sizeInBytes. + * The number of bytes will be a multiple of the frame size in bytes + * not to exceed sizeInBytes. */ public int read(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes, @ReadMode int readMode) { @@ -1053,12 +1057,14 @@ public class AudioRecord implements AudioRouting * The format specified in the AudioRecord constructor should be * {@link AudioFormat#ENCODING_PCM_16BIT} to correspond to the data in the array. * @param audioData the array to which the recorded audio data is written. - * @param offsetInShorts index in audioData from which the data is written expressed in shorts. + * @param offsetInShorts index in audioData to which the data is written expressed in shorts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInShorts the number of requested shorts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @return the number of shorts that were read or {@link #ERROR_INVALID_OPERATION} * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if * the parameters don't resolve to valid data and indexes. - * The number of shorts will not exceed sizeInShorts. + * The number of shorts will be a multiple of the channel count not to exceed sizeInShorts. */ public int read(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts) { return read(audioData, offsetInShorts, sizeInShorts, READ_BLOCKING); @@ -1070,7 +1076,9 @@ public class AudioRecord implements AudioRouting * {@link AudioFormat#ENCODING_PCM_16BIT} to correspond to the data in the array. * @param audioData the array to which the recorded audio data is written. * @param offsetInShorts index in audioData from which the data is written expressed in shorts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInShorts the number of requested shorts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param readMode one of {@link #READ_BLOCKING}, {@link #READ_NON_BLOCKING}. * <br>With {@link #READ_BLOCKING}, the read will block until all the requested data * is read. @@ -1079,7 +1087,7 @@ public class AudioRecord implements AudioRouting * @return the number of shorts that were read or {@link #ERROR_INVALID_OPERATION} * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if * the parameters don't resolve to valid data and indexes. - * The number of shorts will not exceed sizeInShorts. + * The number of shorts will be a multiple of the channel count not to exceed sizeInShorts. */ public int read(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts, @ReadMode int readMode) { @@ -1108,7 +1116,9 @@ public class AudioRecord implements AudioRouting * {@link AudioFormat#ENCODING_PCM_FLOAT} to correspond to the data in the array. * @param audioData the array to which the recorded audio data is written. * @param offsetInFloats index in audioData from which the data is written. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInFloats the number of requested floats. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param readMode one of {@link #READ_BLOCKING}, {@link #READ_NON_BLOCKING}. * <br>With {@link #READ_BLOCKING}, the read will block until all the requested data * is read. @@ -1117,7 +1127,7 @@ public class AudioRecord implements AudioRouting * @return the number of floats that were read or {@link #ERROR_INVALID_OPERATION} * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if * the parameters don't resolve to valid data and indexes. - * The number of floats will not exceed sizeInFloats. + * The number of floats will be a multiple of the channel count not to exceed sizeInFloats. */ public int read(@NonNull float[] audioData, int offsetInFloats, int sizeInFloats, @ReadMode int readMode) { @@ -1154,6 +1164,7 @@ public class AudioRecord implements AudioRouting * The representation of the data in the buffer will depend on the format specified in * the AudioRecord constructor, and will be native endian. * @param audioBuffer the direct buffer to which the recorded audio data is written. + * Data is written to audioBuffer.position(). * @param sizeInBytes the number of requested bytes. It is recommended but not enforced * that the number of bytes requested be a multiple of the frame size (sample size in * bytes multiplied by the channel count). @@ -1161,7 +1172,7 @@ public class AudioRecord implements AudioRouting * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if * the parameters don't resolve to valid data and indexes. * The number of bytes will not exceed sizeInBytes. - * The number of bytes read will truncated to be a multiple of the frame size. + * The number of bytes read will be truncated to be a multiple of the frame size. */ public int read(@NonNull ByteBuffer audioBuffer, int sizeInBytes) { return read(audioBuffer, sizeInBytes, READ_BLOCKING); @@ -1175,6 +1186,7 @@ public class AudioRecord implements AudioRouting * The representation of the data in the buffer will depend on the format specified in * the AudioRecord constructor, and will be native endian. * @param audioBuffer the direct buffer to which the recorded audio data is written. + * Data is written to audioBuffer.position(). * @param sizeInBytes the number of requested bytes. It is recommended but not enforced * that the number of bytes requested be a multiple of the frame size (sample size in * bytes multiplied by the channel count). @@ -1187,7 +1199,7 @@ public class AudioRecord implements AudioRouting * if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if * the parameters don't resolve to valid data and indexes. * The number of bytes will not exceed sizeInBytes. - * The number of bytes read will truncated to be a multiple of the frame size. + * The number of bytes read will be truncated to be a multiple of the frame size. */ public int read(@NonNull ByteBuffer audioBuffer, int sizeInBytes, @ReadMode int readMode) { if (mState != STATE_INITIALIZED) { diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index b26b310a904b..bdf6d9f19558 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -1774,6 +1774,7 @@ public class AudioTrack implements AudioRouting * or copies audio data for later playback (static buffer mode). * The format specified in the AudioTrack constructor should be * {@link AudioFormat#ENCODING_PCM_8BIT} to correspond to the data in the array. + * The format can be {@link AudioFormat#ENCODING_PCM_16BIT}, but this is deprecated. * <p> * In streaming mode, the write will normally block until all the data has been enqueued for * playback, and will return a full transfer count. However, if the track is stopped or paused @@ -1786,7 +1787,9 @@ public class AudioTrack implements AudioRouting * @param audioData the array that holds the data to play. * @param offsetInBytes the offset expressed in bytes in audioData where the data to write * starts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInBytes the number of bytes to write in audioData after the offset. + * Must not be negative, or cause the data access to go out of bounds of the array. * @return zero or the positive number of bytes that were written, or * {@link #ERROR_INVALID_OPERATION} * if the track isn't properly initialized, or {@link #ERROR_BAD_VALUE} if @@ -1795,6 +1798,8 @@ public class AudioTrack implements AudioRouting * needs to be recreated. * The dead object error code is not returned if some data was successfully transferred. * In this case, the error is returned at the next write(). + * The number of bytes will be a multiple of the frame size in bytes + * not to exceed sizeInBytes. * * This is equivalent to {@link #write(byte[], int, int, int)} with <code>writeMode</code> * set to {@link #WRITE_BLOCKING}. @@ -1808,6 +1813,7 @@ public class AudioTrack implements AudioRouting * or copies audio data for later playback (static buffer mode). * The format specified in the AudioTrack constructor should be * {@link AudioFormat#ENCODING_PCM_8BIT} to correspond to the data in the array. + * The format can be {@link AudioFormat#ENCODING_PCM_16BIT}, but this is deprecated. * <p> * In streaming mode, the blocking behavior depends on the write mode. If the write mode is * {@link #WRITE_BLOCKING}, the write will normally block until all the data has been enqueued @@ -1823,7 +1829,9 @@ public class AudioTrack implements AudioRouting * @param audioData the array that holds the data to play. * @param offsetInBytes the offset expressed in bytes in audioData where the data to write * starts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInBytes the number of bytes to write in audioData after the offset. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. It has no * effect in static mode. * <br>With {@link #WRITE_BLOCKING}, the write will block until all data has been written @@ -1838,6 +1846,8 @@ public class AudioTrack implements AudioRouting * needs to be recreated. * The dead object error code is not returned if some data was successfully transferred. * In this case, the error is returned at the next write(). + * The number of bytes will be a multiple of the frame size in bytes + * not to exceed sizeInBytes. */ public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes, @WriteMode int writeMode) { @@ -1887,7 +1897,9 @@ public class AudioTrack implements AudioRouting * @param audioData the array that holds the data to play. * @param offsetInShorts the offset expressed in shorts in audioData where the data to play * starts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInShorts the number of shorts to read in audioData after the offset. + * Must not be negative, or cause the data access to go out of bounds of the array. * @return zero or the positive number of shorts that were written, or * {@link #ERROR_INVALID_OPERATION} * if the track isn't properly initialized, or {@link #ERROR_BAD_VALUE} if @@ -1896,6 +1908,7 @@ public class AudioTrack implements AudioRouting * needs to be recreated. * The dead object error code is not returned if some data was successfully transferred. * In this case, the error is returned at the next write(). + * The number of shorts will be a multiple of the channel count not to exceed sizeInShorts. * * This is equivalent to {@link #write(short[], int, int, int)} with <code>writeMode</code> * set to {@link #WRITE_BLOCKING}. @@ -1923,7 +1936,9 @@ public class AudioTrack implements AudioRouting * @param audioData the array that holds the data to write. * @param offsetInShorts the offset expressed in shorts in audioData where the data to write * starts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInShorts the number of shorts to read in audioData after the offset. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. It has no * effect in static mode. * <br>With {@link #WRITE_BLOCKING}, the write will block until all data has been written @@ -1938,6 +1953,7 @@ public class AudioTrack implements AudioRouting * needs to be recreated. * The dead object error code is not returned if some data was successfully transferred. * In this case, the error is returned at the next write(). + * The number of shorts will be a multiple of the channel count not to exceed sizeInShorts. */ public int write(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts, @WriteMode int writeMode) { @@ -1999,7 +2015,9 @@ public class AudioTrack implements AudioRouting * to provide samples values within the nominal range. * @param offsetInFloats the offset, expressed as a number of floats, * in audioData where the data to write starts. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param sizeInFloats the number of floats to write in audioData after the offset. + * Must not be negative, or cause the data access to go out of bounds of the array. * @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. It has no * effect in static mode. * <br>With {@link #WRITE_BLOCKING}, the write will block until all data has been written @@ -2014,6 +2032,7 @@ public class AudioTrack implements AudioRouting * needs to be recreated. * The dead object error code is not returned if some data was successfully transferred. * In this case, the error is returned at the next write(). + * The number of floats will be a multiple of the channel count not to exceed sizeInFloats. */ public int write(@NonNull float[] audioData, int offsetInFloats, int sizeInFloats, @WriteMode int writeMode) { @@ -2075,7 +2094,9 @@ public class AudioTrack implements AudioRouting * <BR>Note that upon return, the buffer position (<code>audioData.position()</code>) will * have been advanced to reflect the amount of data that was successfully written to * the AudioTrack. - * @param sizeInBytes number of bytes to write. + * @param sizeInBytes number of bytes to write. It is recommended but not enforced + * that the number of bytes requested be a multiple of the frame size (sample size in + * bytes multiplied by the channel count). * <BR>Note this may differ from <code>audioData.remaining()</code>, but cannot exceed it. * @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. It has no * effect in static mode. @@ -2142,7 +2163,9 @@ public class AudioTrack implements AudioRouting * <BR>Note that upon return, the buffer position (<code>audioData.position()</code>) will * have been advanced to reflect the amount of data that was successfully written to * the AudioTrack. - * @param sizeInBytes number of bytes to write. + * @param sizeInBytes number of bytes to write. It is recommended but not enforced + * that the number of bytes requested be a multiple of the frame size (sample size in + * bytes multiplied by the channel count). * <BR>Note this may differ from <code>audioData.remaining()</code>, but cannot exceed it. * @param writeMode one of {@link #WRITE_BLOCKING}, {@link #WRITE_NON_BLOCKING}. * <BR>With {@link #WRITE_BLOCKING}, the write will block until all data has been written diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl index d18933385463..12a220f2974f 100644 --- a/media/java/android/media/tv/ITvInputManager.aidl +++ b/media/java/android/media/tv/ITvInputManager.aidl @@ -88,7 +88,7 @@ interface ITvInputManager { // For the recording session void connect(in IBinder sessionToken, in Uri channelUri, in Bundle params, int userId); - void startRecording(in IBinder sessionToken, int userId); + void startRecording(in IBinder sessionToken, in Uri programHint, int userId); void stopRecording(in IBinder sessionToken, int userId); // For TV input hardware binding diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl index 408a76277845..07781bc0a042 100644 --- a/media/java/android/media/tv/ITvInputSession.aidl +++ b/media/java/android/media/tv/ITvInputSession.aidl @@ -58,6 +58,6 @@ oneway interface ITvInputSession { // For the recording session void connect(in Uri channelUri, in Bundle params); void disconnect(); - void startRecording(); + void startRecording(in Uri programHint); void stopRecording(); } diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java index 4ac58766ca94..b15acef583b0 100644 --- a/media/java/android/media/tv/ITvInputSessionWrapper.java +++ b/media/java/android/media/tv/ITvInputSessionWrapper.java @@ -16,6 +16,7 @@ package android.media.tv; +import android.annotation.Nullable; import android.content.Context; import android.graphics.Rect; import android.media.PlaybackParams; @@ -220,7 +221,7 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand break; } case DO_START_RECORDING: { - mTvInputRecordingSessionImpl.startRecording(); + mTvInputRecordingSessionImpl.startRecording((Uri) msg.obj); break; } case DO_STOP_RECORDING: { @@ -366,8 +367,8 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand } @Override - public void startRecording() { - mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_START_RECORDING)); + public void startRecording(@Nullable Uri programHint) { + mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_START_RECORDING, programHint)); } @Override diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java index 62a01dcf8808..82c5a8efab5f 100644 --- a/media/java/android/media/tv/TvContract.java +++ b/media/java/android/media/tv/TvContract.java @@ -27,6 +27,7 @@ import android.os.IBinder; import android.provider.BaseColumns; import android.util.ArraySet; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -1020,22 +1021,28 @@ public final class TvContract { * * <p>Use the same language appeared in the underlying broadcast standard, if applicable. * (For example, one can refer to the genre strings used in Genre Descriptor of ATSC A/65 or - * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty. + * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty. Use + * {@link Genres#encode} to create a text that can be stored in this column. Use + * {@link Genres#decode} to get the broadcast genre strings from the text stored in the + * column. * * <p>Type: TEXT + * @see Genres#encode + * @see Genres#decode */ public static final String COLUMN_BROADCAST_GENRE = "broadcast_genre"; /** * The comma-separated canonical genre string of this TV program. * - * <p>Canonical genres are defined in {@link Genres}. Use - * {@link Genres#encode Genres.encode()} to create a text that can be stored in this column. - * Use {@link Genres#decode Genres.decode()} to get the canonical genre strings from the - * text stored in this column. + * <p>Canonical genres are defined in {@link Genres}. Use {@link Genres#encode} to create a + * text that can be stored in this column. Use {@link Genres#decode} to get the canonical + * genre strings from the text stored in the column. * * <p>Type: TEXT * @see Genres + * @see Genres#encode + * @see Genres#decode */ public static final String COLUMN_CANONICAL_GENRE = "canonical_genre"; @@ -1303,34 +1310,87 @@ public final class TvContract { CANONICAL_GENRES.add(TECH_SCIENCE); } + private static final char DOUBLE_QUOTE = '"'; + private static final char COMMA = ','; + private static final String DELIMITER = ","; + private Genres() {} /** - * Encodes canonical genre strings to a text that can be put into the database. + * Encodes genre strings to a text that can be put into the database. * - * @param genres Canonical genre strings. Use the strings defined in this class. + * @param genres Genre strings. * @return an encoded genre string that can be inserted into the - * {@link #COLUMN_CANONICAL_GENRE} column. + * {@link #COLUMN_BROADCAST_GENRE} or {@link #COLUMN_CANONICAL_GENRE} column. */ public static String encode(String... genres) { StringBuilder sb = new StringBuilder(); String separator = ""; for (String genre : genres) { - sb.append(separator).append(genre); - separator = ","; + sb.append(separator).append(encodeToCsv(genre)); + separator = DELIMITER; + } + return sb.toString(); + } + + private static String encodeToCsv(String genre) { + StringBuilder sb = new StringBuilder(); + int length = genre.length(); + for (int i = 0; i < length; ++i) { + char c = genre.charAt(i); + switch (c) { + case DOUBLE_QUOTE: + sb.append(DOUBLE_QUOTE); + break; + case COMMA: + sb.append(DOUBLE_QUOTE); + break; + } + sb.append(c); } return sb.toString(); } /** - * Decodes the canonical genre strings from the text stored in the database. + * Decodes the genre strings from the text stored in the database. * * @param genres The encoded genre string retrieved from the - * {@link #COLUMN_CANONICAL_GENRE} column. - * @return canonical genre strings. + * {@link #COLUMN_BROADCAST_GENRE} or {@link #COLUMN_CANONICAL_GENRE} column. + * @return genre strings. */ public static String[] decode(String genres) { - return genres.split("\\s*,\\s*"); + StringBuilder sb = new StringBuilder(); + List<String> results = new ArrayList<>(); + int length = genres.length(); + boolean escape = false; + for (int i = 0; i < length; ++i) { + char c = genres.charAt(i); + switch (c) { + case DOUBLE_QUOTE: + if (!escape) { + escape = true; + continue; + } + break; + case COMMA: + if (!escape) { + String string = sb.toString().trim(); + if (string.length() > 0) { + results.add(string); + } + sb = new StringBuilder(); + continue; + } + break; + } + sb.append(c); + escape = false; + } + String string = sb.toString().trim(); + if (string.length() > 0) { + results.add(string); + } + return results.toArray(new String[results.size()]); } /** @@ -1441,7 +1501,10 @@ public final class TvContract { * * <p>Use the same language appeared in the underlying broadcast standard, if applicable. * (For example, one can refer to the genre strings used in Genre Descriptor of ATSC A/65 or - * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty. + * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty. Use + * {@link Genres#encode Genres.encode()} to create a text that can be stored in this column. + * Use {@link Genres#decode Genres.decode()} to get the broadcast genre strings from the + * text stored in the column. * * <p>Type: TEXT * @see Programs#COLUMN_BROADCAST_GENRE @@ -1454,7 +1517,7 @@ public final class TvContract { * <p>Canonical genres are defined in {@link Programs.Genres}. Use * {@link Programs.Genres#encode Genres.encode()} to create a text that can be stored in * this column. Use {@link Programs.Genres#decode Genres.decode()} to get the canonical - * genre strings from the text stored in this column. + * genre strings from the text stored in the column. * * <p>Type: TEXT * @see Programs#COLUMN_CANONICAL_GENRE diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 1cd19589cb94..d76408e3a9d3 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -2039,22 +2039,25 @@ public final class TvInputManager { } /** - * Starts TV program recording for the current recording session. + * Starts TV program recording in the current recording session. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be {@code null}. */ - void startRecording() { + void startRecording(@Nullable Uri programHint) { if (mToken == null) { Log.w(TAG, "The session has been already released"); return; } try { - mService.startRecording(mToken, mUserId); + mService.startRecording(mToken, programHint, mUserId); } catch (RemoteException e) { throw new RuntimeException(e); } } /** - * Stops TV program recording for the current recording session. + * Stops TV program recording in the current recording session. */ void stopRecording() { if (mToken == null) { diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index d48b2c8b0816..91f1ee9f7e33 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -1699,16 +1699,26 @@ public abstract class TvInputService extends Service { * Called when the application requests to start recording. Recording must start * immediately. * + * <p>The application may supply the URI for a TV program as a hint for filling in program + * specific data fields in the {@link android.media.tv.TvContract.RecordedPrograms} table. + * A non-null {@code programHint} implies the started recording should be of that specific + * program, whereas null {@code programHint} does not impose such a requirement and the + * recording can span across multiple TV programs. In either case, the application must call + * {@link TvRecordingClient#stopRecording()} to stop the recording. + * * <p>The session must call either {@link #notifyRecordingStarted()} or - * {@link #notifyError(int)}}. + * {@link #notifyError(int)}. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be {@code null}. */ - public abstract void onStartRecording(); + public abstract void onStartRecording(@Nullable Uri programHint); /** * Called when the application requests to stop recording. Recording must stop immediately. * * <p>The session must call either {@link #notifyRecordingStopped(Uri)} or - * {@link #notifyError(int)}}. + * {@link #notifyError(int)}. */ public abstract void onStopRecording(); @@ -1744,11 +1754,11 @@ public abstract class TvInputService extends Service { } /** - * Calls {@link #onStartRecording()}. + * Calls {@link #onStartRecording(Uri)}. * */ - void startRecording() { - onStartRecording(); + void startRecording(@Nullable Uri programHint) { + onStartRecording(programHint); } /** diff --git a/media/java/android/media/tv/TvRecordingClient.java b/media/java/android/media/tv/TvRecordingClient.java index 1d80068fbdf8..b943c3d5f559 100644 --- a/media/java/android/media/tv/TvRecordingClient.java +++ b/media/java/android/media/tv/TvRecordingClient.java @@ -17,6 +17,7 @@ package android.media.tv; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.Context; import android.net.Uri; @@ -131,20 +132,31 @@ public class TvRecordingClient { } /** - * Starts TV program recording for the current recording session. It is expected that recording + * Starts TV program recording in the current recording session. It is expected that recording * starts immediately after calling this method. * + * <p>The application may supply the URI for a TV program as a hint to the corresponding TV + * input service for filling in program specific data fields in the + * {@link android.media.tv.TvContract.RecordedPrograms} table. A non-null {@code programHint} + * implies the started recording should be of that specific program, whereas null + * {@code programHint} does not impose such a requirement and the recording can span across + * multiple TV programs. In either case, the caller must call {@link #stopRecording()} to stop + * the recording. + * * <p>The recording session will respond by calling * {@link RecordingCallback#onRecordingStarted()} or {@link RecordingCallback#onError(int)}. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be null. */ - public void startRecording() { + public void startRecording(@Nullable Uri programHint) { if (mSession != null) { - mSession.startRecording(); + mSession.startRecording(programHint); } } /** - * Stops TV program recording for the current recording session. It is expected that recording + * Stops TV program recording in the current recording session. It is expected that recording * stops immediately after calling this method. * * <p>The recording session will respond by calling @@ -325,7 +337,7 @@ public class TvRecordingClient { @Override public void onRecordingStopped(TvInputManager.Session session, Uri recordedProgramUri) { if (DEBUG) { - Log.d(TAG, "onRecordingStopped()"); + Log.d(TAG, "onRecordingStopped(recordedProgramUri= " + recordedProgramUri + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onRecordingStopped - session not created"); @@ -337,7 +349,7 @@ public class TvRecordingClient { @Override public void onError(TvInputManager.Session session, int error) { if (DEBUG) { - Log.d(TAG, "onError()"); + Log.d(TAG, "onError(error=" + error + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onError - session not created"); @@ -350,7 +362,8 @@ public class TvRecordingClient { public void onSessionEvent(TvInputManager.Session session, String eventType, Bundle eventArgs) { if (DEBUG) { - Log.d(TAG, "onSessionEvent(" + eventType + ")"); + Log.d(TAG, "onSessionEvent(eventType=" + eventType + ", eventArgs=" + eventArgs + + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onSessionEvent - session not created"); diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow_am_alpha.png Binary files differdeleted file mode 100644 index e4881dd03446..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow_am_alpha.png Binary files differdeleted file mode 100644 index 66725e5c94ce..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow_am_alpha.png Binary files differdeleted file mode 100644 index cdf21b1e300b..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow_am_alpha.png Binary files differdeleted file mode 100644 index 050313f41c1b..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_subdirectory_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_subdirectory_arrow_am_alpha.png Binary files differdeleted file mode 100644 index 8fddb85f2f02..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_subdirectory_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable/ic_subdirectory_arrow.xml b/packages/DocumentsUI/res/drawable/ic_subdirectory_arrow.xml index 5723233b8213..0f34ba446373 100644 --- a/packages/DocumentsUI/res/drawable/ic_subdirectory_arrow.xml +++ b/packages/DocumentsUI/res/drawable/ic_subdirectory_arrow.xml @@ -1,5 +1,24 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_subdirectory_arrow_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> +<!-- +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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="?android:attr/colorControlNormal" + android:pathData="M19 15l-6 6,-1.42,-1.42L15.17 16H4V4h2v10h9.17l-3.59,-3.58L13 9l6 6z"/> +</vector> diff --git a/packages/DocumentsUI/res/layout/directory_cluster.xml b/packages/DocumentsUI/res/layout/directory_cluster.xml index 2fa09d39bdab..d84ef0823309 100644 --- a/packages/DocumentsUI/res/layout/directory_cluster.xml +++ b/packages/DocumentsUI/res/layout/directory_cluster.xml @@ -27,6 +27,7 @@ <FrameLayout android:id="@+id/container_directory" + android:clipToPadding="false" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml index 223d7290e72f..d0364ff44294 100644 --- a/packages/DocumentsUI/res/layout/fragment_directory.xml +++ b/packages/DocumentsUI/res/layout/fragment_directory.xml @@ -17,8 +17,10 @@ <com.android.documentsui.DirectoryView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:animateLayoutChanges="true"> + android:background="@color/window_background" + android:outlineProvider="bounds" + android:elevation="4dp" + android:orientation="vertical"> <ProgressBar android:id="@+id/progressbar" @@ -43,6 +45,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + android:background="@color/window_background" android:visibility="gone"> <LinearLayout @@ -81,7 +84,6 @@ <android.support.v7.widget.RecyclerView android:id="@+id/list" - android:background="@color/window_background" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" diff --git a/packages/DocumentsUI/res/layout/item_subdir.xml b/packages/DocumentsUI/res/layout/item_subdir.xml index b2a739ac579f..821432d96799 100644 --- a/packages/DocumentsUI/res/layout/item_subdir.xml +++ b/packages/DocumentsUI/res/layout/item_subdir.xml @@ -26,8 +26,8 @@ <ImageView android:id="@+id/subdir" - android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_width="24dp" + android:layout_height="24dp" android:paddingEnd="8dp" android:scaleType="centerInside" android:visibility="gone" diff --git a/packages/DocumentsUI/res/values-az-rAZ/strings.xml b/packages/DocumentsUI/res/values-az-rAZ/strings.xml index 7fb1d068546c..53566d46dbc0 100644 --- a/packages/DocumentsUI/res/values-az-rAZ/strings.xml +++ b/packages/DocumentsUI/res/values-az-rAZ/strings.xml @@ -26,7 +26,7 @@ <string name="menu_list" msgid="7279285939892417279">"Siyahı görünüşü"</string> <string name="menu_sort" msgid="7677740407158414452">"Bunlardan biri üzrə sırala"</string> <string name="menu_search" msgid="3816712084502856974">"Axtarış"</string> - <string name="menu_settings" msgid="8239065133341597825">"Yaddaş parametrləri"</string> + <string name="menu_settings" msgid="8239065133341597825">"Yaddaş ayarları"</string> <string name="menu_open" msgid="432922957274920903">"Açın"</string> <string name="menu_save" msgid="2394743337684426338">"Yadda saxlayın"</string> <string name="menu_share" msgid="3075149983979628146">"Paylaşın"</string> diff --git a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml index 40e4a0717249..1e1a2f773197 100644 --- a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml +++ b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Sakrij osnovne elemente"</string> <string name="save_error" msgid="6167009778003223664">"Čuvanje dokumenta nije uspelo"</string> <string name="create_error" msgid="3735649141335444215">"Direktorijum nije napravljen"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Učitavanje sadržaja trenutno nije moguće"</string> <string name="root_recent" msgid="4470053704320518133">"Nedavno"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Slobodno je <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Usluge skladištenja"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Još aplikacija"</string> <string name="empty" msgid="7858882803708117596">"Nema stavki"</string> <string name="no_results" msgid="6622510343880730446">"Nema podudaranja u %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Otvaranje datoteke nije uspelo"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nije moguće izbrisati neke dokumente"</string> <string name="share_via" msgid="8966594246261344259">"Delite preko"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopiranje datoteka"</string> @@ -89,15 +87,25 @@ <string name="copy_preparing" msgid="3896202461003039386">"Priprema se kopiranje…"</string> <string name="move_preparing" msgid="2772219441375531410">"Priprema se premeštanje..."</string> <string name="delete_preparing" msgid="5655813182533491992">"Priprema se brisanje…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Nismo uspeli da kopiramo <xliff:g id="COUNT_1">%1$d</xliff:g> datoteku</item> + <item quantity="few">Nismo uspeli da kopiramo <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke</item> + <item quantity="other">Nismo uspeli da kopiramo <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Premeštanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nije uspelo</item> + <item quantity="few">Premeštanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nije uspelo</item> + <item quantity="other">Premeštanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije uspelo</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nije uspelo</item> + <item quantity="few">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nije uspelo</item> + <item quantity="other">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije uspelo</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Dodirnite da biste prikazali detalje"</string> <string name="close" msgid="3043722427445528732">"Zatvori"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Sledeće datoteke nisu kopirane: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Sledeće datoteke nisu premeštene: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ove datoteke su konvertovane u drugi format: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one">Kopirali ste <xliff:g id="COUNT_1">%1$d</xliff:g> datoteku u privremenu memoriju.</item> diff --git a/packages/DocumentsUI/res/values-bn-rBD/strings.xml b/packages/DocumentsUI/res/values-bn-rBD/strings.xml index e87a8240c633..f53cfa82e67c 100644 --- a/packages/DocumentsUI/res/values-bn-rBD/strings.xml +++ b/packages/DocumentsUI/res/values-bn-rBD/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"রুটগুলি লুকান"</string> <string name="save_error" msgid="6167009778003223664">"দস্তাবেজ সংরক্ষণ করতে ব্যর্থ হয়েছে"</string> <string name="create_error" msgid="3735649141335444215">"ফোল্ডার তৈরি করতে ব্যর্থ হয়েছে"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"এই মুহূর্তে সামগ্রী লোড করা যাবে না"</string> <string name="root_recent" msgid="4470053704320518133">"সাম্প্রতিক"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> খালি আছে"</string> <string name="root_type_service" msgid="2178854894416775409">"সঞ্চয়স্থান পরিষেবাগুলি"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"আরো অ্যাপ্লিকেশান"</string> <string name="empty" msgid="7858882803708117596">"কোনো আইটেম নেই"</string> <string name="no_results" msgid="6622510343880730446">"%1$s এ কোনো মিল নেই"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"ফাইল খোলা যাবে না"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"কিছু দস্তাবেজ মুছতে অসমর্থ"</string> <string name="share_via" msgid="8966594246261344259">"এর মাধ্যমে শেয়ার করুন"</string> <string name="copy_notification_title" msgid="6374299806748219777">"ফাইলগুলি অনুলিপি করা হচ্ছে"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"অনুলিপি করার জন্য প্রস্তুত করা হচ্ছে..."</string> <string name="move_preparing" msgid="2772219441375531410">"সরানোর জন্য প্রস্তুত হচ্ছে..."</string> <string name="delete_preparing" msgid="5655813182533491992">"মোছার জন্য প্রস্তুত করা হচ্ছে..."</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল প্রতিলিপি করা গেল না</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল প্রতিলিপি করা গেল না</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল সরানো গেল না</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল সরানো গেল না</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল মোছা গেল না</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল মোছা গেল না</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"বিশদ বিবরণ দেখতে আলতো চাপুন"</string> <string name="close" msgid="3043722427445528732">"বন্ধ করুন"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"এই ফাইলগুলির প্রতিলিপি করা হয়নি: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"এই ফাইলগুলি সরানো হয়নি: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"এই ফাইলগুলি অন্য ফরম্যাটে রূপান্তর করা হয়েছে: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল ক্লিপবোর্ডে প্রতিলিপি করা হয়েছে।</item> diff --git a/packages/DocumentsUI/res/values-bs-rBA/strings.xml b/packages/DocumentsUI/res/values-bs-rBA/strings.xml index 9c7b71aba4a4..21a0a97877fb 100644 --- a/packages/DocumentsUI/res/values-bs-rBA/strings.xml +++ b/packages/DocumentsUI/res/values-bs-rBA/strings.xml @@ -89,8 +89,7 @@ <skip /> <!-- no translation found for create_error (3735649141335444215) --> <skip /> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Trenutno nije moguće učitati sadržaj"</string> <!-- no translation found for root_recent (4470053704320518133) --> <skip /> <!-- no translation found for root_available_bytes (8568452858617033281) --> @@ -106,8 +105,7 @@ <!-- no translation found for empty (7858882803708117596) --> <skip /> <string name="no_results" msgid="6622510343880730446">"Nema rezultata u %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Nije moguće otvoriti fajl"</string> <!-- no translation found for toast_failed_delete (2180678019407244069) --> <skip /> <!-- no translation found for share_via (8966594246261344259) --> @@ -128,15 +126,25 @@ <!-- no translation found for move_preparing (2772219441375531410) --> <skip /> <string name="delete_preparing" msgid="5655813182533491992">"Pripremanje za brisanje…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Nije moguće kopirati <xliff:g id="COUNT_1">%1$d</xliff:g> fajl</item> + <item quantity="few">Nije moguće kopirati <xliff:g id="COUNT_1">%1$d</xliff:g> fajla</item> + <item quantity="other">Nije moguće kopirati <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Nije moguće premjestiti <xliff:g id="COUNT_1">%1$d</xliff:g> fajl</item> + <item quantity="few">Nije moguće premjestiti <xliff:g id="COUNT_1">%1$d</xliff:g> fajla</item> + <item quantity="other">Nije moguće premjestiti <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Nije moguće izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajl</item> + <item quantity="few">Nije moguće izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajla</item> + <item quantity="other">Nije moguće izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Dodirnite za prikaz detalja"</string> <string name="close" msgid="3043722427445528732">"Zatvori"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Nisu kopirani sljedeći fajlovi: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Nisu premješteni sljedeći fajlovi: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ove datoteke su pretvorene u drugi format: <xliff:g id="LIST">%1$s</xliff:g>"</string> <!-- no translation found for clipboard_files_clipped (855459017537058539) --> <!-- no translation found for clipboard_files_cannot_paste (2878324825602325706) --> diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml index 2cb22c8820d3..96bfbb79c3e7 100644 --- a/packages/DocumentsUI/res/values-ca/strings.xml +++ b/packages/DocumentsUI/res/values-ca/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Amaga les arrels"</string> <string name="save_error" msgid="6167009778003223664">"No s\'ha pogut desar el document."</string> <string name="create_error" msgid="3735649141335444215">"No s\'ha pogut crear la carpeta"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"En aquest moment no es pot carregar el contingut"</string> <string name="root_recent" msgid="4470053704320518133">"Recent"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> lliures"</string> <string name="root_type_service" msgid="2178854894416775409">"Serveis d\'emmagatzematge"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Més aplicacions"</string> <string name="empty" msgid="7858882803708117596">"Sense elements"</string> <string name="no_results" msgid="6622510343880730446">"No hi ha cap coincidència a %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"No es pot obrir el fitxer"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"No es poden suprimir alguns documents."</string> <string name="share_via" msgid="8966594246261344259">"Comparteix mitjançant"</string> <string name="copy_notification_title" msgid="6374299806748219777">"S\'estan copiant fitxers"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"S\'està preparant una còpia…"</string> <string name="move_preparing" msgid="2772219441375531410">"S\'està preparant per moure\'ls..."</string> <string name="delete_preparing" msgid="5655813182533491992">"S\'està preparant per suprimir…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">No s\'han pogut copiar <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers</item> + <item quantity="one">No s\'ha pogut copiar <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">No s\'han pogut moure <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers</item> + <item quantity="one">No s\'ha pogut moure <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">No s\'han pogut suprimir <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers</item> + <item quantity="one">No s\'ha pogut suprimir <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Toca per veure\'n els detalls"</string> <string name="close" msgid="3043722427445528732">"Tanca"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Aquests fitxers no s\'han copiat: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Aquests fitxers no s\'han mogut: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Aquests fitxers s\'han convertit a un altre format: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">S\'han copiat <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers al porta-retalls.</item> diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml index c41b1b148738..a6e79b654d02 100644 --- a/packages/DocumentsUI/res/values-cs/strings.xml +++ b/packages/DocumentsUI/res/values-cs/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Skrýt kořeny"</string> <string name="save_error" msgid="6167009778003223664">"Uložení dokumentu se nezdařilo"</string> <string name="create_error" msgid="3735649141335444215">"Složku se nepodařilo vytvořit"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Obsah nyní nelze načíst"</string> <string name="root_recent" msgid="4470053704320518133">"Nedávné"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Volné místo: <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Služby úložiště"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Další aplikace"</string> <string name="empty" msgid="7858882803708117596">"Žádné položky"</string> <string name="no_results" msgid="6622510343880730446">"%1$s – žádné shody"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Soubor nelze otevřít"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Některé dokumenty nelze smazat"</string> <string name="share_via" msgid="8966594246261344259">"Sdílet pomocí"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopírování souborů"</string> @@ -92,15 +90,28 @@ <string name="copy_preparing" msgid="3896202461003039386">"Příprava na kopírování…"</string> <string name="move_preparing" msgid="2772219441375531410">"Příprava na přesunutí…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Příprava na mazání…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> soubory se zkopírovat nepodařilo</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> souboru se zkopírovat nepodařilo</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> souborů se zkopírovat nepodařilo</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> soubor se zkopírovat nepodařilo</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> soubory nelze přesunout</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> souboru nelze přesunout</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> souborů nelze přesunout</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> soubor nelze přesunout</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> soubory se smazat nepodařilo</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> souboru se smazat nepodařilo</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> souborů se smazat nepodařilo</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> soubor se smazat nepodařilo</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Klepnutím zobrazíte podrobnosti"</string> <string name="close" msgid="3043722427445528732">"Zavřít"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Následující soubory nebyly zkopírovány: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Následující soubory nebyly přesunuty: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Soubory byly převedeny do jiného formátu: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> soubory byly zkopírovány do schránky.</item> diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml index 78c59b928bc9..a0b7c1fe3579 100644 --- a/packages/DocumentsUI/res/values-da/strings.xml +++ b/packages/DocumentsUI/res/values-da/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Skjul rødder"</string> <string name="save_error" msgid="6167009778003223664">"Dokumentet kunne ikke gemmes"</string> <string name="create_error" msgid="3735649141335444215">"Mappen kunne ikke oprettes"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Der kan ikke indlæses indhold i øjeblikket"</string> <string name="root_recent" msgid="4470053704320518133">"Seneste"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ledig plads"</string> <string name="root_type_service" msgid="2178854894416775409">"Lagringstjenester"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Flere apps"</string> <string name="empty" msgid="7858882803708117596">"Ingen elementer"</string> <string name="no_results" msgid="6622510343880730446">"Ingen kampe i %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Filen kan ikke åbnes"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nogle dokumenter kan ikke slettes"</string> <string name="share_via" msgid="8966594246261344259">"Del via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopierer filer"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Forbereder kopiering…"</string> <string name="move_preparing" msgid="2772219441375531410">"Forbereder flytning…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Forbereder til sletning…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fil kunne ikke kopieres</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer kunne ikke kopieres</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fil kunne ikke flyttes</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer kunne ikke flyttes</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fil kunne ikke slettes</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer kunne ikke slettes</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Tryk for at se oplysninger"</string> <string name="close" msgid="3043722427445528732">"Luk"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Disse filer blev ikke kopieret: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Disse filer blev ikke flyttet: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Disse filer er konverteret til et andet format: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> filer blev kopieret til udklipsholder.</item> diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml index fb25867c69e9..2d968fee52f6 100644 --- a/packages/DocumentsUI/res/values-de/strings.xml +++ b/packages/DocumentsUI/res/values-de/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Root-Verzeichnis ausblenden"</string> <string name="save_error" msgid="6167009778003223664">"Dokument konnte nicht gespeichert werden."</string> <string name="create_error" msgid="3735649141335444215">"Ordner konnte nicht erstellt werden."</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Inhalte können momentan nicht geladen werden"</string> <string name="root_recent" msgid="4470053704320518133">"Letzte"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> verfügbar"</string> <string name="root_type_service" msgid="2178854894416775409">"Speicherdienste"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Weitere Apps"</string> <string name="empty" msgid="7858882803708117596">"Keine Dokumente"</string> <string name="no_results" msgid="6622510343880730446">"Keine Übereinstimmungen in %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Datei kann nicht geöffnet werden"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Einige Dokumente konnten nicht gelöscht werden."</string> <string name="share_via" msgid="8966594246261344259">"Teilen über"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Dateien werden kopiert"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Kopieren wird vorbereitet…"</string> <string name="move_preparing" msgid="2772219441375531410">"Verschieben wird vorbereitet…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Löschvorgang wird vorbereitet…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien konnten nicht kopiert werden</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei konnte nicht kopiert werden</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien konnten nicht verschoben werden</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei konnte nicht verschoben werden</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien konnten nicht gelöscht werden</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei konnte nicht gelöscht werden</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Zum Ansehen der Details tippen"</string> <string name="close" msgid="3043722427445528732">"Schließen"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Diese Dateien wurden nicht kopiert: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Diese Dateien wurden nicht verschoben: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Folgende Dateien wurden in ein anderes Format konvertiert: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien wurden in die Zwischenablage kopiert.</item> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml index 5661e829c51b..6c9896d2ca32 100644 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ b/packages/DocumentsUI/res/values-el/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Απόκρυψη ρίζας"</string> <string name="save_error" msgid="6167009778003223664">"Αποτυχία αποθήκευσης του εγγράφου"</string> <string name="create_error" msgid="3735649141335444215">"Αποτυχία δημιουργίας φακέλου"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Δεν είναι δυνατή η φόρτωση περιεχομένου τώρα"</string> <string name="root_recent" msgid="4470053704320518133">"Πρόσφατα"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ελεύθερα"</string> <string name="root_type_service" msgid="2178854894416775409">"Υπηρεσίες αποθήκευσης"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Περισσότερες εφαρμογές"</string> <string name="empty" msgid="7858882803708117596">"Δεν υπάρχουν στοιχεία"</string> <string name="no_results" msgid="6622510343880730446">"Χωρίς αντιστοιχίσεις στο %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Δεν είναι δυνατό το άνοιγμα του αρχείου"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Δεν είναι δυνατή η διαγραφή ορισμένων εγγράφων"</string> <string name="share_via" msgid="8966594246261344259">"Κοινή χρήση μέσω"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Αντιγραφή αρχείων"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Προετοιμασία για αντιγραφή…"</string> <string name="move_preparing" msgid="2772219441375531410">"Προετοιμασία για μετακίνηση…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Προετοιμασία για διαγραφή…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">Δεν ήταν δυνατή η αντιγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων</item> + <item quantity="one">Δεν ήταν δυνατή η αντιγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">Δεν ήταν δυνατή η μετακίνηση <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων</item> + <item quantity="one">Δεν ήταν δυνατή η μετακίνηση <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">Δεν ήταν δυνατή η διαγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων</item> + <item quantity="one">Δεν ήταν δυνατή η διαγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Πατήστε για προβολή λεπτομερειών"</string> <string name="close" msgid="3043722427445528732">"Κλείσιμο"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Αυτά τα αρχεία δεν αντιγράφηκαν: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Αυτά τα αρχεία δεν μετακινήθηκαν: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Αυτά τα αρχεία μετατράπηκαν σε άλλη μορφή: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> αρχεία αντιγράφηκαν στο πρόχειρο.</item> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml index a72973261e96..e212053c16f7 100644 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string> <string name="save_error" msgid="6167009778003223664">"Error al guardar el documento"</string> <string name="create_error" msgid="3735649141335444215">"Error al crear la carpeta"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"No se puede cargar el contenido en este momento"</string> <string name="root_recent" msgid="4470053704320518133">"Recientes"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> de espacio libre"</string> <string name="root_type_service" msgid="2178854894416775409">"Almacenamiento"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Más aplicaciones"</string> <string name="empty" msgid="7858882803708117596">"Sin elementos"</string> <string name="no_results" msgid="6622510343880730446">"No hay coincidencias en %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"No se puede abrir el archivo"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos."</string> <string name="share_via" msgid="8966594246261344259">"Compartir mediante"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando archivos"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar…"</string> <string name="move_preparing" msgid="2772219441375531410">"Preparación para mover archivos…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Preparando para borrar…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">No se pudieron copiar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> + <item quantity="one">No se pudo copiar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">No se pudieron trasladar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> + <item quantity="one">No se pudo trasladar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">No se pudieron borrar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> + <item quantity="one">No se pudo borrar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Presiona para ver los detalles"</string> <string name="close" msgid="3043722427445528732">"Cerrar"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Los siguientes archivos no se pudieron copiar: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Los siguientes archivos no se trasladaron: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Estos archivos se convirtieron a otro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">Se copiaron <xliff:g id="COUNT_1">%1$d</xliff:g> archivos al portapapeles.</item> diff --git a/packages/DocumentsUI/res/values-eu-rES/strings.xml b/packages/DocumentsUI/res/values-eu-rES/strings.xml index 539774ffa5b2..a8f35176e6a8 100644 --- a/packages/DocumentsUI/res/values-eu-rES/strings.xml +++ b/packages/DocumentsUI/res/values-eu-rES/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ezkutatu erroko karpetak"</string> <string name="save_error" msgid="6167009778003223664">"Ezin izan da dokumentua gorde"</string> <string name="create_error" msgid="3735649141335444215">"Ezin izan da karpeta sortu"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Une honetan ezin da kargatu edukia"</string> <string name="root_recent" msgid="4470053704320518133">"Azkenak"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> doan"</string> <string name="root_type_service" msgid="2178854894416775409">"Biltegiratze-zerbitzuak"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Aplikazio gehiago"</string> <string name="empty" msgid="7858882803708117596">"Ez dago elementurik"</string> <string name="no_results" msgid="6622510343880730446">"Ez da aurkitu ezer %1$s atalean"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Ezin da ireki fitxategia"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ezin izan dira dokumentu batzuk ezabatu"</string> <string name="share_via" msgid="8966594246261344259">"Partekatu honen bidez:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Fitxategiak kopiatzen"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Kopiatzeko prestatzen…"</string> <string name="move_preparing" msgid="2772219441375531410">"Mugitzeko prestatzen…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Ezabatzeko prestatzen…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">Ezin izan dira kopiatu <xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi</item> + <item quantity="one">Ezin izan da kopiatu <xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">Ezin izan dira mugitu <xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi</item> + <item quantity="one">Ezin izan da mugitu <xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">Ezin izan dira ezabatu <xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi</item> + <item quantity="one">Ezin izan da ezabatu <xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Sakatu xehetasunak ikusteko"</string> <string name="close" msgid="3043722427445528732">"Itxi"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Ez dira kopiatu fitxategi hauek: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Ez dira mugitu fitxategi hauek: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Fitxategi hauek beste formatu bateko fitxategi bihurtu dira: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi kopiatu dira arbelean.</item> diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml index e349eefaaae8..14513bdb09ea 100644 --- a/packages/DocumentsUI/res/values-fi/strings.xml +++ b/packages/DocumentsUI/res/values-fi/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Piilota juuret"</string> <string name="save_error" msgid="6167009778003223664">"Asiakirjan tallennus epäonnistui"</string> <string name="create_error" msgid="3735649141335444215">"Kansion luominen epäonnistui"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Sisältöä ei juuri nyt voi ladata."</string> <string name="root_recent" msgid="4470053704320518133">"Viimeisimmät"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> vapaana"</string> <string name="root_type_service" msgid="2178854894416775409">"Tallennuspalvelut"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Lisää sovelluksia"</string> <string name="empty" msgid="7858882803708117596">"Ei kohteita"</string> <string name="no_results" msgid="6622510343880730446">"Ei osumia kohteessa %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Tiedoston avaaminen epäonnistui."</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Joitakin asiakirjoja ei voi poistaa"</string> <string name="share_via" msgid="8966594246261344259">"Jaa sovelluksessa"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopioidaan tiedostoja"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Valmistellaan kopiointia…"</string> <string name="move_preparing" msgid="2772219441375531410">"Valmistellaan siirtämistä…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Valmistellaan poistamista…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tiedoston kopioiminen epäonnistui.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> tiedoston kopioiminen epäonnistui.</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tiedoston siirtäminen epäonnistui.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> tiedoston siirtäminen epäonnistui.</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tiedoston poistaminen epäonnistui.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> tiedoston poistaminen epäonnistui.</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Tarkastele tietoja napauttamalla"</string> <string name="close" msgid="3043722427445528732">"Sulje"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Näitä tiedostoja ei kopioitu: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Näitä tiedostoja ei siirretty: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Seuraavat tiedostot muunnettiin toiseen muotoon: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa kopioitiin leikepöydälle.</item> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index fad48007bf2b..0d35f4aa5412 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Masquer les racines"</string> <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document"</string> <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Impossible de charger le contenu pour le moment"</string> <string name="root_recent" msgid="4470053704320518133">"Récents"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> disponible"</string> <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Plus d\'applications"</string> <string name="empty" msgid="7858882803708117596">"Aucun élément"</string> <string name="no_results" msgid="6622510343880730446">"Aucune correspondance dans %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Impossible d\'ouvrir le fichier"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents"</string> <string name="share_via" msgid="8966594246261344259">"Partager par"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copie de fichiers..."</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Préparation de la copie en cours"</string> <string name="move_preparing" msgid="2772219441375531410">"Préparation du déplacement..."</string> <string name="delete_preparing" msgid="5655813182533491992">"Préparation de la suppression..."</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Impossible de copier <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> + <item quantity="other">Impossible de copier <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Impossible de déplacer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> + <item quantity="other">Impossible de déplacer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Impossible de supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> dossier</item> + <item quantity="other">Impossible de supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> dossiers</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Touchez pour afficher les détails"</string> <string name="close" msgid="3043722427445528732">"Fermer"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Ces fichiers ne ont pas été copiés : <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Ces fichiers n\'ont pas été déplacés : <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ces fichiers ont été convertis dans un autre format : <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fichier a été copié dans le presse-papiers.</item> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml index 413416bac924..7ed98bb9fcd6 100644 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ b/packages/DocumentsUI/res/values-fr/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Masquer les répertoires racines"</string> <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document."</string> <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier."</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Impossible de charger le contenu pour le moment"</string> <string name="root_recent" msgid="4470053704320518133">"Récents"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Espace disponible : <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Autres applications"</string> <string name="empty" msgid="7858882803708117596">"Aucun élément"</string> <string name="no_results" msgid="6622510343880730446">"Aucune correspondance dans %1$s."</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Impossible d\'ouvrir le fichier"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents."</string> <string name="share_via" msgid="8966594246261344259">"Partager via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copie de fichiers en cours"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Préparation de la copie en cours…"</string> <string name="move_preparing" msgid="2772219441375531410">"Préparation au déplacement…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Préparation à la suppression…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Impossible de copier <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> + <item quantity="other">Impossible de copier <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Impossible de déplacer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> + <item quantity="other">Impossible de déplacer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Impossible de supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> + <item quantity="other">Impossible de supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Appuyez pour afficher plus d\'informations."</string> <string name="close" msgid="3043722427445528732">"Fermer"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Les fichiers suivants n\'ont pas été copiés : <xliff:g id="LIST">%1$s</xliff:g>."</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Les fichiers suivants n\'ont pas été déplacés : <xliff:g id="LIST">%1$s</xliff:g>."</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ces fichiers ont été convertis dans un autre format : <xliff:g id="LIST">%1$s</xliff:g>."</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fichier a bien été copié dans le Presse-papiers.</item> diff --git a/packages/DocumentsUI/res/values-gl-rES/strings.xml b/packages/DocumentsUI/res/values-gl-rES/strings.xml index 32745682c058..645eb0437967 100644 --- a/packages/DocumentsUI/res/values-gl-rES/strings.xml +++ b/packages/DocumentsUI/res/values-gl-rES/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string> <string name="save_error" msgid="6167009778003223664">"Non se puido gardar o documento"</string> <string name="create_error" msgid="3735649141335444215">"Non se puido crear o cartafol"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Non se pode cargar o contido neste momento"</string> <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> libres"</string> <string name="root_type_service" msgid="2178854894416775409">"Servizos de almacenamento"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Máis aplicacións"</string> <string name="empty" msgid="7858882803708117596">"Ningún elemento"</string> <string name="no_results" msgid="6622510343880730446">"Non hai coincidencias en %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Non se pode abrir o ficheiro"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Non se poden eliminar algúns documentos"</string> <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando ficheiros"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar…"</string> <string name="move_preparing" msgid="2772219441375531410">"Preparándose para mover..."</string> <string name="delete_preparing" msgid="5655813182533491992">"Preparando para eliminar…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">Non se puideron copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> + <item quantity="one">Non se puido copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">Non se puideron mover <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> + <item quantity="one">Non se puido mover <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">Non se puideron eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> + <item quantity="one">Non se puido eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Toca para ver detalles"</string> <string name="close" msgid="3043722427445528732">"Pechar"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Non se copiaron estes ficheiros: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Non se moveron estes ficheiros: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Estes ficheiros convertéronse a outro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">Copiáronse <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros no portapapeis.</item> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index 39344de20ba0..4448fe444f1c 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Թաքցնել արմատները"</string> <string name="save_error" msgid="6167009778003223664">"Չհաջողվեց պահել փաստաթուղթը"</string> <string name="create_error" msgid="3735649141335444215">"Չհաջողվեց ստեղծել պանակը"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Այս պահին հնարավոր չէ բեռնել բովանդակությունը"</string> <string name="root_recent" msgid="4470053704320518133">"Վերջին"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ազատ է"</string> <string name="root_type_service" msgid="2178854894416775409">"Պահուստի ծառայություններ"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Հավելյալ ծրագրեր"</string> <string name="empty" msgid="7858882803708117596">"Տարրեր չկան"</string> <string name="no_results" msgid="6622510343880730446">"%1$s-ում համընկնումներ չկան"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Հնարավոր չէ բացել ֆայլը"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Անհնար է ջնջել որոշ փաստաթղթեր"</string> <string name="share_via" msgid="8966594246261344259">"Տարածել"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Ֆայլերի պատճենում"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Պատճենման նախապատրաստում…"</string> <string name="move_preparing" msgid="2772219441375531410">"Տեղափոխման նախապատրաստում…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Պատրաստվում է ջնջել…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Չհաջողվեց պատճենել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> + <item quantity="other">Չհաջողվեց պատճենել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Չհաջողվեց տեղափոխել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> + <item quantity="other">Չհաջողվեց տեղափոխել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Չհաջողվեց ջնջել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> + <item quantity="other">Չհաջողվեց ջնջել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Հպեք՝ մանրամասները դիտելու համար"</string> <string name="close" msgid="3043722427445528732">"Փակել"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Հետևյալ ֆայլերը չեն պատճենվել՝ <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Հետևյալ ֆայլերը չեն տեղափոխվել՝ <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Այս ֆայլերը փոխարկվել են մեկ այլ ձևաչափի՝ <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ պատճենվեց սեղմատախտակին:</item> diff --git a/packages/DocumentsUI/res/values-is-rIS/strings.xml b/packages/DocumentsUI/res/values-is-rIS/strings.xml index 1d3d75f20ca3..d7e428408d18 100644 --- a/packages/DocumentsUI/res/values-is-rIS/strings.xml +++ b/packages/DocumentsUI/res/values-is-rIS/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Fela rótarsöfn"</string> <string name="save_error" msgid="6167009778003223664">"Mistókst að vista skjalið"</string> <string name="create_error" msgid="3735649141335444215">"Mistókst að búa til möppu"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Ekki hægt að hlaða efni í augnablikinu"</string> <string name="root_recent" msgid="4470053704320518133">"Nýlegt"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> laus"</string> <string name="root_type_service" msgid="2178854894416775409">"Geymsluþjónusta"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Fleiri forrit"</string> <string name="empty" msgid="7858882803708117596">"Engin atriði"</string> <string name="no_results" msgid="6622510343880730446">"Engar samsvarandi niðurstöður í %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Ekki hægt að opna skrá"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ekki er hægt að eyða einhverjum skjölum"</string> <string name="share_via" msgid="8966594246261344259">"Deila í gegnum"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Afritar skrár"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Undirbúningur fyrir afritun…"</string> <string name="move_preparing" msgid="2772219441375531410">"Flutningur undirbúinn…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Býr sig undir að eyða…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Ekki tókst að afrita <xliff:g id="COUNT_1">%1$d</xliff:g> skrá</item> + <item quantity="other">Ekki tókst að afrita <xliff:g id="COUNT_1">%1$d</xliff:g> skrár</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Ekki tókst að færa <xliff:g id="COUNT_1">%1$d</xliff:g> skrá</item> + <item quantity="other">Ekki tókst að færa <xliff:g id="COUNT_1">%1$d</xliff:g> skrár</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Ekki tókst að eyða <xliff:g id="COUNT_1">%1$d</xliff:g> skrá</item> + <item quantity="other">Ekki tókst að eyða <xliff:g id="COUNT_1">%1$d</xliff:g> skrám</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Ýttu til að skoða frekari upplýsingar"</string> <string name="close" msgid="3043722427445528732">"Loka"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Þessar skrár voru ekki afritaðar: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Þessar skrár voru ekki færðar: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Þessum skrám var umbreytt yfir á annað snið: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> skrá afrituð á klippiborð.</item> diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml index e0f750ace11c..88060790ba43 100644 --- a/packages/DocumentsUI/res/values-iw/strings.xml +++ b/packages/DocumentsUI/res/values-iw/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"הסתר שורשים"</string> <string name="save_error" msgid="6167009778003223664">"שמירת המסמך נכשלה"</string> <string name="create_error" msgid="3735649141335444215">"יצירת התיקיה נכשלה"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"לא ניתן כרגע לטעון תוכן"</string> <string name="root_recent" msgid="4470053704320518133">"מהזמן האחרון"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> של שטח פנוי"</string> <string name="root_type_service" msgid="2178854894416775409">"שירותי אחסון"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"עוד אפליקציות"</string> <string name="empty" msgid="7858882803708117596">"אין פריטים"</string> <string name="no_results" msgid="6622510343880730446">"אין התאמות ב-%1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"לא ניתן לפתוח את הקובץ"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"לא ניתן למחוק חלק מהמסמכים"</string> <string name="share_via" msgid="8966594246261344259">"שתף באמצעות"</string> <string name="copy_notification_title" msgid="6374299806748219777">"מעתיק קבצים"</string> @@ -92,15 +90,28 @@ <string name="copy_preparing" msgid="3896202461003039386">"מתכונן להעתקה..."</string> <string name="move_preparing" msgid="2772219441375531410">"מתכונן להעברה…"</string> <string name="delete_preparing" msgid="5655813182533491992">"מתכונן למחיקה…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="two">לא ניתן היה להעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="many">לא ניתן היה להעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="other">לא ניתן היה להעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="one">לא ניתן היה להעתיק <xliff:g id="COUNT_0">%1$d</xliff:g> קובץ</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="two">לא ניתן היה להעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="many">לא ניתן היה להעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="other">לא ניתן היה להעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="one">לא ניתן היה להעביר <xliff:g id="COUNT_0">%1$d</xliff:g> קובץ</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="two">לא ניתן היה למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="many">לא ניתן היה למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="other">לא ניתן היה למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> + <item quantity="one">לא ניתן היה למחוק <xliff:g id="COUNT_0">%1$d</xliff:g> קובץ</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"הקש כדי להציג פרטים"</string> <string name="close" msgid="3043722427445528732">"סגור"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"הקבצים הבאים לא הועתקו: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"הקבצים הבאים לא הועברו: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"הקבצים האלה הומרו לפורמט אחר: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> קבצים הועתקו אל הלוח.</item> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml index c56876dd5169..e0b82e5d59c3 100644 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ b/packages/DocumentsUI/res/values-ja/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ルートを非表示にする"</string> <string name="save_error" msgid="6167009778003223664">"ドキュメントを保存できませんでした"</string> <string name="create_error" msgid="3735649141335444215">"フォルダを作成できませんでした"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"現在、コンテンツを読み込むことができません"</string> <string name="root_recent" msgid="4470053704320518133">"最近"</string> <string name="root_available_bytes" msgid="8568452858617033281">"空き容量: <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"ストレージサービス"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"その他のアプリ"</string> <string name="empty" msgid="7858882803708117596">"アイテムがありません"</string> <string name="no_results" msgid="6622510343880730446">"該当するものは %1$s にありません"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"ファイルを開けません"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"一部のドキュメントを削除できません"</string> <string name="share_via" msgid="8966594246261344259">"共有ツール"</string> <string name="copy_notification_title" msgid="6374299806748219777">"ファイルのコピー中"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"コピーの準備をしています…"</string> <string name="move_preparing" msgid="2772219441375531410">"移動の準備をしています…"</string> <string name="delete_preparing" msgid="5655813182533491992">"削除の準備をしています…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のファイルをコピーできませんでした</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のファイルをコピーできませんでした</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のファイルを移動できませんでした</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のファイルを移動できませんでした</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のファイルを削除できませんでした</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のファイルを削除できませんでした</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"タップすると詳細が表示されます"</string> <string name="close" msgid="3043722427445528732">"閉じる"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"次のファイルをコピーできませんでした: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"次のファイルを移動できませんでした: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"次のファイルが別の形式に変換されました: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>件のファイルをクリップボードにコピーしました。</item> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml index 69ffda20625d..5e1ddd3ede15 100644 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ფესვების დამალვა"</string> <string name="save_error" msgid="6167009778003223664">"დოკუმენტის შენახვა ვერ მოხერხდა"</string> <string name="create_error" msgid="3735649141335444215">"საქაღალდის შექმნა ვერ მოხერხდა"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"კონტენტის ჩატვირთვა ამჟამად ვერ ხერხდება"</string> <string name="root_recent" msgid="4470053704320518133">"ბოლო"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> თავისუფალია"</string> <string name="root_type_service" msgid="2178854894416775409">"მეხსიერების სერვისები"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"მეტი აპები"</string> <string name="empty" msgid="7858882803708117596">"ერთეულები არ არის"</string> <string name="no_results" msgid="6622510343880730446">"„%1$s“-ში დამთხვევა ვერ მოიძებნა"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"ფაილის გახსნა ვერ ხერხდება"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ზოგიერთი დოკუმენტის წაშლა ვერ ხერხდება"</string> <string name="share_via" msgid="8966594246261344259">"გაზიარება:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"მიმდ. ფაილების კოპირება"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"მომზადება კოპირებისთვის…"</string> <string name="move_preparing" msgid="2772219441375531410">"გადაადგილება მზადდება..."</string> <string name="delete_preparing" msgid="5655813182533491992">"მზადდება წასაშლელად…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ფაილი ვერ დაკოპირდა</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ფაილი ვერ დაკოპირდა</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ფაილი ვერ გადაადგილდა</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ფაილი ვერ გადაადგილდა</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ფაილი ვერ წაიშალა</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ფაილი ვერ წაიშალა</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"შეეხეთ დეტალების სანახავად"</string> <string name="close" msgid="3043722427445528732">"დახურვა"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"შემდეგი ფაილები არ დაკოპირდა: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"შემდეგი ფაილები არ გადაადგილდა: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"შემდეგი ფაილები გარდაქმნილია სხვა ფორმატში: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">მოხდა <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილის გაცვლის ბუფერში კოპირება.</item> diff --git a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml index a6a38765d7ed..5b6b94dacd7f 100644 --- a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml +++ b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml @@ -53,7 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Тамырын жасыру"</string> <string name="save_error" msgid="6167009778003223664">"Құжатты сақтау орындалмады"</string> <string name="create_error" msgid="3735649141335444215">"Қалта жасақтау іске аспады"</string> - <string name="query_error" msgid="5999895349602476581">"Қазіргі уақытта мазмұнды жүктеу мүмкін емес"</string> + <string name="query_error" msgid="5999895349602476581">"Қазір мазмұнды жүктеу мүмкін емес"</string> <string name="root_recent" msgid="4470053704320518133">"Жуықта қолданылған"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> бос"</string> <string name="root_type_service" msgid="2178854894416775409">"Жад қызметтері"</string> diff --git a/packages/DocumentsUI/res/values-kn-rIN/strings.xml b/packages/DocumentsUI/res/values-kn-rIN/strings.xml index 9c956f58fe88..487a7b3d014e 100644 --- a/packages/DocumentsUI/res/values-kn-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-kn-rIN/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ರೂಟ್ಗಳನ್ನು ಮರೆಮಾಡು"</string> <string name="save_error" msgid="6167009778003223664">"ಡಾಕ್ಯುಮೆಂಟ್ ಉಳಿಸಲು ವಿಫಲವಾಗಿದೆ"</string> <string name="create_error" msgid="3735649141335444215">"ಫೋಲ್ಡರ್ ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"ಈ ಕ್ಷಣದಲ್ಲಿ ವಿಷಯವನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="root_recent" msgid="4470053704320518133">"ಇತ್ತೀಚಿನದು"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ಮುಕ್ತವಾಗಿದೆ"</string> <string name="root_type_service" msgid="2178854894416775409">"ಸಂಗ್ರಹಣೆ ಸೇವೆಗಳು"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"ಇನ್ನಷ್ಟು ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string> <string name="empty" msgid="7858882803708117596">"ಯಾವುದೇ ಐಟಂಗಳಿಲ್ಲ"</string> <string name="no_results" msgid="6622510343880730446">"%1$s ರಲ್ಲಿ ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಗಳಿಲ್ಲ"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"ಫೈಲ್ ತೆರೆಯಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ಕೆಲವು ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="share_via" msgid="8966594246261344259">"ಈ ಮೂಲಕ ಹಂಚಿಕೊಳ್ಳಿ"</string> <string name="copy_notification_title" msgid="6374299806748219777">"ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗುತ್ತಿದೆ"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"ನಕಲಿಸಲು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ..."</string> <string name="move_preparing" msgid="2772219441375531410">"ಸರಿಸಲು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ…"</string> <string name="delete_preparing" msgid="5655813182533491992">"ಅಳಿಸಲು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗಲಿಲ್ಲ</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗಲಿಲ್ಲ</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"ವಿವರಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="close" msgid="3043722427445528732">"ಮುಚ್ಚು"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"ಈ ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗಿಲ್ಲ: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"ಈ ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗಿಲ್ಲ: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"ಈ ಫೈಲ್ಗಳನ್ನು ಮತ್ತೊಂದು ಫಾರ್ಮೆಟ್ಗೆ ಪರಿವರ್ತಿಸಲಾಗಿತ್ತು: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one">ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗಿದೆ.</item> diff --git a/packages/DocumentsUI/res/values-ky-rKG/strings.xml b/packages/DocumentsUI/res/values-ky-rKG/strings.xml index 1dc5e77373bd..f93f709a5060 100644 --- a/packages/DocumentsUI/res/values-ky-rKG/strings.xml +++ b/packages/DocumentsUI/res/values-ky-rKG/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Папкаларды жашыруу"</string> <string name="save_error" msgid="6167009778003223664">"Документтерди сактоо кыйрады"</string> <string name="create_error" msgid="3735649141335444215">"Папка түзүү кыйрады"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Учурда мазмун жүктөлбөй жатат"</string> <string name="root_recent" msgid="4470053704320518133">"Акыркы"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> бош"</string> <string name="root_type_service" msgid="2178854894416775409">"Сактагыч кызматтар"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Көбүрөөк колдонмолор"</string> <string name="empty" msgid="7858882803708117596">"Эч нерсе жок"</string> <string name="no_results" msgid="6622510343880730446">"%1$s ичинде дал келүүлөр жок"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Файл ачылбай жатат"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Кээ бир документтерди өчүрүү кыйрады"</string> <string name="share_via" msgid="8966594246261344259">"Кийинки аркылуу бөлүшүү:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Файлдар көчүрүлүүдө"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Көчүрүүгө даярдалууда…"</string> <string name="move_preparing" msgid="2772219441375531410">"Жылдырууга даярдалууда…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Жок кылууга даярдалууда…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл көчүрүлбөй койду</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл көчүрүлбөй койду</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл жылдырылбай койду</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл жылдырылбай койду</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл жок кылынбай койду</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл жок кылынбай койду</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Чоо-жайын көрүү үчүн таптаңыз"</string> <string name="close" msgid="3043722427445528732">"Жабуу"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Төмөнкү файлдар көчүрүлгөн жок: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Төмөнкү файлдар жылдырылган жок: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Бул файлдар башка форматка айландырылды: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл буферге көчүрүлдү.</item> diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml index 65276ba25aa3..4b3605759317 100644 --- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml +++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml @@ -85,8 +85,8 @@ <string name="move_preparing" msgid="2772219441375531410">"ກຳລັງກະກຽມຍ້າຍ…"</string> <string name="delete_preparing" msgid="5655813182533491992">"ກຳລັງກະກຽມລຶບ…"</string> <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">ບໍ່ສາມາດອັດສຳເນົາ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> - <item quantity="one">ບໍ່ສາມາດອັດສຳເນົາ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> + <item quantity="other">ບໍ່ສາມາດສຳເນົາ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> + <item quantity="one">ບໍ່ສາມາດສຳເນົາ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> </plurals> <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> <item quantity="other">ບໍ່ສາມາດຍ້າຍ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> @@ -98,7 +98,7 @@ </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"ແຕະເພື່ອເບິ່ງລາຍລະອຽດ"</string> <string name="close" msgid="3043722427445528732">"ປິດ"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ໄຟລ໌ເຫຼົ່ານີ້ບໍ່ໄດ້ຖືກອັດສຳເນົາ: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"ໄຟລ໌ເຫຼົ່ານີ້ບໍ່ໄດ້ຖືກສຳເນົາ: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="move_failure_alert_content" msgid="2635075788682922861">"ໄຟລ໌ເຫຼົ່ານີ້ບໍ່ໄດ້ຖືກຍ້າຍ: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"ໄຟລ໌ເຫຼົ່ານີ້ໄດ້ຖືກປ່ຽນເປັນຮູບແບບອື່ນແລ້ວ: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml index 224e15b57a4c..7711941ae37c 100644 --- a/packages/DocumentsUI/res/values-lv/strings.xml +++ b/packages/DocumentsUI/res/values-lv/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Slēpt saknes"</string> <string name="save_error" msgid="6167009778003223664">"Neizdevās saglabāt dokumentu."</string> <string name="create_error" msgid="3735649141335444215">"Neizdevās izveidot mapi."</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Pašlaik nevar ielādēt saturu."</string> <string name="root_recent" msgid="4470053704320518133">"Pēdējie"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Brīva vieta: <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Glabāšanas pakalpojumi"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Vairāk lietotņu"</string> <string name="empty" msgid="7858882803708117596">"Nav vienumu"</string> <string name="no_results" msgid="6622510343880730446">"Failā %1$s nav atbilstību"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Nevar atvērt failu."</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nevar dzēst dažus dokumentus."</string> <string name="share_via" msgid="8966594246261344259">"Kopīgot, izmantojot"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Notiek failu kopēšana"</string> @@ -89,15 +87,25 @@ <string name="copy_preparing" msgid="3896202461003039386">"Gatavošanās kopēšanai…"</string> <string name="move_preparing" msgid="2772219441375531410">"Sagatavošana pārvietošanai…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Notiek gatavošanās dzēšanai…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="zero">Nevarēja nokopēt <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> + <item quantity="one">Nevarēja nokopēt <xliff:g id="COUNT_1">%1$d</xliff:g> failu</item> + <item quantity="other">Nevarēja nokopēt <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="zero">Nevarēja pārvietot <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> + <item quantity="one">Nevarēja pārvietot <xliff:g id="COUNT_1">%1$d</xliff:g> failu</item> + <item quantity="other">Nevarēja pārvietot <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="zero">Nevarēja izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> + <item quantity="one">Nevarēja izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failu</item> + <item quantity="other">Nevarēja izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Pieskarieties, lai skatītu informāciju"</string> <string name="close" msgid="3043722427445528732">"Aizvērt"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Netika nokopēti šādi faili: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Netika pārvietoti šādi faili: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Šie faili tika pārveidoti citā formātā: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> faili tika kopēti starpliktuvē.</item> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml index f24dc9671773..64f616313041 100644 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string> <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string> <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Tidak dapat memuatkan kandungan pada masa ini"</string> <string name="root_recent" msgid="4470053704320518133">"Terbaharu"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> kosong"</string> <string name="root_type_service" msgid="2178854894416775409">"Perkhidmatan storan"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Lebih banyak apl"</string> <string name="empty" msgid="7858882803708117596">"Tiada item"</string> <string name="no_results" msgid="6622510343880730446">"Tiada padanan dalam %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Tidak dapat membuka fail"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat memadam beberapa dokumen"</string> <string name="share_via" msgid="8966594246261344259">"Kongsi melalui"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Menyalin fail"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Bersedia untuk salin..."</string> <string name="move_preparing" msgid="2772219441375531410">"Bersedia untuk mengalih…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Bersedia untuk memadam…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">Tidak dapat menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> fail</item> + <item quantity="one">Tidak dapat menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> fail</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">Tidak dapat mengalihkan <xliff:g id="COUNT_1">%1$d</xliff:g> fail</item> + <item quantity="one">Tidak dapat mengalihkan <xliff:g id="COUNT_0">%1$d</xliff:g> fail</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">Tidak dapat memadamkan <xliff:g id="COUNT_1">%1$d</xliff:g> fail</item> + <item quantity="one">Tidak dapat memadamkan <xliff:g id="COUNT_0">%1$d</xliff:g> fail</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Ketik untuk melihat butiran"</string> <string name="close" msgid="3043722427445528732">"Tutup"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Fail ini tidak disalin: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Fail ini tidak dialihkan: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Fail ini telah ditukarkan kepada format lain: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fail disalin ke papan keratan.</item> diff --git a/packages/DocumentsUI/res/values-my-rMM/strings.xml b/packages/DocumentsUI/res/values-my-rMM/strings.xml index 74d0ae40c428..2813f2d97c24 100644 --- a/packages/DocumentsUI/res/values-my-rMM/strings.xml +++ b/packages/DocumentsUI/res/values-my-rMM/strings.xml @@ -53,7 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ဖိုဒါကို ပိတ်လိုက်ပါ"</string> <string name="save_error" msgid="6167009778003223664">"စာရွက်စာတန်း သိမ်းဆည်းမှု မအောင်မြင်ပါ"</string> <string name="create_error" msgid="3735649141335444215">"အကန့်အသစ် ဖန်တီးခြင်း မအောင်မြင်ပါ"</string> - <string name="query_error" msgid="5999895349602476581">"အကြောင်းအရာများကို လောလောဆယ်တွင် ဖွင့်၍မရသေးပါ"</string> + <string name="query_error" msgid="5999895349602476581">"အကြောင်းအရာများကို လောလောဆယ်တွင် တင်၍မရသေးပါ"</string> <string name="root_recent" msgid="4470053704320518133">"လတ်တလော"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> အသုံးချနိုင်ပါသည်"</string> <string name="root_type_service" msgid="2178854894416775409">"သိုလှောင်ရန်ဆားဗစ်များ"</string> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml index aa74b9818c14..d79b2799befc 100644 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ b/packages/DocumentsUI/res/values-nb/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Skjul røtter"</string> <string name="save_error" msgid="6167009778003223664">"Kunne ikke lagre dokumentet"</string> <string name="create_error" msgid="3735649141335444215">"Kunne ikke opprette mappen"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Kan ikke laste inn innholdet for øyeblikket"</string> <string name="root_recent" msgid="4470053704320518133">"Siste"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ledig"</string> <string name="root_type_service" msgid="2178854894416775409">"Lagringstjenester"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Flere apper"</string> <string name="empty" msgid="7858882803708117596">"Ingen elementer"</string> <string name="no_results" msgid="6622510343880730446">"Ingen treff i %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Kan ikke åpne filen"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Enkelte dokumenter kunne ikke slettes"</string> <string name="share_via" msgid="8966594246261344259">"Del via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopierer filer"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Forbereder kopiering …"</string> <string name="move_preparing" msgid="2772219441375531410">"Forbereder flytting …"</string> <string name="delete_preparing" msgid="5655813182533491992">"Gjøres klar for sletting …"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">Kunne ikke kopiere <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> + <item quantity="one">Kunne ikke kopiere <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">Kunne ikke flytte <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> + <item quantity="one">Kunne ikke flytte <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">Kunne ikke slette <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> + <item quantity="one">Kunne ikke slette <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Trykk for å se detaljer"</string> <string name="close" msgid="3043722427445528732">"Lukk"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Disse filene er ikke kopiert: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Disse filene er ikke flyttet: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Disse filene er konvertert til et annet format: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">Kopierte <xliff:g id="COUNT_1">%1$d</xliff:g> filer til utklippstavlen.</item> diff --git a/packages/DocumentsUI/res/values-pa-rIN/strings.xml b/packages/DocumentsUI/res/values-pa-rIN/strings.xml index 0fb35fada75c..758a4d82f1f8 100644 --- a/packages/DocumentsUI/res/values-pa-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-pa-rIN/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ਰੂਟਸ ਲੁਕਾਓ"</string> <string name="save_error" msgid="6167009778003223664">"ਦਸਾਤਵੇਜ਼ ਸੁਰੱਖਿਅਤ ਕਰਨ ਵਿੱਚ ਅਸਫਲ"</string> <string name="create_error" msgid="3735649141335444215">"ਫੋਲਡਰ ਬਣਾਉਣ ਲਈ ਅਸਫਲ"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"ਇਸ ਵੇਲੇ ਸਮੱਗਰੀ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string> <string name="root_recent" msgid="4470053704320518133">"ਹਾਲੀਆ"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ਖਾਲੀ"</string> <string name="root_type_service" msgid="2178854894416775409">"ਸਟੋਰੇਜ ਸੇਵਾਵਾਂ"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"ਹੋਰ ਐਪਸ"</string> <string name="empty" msgid="7858882803708117596">"ਕੋਈ ਆਈਟਮਾਂ ਨਹੀਂ"</string> <string name="no_results" msgid="6622510343880730446">"%1$s ਵਿੱਚ ਕੋਈ ਮੇਲ ਨਹੀਂ"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"ਫ਼ਾਈਲ ਨੂੰ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ਕੁਝ ਦਸਤਾਵੇਜ਼ ਮਿਟਾਉਣ ਵਿੱਚ ਅਸਮਰੱਥ"</string> <string name="share_via" msgid="8966594246261344259">"ਇਸ ਰਾਹੀਂ ਸ਼ੇਅਰ ਕਰੋ"</string> <string name="copy_notification_title" msgid="6374299806748219777">"ਫਾਈਲਾਂ ਕਾਪੀ ਕਰ ਰਿਹਾ ਹੈ"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"ਕਾਪੀ ਲਈ ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ…"</string> <string name="move_preparing" msgid="2772219441375531410">"ਮੂਵ ਲਈ ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ..."</string> <string name="delete_preparing" msgid="5655813182533491992">"ਮਿਟਾਉਣ ਦੀ ਤਿਆਰੀ ਹੋ ਰਹੀ ਹੈ…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਕਾਪੀ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਕਾਪੀ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਤਬਦੀਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਤਬਦੀਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"ਵੇਰਵਿਆਂ ਨੂੰ ਵੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="close" msgid="3043722427445528732">"ਬੰਦ ਕਰੋ"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"ਇਹ ਫ਼ਾਈਲਾਂ ਕਾਪੀ ਨਹੀਂ ਹੋਈਆਂ ਸਨ: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"ਇਹ ਫ਼ਾਈਲਾਂ ਤਬਦੀਲ ਨਹੀਂ ਹੋਈਆਂ ਸਨ: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"ਇਹ ਫ਼ਾਈਲਾਂ ਕਿਸੇ ਹੋਰ ਫੌਰਮੈਟ ਵਿੱਚ ਤਬਦੀਲ ਕੀਤੀਆਂ ਗਈਆਂ ਸਨ: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one">ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ <xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਦੀ ਪ੍ਰਤੀਲਿਪੀ ਬਣਾਈ ਗਈ।</item> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml index 790c7b7aed56..8a4d17c57a36 100644 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ b/packages/DocumentsUI/res/values-pl/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ukryj elementy główne"</string> <string name="save_error" msgid="6167009778003223664">"Nie udało się zapisać dokumentu"</string> <string name="create_error" msgid="3735649141335444215">"Nie udało się utworzyć folderu"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Teraz nie można załadować zawartości"</string> <string name="root_recent" msgid="4470053704320518133">"Ostatnie"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> wolne"</string> <string name="root_type_service" msgid="2178854894416775409">"Usługi pamięci masowej"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Więcej aplikacji"</string> <string name="empty" msgid="7858882803708117596">"Brak elementów"</string> <string name="no_results" msgid="6622510343880730446">"Brak wyników w %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Nie można otworzyć pliku"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nie można usunąć niektórych dokumentów"</string> <string name="share_via" msgid="8966594246261344259">"Udostępnij przez:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopiowanie plików"</string> @@ -92,15 +90,28 @@ <string name="copy_preparing" msgid="3896202461003039386">"Przygotowuję do kopiowania…"</string> <string name="move_preparing" msgid="2772219441375531410">"Przygotowuję przenoszenie…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Przygotowuję do usunięcia…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="few">Nie udało się skopiować <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> + <item quantity="many">Nie udało się skopiować <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> + <item quantity="other">Nie udało się skopiować <xliff:g id="COUNT_1">%1$d</xliff:g> pliku</item> + <item quantity="one">Nie udało się skopiować <xliff:g id="COUNT_0">%1$d</xliff:g> pliku</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="few">Nie udało się przenieść <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> + <item quantity="many">Nie udało się przenieść <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> + <item quantity="other">Nie udało się przenieść <xliff:g id="COUNT_1">%1$d</xliff:g> pliku</item> + <item quantity="one">Nie udało się przenieść <xliff:g id="COUNT_0">%1$d</xliff:g> pliku</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="few">Nie udało się usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> + <item quantity="many">Nie udało się usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> + <item quantity="other">Nie udało się usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> pliku</item> + <item quantity="one">Nie udało się usunąć <xliff:g id="COUNT_0">%1$d</xliff:g> pliku</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Kliknij, by zobaczyć szczegóły"</string> <string name="close" msgid="3043722427445528732">"Zamknij"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Te pliki nie zostały skopiowane: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Te pliki nie zostały przeniesione: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Te pliki zostały przekonwertowane na inny format: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="few">Skopiowano <xliff:g id="COUNT_1">%1$d</xliff:g> pliki do schowka.</item> diff --git a/packages/DocumentsUI/res/values-pt-rBR/strings.xml b/packages/DocumentsUI/res/values-pt-rBR/strings.xml index 8e62483d6ed1..391a053cf25c 100644 --- a/packages/DocumentsUI/res/values-pt-rBR/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rBR/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string> <string name="save_error" msgid="6167009778003223664">"Falha ao salvar o documento"</string> <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Não é possível carregar o conteúdo no momento"</string> <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> livres"</string> <string name="root_type_service" msgid="2178854894416775409">"Serviços de armazenamento"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Mais apps"</string> <string name="empty" msgid="7858882803708117596">"Nenhum item"</string> <string name="no_results" msgid="6622510343880730446">"Nenhum resultado em %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Não é possível abrir o arquivo"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Não foi possível excluir alguns documentos"</string> <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando arquivos"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string> <string name="move_preparing" msgid="2772219441375531410">"Preparando para mover..."</string> <string name="delete_preparing" msgid="5655813182533491992">"Preparando-se para excluir..."</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + <item quantity="other">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + <item quantity="other">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Não foi possível excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + <item quantity="other">Não foi possível excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Tocar para ver detalhes"</string> <string name="close" msgid="3043722427445528732">"Fechar"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Estes arquivos não foram copiados: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Estes arquivos não foram movidos: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Esses arquivos foram convertidos em outro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> arquivos copiados para a área de transferência.</item> diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml index 02467fed8d0a..448ddfef69d0 100644 --- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string> <string name="save_error" msgid="6167009778003223664">"Falha ao guardar o documento"</string> <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Não é possível carregar o conteúdo neste momento"</string> <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> espaço livre"</string> <string name="root_type_service" msgid="2178854894416775409">"Serv. de armazenamento"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Mais aplicações"</string> <string name="empty" msgid="7858882803708117596">"Sem itens"</string> <string name="no_results" msgid="6622510343880730446">"Sem correspondências para %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Não é possível abrir o ficheiro"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Não é possível eliminar alguns documentos"</string> <string name="share_via" msgid="8966594246261344259">"Partilhar através de"</string> <string name="copy_notification_title" msgid="6374299806748219777">"A copiar ficheiros"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"A preparar para copiar…"</string> <string name="move_preparing" msgid="2772219441375531410">"A preparar para mover…"</string> <string name="delete_preparing" msgid="5655813182533491992">"A preparar para eliminar…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> + <item quantity="one">Não foi possível copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> + <item quantity="one">Não foi possível mover <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">Não foi possível eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> + <item quantity="one">Não foi possível eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Toque para ver detalhes"</string> <string name="close" msgid="3043722427445528732">"Fechar"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Os seguintes ficheiros não foram copiados: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Os seguintes ficheiros não foram movidos: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Estes ficheiros foram convertidos para outro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">Copiou <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros para a área de transferência.</item> diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml index 8e62483d6ed1..391a053cf25c 100644 --- a/packages/DocumentsUI/res/values-pt/strings.xml +++ b/packages/DocumentsUI/res/values-pt/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string> <string name="save_error" msgid="6167009778003223664">"Falha ao salvar o documento"</string> <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Não é possível carregar o conteúdo no momento"</string> <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> livres"</string> <string name="root_type_service" msgid="2178854894416775409">"Serviços de armazenamento"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Mais apps"</string> <string name="empty" msgid="7858882803708117596">"Nenhum item"</string> <string name="no_results" msgid="6622510343880730446">"Nenhum resultado em %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Não é possível abrir o arquivo"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Não foi possível excluir alguns documentos"</string> <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Copiando arquivos"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string> <string name="move_preparing" msgid="2772219441375531410">"Preparando para mover..."</string> <string name="delete_preparing" msgid="5655813182533491992">"Preparando-se para excluir..."</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + <item quantity="other">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + <item quantity="other">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Não foi possível excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + <item quantity="other">Não foi possível excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Tocar para ver detalhes"</string> <string name="close" msgid="3043722427445528732">"Fechar"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Estes arquivos não foram copiados: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Estes arquivos não foram movidos: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Esses arquivos foram convertidos em outro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> arquivos copiados para a área de transferência.</item> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index a598fe46fca8..565a4e97f01c 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ascundeți directoarele rădăcină"</string> <string name="save_error" msgid="6167009778003223664">"Salvarea documentului nu a reușit"</string> <string name="create_error" msgid="3735649141335444215">"Eroare la crearea dosarului"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Momentan, conținutul nu poate fi încărcat"</string> <string name="root_recent" msgid="4470053704320518133">"Recente"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> spațiu liber"</string> <string name="root_type_service" msgid="2178854894416775409">"Servicii de stocare"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Alte aplicații"</string> <string name="empty" msgid="7858882803708117596">"Nu există elemente"</string> <string name="no_results" msgid="6622510343880730446">"Niciun rezultat în %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Fișierul nu poate fi deschis"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Unele documente nu au putut fi șterse"</string> <string name="share_via" msgid="8966594246261344259">"Trimiteți prin"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Se copiază fișierele"</string> @@ -89,15 +87,25 @@ <string name="copy_preparing" msgid="3896202461003039386">"Se pregătește copierea..."</string> <string name="move_preparing" msgid="2772219441375531410">"Se pregătește mutarea…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Se pregătește ștergerea…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="few">Nu s-au putut copia <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere</item> + <item quantity="other">Nu s-au putut copia <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere</item> + <item quantity="one">Nu s-a putut copia <xliff:g id="COUNT_0">%1$d</xliff:g> fișier</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="few">Nu s-au putut muta <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere</item> + <item quantity="other">Nu s-au putut muta <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere</item> + <item quantity="one">Nu s-a putut muta <xliff:g id="COUNT_0">%1$d</xliff:g> fișier</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="few">Nu s-au putut șterge <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere</item> + <item quantity="other">Nu s-au putut șterge <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere</item> + <item quantity="one">Nu s-a putut șterge <xliff:g id="COUNT_0">%1$d</xliff:g> fișier</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Atingeți pentru a vedea detaliile"</string> <string name="close" msgid="3043722427445528732">"Închideți"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Aceste fișiere nu au fost copiate: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Aceste fișiere nu au fost mutate: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Aceste fișiere au fost convertite în alt format: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="few">Au fost copiate <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere în clipboard.</item> diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml index 934037ec4b4d..ec978404e8d5 100644 --- a/packages/DocumentsUI/res/values-ru/strings.xml +++ b/packages/DocumentsUI/res/values-ru/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Скрыть"</string> <string name="save_error" msgid="6167009778003223664">"Не удалось сохранить документ"</string> <string name="create_error" msgid="3735649141335444215">"Не удалось создать папку"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Не удалось загрузить контент"</string> <string name="root_recent" msgid="4470053704320518133">"Недавние"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Свободно <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Службы хранения"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Другие приложения"</string> <string name="empty" msgid="7858882803708117596">"Ничего нет"</string> <string name="no_results" msgid="6622510343880730446">"В \"%1$s\" ничего не найдено"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Не удалось открыть файл"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Не удалось удалить некоторые документы"</string> <string name="share_via" msgid="8966594246261344259">"Поделиться"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Копирование файлов"</string> @@ -92,15 +90,28 @@ <string name="copy_preparing" msgid="3896202461003039386">"Подготовка к копированию…"</string> <string name="move_preparing" msgid="2772219441375531410">"Подготовка…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Подготовка к удалению…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> + <item quantity="few">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> + <item quantity="many">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файлов</item> + <item quantity="other">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Не удалось переместить <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> + <item quantity="few">Не удалось переместить <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> + <item quantity="many">Не удалось переместить <xliff:g id="COUNT_1">%1$d</xliff:g> файлов</item> + <item quantity="other">Не удалось переместить <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Не удалось удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> + <item quantity="few">Не удалось удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> + <item quantity="many">Не удалось удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файлов</item> + <item quantity="other">Не удалось удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Нажмите, чтобы узнать подробности."</string> <string name="close" msgid="3043722427445528732">"Закрыть"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Не удалось скопировать следующие файлы: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Не удалось переместить следующие файлы: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Формат этих файлов изменен: <xliff:g id="LIST">%1$s</xliff:g>."</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one">Скопирован <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml index f83a173f091f..4d290219db1f 100644 --- a/packages/DocumentsUI/res/values-sk/strings.xml +++ b/packages/DocumentsUI/res/values-sk/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Skryť korene"</string> <string name="save_error" msgid="6167009778003223664">"Dokument sa nepodarilo uložiť"</string> <string name="create_error" msgid="3735649141335444215">"Priečinok sa nepodarilo vytvoriť"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Obsah momentálne nie je možné načítať"</string> <string name="root_recent" msgid="4470053704320518133">"Nedávne"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Voľné <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Služby úložiska"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Ďalšie aplikácie"</string> <string name="empty" msgid="7858882803708117596">"Žiadne položky"</string> <string name="no_results" msgid="6622510343880730446">"Žiadne zhody – %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Súbor nie je možné otvoriť"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Niektoré dokumenty sa nepodarilo odstrániť"</string> <string name="share_via" msgid="8966594246261344259">"Zdieľať"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kopírovanie súborov"</string> @@ -92,15 +90,28 @@ <string name="copy_preparing" msgid="3896202461003039386">"Pripravuje sa na kopírovanie..."</string> <string name="move_preparing" msgid="2772219441375531410">"Prebieha príprava na presunutie…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Príprava na odstránenie…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="few">Nepodarilo sa skopírovať <xliff:g id="COUNT_1">%1$d</xliff:g> súbory</item> + <item quantity="many">Nepodarilo sa skopírovať <xliff:g id="COUNT_1">%1$d</xliff:g> súboru</item> + <item quantity="other">Nepodarilo sa skopírovať <xliff:g id="COUNT_1">%1$d</xliff:g> súborov</item> + <item quantity="one">Nepodarilo sa skopírovať <xliff:g id="COUNT_0">%1$d</xliff:g> súbor</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> súbory nie je možné presunúť</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> súboru nie je možné presunúť</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> súborov nie je možné presunúť</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> súbor nie je možné presunúť</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="few">Nepodarilo sa odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súbory</item> + <item quantity="many">Nepodarilo sa odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súboru</item> + <item quantity="other">Nepodarilo sa odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súborov</item> + <item quantity="one">Nepodarilo sa odstrániť <xliff:g id="COUNT_0">%1$d</xliff:g> súbor</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Klepnutím zobrazíte podrobnosti"</string> <string name="close" msgid="3043722427445528732">"Zavrieť"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Tieto súbory neboli skopírované: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Tieto súbory neboli presunuté: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Tieto súbory boli konvertované do iného formátu: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="few">Do schránky boli skopírované <xliff:g id="COUNT_1">%1$d</xliff:g> súbory.</item> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index 0152b3a3149f..e207c2e8121e 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Сакриј основне елементе"</string> <string name="save_error" msgid="6167009778003223664">"Чување документа није успело"</string> <string name="create_error" msgid="3735649141335444215">"Директоријум није направљен"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Учитавање садржаја тренутно није могуће"</string> <string name="root_recent" msgid="4470053704320518133">"Недавно"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Слободно је <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Услуге складиштења"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Још апликација"</string> <string name="empty" msgid="7858882803708117596">"Нема ставки"</string> <string name="no_results" msgid="6622510343880730446">"Нема подударања у %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Отварање датотеке није успело"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Није могуће избрисати неке документе"</string> <string name="share_via" msgid="8966594246261344259">"Делите преко"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Копирање датотека"</string> @@ -89,15 +87,25 @@ <string name="copy_preparing" msgid="3896202461003039386">"Припрема се копирање…"</string> <string name="move_preparing" msgid="2772219441375531410">"Припрема се премештање..."</string> <string name="delete_preparing" msgid="5655813182533491992">"Припрема се брисање…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Нисмо успели да копирамо <xliff:g id="COUNT_1">%1$d</xliff:g> датотеку</item> + <item quantity="few">Нисмо успели да копирамо <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке</item> + <item quantity="other">Нисмо успели да копирамо <xliff:g id="COUNT_1">%1$d</xliff:g> датотека</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Премештање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке није успело</item> + <item quantity="few">Премештање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке није успело</item> + <item quantity="other">Премештање <xliff:g id="COUNT_1">%1$d</xliff:g> датотека није успело</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Брисање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке није успело</item> + <item quantity="few">Брисање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке није успело</item> + <item quantity="other">Брисање <xliff:g id="COUNT_1">%1$d</xliff:g> датотека није успело</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Додирните да бисте приказали детаље"</string> <string name="close" msgid="3043722427445528732">"Затвори"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Следеће датотеке нису копиране: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Следеће датотеке нису премештене: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ове датотеке су конвертоване у други формат: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one">Копирали сте <xliff:g id="COUNT_1">%1$d</xliff:g> датотеку у привремену меморију.</item> diff --git a/packages/DocumentsUI/res/values-ta-rIN/strings.xml b/packages/DocumentsUI/res/values-ta-rIN/strings.xml index 5aaf2b71ca5e..3f85a17567db 100644 --- a/packages/DocumentsUI/res/values-ta-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-ta-rIN/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"வழிகளை மறை"</string> <string name="save_error" msgid="6167009778003223664">"ஆவணத்தைச் சேமிப்பதில் தோல்வி"</string> <string name="create_error" msgid="3735649141335444215">"கோப்புறையை உருவாக்குவதில் தோல்வி"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"தற்போது உள்ளடக்கத்தை ஏற்ற முடியாது"</string> <string name="root_recent" msgid="4470053704320518133">"சமீபத்தியவை"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> இலவசம்"</string> <string name="root_type_service" msgid="2178854894416775409">"சேமிப்பிட சாதனங்கள்"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"மேலும் பயன்பாடுகள்"</string> <string name="empty" msgid="7858882803708117596">"எதுவும் இல்லை"</string> <string name="no_results" msgid="6622510343880730446">"%1$s இல் பொருந்தும் முடிவு இல்லை"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"கோப்பைத் திறக்க முடியாது"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"சில ஆவணங்களை நீக்க முடியவில்லை"</string> <string name="share_via" msgid="8966594246261344259">"இதன் வழியாகப் பகிர்"</string> <string name="copy_notification_title" msgid="6374299806748219777">"கோப்புகளை நகலெடுத்தல்"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"நகல் தயாராகிறது…"</string> <string name="move_preparing" msgid="2772219441375531410">"நகர்த்துவதற்குத் தயார்படுத்துகிறது…"</string> <string name="delete_preparing" msgid="5655813182533491992">"நீக்கத் தயாராகிறது…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நகலெடுக்க முடியவில்லை</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகலெடுக்க முடியவில்லை</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நகர்த்த முடியவில்லை</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகர்த்த முடியவில்லை</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நீக்க முடியவில்லை</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நீக்க முடியவில்லை</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"விவரங்களைப் பார்க்க, தட்டவும்"</string> <string name="close" msgid="3043722427445528732">"மூடு"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"பின்வரும் கோப்புகள் நகலெடுக்கப்படவில்லை: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"பின்வரும் கோப்புகள் நகர்த்தப்படவில்லை: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"இந்தக் கோப்புகள் வேறொரு வடிவத்திற்கு மாற்றப்பட்டன: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">கிளிப்போர்டிற்கு <xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகள் நகலெடுக்கப்பட்டன.</item> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml index f24757110bfa..8562ef650232 100644 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ b/packages/DocumentsUI/res/values-th/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ซ่อนราก"</string> <string name="save_error" msgid="6167009778003223664">"การบันทึกเอกสารล้มเหลว"</string> <string name="create_error" msgid="3735649141335444215">"การสร้างโฟลเดอร์ล้มเหลว"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"โหลดเนื้อหาไม่ได้ในขณะนี้"</string> <string name="root_recent" msgid="4470053704320518133">"ล่าสุด"</string> <string name="root_available_bytes" msgid="8568452858617033281">"ว่าง <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"บริการที่เก็บข้อมูล"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"แอปเพิ่มเติม"</string> <string name="empty" msgid="7858882803708117596">"ไม่มีรายการ"</string> <string name="no_results" msgid="6622510343880730446">"ไม่พบข้อมูลที่ตรงกันใน %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"เปิดไฟล์ไม่ได้"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ไม่สามารถลบเอกสารบางรายการ"</string> <string name="share_via" msgid="8966594246261344259">"แชร์ผ่าน"</string> <string name="copy_notification_title" msgid="6374299806748219777">"กำลังคัดลอกไฟล์"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"กำลังเตรียมการคัดลอก…"</string> <string name="move_preparing" msgid="2772219441375531410">"กำลังเตรียมการย้าย…"</string> <string name="delete_preparing" msgid="5655813182533491992">"กำลังเตรียมลบ…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">คัดลอกไม่ได้ <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> + <item quantity="one">คัดลอกไม่ได้ <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">ย้ายไม่ได้ <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> + <item quantity="one">ย้ายไม่ได้ <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">ลบไม่ได้ <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> + <item quantity="one">ลบไม่ได้ <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"แตะเพื่อดูรายละเอียด"</string> <string name="close" msgid="3043722427445528732">"ปิด"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"ไม่ได้คัดลอกไฟล์เหล่านี้: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"ไม่ได้ย้ายไฟล์เหล่านี้: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"ไฟล์ต่อไปนี้แปลงเป็นอีกรูปแบบหนึ่งแล้ว: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">คัดลอก <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์ไปยังคลิปบอร์ดแล้ว</item> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index bca1f84d0217..de0c9bd1db3c 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Itago ang mga root"</string> <string name="save_error" msgid="6167009778003223664">"Hindi na-save ang dokumento"</string> <string name="create_error" msgid="3735649141335444215">"Hindi nagawa ang folder"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Hindi ma-load ang content sa ngayon"</string> <string name="root_recent" msgid="4470053704320518133">"Kamakailan"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ang libre"</string> <string name="root_type_service" msgid="2178854894416775409">"Mga serbisyo ng storage"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Higit pang apps"</string> <string name="empty" msgid="7858882803708117596">"Walang mga item"</string> <string name="no_results" msgid="6622510343880730446">"Walang mga katugma sa %1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Hindi mabuksan ang file"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Hindi matanggal ang ilang dokumento"</string> <string name="share_via" msgid="8966594246261344259">"Ibahagi sa pamamagitan ng"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Kinokopya ang mga file"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Naghahanda para sa pagkopya…"</string> <string name="move_preparing" msgid="2772219441375531410">"Naghahanda para sa paglilipat…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Naghahanda para sa pag-delete…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Hindi makopya ang <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> + <item quantity="other">Hindi makopya ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Hindi mailipat ang <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> + <item quantity="other">Hindi mailipat ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Hindi ma-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> + <item quantity="other">Hindi ma-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"I-tap upang tingnan ang mga detalye"</string> <string name="close" msgid="3043722427445528732">"Isara"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Hindi nakopya ang mga file na ito: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Hindi nailipat ang mga file na ito: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Na-convert ang mga file na ito sa ibang format: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one">Nakopya ang <xliff:g id="COUNT_1">%1$d</xliff:g> file sa clipboard.</item> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index 7ee02180b2da..c9245c6ce4f7 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Kökleri sakla"</string> <string name="save_error" msgid="6167009778003223664">"Doküman kaydedilemedi"</string> <string name="create_error" msgid="3735649141335444215">"Klasör oluşturulamadı"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"İçerik şu anda yüklenemiyor"</string> <string name="root_recent" msgid="4470053704320518133">"En son"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> boş"</string> <string name="root_type_service" msgid="2178854894416775409">"Depolama hizmetleri"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Diğer uygulamalar"</string> <string name="empty" msgid="7858882803708117596">"Öğe yok"</string> <string name="no_results" msgid="6622510343880730446">"%1$s içinde eşleşme bulunamadı"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Dosya açılamıyor"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Bazı dokümanlar silinemiyor"</string> <string name="share_via" msgid="8966594246261344259">"Şunu kullanarak paylaş:"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Dosyalar kopyalanıyor"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Kopyalanmak için hazırlanıyor…"</string> <string name="move_preparing" msgid="2772219441375531410">"Taşıma için hazırlanıyor…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Silmek için hazırlanıyor…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya kopyalanamadı</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya kopyalanamadı</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya taşınamadı</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya taşınamadı</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya silinemedi</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya silinemedi</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Ayrıntıları görmek için hafifçe dokunun"</string> <string name="close" msgid="3043722427445528732">"Kapat"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Şu dosyalar kopyalanamadı: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Şu dosyalar taşınamadı: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Bu dosyalar başka bir biçime dönüştürüldü: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya panoya kopyalandı.</item> diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml index 1ef29267d88d..40831eb2e013 100644 --- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml +++ b/packages/DocumentsUI/res/values-ur-rPK/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"روٹس کو چھپائیں"</string> <string name="save_error" msgid="6167009778003223664">"دستاویز کو محفوظ کرنے میں ناکام ہو گیا۔"</string> <string name="create_error" msgid="3735649141335444215">"فولڈر بنانے میں ناکام ہو گیا"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"اس وقت مواد لوڈ نہیں ہو سکتا"</string> <string name="root_recent" msgid="4470053704320518133">"حالیہ"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> خالی"</string> <string name="root_type_service" msgid="2178854894416775409">"اسٹوریج سروسز"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"مزید ایپس"</string> <string name="empty" msgid="7858882803708117596">"کوئی آئٹمز نہيں ہیں"</string> <string name="no_results" msgid="6622510343880730446">"%1$s میں کوئی مماثل نہیں"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"فائل نہیں کھل سکتی"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"کچھ دستاویزات کو حذف کرنے سے قاصر"</string> <string name="share_via" msgid="8966594246261344259">"اشتراک کریں بذریعہ"</string> <string name="copy_notification_title" msgid="6374299806748219777">"فائلیں کاپی ہو رہی ہیں"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"کاپی کیلئے تیار ہو رہا ہے…"</string> <string name="move_preparing" msgid="2772219441375531410">"منتقلی کیلئے تیار ہو رہی ہیں…"</string> <string name="delete_preparing" msgid="5655813182533491992">"حذف کرنے کیلئے تیاری ہو رہی ہے…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں کاپی نہیں ہو سکیں</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل کاپی نہیں ہو سکی</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں منتقل نہیں ہو سکیں</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل منتقل نہیں ہو سکی</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں حذف نہیں ہو سکیں</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل حذف نہیں ہو سکی</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"تفصیلات دیکھنے کیلئے تھپتھپائیں"</string> <string name="close" msgid="3043722427445528732">"بند کریں"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"یہ فائلیں کاپی نہیں ہوئیں: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"یہ فائلیں منتقل نہیں ہوئیں: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"ان فائلوں کو ایک دوسرے فارمیٹ میں تبدیل کیا گیا تھا: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلز کلپ بورڈ پر کاپی کی گئیں۔</item> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml index b8111252a908..48fa9a6f2925 100644 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml @@ -31,7 +31,7 @@ <string name="menu_save" msgid="2394743337684426338">"Saqlash"</string> <string name="menu_share" msgid="3075149983979628146">"Ulashish"</string> <string name="menu_delete" msgid="8138799623850614177">"O‘chirish"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Barchasini belgilash"</string> + <string name="menu_select_all" msgid="8323579667348729928">"Hammasini belgilash"</string> <string name="menu_copy" msgid="3612326052677229148">"Nusxalash…"</string> <string name="menu_move" msgid="1828090633118079817">"Ko‘chirib o‘tkazish…"</string> <string name="menu_new_window" msgid="1226032889278727538">"Yangi oyna"</string> @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Asosiy jildlarni yashirish"</string> <string name="save_error" msgid="6167009778003223664">"Hujjat saqlanmadi"</string> <string name="create_error" msgid="3735649141335444215">"Jild yaratilmadi"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Ayni paytda kontentni yuklab bo‘lmayapti"</string> <string name="root_recent" msgid="4470053704320518133">"Yaqinda"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bo‘sh"</string> <string name="root_type_service" msgid="2178854894416775409">"Xotira xizmatlari"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Ko‘proq dasturlar"</string> <string name="empty" msgid="7858882803708117596">"Hech narsa yo‘q"</string> <string name="no_results" msgid="6622510343880730446">"%1$s jildidan topilmadi"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Fayl ochilmadi"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ba’zi hujjatlar o‘chirilmadi"</string> <string name="share_via" msgid="8966594246261344259">"Quyidagi orqali ulashish"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Fayllar nusxalanmoqda"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Nuxsa olishga tayyorgarlik..."</string> <string name="move_preparing" msgid="2772219441375531410">"Ko‘chirishga tayyorgarlik…"</string> <string name="delete_preparing" msgid="5655813182533491992">"O‘chirishga tayyorlanmoqda…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta fayldan nusxa olib bo‘lmadi</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta fayldan nusxa olib bo‘lmadi</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta faylni ko‘chirib bo‘lmadi</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta faylni ko‘chirib bo‘lmadi</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta faylni o‘chirib bo‘lmadi</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta faylni o‘chirib bo‘lmadi</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Batafsil ma’lumot olish uchun bosing"</string> <string name="close" msgid="3043722427445528732">"Yopish"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Quyidagi fayllardan nusxa olinmadi: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Quyidagi fayllar ko‘chirilmadi: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ushbu fayllar boshqa formatga o‘girildi: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta fayldan vaqtinchalik xotiraga nusxa olindi.</item> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml index 0ad4e3bd67cc..bb48b0c75396 100644 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"隐藏根目录"</string> <string name="save_error" msgid="6167009778003223664">"无法保存文档"</string> <string name="create_error" msgid="3735649141335444215">"无法创建文件夹"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"暂时无法加载内容"</string> <string name="root_recent" msgid="4470053704320518133">"最近"</string> <string name="root_available_bytes" msgid="8568452858617033281">"可用空间:<xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"存储服务"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"更多应用"</string> <string name="empty" msgid="7858882803708117596">"无任何文件"</string> <string name="no_results" msgid="6622510343880730446">"%1$s中没有任何相符项"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"无法打开文件"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"无法删除部分文档"</string> <string name="share_via" msgid="8966594246261344259">"分享方式"</string> <string name="copy_notification_title" msgid="6374299806748219777">"正在复制文件"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"正在准备复制…"</string> <string name="move_preparing" msgid="2772219441375531410">"正在准备移动…"</string> <string name="delete_preparing" msgid="5655813182533491992">"正在准备删除…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="other">无法复制 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件</item> + <item quantity="one">无法复制 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件</item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="other">无法移动 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件</item> + <item quantity="one">无法移动 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件</item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="other">无法删除 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件</item> + <item quantity="one">无法删除 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件</item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"点按即可查看详情"</string> <string name="close" msgid="3043722427445528732">"关闭"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"无法复制以下文件:<xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"无法移动以下文件:<xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"下列文件已转换成其他格式:<xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">已将 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件复制到剪贴板。</item> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml index 44ac652f6a21..f8d46d5c8ff7 100644 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml @@ -98,8 +98,8 @@ </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"輕按即可查看詳細資訊"</string> <string name="close" msgid="3043722427445528732">"關閉"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"未複製下列檔案:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"未移動下列檔案:<xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"以下檔案未能複製:<xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"以下檔案未能移動:<xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"這些檔案已轉換成其他格式:<xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="other">已複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案到剪貼簿。</item> diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml index f450209b1e0e..c49500cd6ba6 100644 --- a/packages/DocumentsUI/res/values-zu/strings.xml +++ b/packages/DocumentsUI/res/values-zu/strings.xml @@ -53,8 +53,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Fihla izimpande"</string> <string name="save_error" msgid="6167009778003223664">"Yehlulekile ukulondoloza idokhumenti"</string> <string name="create_error" msgid="3735649141335444215">"Yehlulekile ukudala ifolda"</string> - <!-- no translation found for query_error (5999895349602476581) --> - <skip /> + <string name="query_error" msgid="5999895349602476581">"Ayikwazanga ukulayisha okuqukethwe okwamanje"</string> <string name="root_recent" msgid="4470053704320518133">"Okwakamuva"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> okhululekile"</string> <string name="root_type_service" msgid="2178854894416775409">"Amasevisi wesitoreji"</string> @@ -63,8 +62,7 @@ <string name="root_type_apps" msgid="8838065367985945189">"Izinhlelo zokusebenza eziningi"</string> <string name="empty" msgid="7858882803708117596">"Azikho izinto"</string> <string name="no_results" msgid="6622510343880730446">"Akukho okufanayo ku-%1$s"</string> - <!-- no translation found for toast_no_application (4632640357724698144) --> - <skip /> + <string name="toast_no_application" msgid="4632640357724698144">"Ayikwazanga ukuvula ifayela"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ayikwazi ukususa amanye amadokhumenti"</string> <string name="share_via" msgid="8966594246261344259">"Yabelana nge-"</string> <string name="copy_notification_title" msgid="6374299806748219777">"Ikopisha amafayela"</string> @@ -86,15 +84,22 @@ <string name="copy_preparing" msgid="3896202461003039386">"Ilungiselela ukukopisha..."</string> <string name="move_preparing" msgid="2772219441375531410">"Ilungiselela ukuhambisa…"</string> <string name="delete_preparing" msgid="5655813182533491992">"Ilungiselela ukususa…"</string> - <!-- no translation found for copy_error_notification_title (7160447124922897689) --> - <!-- no translation found for move_error_notification_title (2710901971014783012) --> - <!-- no translation found for delete_error_notification_title (7228393157786591199) --> + <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> + <item quantity="one">Ayikwazanga ukukopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Ayikwazanga ukukopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> + </plurals> + <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> + <item quantity="one">Ayikwazanga ukuhambisa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Ayikwazanga ukuhambisa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> + </plurals> + <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> + <item quantity="one">Ayikwazanga ukususa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Ayikwazanga ukususa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> + </plurals> <string name="notification_touch_for_details" msgid="6268189413228855582">"Thepha ukuze ubuke imininingwane"</string> <string name="close" msgid="3043722427445528732">"Vala"</string> - <!-- no translation found for copy_failure_alert_content (4563147454522476183) --> - <skip /> - <!-- no translation found for move_failure_alert_content (2635075788682922861) --> - <skip /> + <string name="copy_failure_alert_content" msgid="4563147454522476183">"Lawo mafayela awakopishwanga: <xliff:g id="LIST">%1$s</xliff:g>"</string> + <string name="move_failure_alert_content" msgid="2635075788682922861">"Lawa mafayela awazange ahanjiswe: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="copy_converted_warning_content" msgid="5753861488218674361">"Lawo mafayela aguqulelwe kwenye ifomethi: <xliff:g id="LIST">%1$s</xliff:g>"</string> <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> <item quantity="one">Kukopishwe amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g> kubhodi lokunamathisela.</item> diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java index 3c21a214b19b..475387bb224b 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -216,11 +216,13 @@ public abstract class BaseActivity extends Activity return state; } - void onStackRestored(boolean restored, boolean external) {} + public void setRootsDrawerOpen(boolean open) { + mNavigator.revealRootsDrawer(open); + } void onRootPicked(RootInfo root) { - // Skip refreshing if root didn't change - if(root.equals(getCurrentRoot())) { + // Skip refreshing if root nor directory didn't change + if (root.equals(getCurrentRoot()) && mState.stack.size() == 1) { return; } @@ -539,7 +541,8 @@ public abstract class BaseActivity extends Activity // Do some "do what a I want" drawer fiddling, but don't // do it if user already hit back recently and we recently // did some fiddling. - if ((System.currentTimeMillis() - mDrawerLastFiddled) > DRAWER_NO_FIDDLE_DELAY) { + if (mDrawer.isPresent() + && (System.currentTimeMillis() - mDrawerLastFiddled) > DRAWER_NO_FIDDLE_DELAY) { // Close drawer if it is open. if (mDrawer.isOpen()) { mDrawer.setOpen(false); diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index 3485fe4446f5..80bdfda035d6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -32,7 +32,6 @@ import android.content.ComponentName; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentValues; -import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; import android.content.res.Resources; @@ -141,8 +140,7 @@ public class DocumentsActivity extends BaseActivity { } } - @Override - void onStackRestored(boolean restored, boolean external) { + private void onStackRestored(boolean restored, boolean external) { // Show drawer when no stack restored, but only when requesting // non-visual content. However, if we last used an external app, // drawer is always shown. @@ -329,10 +327,6 @@ public class DocumentsActivity extends BaseActivity { mNavigator.revealRootsDrawer(false); } - public void setRootsDrawerOpen(boolean open) { - mNavigator.revealRootsDrawer(open); - } - @Override public void onDocumentPicked(DocumentInfo doc, SiblingProvider siblings) { final FragmentManager fm = getFragmentManager(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/Events.java b/packages/DocumentsUI/src/com/android/documentsui/Events.java index 99b425e9fac2..14d4e2d942d9 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Events.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Events.java @@ -91,6 +91,8 @@ public final class Events { case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_MOVE_HOME: case KeyEvent.KEYCODE_MOVE_END: + case KeyEvent.KEYCODE_PAGE_UP: + case KeyEvent.KEYCODE_PAGE_DOWN: return true; default: return false; diff --git a/packages/DocumentsUI/src/com/android/documentsui/State.java b/packages/DocumentsUI/src/com/android/documentsui/State.java index d141de667f2f..139fb454c856 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/State.java +++ b/packages/DocumentsUI/src/com/android/documentsui/State.java @@ -16,12 +16,16 @@ package com.android.documentsui; +import static com.android.documentsui.Shared.DEBUG; + import android.annotation.IntDef; import android.content.Intent; import android.os.Parcel; import android.os.Parcelable; +import android.util.Log; import android.util.SparseArray; +import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; @@ -35,6 +39,8 @@ import java.util.List; public class State implements android.os.Parcelable { + private static final String TAG = "State"; + public static final int ACTION_OPEN = 1; public static final int ACTION_CREATE = 2; public static final int ACTION_GET_CONTENT = 3; @@ -85,6 +91,8 @@ public class State implements android.os.Parcelable { /** Current user navigation stack; empty implies recents. */ public DocumentStack stack = new DocumentStack(); private boolean mStackTouched; + private boolean mInitialRootChanged; + private boolean mInitialDocChanged; /** Currently active search, overriding any stack. */ public String currentSearch; @@ -92,8 +100,11 @@ public class State implements android.os.Parcelable { /** Instance state for every shown directory */ public HashMap<String, SparseArray<Parcelable>> dirState = new HashMap<>(); + /** UI selection */ + public Selection selectedDocuments = new Selection(); + /** Currently copying file */ - public List<DocumentInfo> selectedDocumentsForCopy = new ArrayList<DocumentInfo>(); + public List<DocumentInfo> selectedDocumentsForCopy = new ArrayList<>(); /** Name of the package that started DocsUI */ public List<String> excludedAuthorities = new ArrayList<>(); @@ -108,22 +119,32 @@ public class State implements android.os.Parcelable { } public void onRootChanged(RootInfo root) { + if (DEBUG) Log.d(TAG, "Root changed to: " + root); + if (!mInitialRootChanged && stack.root != null && !root.equals(stack.root)) { + mInitialRootChanged = true; + } stack.root = root; stack.clear(); mStackTouched = true; } public void pushDocument(DocumentInfo info) { + if (DEBUG) Log.d(TAG, "Adding doc to stack: " + info); + if (!mInitialDocChanged && stack.size() > 0 && !info.equals(stack.peek())) { + mInitialDocChanged = true; + } stack.push(info); mStackTouched = true; } public void popDocument() { + if (DEBUG) Log.d(TAG, "Popping doc off stack."); stack.pop(); mStackTouched = true; } public void setStack(DocumentStack stack) { + if (DEBUG) Log.d(TAG, "Setting the whole darn stack to: " + stack); this.stack = stack; mStackTouched = true; } @@ -132,6 +153,10 @@ public class State implements android.os.Parcelable { return mStackTouched; } + public boolean initialiLocationHasChanged() { + return mInitialRootChanged || mInitialDocChanged; + } + @Override public int describeContents() { return 0; @@ -152,10 +177,13 @@ public class State implements android.os.Parcelable { DurableUtils.writeToParcel(out, stack); out.writeString(currentSearch); out.writeMap(dirState); + out.writeParcelable(selectedDocuments, 0); out.writeList(selectedDocumentsForCopy); out.writeList(excludedAuthorities); out.writeInt(openableOnly ? 1 : 0); out.writeInt(mStackTouched ? 1 : 0); + out.writeInt(mInitialRootChanged ? 1 : 0); + out.writeInt(mInitialDocChanged ? 1 : 0); } public static final ClassLoaderCreator<State> CREATOR = new ClassLoaderCreator<State>() { @@ -180,10 +208,13 @@ public class State implements android.os.Parcelable { DurableUtils.readFromParcel(in, state.stack); state.currentSearch = in.readString(); in.readMap(state.dirState, loader); + state.selectedDocuments = in.readParcelable(loader); in.readList(state.selectedDocumentsForCopy, loader); in.readList(state.excludedAuthorities, loader); state.openableOnly = in.readInt() != 0; state.mStackTouched = in.readInt() != 0; + state.mInitialRootChanged = in.readInt() != 0; + state.mInitialDocChanged = in.readInt() != 0; return state; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index 70bee3cd3c6e..174984cec8ed 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -27,6 +27,7 @@ import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkState; import static com.google.common.base.Preconditions.checkArgument; +import android.annotation.IntDef; import android.annotation.StringRes; import android.app.Activity; import android.app.ActivityManager; @@ -53,9 +54,7 @@ import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.GridLayoutManager.SpanSizeLookup; -import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.LayoutManager; import android.support.v7.widget.RecyclerView.OnItemTouchListener; import android.support.v7.widget.RecyclerView.RecyclerListener; import android.support.v7.widget.RecyclerView.ViewHolder; @@ -94,14 +93,19 @@ import com.android.documentsui.RootsCache; import com.android.documentsui.Shared; import com.android.documentsui.Snackbars; import com.android.documentsui.State; +import com.android.documentsui.State.ViewMode; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.RootInfo; import com.android.documentsui.services.FileOperationService; +import com.android.documentsui.services.FileOperationService.OpType; import com.android.documentsui.services.FileOperations; + import com.google.common.collect.Lists; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -111,6 +115,13 @@ import java.util.List; */ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Environment { + @IntDef(flag = true, value = { + TYPE_NORMAL, + TYPE_SEARCH, + TYPE_RECENT_OPEN + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ResultType {} public static final int TYPE_NORMAL = 1; public static final int TYPE_SEARCH = 2; public static final int TYPE_RECENT_OPEN = 3; @@ -140,6 +151,7 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi private MultiSelectManager mSelectionManager; private Model.UpdateListener mModelUpdateListener = new ModelUpdateListener(); private ItemEventListener mItemEventListener = new ItemEventListener(); + private FocusManager mFocusManager; private IconHelper mIconHelper; @@ -147,7 +159,7 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi private RecyclerView mRecView; private ListeningGestureDetector mGestureDetector; - private int mType = TYPE_NORMAL; + private @ResultType int mType = TYPE_NORMAL; private String mStateKey; private int mLastSortOrder = SORT_ORDER_UNKNOWN; @@ -155,9 +167,7 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi private LoaderCallbacks<DirectoryResult> mCallbacks; private FragmentTuner mTuner; private DocumentClipper mClipper; - // These are lazily initialized. - private LinearLayoutManager mListLayout; - private GridLayoutManager mGridLayout; + private GridLayoutManager mLayout; private int mColumnCount = 1; // This will get updated when layout changes. private MessageBar mMessageBar; @@ -182,22 +192,6 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi } }); - // TODO: Rather than update columns on layout changes, push this - // code (or something like it) into GridLayoutManager. - mRecView.addOnLayoutChangeListener( - new View.OnLayoutChangeListener() { - - @Override - public void onLayoutChange( - View v, int left, int top, int right, int bottom, int oldLeft, - int oldTop, int oldRight, int oldBottom) { - mColumnCount = calculateColumnCount(); - if (mGridLayout != null) { - mGridLayout.setSpanCount(mColumnCount); - } - } - }); - mRecView.setItemAnimator(new DirectoryItemAnimator(getActivity())); // TODO: Add a divider between views (which might use RecyclerView.ItemDecoration). @@ -218,9 +212,6 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi final View view = mRecView.getChildAt(i); cancelThumbnailTask(view); } - - // Clear any outstanding selection - mSelectionManager.clearSelection(); } @Override @@ -232,6 +223,7 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi final RootInfo root = getArguments().getParcelable(EXTRA_ROOT); final DocumentInfo doc = getArguments().getParcelable(EXTRA_DOC); + mStateKey = buildStateKey(root, doc); mIconHelper = new IconHelper(context, MODE_GRID); @@ -240,10 +232,24 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi mRecView.setAdapter(mAdapter); + mLayout = new GridLayoutManager(getContext(), mColumnCount); + SpanSizeLookup lookup = mAdapter.createSpanSizeLookup(); + if (lookup != null) { + mLayout.setSpanSizeLookup(lookup); + } + mRecView.setLayoutManager(mLayout); + mGestureDetector = new ListeningGestureDetector(this.getContext(), new GestureListener()); mRecView.addOnItemTouchListener(mGestureDetector); + // final here because we'll manually bump the listener iwhen we had an initial selection, + // but only after the model is fully loaded. + final SelectionModeListener selectionListener = new SelectionModeListener(); + final Selection initialSelection = state.selectedDocuments.hasDirectoryKey(mStateKey) + ? state.selectedDocuments + : null; + // TODO: instead of inserting the view into the constructor, extract listener-creation code // and set the listener on the view after the fact. Then the view doesn't need to be passed // into the selection manager. @@ -252,17 +258,20 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi mAdapter, state.allowMultiple ? MultiSelectManager.MODE_MULTIPLE - : MultiSelectManager.MODE_SINGLE); - mSelectionManager.addCallback(new SelectionModeListener()); + : MultiSelectManager.MODE_SINGLE, + initialSelection); + + mSelectionManager.addCallback(selectionListener); + + mFocusManager = new FocusManager(mRecView, mSelectionManager); mModel = new Model(); mModel.addUpdateListener(mAdapter); mModel.addUpdateListener(mModelUpdateListener); mType = getArguments().getInt(EXTRA_TYPE); - mStateKey = buildStateKey(root, doc); - mTuner = FragmentTuner.pick(state); + mTuner = FragmentTuner.pick(getContext(), state); mClipper = new DocumentClipper(context); boolean hideGridTitles; @@ -320,10 +329,8 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi updateDisplayState(); - // When launched into empty recents, show drawer - if (mType == TYPE_RECENT_OPEN && mModel.isEmpty() && !state.hasLocationChanged() && - context instanceof DocumentsActivity) { - ((DocumentsActivity) context).setRootsDrawerOpen(true); + if (initialSelection != null) { + selectionListener.onSelectionChanged(); } // Restore any previous instance state @@ -338,6 +345,8 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi } mLastSortOrder = state.derivedSortOrder; + + mTuner.onModelLoaded(mModel, mType); } @Override @@ -351,6 +360,18 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi } @Override + public void onSaveInstanceState(Bundle outState) { + State state = getDisplayState(); + if (mSelectionManager.hasSelection()) { + mSelectionManager.getSelection(state.selectedDocuments); + state.selectedDocuments.setDirectoryKey(mStateKey); + if (!state.selectedDocuments.isEmpty()) { + if (DEBUG) Log.d(TAG, "Persisted selection: " + state.selectedDocuments); + } + } + } + + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // There's only one request code right now. Replace this with a switch statement or // something more scalable when more codes are added. @@ -432,41 +453,28 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi } /** - * Returns a {@code LayoutManager} for {@code mode}, lazily initializing - * classes as needed. + * Updates the layout after the view mode switches. + * @param mode The new view mode. */ - private void updateLayout(int mode) { - final LayoutManager layout; - switch (mode) { - case MODE_GRID: - if (mGridLayout == null) { - mGridLayout = new GridLayoutManager(getContext(), mColumnCount); - SpanSizeLookup lookup = mAdapter.createSpanSizeLookup(); - if (lookup != null) { - mGridLayout.setSpanSizeLookup(lookup); - } - } - layout = mGridLayout; - break; - case MODE_LIST: - if (mListLayout == null) { - mListLayout = new LinearLayoutManager(getContext()); - } - layout = mListLayout; - break; - default: - throw new IllegalArgumentException("Unsupported layout mode: " + mode); + private void updateLayout(@ViewMode int mode) { + mColumnCount = calculateColumnCount(mode); + if (mLayout != null) { + mLayout.setSpanCount(mColumnCount); } int pad = getDirectoryPadding(mode); mRecView.setPadding(pad, pad, pad, pad); - // setting layout manager automatically invalidates existing ViewHolders. - mRecView.setLayoutManager(layout); + mRecView.requestLayout(); mSelectionManager.handleLayoutChanged(); // RecyclerView doesn't do this for us mIconHelper.setViewMode(mode); } - private int calculateColumnCount() { + private int calculateColumnCount(@ViewMode int mode) { + if (mode == MODE_LIST) { + // List mode is a "grid" with 1 column. + return 1; + } + int cellWidth = getResources().getDimensionPixelSize(R.dimen.grid_width); int cellMargin = 2 * getResources().getDimensionPixelSize(R.dimen.grid_item_margin); int viewPadding = mRecView.getPaddingLeft() + mRecView.getPaddingRight(); @@ -478,14 +486,12 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi return columnCount; } - private int getDirectoryPadding(int mode) { + private int getDirectoryPadding(@ViewMode int mode) { switch (mode) { case MODE_GRID: - return getResources().getDimensionPixelSize( - R.dimen.grid_container_padding); + return getResources().getDimensionPixelSize(R.dimen.grid_container_padding); case MODE_LIST: - return getResources().getDimensionPixelSize( - R.dimen.list_container_padding); + return getResources().getDimensionPixelSize(R.dimen.list_container_padding); default: throw new IllegalArgumentException("Unsupported layout mode: " + mode); } @@ -784,7 +790,7 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi .show(); } - private void transferDocuments(final Selection selected, final int mode) { + private void transferDocuments(final Selection selected, final @OpType int mode) { // Pop up a dialog to pick a destination. This is inadequate but works for now. // TODO: Implement a picker that is to spec. final Intent intent = new Intent( @@ -876,17 +882,8 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi msgView.setText(msg); imageView.setImageResource(drawable); - content.animate().cancel(); // cancel any ongoing animations - - content.setAlpha(0); mEmptyView.setVisibility(View.VISIBLE); mRecView.setVisibility(View.GONE); - - // fade in the content, so it looks purdy like - content.animate() - .alpha(1f) - .setDuration(EMPTY_REVEAL_DURATION) - .setListener(null); } private void showDirectory() { @@ -1255,119 +1252,17 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi return false; } - boolean handled = false; - if (Events.isNavigationKeyCode(keyCode)) { - // Find the target item and focus it. - int endPos = findTargetPosition(doc.itemView, keyCode); - - if (endPos != RecyclerView.NO_POSITION) { - focusItem(endPos); - - // Handle any necessary adjustments to selection. - boolean extendSelection = event.isShiftPressed(); - if (extendSelection) { - int startPos = doc.getAdapterPosition(); - mSelectionManager.selectRange(startPos, endPos); - } - handled = true; - } - } else { - // Handle enter key events - if (keyCode == KeyEvent.KEYCODE_ENTER) { - handled = onActivate(doc); - } - } - - return handled; - } - - /** - * Finds the destination position where the focus should land for a given navigation event. - * - * @param view The view that received the event. - * @param keyCode The key code for the event. - * @return The adapter position of the destination item. Could be RecyclerView.NO_POSITION. - */ - private int findTargetPosition(View view, int keyCode) { - if (keyCode == KeyEvent.KEYCODE_MOVE_HOME) { - return 0; - } - - if (keyCode == KeyEvent.KEYCODE_MOVE_END) { - return mAdapter.getItemCount() - 1; - } - - // Find a navigation target based on the arrow key that the user pressed. - int searchDir = -1; - switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_UP: - searchDir = View.FOCUS_UP; - break; - case KeyEvent.KEYCODE_DPAD_DOWN: - searchDir = View.FOCUS_DOWN; - break; - case KeyEvent.KEYCODE_DPAD_LEFT: - searchDir = View.FOCUS_LEFT; - break; - case KeyEvent.KEYCODE_DPAD_RIGHT: - searchDir = View.FOCUS_RIGHT; - break; + if (mFocusManager.handleKey(doc, keyCode, event)) { + return true; } - if (searchDir != -1) { - View targetView = view.focusSearch(searchDir); - // TargetView can be null, for example, if the user pressed <down> at the bottom - // of the list. - if (targetView != null) { - // Ignore navigation targets that aren't items in the RecyclerView. - if (targetView.getParent() == mRecView) { - return mRecView.getChildAdapterPosition(targetView); - } - } + // Handle enter key events + if (keyCode == KeyEvent.KEYCODE_ENTER) { + return onActivate(doc); } - return RecyclerView.NO_POSITION; - } - - /** - * Requests focus for the item in the given adapter position, scrolling the RecyclerView if - * necessary. - * - * @param pos - */ - public void focusItem(final int pos) { - // If the item is already in view, focus it; otherwise, scroll to it and focus it. - RecyclerView.ViewHolder vh = mRecView.findViewHolderForAdapterPosition(pos); - if (vh != null) { - vh.itemView.requestFocus(); - } else { - mRecView.smoothScrollToPosition(pos); - // Set a one-time listener to request focus when the scroll has completed. - mRecView.addOnScrollListener( - new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged (RecyclerView view, int newState) { - if (newState == RecyclerView.SCROLL_STATE_IDLE) { - // When scrolling stops, find the item and focus it. - RecyclerView.ViewHolder vh = - view.findViewHolderForAdapterPosition(pos); - if (vh != null) { - vh.itemView.requestFocus(); - } else { - // This might happen in weird corner cases, e.g. if the user is - // scrolling while a delete operation is in progress. In that - // case, just don't attempt to focus the missing item. - Log.w( - TAG, "Unable to focus position " + pos + " after a scroll"); - } - view.removeOnScrollListener(this); - } - } - }); - } + return false; } - - } private final class ModelUpdateListener implements Model.UpdateListener { diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java index 43c2f6386347..0930c22b356c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java @@ -27,7 +27,6 @@ import android.util.SparseArray; import com.android.documentsui.State; -import java.nio.channels.UnsupportedAddressTypeException; import java.util.List; /** @@ -87,7 +86,7 @@ abstract class DocumentsAdapter * we adjust sizes. */ GridLayoutManager.SpanSizeLookup createSpanSizeLookup() { - throw new UnsupportedAddressTypeException(); + throw new UnsupportedOperationException(); } static boolean isDirectory(Cursor cursor) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java new file mode 100644 index 000000000000..86b9146ba48c --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui.dirlist; + +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; + +import com.android.documentsui.Events; + +/** + * A class that handles navigation and focus within the DirectoryFragment. + */ +class FocusManager { + private static final String TAG = "FocusManager"; + + private RecyclerView mView; + private RecyclerView.Adapter<?> mAdapter; + private LinearLayoutManager mLayout; + private MultiSelectManager mSelectionManager; + + public FocusManager(RecyclerView view, MultiSelectManager selectionManager) { + mView = view; + mAdapter = view.getAdapter(); + mLayout = (LinearLayoutManager) view.getLayoutManager(); + mSelectionManager = selectionManager; + } + + /** + * Handles navigation (setting focus, adjusting selection if needed) arising from incoming key + * events. + * + * @param doc The DocumentHolder receiving the key event. + * @param keyCode + * @param event + * @return Whether the event was handled. + */ + public boolean handleKey(DocumentHolder doc, int keyCode, KeyEvent event) { + boolean handled = false; + if (Events.isNavigationKeyCode(keyCode)) { + // Find the target item and focus it. + int endPos = findTargetPosition(doc.itemView, keyCode, event); + + if (endPos != RecyclerView.NO_POSITION) { + focusItem(endPos); + + // Handle any necessary adjustments to selection. + boolean extendSelection = event.isShiftPressed(); + if (extendSelection) { + int startPos = doc.getAdapterPosition(); + mSelectionManager.selectRange(startPos, endPos); + } + handled = true; + } + } + return handled; + } + + /** + * Finds the destination position where the focus should land for a given navigation event. + * + * @param view The view that received the event. + * @param keyCode The key code for the event. + * @param event + * @return The adapter position of the destination item. Could be RecyclerView.NO_POSITION. + */ + private int findTargetPosition(View view, int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_MOVE_HOME: + return 0; + case KeyEvent.KEYCODE_MOVE_END: + return mAdapter.getItemCount() - 1; + case KeyEvent.KEYCODE_PAGE_UP: + case KeyEvent.KEYCODE_PAGE_DOWN: + return findPagedTargetPosition(view, keyCode, event); + } + + // Find a navigation target based on the arrow key that the user pressed. + int searchDir = -1; + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_UP: + searchDir = View.FOCUS_UP; + break; + case KeyEvent.KEYCODE_DPAD_DOWN: + searchDir = View.FOCUS_DOWN; + break; + case KeyEvent.KEYCODE_DPAD_LEFT: + searchDir = View.FOCUS_LEFT; + break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + searchDir = View.FOCUS_RIGHT; + break; + } + + if (searchDir != -1) { + View targetView = view.focusSearch(searchDir); + // TargetView can be null, for example, if the user pressed <down> at the bottom + // of the list. + if (targetView != null) { + // Ignore navigation targets that aren't items in the RecyclerView. + if (targetView.getParent() == mView) { + return mView.getChildAdapterPosition(targetView); + } + } + } + + return RecyclerView.NO_POSITION; + } + + /** + * Given a PgUp/PgDn event and the current view, find the position of the target view. + * This returns: + * <li>The position of the topmost (or bottom-most) visible item, if the current item is not + * the top- or bottom-most visible item. + * <li>The position of an item that is one page's worth of items up (or down) if the current + * item is the top- or bottom-most visible item. + * <li>The first (or last) item, if paging up (or down) would go past those limits. + * @param view The view that received the key event. + * @param keyCode Must be KEYCODE_PAGE_UP or KEYCODE_PAGE_DOWN. + * @param event + * @return The adapter position of the target item. + */ + private int findPagedTargetPosition(View view, int keyCode, KeyEvent event) { + int first = mLayout.findFirstVisibleItemPosition(); + int last = mLayout.findLastVisibleItemPosition(); + int current = mView.getChildAdapterPosition(view); + int pageSize = last - first + 1; + + if (keyCode == KeyEvent.KEYCODE_PAGE_UP) { + if (current > first) { + // If the current item isn't the first item, target the first item. + return first; + } else { + // If the current item is the first item, target the item one page up. + int target = current - pageSize; + return target < 0 ? 0 : target; + } + } + + if (keyCode == KeyEvent.KEYCODE_PAGE_DOWN) { + if (current < last) { + // If the current item isn't the last item, target the last item. + return last; + } else { + // If the current item is the last item, target the item one page down. + int target = current + pageSize; + int max = mAdapter.getItemCount() - 1; + return target < max ? target : max; + } + } + + throw new IllegalArgumentException("Unsupported keyCode: " + keyCode); + } + + /** + * Requests focus for the item in the given adapter position, scrolling the RecyclerView if + * necessary. + * + * @param pos + */ + private void focusItem(final int pos) { + // If the item is already in view, focus it; otherwise, scroll to it and focus it. + RecyclerView.ViewHolder vh = mView.findViewHolderForAdapterPosition(pos); + if (vh != null) { + vh.itemView.requestFocus(); + } else { + mView.smoothScrollToPosition(pos); + // Set a one-time listener to request focus when the scroll has completed. + mView.addOnScrollListener( + new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView view, int newState) { + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + // When scrolling stops, find the item and focus it. + RecyclerView.ViewHolder vh = + view.findViewHolderForAdapterPosition(pos); + if (vh != null) { + vh.itemView.requestFocus(); + } else { + // This might happen in weird corner cases, e.g. if the user is + // scrolling while a delete operation is in progress. In that + // case, just don't attempt to focus the missing item. + Log.w(TAG, "Unable to focus position " + pos + " after scroll"); + } + view.removeOnScrollListener(this); + } + } + }); + } + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java index a295ab2524fb..3f51e538a263 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java @@ -16,6 +16,7 @@ package com.android.documentsui.dirlist; +import static com.android.documentsui.Shared.DEBUG; import static com.android.documentsui.State.ACTION_BROWSE; import static com.android.documentsui.State.ACTION_CREATE; import static com.android.documentsui.State.ACTION_GET_CONTENT; @@ -24,36 +25,43 @@ import static com.android.documentsui.State.ACTION_OPEN; import static com.android.documentsui.State.ACTION_OPEN_TREE; import static com.android.internal.util.Preconditions.checkArgument; -import com.android.documentsui.Menus; -import com.android.documentsui.MimePredicate; -import com.android.documentsui.R; -import com.android.documentsui.State; - +import android.content.Context; import android.os.SystemProperties; import android.provider.DocumentsContract.Document; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import com.android.documentsui.DocumentsActivity; +import com.android.documentsui.FilesActivity; +import com.android.documentsui.Menus; +import com.android.documentsui.MimePredicate; +import com.android.documentsui.R; +import com.android.documentsui.State; +import com.android.documentsui.dirlist.DirectoryFragment.ResultType; + /** * Providers support for specializing the DirectoryFragment to the "host" Activity. * Feel free to expand the role of this class to handle other specializations. */ public abstract class FragmentTuner { + final Context mContext; final State mState; - public FragmentTuner(State state) { + public FragmentTuner(Context context, State state) { + mContext = context; mState = state; } - public static FragmentTuner pick(State state) { + public static FragmentTuner pick(Context context, State state) { switch (state.action) { case ACTION_BROWSE: - return new FilesTuner(state); + return new FilesTuner(context, state); case ACTION_MANAGE: - return new DownloadsTuner(state); + return new DownloadsTuner(context, state); default: - return new DocumentsTuner(state); + return new DocumentsTuner(context, state); } } @@ -76,13 +84,15 @@ public abstract class FragmentTuner { return MimePredicate.mimeMatches(mState.acceptMimes, docMimeType); } + abstract void onModelLoaded(Model model, @ResultType int resultType); + /** * Provides support for Platform specific specializations of DirectoryFragment. */ private static final class DocumentsTuner extends FragmentTuner { - public DocumentsTuner(State state) { - super(state); + public DocumentsTuner(Context context, State state) { + super(context, state); } @Override @@ -154,6 +164,16 @@ public abstract class FragmentTuner { moveTo.setEnabled(moveEnabled); rename.setVisible(false); } + + @Override + void onModelLoaded(Model model, @ResultType int resultType) { + // When launched into empty recents, show drawer + if (resultType == DirectoryFragment.TYPE_RECENT_OPEN + && model.isEmpty() + && !mState.hasLocationChanged()) { + ((DocumentsActivity) mContext).setRootsDrawerOpen(true); + } + } } /** @@ -161,8 +181,8 @@ public abstract class FragmentTuner { */ private static final class DownloadsTuner extends FragmentTuner { - public DownloadsTuner(State state) { - super(state); + public DownloadsTuner(Context context, State state) { + super(context, state); } @Override @@ -189,6 +209,9 @@ public abstract class FragmentTuner { moveTo.setEnabled(moveEnabled); rename.setVisible(false); } + + @Override + void onModelLoaded(Model model, @ResultType int resultType) {} } /** @@ -196,8 +219,10 @@ public abstract class FragmentTuner { */ private static final class FilesTuner extends FragmentTuner { - public FilesTuner(State state) { - super(state); + private static final String TAG = "FilesTuner"; + + public FilesTuner(Context context, State state) { + super(context, state); } @Override @@ -221,9 +246,23 @@ public abstract class FragmentTuner { Menus.disableHiddenItems(menu, copy, paste); } + + @Override + void onModelLoaded(Model model, @ResultType int resultType) { + if (DEBUG) Log.d(TAG, "Handling model loaded. Has Location shcnage: " + mState.initialiLocationHasChanged()); + // When launched into empty root, open drawer. + if (model.isEmpty() && !mState.initialiLocationHasChanged()) { + if (DEBUG) Log.d(TAG, "Showing roots drawer cuz stuffs empty."); + + // This noops on layouts without drawer, so no need to guard. + ((FilesActivity) mContext).setRootsDrawerOpen(true); + } + if (DEBUG) Log.d(TAG, "Donezo."); + } } private static boolean isDirectory(String mimeType) { return Document.MIME_TYPE_DIR.equals(mimeType); } + } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java index 516b25e6f572..d60825baa7cf 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java @@ -23,9 +23,12 @@ import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkState; +import android.annotation.IntDef; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.v7.widget.GridLayoutManager; @@ -41,12 +44,13 @@ import com.android.documentsui.Events.InputEvent; import com.android.documentsui.Events.MotionInputEvent; import com.android.documentsui.R; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -58,10 +62,13 @@ import java.util.Set; */ public final class MultiSelectManager { - /** Selection mode for multiple select. **/ + @IntDef(flag = true, value = { + MODE_MULTIPLE, + MODE_SINGLE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SelectionMode {} public static final int MODE_MULTIPLE = 0; - - /** Selection mode for multiple select. **/ public static final int MODE_SINGLE = 1; private static final String TAG = "MultiSelectManager"; @@ -79,14 +86,19 @@ public final class MultiSelectManager { /** - * @param recyclerView - * @param mode Selection mode + * @param mode Selection single or multiple selection mode. + * @param initialSelection selection state probably preserved in external state. */ public MultiSelectManager( - final RecyclerView recyclerView, DocumentsAdapter adapter, int mode) { - this(new RuntimeSelectionEnvironment(recyclerView), adapter, mode); + final RecyclerView recyclerView, + DocumentsAdapter adapter, + @SelectionMode int mode, + @Nullable Selection initialSelection) { + + this(new RuntimeSelectionEnvironment(recyclerView), adapter, mode, initialSelection); if (mode == MODE_MULTIPLE) { + // TODO: Don't load this on low memory devices. mBandManager = new BandController(); } @@ -116,10 +128,18 @@ public final class MultiSelectManager { * @hide */ @VisibleForTesting - MultiSelectManager(SelectionEnvironment environment, DocumentsAdapter adapter, int mode) { + MultiSelectManager( + SelectionEnvironment environment, + DocumentsAdapter adapter, + @SelectionMode int mode, + @Nullable Selection initialSelection) { + mEnvironment = checkNotNull(environment, "'environment' cannot be null."); mAdapter = checkNotNull(adapter, "'adapter' cannot be null."); mSingleSelect = mode == MODE_SINGLE; + if (initialSelection != null) { + mSelection.copyFrom(initialSelection); + } mAdapter.registerAdapterDataObserver( new RecyclerView.AdapterDataObserver() { @@ -203,6 +223,13 @@ public final class MultiSelectManager { } /** + * Updates selection to include items in {@code selection}. + */ + public void updateSelection(Selection selection) { + setItemsSelected(selection.toList(), true); + } + + /** * Sets the selected state of the specified items. Note that the callback will NOT * be consulted to see if an item can be selected. * @@ -615,7 +642,7 @@ public final class MultiSelectManager { * Object representing the current selection. Provides read only access * public access, and private write access. */ - public static final class Selection { + public static final class Selection implements Parcelable { // This class tracks selected items by managing two sets: the saved selection, and the total // selection. Saved selections are those which have been completed by tapping an item or by @@ -628,8 +655,9 @@ public final class MultiSelectManager { // item A is tapped (and selected), then an in-progress band select covers A then uncovers // A, A should still be selected as it has been saved. To ensure this behavior, the saved // selection must be tracked separately. - private Set<String> mSavedSelection = new HashSet<>(); - private Set<String> mTotalSelection = new HashSet<>(); + private Set<String> mSelection = new HashSet<>(); + private Set<String> mProvisionalSelection = new HashSet<>(); + private String mDirectoryKey; @VisibleForTesting public Selection(String... ids) { @@ -643,53 +671,70 @@ public final class MultiSelectManager { * @return true if the position is currently selected. */ public boolean contains(@Nullable String id) { - return mTotalSelection.contains(id); + return mSelection.contains(id) || mProvisionalSelection.contains(id); } /** * Returns an unordered array of selected positions. */ public String[] getAll() { - return mTotalSelection.toArray(new String[0]); + return toList().toArray(new String[0]); + } + + /** + * Returns an unordered array of selected positions (including any + * provisional selections current in effect). + */ + private List<String> toList() { + ArrayList<String> selection = new ArrayList<String>(mSelection); + selection.addAll(mProvisionalSelection); + return selection; } /** * @return size of the selection. */ public int size() { - return mTotalSelection.size(); + return mSelection.size() + mProvisionalSelection.size(); } /** * @return true if the selection is empty. */ public boolean isEmpty() { - return mTotalSelection.isEmpty(); + return mSelection.isEmpty() && mProvisionalSelection.isEmpty(); } /** * Sets the provisional selection, which is a temporary selection that can be saved, * canceled, or adjusted at a later time. When a new provision selection is applied, the old * one (if it exists) is abandoned. - * @return Array with entry for each position added or removed. Entries which were added - * contain a value of true, and entries which were removed contain a value of false. + * @return Map of ids added or removed. Added ids have a value of true, removed are false. */ @VisibleForTesting - protected Map<String, Boolean> setProvisionalSelection(Set<String> provisionalSelection) { + protected Map<String, Boolean> setProvisionalSelection(Set<String> newSelection) { Map<String, Boolean> delta = new HashMap<>(); - for (String id: mTotalSelection) { + for (String id: mProvisionalSelection) { + // Mark each item that used to be in the selection but is unsaved and not in the new + // provisional selection. + if (!newSelection.contains(id) && !mSelection.contains(id)) { + delta.put(id, false); + } + } + + for (String id: mSelection) { // Mark each item that used to be in the selection but is unsaved and not in the new // provisional selection. - if (!provisionalSelection.contains(id) && !mSavedSelection.contains(id)) { + if (!newSelection.contains(id)) { delta.put(id, false); } } - for (String id: provisionalSelection) { + for (String id: newSelection) { // Mark each item that was not previously in the selection but is in the new // provisional selection. - if (!mTotalSelection.contains(id)) { + if (!mSelection.contains(id) && !mProvisionalSelection.contains(id)) { delta.put(id, true); } } @@ -700,9 +745,9 @@ public final class MultiSelectManager { for (Map.Entry<String, Boolean> entry: delta.entrySet()) { String id = entry.getKey(); if (entry.getValue()) { - mTotalSelection.add(id); + mProvisionalSelection.add(id); } else { - mTotalSelection.remove(id); + mProvisionalSelection.remove(id); } } @@ -716,7 +761,8 @@ public final class MultiSelectManager { */ @VisibleForTesting protected void applyProvisionalSelection() { - mSavedSelection = new HashSet<>(mTotalSelection); + mSelection.addAll(mProvisionalSelection); + mProvisionalSelection.clear(); } /** @@ -725,15 +771,14 @@ public final class MultiSelectManager { */ @VisibleForTesting void cancelProvisionalSelection() { - mTotalSelection = new HashSet<>(mSavedSelection); + mProvisionalSelection.clear(); } /** @hide */ @VisibleForTesting boolean add(String id) { - if (!mTotalSelection.contains(id)) { - mTotalSelection.add(id); - mSavedSelection.add(id); + if (!mSelection.contains(id)) { + mSelection.add(id); return true; } return false; @@ -742,31 +787,29 @@ public final class MultiSelectManager { /** @hide */ @VisibleForTesting boolean remove(String id) { - if (mTotalSelection.contains(id)) { - mTotalSelection.remove(id); - mSavedSelection.remove(id); + if (mSelection.contains(id)) { + mSelection.remove(id); return true; } return false; } public void clear() { - mSavedSelection.clear(); - mTotalSelection.clear(); + mSelection.clear(); } /** * Trims this selection to be the intersection of itself with the set of given IDs. */ public void intersect(Collection<String> ids) { - mSavedSelection.retainAll(ids); - mTotalSelection.retainAll(ids); + mSelection.retainAll(ids); + mProvisionalSelection.retainAll(ids); } @VisibleForTesting void copyFrom(Selection source) { - mSavedSelection = new HashSet<>(source.mSavedSelection); - mTotalSelection = new HashSet<>(source.mTotalSelection); + mSelection = new HashSet<>(source.mSelection); + mProvisionalSelection = new HashSet<>(source.mProvisionalSelection); } @Override @@ -775,24 +818,19 @@ public final class MultiSelectManager { return "size=0, items=[]"; } - StringBuilder buffer = new StringBuilder(mTotalSelection.size() * 28); - buffer.append("{size=") - .append(mTotalSelection.size()) - .append(", ") - .append("items=["); - for (Iterator<String> i = mTotalSelection.iterator(); i.hasNext(); ) { - buffer.append(i.next()); - if (i.hasNext()) { - buffer.append(", "); - } - } - buffer.append("]}"); + StringBuilder buffer = new StringBuilder(size() * 28); + buffer.append("Selection{") + .append("applied{size=" + mSelection.size()) + .append(", entries=" + mSelection) + .append("}, provisional{size=" + mProvisionalSelection.size()) + .append(", entries=" + mProvisionalSelection) + .append("}}"); return buffer.toString(); } @Override public int hashCode() { - return mSavedSelection.hashCode() ^ mTotalSelection.hashCode(); + return mSelection.hashCode() ^ mProvisionalSelection.hashCode(); } @Override @@ -805,8 +843,38 @@ public final class MultiSelectManager { return false; } - return mSavedSelection.equals(((Selection) that).mSavedSelection) && - mTotalSelection.equals(((Selection) that).mTotalSelection); + return mSelection.equals(((Selection) that).mSelection) && + mProvisionalSelection.equals(((Selection) that).mProvisionalSelection); + } + + /** + * Sets the state key for this selection, which allows us to match selections + * to particular states (of DirectoryFragment). Basically this lets us avoid + * loading a persisted selection in the wrong directory. + */ + public void setDirectoryKey(String key) { + mDirectoryKey = key; + } + + /** + * Sets the state key for this selection, which allows us to match selections + * to particular states (of DirectoryFragment). Basically this lets us avoid + * loading a persisted selection in the wrong directory. + */ + public boolean hasDirectoryKey(String key) { + return key.equals(mDirectoryKey); + } + + @Override + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mDirectoryKey); + dest.writeList(new ArrayList<>(mSelection)); + // We don't include provisional selection since it is + // typically coupled to some other runtime state (like a band). } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java new file mode 100644 index 000000000000..34f11207b006 --- /dev/null +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY; +import static com.android.documentsui.StubProvider.ROOT_0_ID; +import static com.android.documentsui.StubProvider.ROOT_1_ID; + +import android.app.Activity; +import android.app.Instrumentation; +import android.content.ContentProviderClient; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.os.RemoteException; +import android.provider.DocumentsContract.Document; +import android.support.test.uiautomator.By; +import android.support.test.uiautomator.Configurator; +import android.support.test.uiautomator.UiDevice; +import android.support.test.uiautomator.UiObjectNotFoundException; +import android.support.test.uiautomator.Until; +import android.test.ActivityInstrumentationTestCase2; +import android.view.MotionEvent; + +import com.android.documentsui.model.RootInfo; + +/** + * Provides basic test environment for UI tests: + * - Launches activity + * - Creates and gives access to test root directories and test files + * - Cleans up the test environment + */ +public abstract class ActivityTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> { + + static final int TIMEOUT = 5000; + + // Testing files. For custom ones, override initTestFiles(). + public static final String dirName1 = "Dir1"; + public static final String fileName1 = "file1.log"; + public static final String fileName2 = "file12.png"; + public static final String fileName3 = "anotherFile0.log"; + public static final String fileName4 = "poodles.text"; + public static final String fileNameNoRename = "NO_RENAMEfile.txt"; + + public UiBot bot; + public UiDevice device; + public Context context; + + public RootInfo rootDir0; + public RootInfo rootDir1; + + ContentResolver mResolver; + DocumentsProviderHelper mDocsHelper; + ContentProviderClient mClient; + + public ActivityTest(Class<T> activityClass) { + super(activityClass); + } + + @Override + public void setUp() throws Exception { + device = UiDevice.getInstance(getInstrumentation()); + // NOTE: Must be the "target" context, else security checks in content provider will fail. + context = getInstrumentation().getTargetContext(); + bot = new UiBot(device, context, TIMEOUT); + + Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); + bot.revealLauncher(); + + mResolver = context.getContentResolver(); + mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); + mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); + + rootDir0 = mDocsHelper.getRoot(ROOT_0_ID); + rootDir1 = mDocsHelper.getRoot(ROOT_1_ID); + + launchActivity(); + + bot.revealApp(); + resetStorage(); + } + + @Override + public void tearDown() throws Exception { + mClient.release(); + super.tearDown(); + } + + void launchActivity() { + final Intent intent = context.getPackageManager().getLaunchIntentForPackage( + UiBot.TARGET_PKG); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + setActivityIntent(intent); + getActivity(); // Launch the activity. + } + + void resetStorage() throws RemoteException { + mClient.call("clear", null, null); + device.waitForIdle(); + } + + void initTestFiles() throws RemoteException { + mDocsHelper.createFolder(rootDir0, dirName1); + mDocsHelper.createDocument(rootDir0, "text/plain", fileName1); + mDocsHelper.createDocument(rootDir0, "image/png", fileName2); + mDocsHelper.createDocumentWithFlags(rootDir0.documentId, "text/plain", fileNameNoRename, + Document.FLAG_SUPPORTS_WRITE); + + mDocsHelper.createDocument(rootDir1, "text/plain", fileName3); + mDocsHelper.createDocument(rootDir1, "text/plain", fileName4); + } + + void assertDefaultContentOfTestDir0() throws UiObjectNotFoundException { + bot.assertDocumentsCount(ROOT_0_ID, 4); + bot.assertHasDocuments(fileName1, fileName2, dirName1, fileNameNoRename); + } + + void assertDefaultContentOfTestDir1() throws UiObjectNotFoundException { + bot.assertDocumentsCount(ROOT_1_ID, 2); + bot.assertHasDocuments(fileName3, fileName4); + } +} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java b/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java index 5df4dcaf11a7..af478eafc38e 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java @@ -92,7 +92,8 @@ public class DocumentsProviderHelper { Uri uri = DocumentsContract.createDocument(mClient, parentUri, mimeType, name); return uri; } catch (RemoteException e) { - throw new RuntimeException("Couldn't create document: " + name + " with mimetype " + mimeType, e); + throw new RuntimeException("Couldn't create document: " + name + " with mimetype " + + mimeType, e); } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java index 243c3577500c..c51f92756012 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java @@ -16,144 +16,86 @@ package com.android.documentsui; -import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY; import static com.android.documentsui.StubProvider.ROOT_0_ID; -import android.app.Instrumentation; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; import android.content.Intent; import android.os.RemoteException; import android.provider.DocumentsContract; import android.support.test.uiautomator.By; -import android.support.test.uiautomator.Configurator; -import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.Until; -import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.LargeTest; -import android.util.Log; -import android.view.MotionEvent; - -import com.android.documentsui.model.RootInfo; @LargeTest -public class DownloadsActivityUiTest extends ActivityInstrumentationTestCase2<DownloadsActivity> { - - private static final int TIMEOUT = 5000; - private static final String TAG = "DownloadsActivityUiTest"; - private static final String TARGET_PKG = "com.android.documentsui"; - private static final String LAUNCHER_PKG = "com.android.launcher"; - - private UiBot mBot; - private UiDevice mDevice; - private Context mContext; - private ContentResolver mResolver; - private DocumentsProviderHelper mDocsHelper; - private ContentProviderClient mClient; - private RootInfo mRoot; +public class DownloadsActivityUiTest extends ActivityTest<DownloadsActivity> { public DownloadsActivityUiTest() { super(DownloadsActivity.class); } - public void setUp() throws Exception { - // Initialize UiDevice instance. - Instrumentation instrumentation = getInstrumentation(); - - mDevice = UiDevice.getInstance(instrumentation); - - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); - - // Start from the home screen. - mDevice.pressHome(); - mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT); - - // NOTE: Must be the "target" context, else security checks in content provider will fail. - mContext = instrumentation.getTargetContext(); - mResolver = mContext.getContentResolver(); - - mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); - mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); - - mRoot = mDocsHelper.getRoot(ROOT_0_ID); - - // Open the Downloads activity on our stub provider root. - Intent intent = new Intent(DocumentsContract.ACTION_MANAGE_ROOT); - intent.setDataAndType(mRoot.getUri(), DocumentsContract.Root.MIME_TYPE_ITEM); + @Override + void launchActivity() { + final Intent intent = new Intent(DocumentsContract.ACTION_MANAGE_ROOT); + intent.setDataAndType(rootDir0.getUri(), DocumentsContract.Root.MIME_TYPE_ITEM); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); setActivityIntent(intent); - getActivity(); // Start the activity. - - // Wait for the app to appear. - mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT); - mDevice.waitForIdle(); - - mBot = new UiBot(mDevice, mContext, TIMEOUT); - - resetStorage(); // Just in case a test failed and tearDown didn't happen. + getActivity(); // Launch the activity. } @Override - protected void tearDown() throws Exception { - Log.d(TAG, "Resetting storage from setUp"); - resetStorage(); - mClient.release(); - - super.tearDown(); - } - - private void resetStorage() throws RemoteException { - mClient.call("clear", null, null); - // TODO: Would be nice to have an event to wait on here. - mDevice.waitForIdle(); - } - - private void initTestFiles() throws RemoteException { - mDocsHelper.createDocument(mRoot, "text/plain", "file0.log"); - mDocsHelper.createDocument(mRoot, "image/png", "file1.png"); - mDocsHelper.createDocument(mRoot, "text/csv", "file2.csv"); + void initTestFiles() throws RemoteException { + mDocsHelper.createDocument(rootDir0, "text/plain", "file0.log"); + mDocsHelper.createDocument(rootDir0, "image/png", "file1.png"); + mDocsHelper.createDocument(rootDir0, "text/csv", "file2.csv"); } public void testWindowTitle() throws Exception { initTestFiles(); - mBot.assertWindowTitle(ROOT_0_ID); + bot.assertWindowTitle(ROOT_0_ID); } public void testFilesListed() throws Exception { initTestFiles(); - mBot.assertHasDocuments("file0.log", "file1.png", "file2.csv"); + bot.assertHasDocuments("file0.log", "file1.png", "file2.csv"); } public void testFilesList_LiveUpdate() throws Exception { initTestFiles(); - mDocsHelper.createDocument(mRoot, "yummers/sandwich", "Ham & Cheese.sandwich"); - mBot.assertHasDocuments("file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); + mDocsHelper.createDocument(rootDir0, "yummers/sandwich", "Ham & Cheese.sandwich"); + + bot.waitForDocument("Ham & Cheese.sandwich"); + bot.assertHasDocuments("file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); } public void testDeleteDocument() throws Exception { initTestFiles(); - mBot.clickDocument("file1.png"); - mDevice.waitForIdle(); - mBot.menuDelete().click(); + bot.clickDocument("file1.png"); + device.waitForIdle(); + bot.menuDelete().click(); - mBot.waitForDeleteSnackbar(); - assertFalse(mBot.hasDocuments("file1.png")); + bot.waitForDeleteSnackbar(); + assertFalse(bot.hasDocuments("file1.png")); - mBot.waitForDeleteSnackbarGone(); - assertFalse(mBot.hasDocuments("file1.png")); + bot.waitForDeleteSnackbarGone(); + assertFalse(bot.hasDocuments("file1.png")); } public void testSupportsShare() throws Exception { initTestFiles(); - mBot.clickDocument("file1.png"); - mDevice.waitForIdle(); - assertNotNull(mBot.menuShare()); + bot.clickDocument("file1.png"); + device.waitForIdle(); + assertNotNull(bot.menuShare()); + } + + public void testClosesOnBack() throws Exception { + DownloadsActivity activity = getActivity(); + device.pressBack(); + device.wait(Until.gone(By.text(ROOT_0_ID)), TIMEOUT); // wait for the window to go away + assertTrue(activity.isDestroyed()); } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java index 868dbbb39e1b..77f16d9ca9e6 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java @@ -16,118 +16,37 @@ package com.android.documentsui; -import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY; import static com.android.documentsui.StubProvider.ROOT_0_ID; import static com.android.documentsui.StubProvider.ROOT_1_ID; -import android.app.Instrumentation; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; import android.os.RemoteException; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.Configurator; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.Until; -import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.LargeTest; -import android.util.Log; -import android.view.MotionEvent; - -import com.android.documentsui.model.RootInfo; @LargeTest -public class FilesActivityUiTest extends ActivityInstrumentationTestCase2<FilesActivity> { - - private static final int TIMEOUT = 5000; - private static final String TAG = "FilesActivityUiTest"; - private static final String TARGET_PKG = "com.android.documentsui"; - private static final String LAUNCHER_PKG = "com.android.launcher"; - - private UiBot mBot; - private UiDevice mDevice; - private Context mContext; - private ContentResolver mResolver; - private DocumentsProviderHelper mDocsHelper; - private ContentProviderClient mClient; - private RootInfo mRoot_0; - private RootInfo mRoot_1; +public class FilesActivityUiTest extends ActivityTest<FilesActivity> { public FilesActivityUiTest() { super(FilesActivity.class); } - public void setUp() throws Exception { - // Initialize UiDevice instance. - Instrumentation instrumentation = getInstrumentation(); - - mDevice = UiDevice.getInstance(instrumentation); - - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); - - // Start from the home screen. - mDevice.pressHome(); - mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT); - - // NOTE: Must be the "target" context, else security checks in content provider will fail. - mContext = instrumentation.getTargetContext(); - mResolver = mContext.getContentResolver(); - - mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); - assertNotNull("Failed to acquire ContentProviderClient.", mClient); - mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); - - // Launch app. - Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(TARGET_PKG); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - setActivityIntent(intent); - getActivity(); // Start the activity. - - // Wait for the app to appear. - mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT); - mDevice.waitForIdle(); - - mBot = new UiBot(mDevice, mContext, TIMEOUT); - - resetStorage(); // Just incase a test failed and tearDown didn't happen. - } - @Override - protected void tearDown() throws Exception { - Log.d(TAG, "Resetting storage from setUp"); - resetStorage(); - mClient.release(); - - super.tearDown(); - } - - private void resetStorage() throws RemoteException { - mClient.call("clear", null, null); - // TODO: Would be nice to have an event to wait on here. - mDevice.waitForIdle(); - } - - private void initTestFiles() throws RemoteException { - mRoot_0 = mDocsHelper.getRoot(ROOT_0_ID); - mRoot_1 = mDocsHelper.getRoot(ROOT_1_ID); - - mDocsHelper.createDocument(mRoot_0, "text/plain", "file0.log"); - mDocsHelper.createDocument(mRoot_0, "image/png", "file1.png"); - mDocsHelper.createDocument(mRoot_0, "text/csv", "file2.csv"); + public void initTestFiles() throws RemoteException { + mDocsHelper.createDocument(rootDir0, "text/plain", "file0.log"); + mDocsHelper.createDocument(rootDir0, "image/png", "file1.png"); + mDocsHelper.createDocument(rootDir0, "text/csv", "file2.csv"); - mDocsHelper.createDocument(mRoot_1, "text/plain", "anotherFile0.log"); - mDocsHelper.createDocument(mRoot_1, "text/plain", "poodles.text"); + mDocsHelper.createDocument(rootDir1, "text/plain", "anotherFile0.log"); + mDocsHelper.createDocument(rootDir1, "text/plain", "poodles.text"); } public void testRootsListed() throws Exception { initTestFiles(); - mBot.openRoot(ROOT_0_ID); + bot.openRoot(ROOT_0_ID); // Should also have Drive, but that requires pre-configuration of devices // We omit for now. - mBot.assertHasRoots( + bot.assertHasRoots( "Images", "Videos", "Audio", @@ -140,60 +59,60 @@ public class FilesActivityUiTest extends ActivityInstrumentationTestCase2<FilesA public void testFilesListed() throws Exception { initTestFiles(); - mBot.openRoot(ROOT_0_ID); - mBot.assertHasDocuments("file0.log", "file1.png", "file2.csv"); + bot.openRoot(ROOT_0_ID); + bot.assertHasDocuments("file0.log", "file1.png", "file2.csv"); } public void testLoadsHomeByDefault() throws Exception { initTestFiles(); - mDevice.waitForIdle(); - mBot.assertWindowTitle("Home"); + device.waitForIdle(); + bot.assertWindowTitle("Home"); } public void testRootClickSetsWindowTitle() throws Exception { initTestFiles(); - mBot.openRoot("Downloads"); - mBot.assertWindowTitle("Downloads"); + bot.openRoot("Downloads"); + bot.assertWindowTitle("Downloads"); } public void testFilesList_LiveUpdate() throws Exception { initTestFiles(); - mBot.openRoot(ROOT_0_ID); - mDocsHelper.createDocument(mRoot_0, "yummers/sandwich", "Ham & Cheese.sandwich"); + bot.openRoot(ROOT_0_ID); + mDocsHelper.createDocument(rootDir0, "yummers/sandwich", "Ham & Cheese.sandwich"); - mDevice.waitForIdle(); - mBot.assertHasDocuments("file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); + bot.waitForDocument("Ham & Cheese.sandwich"); + bot.assertHasDocuments("file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); } public void testDeleteDocument() throws Exception { initTestFiles(); - mBot.openRoot(ROOT_0_ID); + bot.openRoot(ROOT_0_ID); - mBot.clickDocument("file1.png"); - mDevice.waitForIdle(); - mBot.menuDelete().click(); + bot.clickDocument("file1.png"); + device.waitForIdle(); + bot.menuDelete().click(); - mBot.waitForDeleteSnackbar(); - assertFalse(mBot.hasDocuments("file1.png")); + bot.waitForDeleteSnackbar(); + assertFalse(bot.hasDocuments("file1.png")); - mBot.waitForDeleteSnackbarGone(); - assertFalse(mBot.hasDocuments("file1.png")); + bot.waitForDeleteSnackbarGone(); + assertFalse(bot.hasDocuments("file1.png")); // Now delete from another root. - mBot.openRoot(ROOT_1_ID); + bot.openRoot(ROOT_1_ID); - mBot.clickDocument("poodles.text"); - mDevice.waitForIdle(); - mBot.menuDelete().click(); + bot.clickDocument("poodles.text"); + device.waitForIdle(); + bot.menuDelete().click(); - mBot.waitForDeleteSnackbar(); - assertFalse(mBot.hasDocuments("poodles.text")); + bot.waitForDeleteSnackbar(); + assertFalse(bot.hasDocuments("poodles.text")); - mBot.waitForDeleteSnackbarGone(); - assertFalse(mBot.hasDocuments("poodles.text")); + bot.waitForDeleteSnackbarGone(); + assertFalse(bot.hasDocuments("poodles.text")); } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java index 5c6254f90964..1069a660862d 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java @@ -17,150 +17,145 @@ package com.android.documentsui; import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.UiTestEnvironment.TIMEOUT; -import android.support.test.uiautomator.UiObject; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; @LargeTest -public class RenameDocumentUiTest extends InstrumentationTestCase { +public class RenameDocumentUiTest extends ActivityTest<FilesActivity> { private static final String TAG = "RenamDocumentUiTest"; private final String newName = "kitties.log"; - private UiTestEnvironment mHelper; + public RenameDocumentUiTest() { + super(FilesActivity.class); + } @Override public void setUp() throws Exception { super.setUp(); - mHelper = new UiTestEnvironment(getInstrumentation()); - mHelper.launch(); - mHelper.initTestFiles(); - mHelper.bot().openRoot(ROOT_0_ID); + initTestFiles(); + bot.openRoot(ROOT_0_ID); } public void testRenameEnabled_SingleSelection() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().assertMenuEnabled(R.string.menu_rename, true); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.assertMenuEnabled(R.string.menu_rename, true); // Dismiss more options window - mHelper.device().pressBack(); + device.pressBack(); } public void testNoRenameSupport_SingleSelection() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileNameNoRename); - mHelper.bot().openOverflowMenu(); - mHelper.bot().assertMenuEnabled(R.string.menu_rename, false); + bot.selectDocument(fileNameNoRename); + bot.openOverflowMenu(); + bot.assertMenuEnabled(R.string.menu_rename, false); // Dismiss more options window - mHelper.device().pressBack(); + device.pressBack(); } public void testOneHasRenameSupport_MultipleSelection() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().selectDocument(UiTestEnvironment.fileNameNoRename); - mHelper.bot().openOverflowMenu(); - mHelper.bot().assertMenuEnabled(R.string.menu_rename, false); + bot.selectDocument(fileName1); + bot.selectDocument(fileNameNoRename); + bot.openOverflowMenu(); + bot.assertMenuEnabled(R.string.menu_rename, false); // Dismiss more options window - mHelper.device().pressBack(); + device.pressBack(); } public void testRenameDisabled_MultipleSelection() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().selectDocument(UiTestEnvironment.fileName2); - mHelper.bot().openOverflowMenu(); - mHelper.bot().assertMenuEnabled(R.string.menu_rename, false); + bot.selectDocument(fileName1); + bot.selectDocument(fileName2); + bot.openOverflowMenu(); + bot.assertMenuEnabled(R.string.menu_rename, false); // Dismiss more options window - mHelper.device().pressBack(); + device.pressBack(); } public void testRenameFile_OkButton() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(newName); - mHelper.bot().dismissKeyboardIfPresent(); - - mHelper.device().waitForIdle(TIMEOUT); - mHelper.bot().findRenameDialogOkButton().click(); - mHelper.device().waitForIdle(TIMEOUT); - - mHelper.bot().assertDocument(UiTestEnvironment.fileName1, false); - mHelper.bot().assertDocument(newName, true); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(newName); + bot.dismissKeyboardIfPresent(); + + device.waitForIdle(TIMEOUT); + bot.findRenameDialogOkButton().click(); + device.waitForIdle(TIMEOUT); + + bot.assertDocument(fileName1, false); + bot.assertDocument(newName, true); + bot.assertDocumentsCount(4); } public void testRenameFile_Enter() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(newName); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(newName); pressEnter(); - mHelper.bot().assertDocument(UiTestEnvironment.fileName1, false); - mHelper.bot().assertDocument(newName, true); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.assertDocument(fileName1, false); + bot.assertDocument(newName, true); + bot.assertDocumentsCount(4); } public void testRenameFile_Cancel() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(newName); - mHelper.bot().dismissKeyboardIfPresent(); - - mHelper.device().waitForIdle(TIMEOUT); - mHelper.bot().findRenameDialogCancelButton().click(); - mHelper.device().waitForIdle(TIMEOUT); - - mHelper.bot().assertDocument(UiTestEnvironment.fileName1, true); - mHelper.bot().assertDocument(newName, false); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(newName); + bot.dismissKeyboardIfPresent(); + + device.waitForIdle(TIMEOUT); + bot.findRenameDialogCancelButton().click(); + device.waitForIdle(TIMEOUT); + + bot.assertDocument(fileName1, true); + bot.assertDocument(newName, false); + bot.assertDocumentsCount(4); } public void testRenameDir() throws Exception { String oldName = "Dir1"; String newName = "Dir123"; - mHelper.bot().selectDocument(oldName); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(newName); + bot.selectDocument(oldName); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(newName); pressEnter(); - mHelper.bot().assertDocument(oldName, false); - mHelper.bot().assertDocument(newName, true); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.assertDocument(oldName, false); + bot.assertDocument(newName, true); + bot.assertDocumentsCount(4); } public void testRename_NameExists() throws Exception { // Check that document with the new name exists - mHelper.bot().assertDocument(UiTestEnvironment.fileName2, true); - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(UiTestEnvironment.fileName2); + bot.assertDocument(fileName2, true); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(fileName2); pressEnter(); - mHelper.bot().assertSnackbar(R.string.rename_error); - mHelper.bot().assertDocument(UiTestEnvironment.fileName1, true); - mHelper.bot().assertDocument(UiTestEnvironment.fileName2, true); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.assertSnackbar(R.string.rename_error); + bot.assertDocument(fileName1, true); + bot.assertDocument(fileName2, true); + bot.assertDocumentsCount(4); } private void pressEnter() { - mHelper.device().waitForIdle(TIMEOUT); - mHelper.device().pressEnter(); - mHelper.device().waitForIdle(TIMEOUT); + device.waitForIdle(TIMEOUT); + device.pressEnter(); + device.waitForIdle(TIMEOUT); } - } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RootUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RootUiTest.java new file mode 100644 index 000000000000..1d1d3b5abd64 --- /dev/null +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/RootUiTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import static com.android.documentsui.StubProvider.ROOT_0_ID; + +import android.support.test.uiautomator.Configurator; +import android.support.test.uiautomator.UiObject; +import android.support.test.uiautomator.UiObjectNotFoundException; +import android.test.InstrumentationTestCase; +import android.test.suitebuilder.annotation.LargeTest; +import android.view.MotionEvent; + +@LargeTest +public class RootUiTest extends ActivityTest<FilesActivity> { + + private static final String TAG = "RootUiTest"; + + public RootUiTest() { + super(FilesActivity.class); + } + + @Override + public void setUp() throws Exception { + super.setUp(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + } + + public void testRootTapped_GoToRootFromChildDir() throws Exception { + bot.openDocument(dirName1); + bot.assertWindowTitle(dirName1); + bot.openRoot(ROOT_0_ID); + bot.assertWindowTitle(ROOT_0_ID); + assertDefaultContentOfTestDir0(); + } +} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java index 042ec85ad212..b8d8795d864c 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java @@ -19,143 +19,135 @@ package com.android.documentsui; import static com.android.documentsui.StubProvider.ROOT_0_ID; import static com.android.documentsui.StubProvider.ROOT_1_ID; -import android.support.test.uiautomator.UiObject; -import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; @LargeTest -public class SearchViewUiTest extends InstrumentationTestCase { +public class SearchViewUiTest extends ActivityTest<FilesActivity> { private static final String TAG = "SearchViewUiTest"; - private UiTestEnvironment mEnv; - - @Override - public void setUp() throws Exception { - super.setUp(); - mEnv = new UiTestEnvironment(getInstrumentation()); - mEnv.launch(); - - } - - @Override - protected void tearDown() throws Exception { - mEnv.device().pressBack(); - super.tearDown(); + public SearchViewUiTest() { + super(FilesActivity.class); } public void testSearchView_ExpandsOnClick() throws Exception { - mEnv.bot().openSearchView(); - mEnv.bot().assertSearchTextFiledAndIcon(true, false); + bot.openSearchView(); + bot.assertSearchTextFiledAndIcon(true, false); } public void testSearchView_CollapsesOnBack() throws Exception { - mEnv.bot().openSearchView(); + bot.openSearchView(); - mEnv.device().pressBack(); + device.pressBack(); - mEnv.bot().assertSearchTextFiledAndIcon(false, true); + bot.assertSearchTextFiledAndIcon(false, true); } public void testSearchView_ClearsTextOnBack() throws Exception { String query = "file2"; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + bot.openSearchView(); + bot.setSearchQuery(query); - mEnv.device().pressBack(); + device.pressBack(); - mEnv.bot().assertSearchTextFiledAndIcon(false, true); + bot.assertSearchTextFiledAndIcon(false, true); } public void testSearch_ResultsFound() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); String query = "file1"; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); - mEnv.bot().assertSearchTextField(true, query); + bot.openSearchView(); + bot.setSearchQuery(query); + bot.assertSearchTextField(true, query); - mEnv.device().pressEnter(); + device.pressEnter(); - mEnv.bot().assertDocumentsCountOnList(true, 2); - mEnv.bot().assertHasDocuments(UiTestEnvironment.fileName1, UiTestEnvironment.fileName2); - mEnv.bot().assertSearchTextField(false, query); + bot.assertDocumentsCountOnList(true, 2); + bot.assertHasDocuments(fileName1, fileName2); + + bot.assertSearchTextField(false, query); } public void testSearchResultsFound_ClearsOnBack() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); + + String query = fileName1; + bot.openSearchView(); + bot.setSearchQuery(query); - String query = UiTestEnvironment.fileName1; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + device.pressEnter(); + device.pressBack(); - mEnv.device().pressEnter(); - mEnv.device().pressBack(); - mEnv.assertDefaultContentOfTestDir0(); + assertDefaultContentOfTestDir0(); } public void testSearch_NoResults() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); String query = "chocolate"; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + bot.openSearchView(); + bot.setSearchQuery(query); - mEnv.device().pressEnter(); + device.pressEnter(); - mEnv.bot().assertDocumentsCountOnList(false, 0); + bot.assertDocumentsCountOnList(false, 0); - String msg = String.valueOf(mEnv.context().getString(R.string.no_results)); - mEnv.bot().assertMessageTextView(String.format(msg, "TEST_ROOT_0")); - mEnv.bot().assertSearchTextField(false, query); + device.waitForIdle(); + String msg = String.valueOf(context.getString(R.string.no_results)); + bot.assertMessageTextView(String.format(msg, "TEST_ROOT_0")); + + bot.assertSearchTextField(false, query); } public void testSearchNoResults_ClearsOnBack() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); String query = "chocolate"; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + bot.openSearchView(); + bot.setSearchQuery(query); + + device.pressEnter(); + device.pressBack(); - mEnv.device().pressEnter(); - mEnv.device().pressBack(); - mEnv.assertDefaultContentOfTestDir0(); + device.waitForIdle(); + assertDefaultContentOfTestDir0(); } public void testSearchResultsFound_ClearsOnDirectoryChange() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); - String query = UiTestEnvironment.fileName1; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + String query = fileName1; + bot.openSearchView(); + bot.setSearchQuery(query); - mEnv.device().pressEnter(); + device.pressEnter(); - mEnv.bot().openRoot(ROOT_1_ID); - mEnv.assertDefaultContentOfTestDir1(); + bot.openRoot(ROOT_1_ID); + assertDefaultContentOfTestDir1(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); } public void testSearchIconVisible_RootWithSearchSupport() throws Exception { - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.bot().assertSearchTextFiledAndIcon(false, true); + bot.openRoot(ROOT_0_ID); + bot.assertSearchTextFiledAndIcon(false, true); } public void testSearchIconHidden_RootNoSearchSupport() throws Exception { - mEnv.bot().openRoot(ROOT_1_ID); - mEnv.bot().assertSearchTextFiledAndIcon(false, false); + bot.openRoot(ROOT_1_ID); + bot.assertSearchTextFiledAndIcon(false, false); } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java index d609fa846591..4534c40c6e0e 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java @@ -21,9 +21,11 @@ import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertFalse; +import android.app.Activity; import android.content.Context; import android.support.test.uiautomator.By; import android.support.test.uiautomator.BySelector; +import android.support.test.uiautomator.Configurator; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiObject2; @@ -32,6 +34,7 @@ import android.support.test.uiautomator.UiScrollable; import android.support.test.uiautomator.UiSelector; import android.support.test.uiautomator.Until; import android.util.Log; +import android.view.MotionEvent; import android.view.inputmethod.InputMethodManager; import junit.framework.Assert; @@ -47,8 +50,10 @@ import java.util.regex.Pattern; * programmatically, and making assertions against the state of the UI. */ class UiBot { + public static final String TARGET_PKG = "com.android.documentsui"; private static final String TAG = "UiBot"; + private static final String LAUNCHER_PKG = "com.android.launcher"; private static final BySelector SNACK_DELETE = By.desc(Pattern.compile("^Deleting [0-9]+ file.+")); @@ -190,6 +195,14 @@ class UiBot { assertNotNull(getSnackbar(mContext.getString(id))); } + void openDocument(String label) throws UiObjectNotFoundException { + int toolType = Configurator.getInstance().getToolType(); + Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_FINGER); + UiObject doc = findDocument(label); + doc.click(); + Configurator.getInstance().setToolType(toolType); + } + void clickDocument(String label) throws UiObjectNotFoundException { findDocument(label).click(); } @@ -245,6 +258,10 @@ class UiBot { mDevice.wait(Until.gone(SNACK_DELETE), mTimeout * 2); } + void waitForDocument(String label) throws UiObjectNotFoundException { + findDocument(label).waitForExists(mTimeout); + } + void switchViewMode() { UiObject2 mode = menuGridMode(); if (mode != null) { @@ -390,4 +407,13 @@ class UiBot { } } + void revealLauncher() { + mDevice.pressHome(); + mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), mTimeout); + } + + void revealApp() { + mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), mTimeout); + mDevice.waitForIdle(); + } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java b/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java deleted file mode 100644 index 9e30589aa973..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY; -import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.StubProvider.ROOT_1_ID; - -import android.app.Instrumentation; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.os.RemoteException; -import android.provider.DocumentsContract.Document; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.Configurator; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.support.test.uiautomator.Until; -import android.view.MotionEvent; - -import com.android.documentsui.model.RootInfo; - -/** - * Provides basic test environment for UI tests: - * - Launches activity - * - Creates and gives access to test root directories and test files - * - Cleans up the test environment - */ -class UiTestEnvironment { - - public static final int TIMEOUT = 5000; - public static final String NO_RENAME = "NO_RENAME"; - - public static final String dirName1 = "Dir1"; - public static final String fileName1 = "file1.log"; - public static final String fileName2 = "file12.png"; - public static final String fileName3 = "anotherFile0.log"; - public static final String fileName4 = "poodles.text"; - public static final String fileNameNoRename = NO_RENAME + "file.txt"; - - private static final String TARGET_PKG = "com.android.documentsui"; - private static final String LAUNCHER_PKG = "com.android.launcher"; - - private final UiBot mBot; - private final UiDevice mDevice; - private final Context mContext; - - private RootInfo mRootDir0; - private RootInfo mRootDir1; - private int mDocsCountDir0; - private int mDocsCountDir1; - - private ContentResolver mResolver; - private DocumentsProviderHelper mDocsHelper; - private ContentProviderClient mClient; - - private final Instrumentation mInstrumentation; - - public UiTestEnvironment(Instrumentation instrumentation) { - mInstrumentation = instrumentation; - mDevice = UiDevice.getInstance(mInstrumentation); - // NOTE: Must be the "target" context, else security checks in content provider will fail. - mContext = mInstrumentation.getTargetContext(); - mBot = new UiBot(mDevice, mContext, TIMEOUT); - } - -/** - * Launches default activity and waits for the application to appear. - * @throws Exception - */ - public void launch() throws Exception { - Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(TARGET_PKG); - launch(intent); - } - - /** - * Launches activity specified by intent and waits for the application to appear. - * @param intent Intent describing activity to launch. - * @throws Exception - */ - public void launch(Intent intent) throws Exception { - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); - // Start from the home screen. - mDevice.pressHome(); - mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT); - - mResolver = mContext.getContentResolver(); - mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); - mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); - - // Launch app. - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); - // Wait for the app to appear. - mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT); - mDevice.waitForIdle(); - - resetStorage(); // Just incase a test failed and tearDown didn't happen. - } - - public void cleanUp() throws Exception { - resetStorage(); - mClient.release(); - } - - public void resetStorage() throws RemoteException { - mClient.call("clear", null, null); - mDevice.waitForIdle(); - } - - public void initTestFiles() throws RemoteException { - mRootDir0 = mDocsHelper.getRoot(ROOT_0_ID); - mRootDir1 = mDocsHelper.getRoot(ROOT_1_ID); - - mDocsHelper.createFolder(mRootDir0, dirName1); - mDocsHelper.createDocument(mRootDir0, "text/plain", fileName1); - mDocsHelper.createDocument(mRootDir0, "image/png", fileName2); - mDocsHelper.createDocumentWithFlags(mRootDir0.documentId, "text/plain", fileNameNoRename, - Document.FLAG_SUPPORTS_WRITE); - mDocsCountDir0 = 4; - - mDocsHelper.createDocument(mRootDir1, "text/plain", fileName3); - mDocsHelper.createDocument(mRootDir1, "text/plain", fileName4); - mDocsCountDir1 = 2; - } - - public void assertDefaultContentOfTestDir0() throws UiObjectNotFoundException { - bot().assertDocumentsCount(ROOT_0_ID, getDocumentsCountDir0()); - bot().assertHasDocuments(UiTestEnvironment.fileName1, UiTestEnvironment.fileName2, - UiTestEnvironment.dirName1, UiTestEnvironment.fileNameNoRename); - } - - public void assertDefaultContentOfTestDir1() throws UiObjectNotFoundException { - bot().assertDocumentsCount(ROOT_1_ID, getDocumentsCountDir1()); - bot().assertHasDocuments(UiTestEnvironment.fileName3, UiTestEnvironment.fileName4); - } - - public UiBot bot() { - return mBot; - } - - public UiDevice device() { - return mDevice; - } - - public Context context() { - return mContext; - } - - public RootInfo getRootDir0() { - return mRootDir0; - } - - public int getDocumentsCountDir0() { - return mDocsCountDir0; - } - - public int getDocumentsCountDir1() { - return mDocsCountDir1; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java index b1cb29e775b5..d95fb490d81e 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java @@ -50,7 +50,7 @@ public class MultiSelectManagerTest extends AndroidTestCase { mCallback = new TestCallback(); mEnv = new TestSelectionEnvironment(items); mAdapter = new TestDocumentsAdapter(items); - mManager = new MultiSelectManager(mEnv, mAdapter, MultiSelectManager.MODE_MULTIPLE); + mManager = new MultiSelectManager(mEnv, mAdapter, MultiSelectManager.MODE_MULTIPLE, null); mManager.addCallback(mCallback); } @@ -174,7 +174,7 @@ public class MultiSelectManagerTest extends AndroidTestCase { } public void testSingleSelectMode() { - mManager = new MultiSelectManager(mEnv, mAdapter, MultiSelectManager.MODE_SINGLE); + mManager = new MultiSelectManager(mEnv, mAdapter, MultiSelectManager.MODE_SINGLE, null); mManager.addCallback(mCallback); longPress(20); tap(13); @@ -182,7 +182,7 @@ public class MultiSelectManagerTest extends AndroidTestCase { } public void testSingleSelectMode_ShiftTap() { - mManager = new MultiSelectManager(mEnv, mAdapter, MultiSelectManager.MODE_SINGLE); + mManager = new MultiSelectManager(mEnv, mAdapter, MultiSelectManager.MODE_SINGLE, null); mManager.addCallback(mCallback); longPress(13); shiftTap(20); @@ -198,24 +198,73 @@ public class MultiSelectManagerTest extends AndroidTestCase { provisional.append(2, true); s.setProvisionalSelection(getItemIds(provisional)); assertSelection(items.get(1), items.get(2)); + } + + public void testProvisionalSelection_Replace() { + Selection s = mManager.getSelection(); - provisional.delete(1); + SparseBooleanArray provisional = new SparseBooleanArray(); + provisional.append(1, true); + provisional.append(2, true); + s.setProvisionalSelection(getItemIds(provisional)); + + provisional.clear(); provisional.append(3, true); + provisional.append(4, true); s.setProvisionalSelection(getItemIds(provisional)); - assertSelection(items.get(2), items.get(3)); + assertSelection(items.get(3), items.get(4)); + } - s.applyProvisionalSelection(); - assertSelection(items.get(2), items.get(3)); + public void testProvisionalSelection_IntersectsExistingProvisionalSelection() { + Selection s = mManager.getSelection(); + + SparseBooleanArray provisional = new SparseBooleanArray(); + provisional.append(1, true); + provisional.append(2, true); + s.setProvisionalSelection(getItemIds(provisional)); provisional.clear(); + provisional.append(1, true); + s.setProvisionalSelection(getItemIds(provisional)); + assertSelection(items.get(1)); + } + + public void testProvisionalSelection_Apply() { + Selection s = mManager.getSelection(); + + SparseBooleanArray provisional = new SparseBooleanArray(); + provisional.append(1, true); + provisional.append(2, true); + s.setProvisionalSelection(getItemIds(provisional)); + s.applyProvisionalSelection(); + assertSelection(items.get(1), items.get(2)); + } + + public void testProvisionalSelection_Cancel() { + mManager.toggleSelection(items.get(1)); + mManager.toggleSelection(items.get(2)); + Selection s = mManager.getSelection(); + + SparseBooleanArray provisional = new SparseBooleanArray(); provisional.append(3, true); provisional.append(4, true); s.setProvisionalSelection(getItemIds(provisional)); - assertSelection(items.get(2), items.get(3), items.get(4)); + s.cancelProvisionalSelection(); + + // Original selection should remain. + assertSelection(items.get(1), items.get(2)); + } - provisional.delete(3); + public void testProvisionalSelection_IntersectsAppliedSelection() { + mManager.toggleSelection(items.get(1)); + mManager.toggleSelection(items.get(2)); + Selection s = mManager.getSelection(); + + SparseBooleanArray provisional = new SparseBooleanArray(); + provisional.append(2, true); + provisional.append(3, true); s.setProvisionalSelection(getItemIds(provisional)); - assertSelection(items.get(2), items.get(3), items.get(4)); + assertSelection(items.get(1), items.get(2), items.get(3)); } private static Set<String> getItemIds(SparseBooleanArray selection) { diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java index ef1e8e20aaff..90b5c096de20 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java @@ -18,7 +18,6 @@ package com.android.mtp; import android.content.ContentResolver; import android.database.Cursor; -import android.database.sqlite.SQLiteException; import android.mtp.MtpObjectInfo; import android.net.Uri; import android.os.Bundle; @@ -262,31 +261,39 @@ class DocumentLoader { if (objectInfoList.length == 0 || getState() != STATE_LOADING) { return; } - if (mNumLoaded == 0) { - mDatabase.getMapper().startAddingDocuments(mIdentifier.mDocumentId); - } - try { + try{ + if (mNumLoaded == 0) { + mDatabase.getMapper().startAddingDocuments(mIdentifier.mDocumentId); + } mDatabase.getMapper().putChildDocuments( mIdentifier.mDeviceId, mIdentifier.mDocumentId, objectInfoList); mNumLoaded += objectInfoList.length; - } catch (SQLiteException exp) { - mError = exp; - mNumLoaded = 0; - } - if (getState() != STATE_LOADING) { - mDatabase.getMapper().stopAddingDocuments(mIdentifier.mDocumentId); + if (getState() != STATE_LOADING) { + mDatabase.getMapper().stopAddingDocuments(mIdentifier.mDocumentId); + } + } catch (FileNotFoundException exception) { + setErrorInternal(exception); } } - void setError(Exception message) { + void setError(Exception error) { final int lastState = getState(); - mError = message; - mNumLoaded = 0; + setErrorInternal(error); if (lastState == STATE_LOADING) { - mDatabase.getMapper().stopAddingDocuments(mIdentifier.mDocumentId); + try { + mDatabase.getMapper().stopAddingDocuments(mIdentifier.mDocumentId); + } catch (FileNotFoundException exception) { + setErrorInternal(exception); + } } } + private void setErrorInternal(Exception error) { + Log.e(MtpDocumentsProvider.TAG, "Error in DocumentLoader thread", error); + mError = error; + mNumLoaded = 0; + } + private Uri createUri() { return DocumentsContract.buildChildDocumentsUri( MtpDocumentsProvider.AUTHORITY, mIdentifier.mDocumentId); diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/Mapper.java b/packages/MtpDocumentsProvider/src/com/android/mtp/Mapper.java index 3faa8f4394f7..897272907a73 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/Mapper.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/Mapper.java @@ -16,8 +16,6 @@ package com.android.mtp; -import static com.android.mtp.MtpDatabaseConstants.*; - import android.annotation.Nullable; import android.content.ContentValues; import android.database.Cursor; @@ -26,13 +24,15 @@ import android.database.sqlite.SQLiteDatabase; import android.mtp.MtpObjectInfo; import android.provider.DocumentsContract.Document; import android.provider.DocumentsContract.Root; +import android.util.Log; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; +import java.io.FileNotFoundException; import java.util.HashMap; import java.util.Map; +import static com.android.mtp.MtpDatabaseConstants.*; import static com.android.mtp.MtpDatabase.strings; /** @@ -56,11 +56,12 @@ class Mapper { /** * Puts device information to database. + * * @return If device is added to the database. + * @throws FileNotFoundException */ - synchronized boolean putDeviceDocument(MtpDeviceRecord device) { + synchronized boolean putDeviceDocument(MtpDeviceRecord device) throws FileNotFoundException { final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - Preconditions.checkState(mMappingMode.containsKey(/* no parent for root */ null)); database.beginTransaction(); try { final ContentValues[] valuesList = new ContentValues[1]; @@ -69,12 +70,12 @@ class Mapper { extraValuesList[0] = new ContentValues(); MtpDatabase.getDeviceDocumentValues(valuesList[0], extraValuesList[0], device); final boolean changed = putDocuments( + null, valuesList, extraValuesList, COLUMN_PARENT_DOCUMENT_ID + " IS NULL", EMPTY_ARGS, - /* heuristic */ false, - COLUMN_DEVICE_ID); + Document.COLUMN_DISPLAY_NAME); database.setTransactionSuccessful(); return changed; } finally { @@ -84,24 +85,24 @@ class Mapper { /** * Puts root information to database. + * * @param parentDocumentId Document ID of device document. * @param roots List of root information. * @return If roots are added or removed from the database. + * @throws FileNotFoundException */ - synchronized boolean putStorageDocuments(String parentDocumentId, MtpRoot[] roots) { + synchronized boolean putStorageDocuments(String parentDocumentId, MtpRoot[] roots) + throws FileNotFoundException { final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); database.beginTransaction(); try { - final boolean heuristic; final String mapColumn; Preconditions.checkState(mMappingMode.containsKey(parentDocumentId)); switch (mMappingMode.get(parentDocumentId)) { case MAP_BY_MTP_IDENTIFIER: - heuristic = false; mapColumn = COLUMN_STORAGE_ID; break; case MAP_BY_NAME: - heuristic = true; mapColumn = Document.COLUMN_DISPLAY_NAME; break; default: @@ -116,11 +117,11 @@ class Mapper { valuesList[i], extraValuesList[i], parentDocumentId, roots[i]); } final boolean changed = putDocuments( + parentDocumentId, valuesList, extraValuesList, COLUMN_PARENT_DOCUMENT_ID + "=?", strings(parentDocumentId), - heuristic, mapColumn); database.setTransactionSuccessful(); @@ -132,21 +133,21 @@ class Mapper { /** * Puts document information to database. + * * @param deviceId Device ID * @param parentId Parent document ID. * @param documents List of document information. + * @throws FileNotFoundException */ - synchronized void putChildDocuments(int deviceId, String parentId, MtpObjectInfo[] documents) { - final boolean heuristic; + synchronized void putChildDocuments(int deviceId, String parentId, MtpObjectInfo[] documents) + throws FileNotFoundException { final String mapColumn; Preconditions.checkState(mMappingMode.containsKey(parentId)); switch (mMappingMode.get(parentId)) { case MAP_BY_MTP_IDENTIFIER: - heuristic = false; mapColumn = COLUMN_OBJECT_HANDLE; break; case MAP_BY_NAME: - heuristic = true; mapColumn = Document.COLUMN_DISPLAY_NAME; break; default: @@ -159,28 +160,28 @@ class Mapper { valuesList[i], deviceId, parentId, documents[i]); } putDocuments( + parentId, valuesList, null, COLUMN_PARENT_DOCUMENT_ID + "=?", strings(parentId), - heuristic, mapColumn); } - @VisibleForTesting void clearMapping() { final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); database.beginTransaction(); try { - mDatabase.deleteDocumentsAndRootsRecursively( - COLUMN_ROW_STATE + " = ?", strings(ROW_STATE_PENDING)); - final ContentValues values = new ContentValues(); - values.putNull(COLUMN_OBJECT_HANDLE); - values.putNull(COLUMN_STORAGE_ID); - values.put(COLUMN_ROW_STATE, ROW_STATE_INVALIDATED); - database.update(TABLE_DOCUMENTS, values, null, null); - database.setTransactionSuccessful(); mMappingMode.clear(); + // Disconnect all device rows. + try { + startAddingDocuments(null); + stopAddingDocuments(null); + } catch (FileNotFoundException exception) { + Log.e(MtpDocumentsProvider.TAG, "Unexpected FileNotFoundException.", exception); + throw new RuntimeException(exception); + } + database.setTransactionSuccessful(); } finally { database.endTransaction(); } @@ -193,9 +194,9 @@ class Mapper { * a corresponding existing row. Otherwise it does heuristic. * * @param parentDocumentId Parent document ID or NULL for root documents. + * @throws FileNotFoundException */ - void startAddingDocuments(@Nullable String parentDocumentId) { - Preconditions.checkState(!mMappingMode.containsKey(parentDocumentId)); + void startAddingDocuments(@Nullable String parentDocumentId) throws FileNotFoundException { final String selection; final String[] args; if (parentDocumentId != null) { @@ -209,21 +210,23 @@ class Mapper { final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); database.beginTransaction(); try { - // Delete all pending rows. - mDatabase.deleteDocumentsAndRootsRecursively( - selection + " AND " + COLUMN_ROW_STATE + "=?", - DatabaseUtils.appendSelectionArgs(args, strings(ROW_STATE_PENDING))); + getParentOrHaltMapping(parentDocumentId); + Preconditions.checkState(!mMappingMode.containsKey(parentDocumentId)); - // Set all documents as invalidated. + // Set all valid documents as invalidated. final ContentValues values = new ContentValues(); values.put(COLUMN_ROW_STATE, ROW_STATE_INVALIDATED); - database.update(TABLE_DOCUMENTS, values, selection, args); + database.update( + TABLE_DOCUMENTS, + values, + selection + " AND " + COLUMN_ROW_STATE + " = ?", + DatabaseUtils.appendSelectionArgs(args, strings(ROW_STATE_VALID))); // If we have rows that does not have MTP identifier, do heuristic mapping by name. final boolean useNameForResolving = DatabaseUtils.queryNumEntries( database, TABLE_DOCUMENTS, - selection + " AND " + COLUMN_STORAGE_ID + " IS NULL", + selection + " AND " + COLUMN_DEVICE_ID + " IS NULL", args) > 0; database.setTransactionSuccessful(); mMappingMode.put( @@ -241,24 +244,27 @@ class Mapper { * {@link #stopAddingDocuments(String)} turns the pending rows into 'valid' * rows. If the methods adds rows to database, it updates valueList with correct document ID. * + * @param parentId Parent document ID. * @param valuesList Values for documents to be stored in the database. * @param rootExtraValuesList Values for root extra to be stored in the database. * @param selection SQL where closure to select rows that shares the same parent. * @param args Argument for selection SQL. - * @param heuristic Whether the mapping mode is heuristic. - * @return Whether the method adds new rows. + * @return Whether it adds at least one new row that is not mapped with existing document ID. + * @throws FileNotFoundException When parentId is not registered in the database. */ private boolean putDocuments( + String parentId, ContentValues[] valuesList, @Nullable ContentValues[] rootExtraValuesList, String selection, String[] args, - boolean heuristic, - String mappingKey) { + String mappingKey) throws FileNotFoundException { final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); boolean added = false; database.beginTransaction(); try { + getParentOrHaltMapping(parentId); + Preconditions.checkState(mMappingMode.containsKey(parentId)); for (int i = 0; i < valuesList.length; i++) { final ContentValues values = valuesList[i]; final ContentValues rootExtraValues; @@ -271,11 +277,13 @@ class Mapper { TABLE_DOCUMENTS, strings(Document.COLUMN_DOCUMENT_ID), selection + " AND " + - COLUMN_ROW_STATE + "=? AND " + + COLUMN_ROW_STATE + " IN (?, ?) AND " + mappingKey + "=?", DatabaseUtils.appendSelectionArgs( args, - strings(ROW_STATE_INVALIDATED, values.getAsString(mappingKey))), + strings(ROW_STATE_INVALIDATED, + ROW_STATE_DISCONNECTED, + values.getAsString(mappingKey))), null, null, null, @@ -285,7 +293,7 @@ class Mapper { if (candidateCursor.getCount() == 0) { rowId = database.insert(TABLE_DOCUMENTS, null, values); added = true; - } else if (!heuristic) { + } else { candidateCursor.moveToNext(); rowId = candidateCursor.getLong(0); database.update( @@ -293,9 +301,6 @@ class Mapper { values, SELECTION_DOCUMENT_ID, strings(rowId)); - } else { - values.put(COLUMN_ROW_STATE, ROW_STATE_PENDING); - rowId = database.insertOrThrow(TABLE_DOCUMENTS, null, values); } // Document ID is a primary integer key of the table. So the returned row // IDs should be same with the document ID. @@ -320,11 +325,12 @@ class Mapper { * Maps 'pending' document and 'invalidated' document that shares the same column of groupKey. * If the database does not find corresponding 'invalidated' document, it just removes * 'invalidated' document from the database. + * * @param parentId Parent document ID or null for root documents. * @return Whether the methods adds or removed visible rows. + * @throws FileNotFoundException */ - boolean stopAddingDocuments(@Nullable String parentId) { - Preconditions.checkState(mMappingMode.containsKey(parentId)); + boolean stopAddingDocuments(@Nullable String parentId) throws FileNotFoundException { final String selection; final String[] args; if (parentId != null) { @@ -334,105 +340,33 @@ class Mapper { selection = COLUMN_PARENT_DOCUMENT_ID + " IS NULL"; args = EMPTY_ARGS; } - final String groupKey; - switch (mMappingMode.get(parentId)) { - case MAP_BY_MTP_IDENTIFIER: - groupKey = parentId != null ? COLUMN_OBJECT_HANDLE : COLUMN_STORAGE_ID; - break; - case MAP_BY_NAME: - groupKey = Document.COLUMN_DISPLAY_NAME; - break; - default: - throw new Error("Unexpected mapping state."); - } - mMappingMode.remove(parentId); + final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); database.beginTransaction(); try { - // Get 1-to-1 mapping of invalidated document and pending document. - final String invalidatedIdQuery = createStateFilter( - ROW_STATE_INVALIDATED, Document.COLUMN_DOCUMENT_ID); - final String pendingIdQuery = createStateFilter( - ROW_STATE_PENDING, Document.COLUMN_DOCUMENT_ID); - // SQL should be like: - // SELECT group_concat(CASE WHEN raw_state = 1 THEN document_id ELSE NULL END), - // group_concat(CASE WHEN raw_state = 2 THEN document_id ELSE NULL END) - // WHERE device_id = ? AND parent_document_id IS NULL - // GROUP BY display_name - // HAVING count(CASE WHEN raw_state = 1 THEN document_id ELSE NULL END) = 1 AND - // count(CASE WHEN raw_state = 2 THEN document_id ELSE NULL END) = 1 - final Cursor mergingCursor = database.query( - TABLE_DOCUMENTS, - new String[] { - "group_concat(" + invalidatedIdQuery + ")", - "group_concat(" + pendingIdQuery + ")" - }, - selection, - args, - groupKey, - "count(" + invalidatedIdQuery + ") = 1 AND count(" + pendingIdQuery + ") = 1", - null); - - final ContentValues values = new ContentValues(); - while (mergingCursor.moveToNext()) { - final String invalidatedId = mergingCursor.getString(0); - final String pendingId = mergingCursor.getString(1); - - // Obtain the new values including the latest object handle from mapping row. - getFirstRow( - TABLE_DOCUMENTS, - SELECTION_DOCUMENT_ID, - new String[] { pendingId }, - values); - values.remove(Document.COLUMN_DOCUMENT_ID); - values.put(COLUMN_ROW_STATE, ROW_STATE_VALID); - database.update( - TABLE_DOCUMENTS, - values, - SELECTION_DOCUMENT_ID, - new String[] { invalidatedId }); - - getFirstRow( - TABLE_ROOT_EXTRA, - SELECTION_ROOT_ID, - new String[] { pendingId }, - values); - if (values.size() > 0) { - values.remove(Root.COLUMN_ROOT_ID); - database.update( - TABLE_ROOT_EXTRA, - values, - SELECTION_ROOT_ID, - new String[] { invalidatedId }); - } - - // Delete 'pending' row. - mDatabase.deleteDocumentsAndRootsRecursively( - SELECTION_DOCUMENT_ID, new String[] { pendingId }); - } - mergingCursor.close(); + final Identifier parentIdentifier = getParentOrHaltMapping(parentId); + Preconditions.checkState(mMappingMode.containsKey(parentId)); + mMappingMode.remove(parentId); boolean changed = false; - - // Delete all invalidated rows that cannot be mapped. - if (mDatabase.deleteDocumentsAndRootsRecursively( - COLUMN_ROW_STATE + " = ? AND " + selection, - DatabaseUtils.appendSelectionArgs(strings(ROW_STATE_INVALIDATED), args))) { - changed = true; + // Delete/disconnect all invalidated rows that cannot be mapped. + final boolean keepUnmatchedDocument = + parentIdentifier == null || + parentIdentifier.mDocumentType == DOCUMENT_TYPE_DEVICE; + if (keepUnmatchedDocument) { + if (mDatabase.disconnectDocumentsRecursively( + COLUMN_ROW_STATE + " = ? AND " + selection, + DatabaseUtils.appendSelectionArgs(strings(ROW_STATE_INVALIDATED), args))) { + changed = true; + } + } else { + if (mDatabase.deleteDocumentsAndRootsRecursively( + COLUMN_ROW_STATE + " = ? AND " + selection, + DatabaseUtils.appendSelectionArgs(strings(ROW_STATE_INVALIDATED), args))) { + changed = true; + } } - // The database cannot find old document ID for the pending rows. - // Turn the all pending rows into valid state, which means the rows become to be - // valid with new document ID. - values.clear(); - values.put(COLUMN_ROW_STATE, ROW_STATE_VALID); - if (database.update( - TABLE_DOCUMENTS, - values, - COLUMN_ROW_STATE + " = ? AND " + selection, - DatabaseUtils.appendSelectionArgs(strings(ROW_STATE_PENDING), args)) != 0) { - changed = true; - } database.setTransactionSuccessful(); return changed; } finally { @@ -441,38 +375,28 @@ class Mapper { } /** - * Obtains values of the first row for the query. - * @param values ContentValues that the values are stored to. - * @param table Target table. - * @param selection Query to select rows. - * @param args Argument for query. + * Returns the parent identifier from parent document ID if the parent ID is found in the + * database. Otherwise it halts mapping and throws FileNotFoundException. + * + * @param parentId Parent document ID + * @return Parent identifier + * @throws FileNotFoundException */ - private void getFirstRow(String table, String selection, String[] args, ContentValues values) { - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - values.clear(); - final Cursor cursor = database.query(table, null, selection, args, null, null, null, "1"); + private @Nullable Identifier getParentOrHaltMapping( + @Nullable String parentId) throws FileNotFoundException { + if (parentId == null) { + return null; + } try { - if (cursor.getCount() == 0) { - return; + final Identifier identifier = mDatabase.createIdentifier(parentId); + if (mDatabase.getRowState(parentId) == ROW_STATE_DISCONNECTED) { + throw new FileNotFoundException( + "document: " + parentId + " is in disconnected device."); } - cursor.moveToNext(); - DatabaseUtils.cursorRowToContentValues(cursor, values); - } finally { - cursor.close(); + return identifier; + } catch (FileNotFoundException error) { + mMappingMode.remove(parentId); + throw error; } } - - /** - * Gets SQL expression that represents the given value or NULL depends on the row state. - * You must pass static constants to this methods otherwise you may be suffered from SQL - * injections. - * @param state Expected row state. - * @param a SQL value. - * @return Expression that represents a if the row state is expected one, and represents NULL - * otherwise. - */ - private static String createStateFilter(int state, String a) { - return "CASE WHEN " + COLUMN_ROW_STATE + " = " + Integer.toString(state) + - " THEN " + a + " ELSE NULL END"; - } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java index 8a3ebefa127f..c456be93d5a3 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java @@ -219,7 +219,7 @@ class MtpDatabase { return mDatabase.query( TABLE_DOCUMENTS, columnNames, - COLUMN_ROW_STATE + " IN (?, ?) AND " + COLUMN_DOCUMENT_TYPE + "=?", + COLUMN_ROW_STATE + " IN (?, ?) AND " + COLUMN_DOCUMENT_TYPE + " = ?", strings(ROW_STATE_VALID, ROW_STATE_INVALIDATED, DOCUMENT_TYPE_STORAGE), null, null, @@ -294,15 +294,6 @@ class MtpDatabase { "1"); } - /** - * Remove all rows belong to a device. - * @param deviceId Device ID. - */ - void removeDeviceRows(int deviceId) { - // Call non-recursive version because it anyway deletes all rows in the devices. - deleteDocumentsAndRoots(COLUMN_DEVICE_ID + "=?", strings(deviceId)); - } - @Nullable String getDocumentIdForDevice(int deviceId) { final Cursor cursor = mDatabase.query( TABLE_DOCUMENTS, @@ -344,7 +335,7 @@ class MtpDatabase { if (cursor.moveToNext()) { return createIdentifier(cursor.getString(0)); } else { - throw new FileNotFoundException("Cannot find a row having ID=" + documentId); + throw new FileNotFoundException("Cannot find a row having ID = " + documentId); } } finally { cursor.close(); @@ -438,7 +429,7 @@ class MtpDatabase { try { while (cursor.moveToNext()) { if (deleteDocumentsAndRootsRecursively( - COLUMN_PARENT_DOCUMENT_ID + "=?", + COLUMN_PARENT_DOCUMENT_ID + " = ?", strings(cursor.getString(0)))) { changed = true; } @@ -456,7 +447,43 @@ class MtpDatabase { } } - private boolean deleteDocumentsAndRoots(String selection, String[] args) { + /** + * Marks the documents and their child as disconnected documents. + * @param selection + * @param args + * @return True if at least one row is updated. + */ + boolean disconnectDocumentsRecursively(String selection, String[] args) { + mDatabase.beginTransaction(); + try { + boolean changed = false; + try (final Cursor cursor = mDatabase.query( + TABLE_DOCUMENTS, + strings(Document.COLUMN_DOCUMENT_ID), + selection, + args, + null, + null, + null)) { + while (cursor.moveToNext()) { + if (disconnectDocumentsRecursively( + COLUMN_PARENT_DOCUMENT_ID + " = ?", + strings(cursor.getString(0)))) { + changed = true; + } + } + } + if (disconnectDocuments(selection, args)) { + changed = true; + } + mDatabase.setTransactionSuccessful(); + return changed; + } finally { + mDatabase.endTransaction(); + } + } + + boolean deleteDocumentsAndRoots(String selection, String[] args) { mDatabase.beginTransaction(); try { int deleted = 0; @@ -481,6 +508,39 @@ class MtpDatabase { } } + boolean disconnectDocuments(String selection, String[] args) { + mDatabase.beginTransaction(); + try { + final ContentValues values = new ContentValues(); + values.put(COLUMN_ROW_STATE, ROW_STATE_DISCONNECTED); + values.putNull(COLUMN_DEVICE_ID); + values.putNull(COLUMN_STORAGE_ID); + values.putNull(COLUMN_OBJECT_HANDLE); + final boolean updated = mDatabase.update(TABLE_DOCUMENTS, values, selection, args) != 0; + mDatabase.setTransactionSuccessful(); + return updated; + } finally { + mDatabase.endTransaction(); + } + } + + int getRowState(String documentId) throws FileNotFoundException { + try (final Cursor cursor = mDatabase.query( + TABLE_DOCUMENTS, + strings(COLUMN_ROW_STATE), + SELECTION_DOCUMENT_ID, + strings(documentId), + null, + null, + null)) { + if (cursor.getCount() == 0) { + throw new FileNotFoundException(); + } + cursor.moveToNext(); + return cursor.getInt(0); + } + } + private static class OpenHelper extends SQLiteOpenHelper { public OpenHelper(Context context, int flags) { super(context, @@ -497,6 +557,12 @@ class MtpDatabase { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (oldVersion == 1) { + db.execSQL("DROP TABLE " + TABLE_DOCUMENTS); + db.execSQL("DROP TABLE " + TABLE_ROOT_EXTRA); + onCreate(db); + return; + } throw new UnsupportedOperationException(); } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java index 3cfb82f24746..cb076af118b4 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java @@ -30,7 +30,7 @@ import java.util.Map; * Class containing MtpDatabase constants. */ class MtpDatabaseConstants { - static final int DATABASE_VERSION = 1; + static final int DATABASE_VERSION = 2; static final String DATABASE_NAME = "database"; static final int FLAG_DATABASE_IN_MEMORY = 1; @@ -78,12 +78,10 @@ class MtpDatabaseConstants { static final int ROW_STATE_INVALIDATED = 1; /** - * The state represents the raw has a valid object handle but it may be going to be mapped with - * another rows invalidated. After fetching all documents under the parent, the database tries - * to map the pending documents and the invalidated documents in order to keep old document ID - * alive. + * The documents are of device/storage that are disconnected now. The documents are invisible + * but their document ID will be reuse when the device/storage is connected again. */ - static final int ROW_STATE_PENDING = 2; + static final int ROW_STATE_DISCONNECTED = 2; /** * Mapping mode that uses MTP identifier to find corresponding rows. @@ -121,7 +119,7 @@ class MtpDatabaseConstants { "CREATE TABLE " + TABLE_DOCUMENTS + " (" + Document.COLUMN_DOCUMENT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + - COLUMN_DEVICE_ID + " INTEGER NOT NULL," + + COLUMN_DEVICE_ID + " INTEGER," + COLUMN_STORAGE_ID + " INTEGER," + COLUMN_OBJECT_HANDLE + " INTEGER," + COLUMN_PARENT_DOCUMENT_ID + " INTEGER," + diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java index a4c3cf4fa5b4..cec2b4dba7b3 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java @@ -22,6 +22,7 @@ import android.os.Process; import android.provider.DocumentsContract; import android.util.Log; +import java.io.FileNotFoundException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -123,14 +124,22 @@ final class RootScanner { // Update devices. final MtpDeviceRecord[] devices = mManager.getDevices(); - mDatabase.getMapper().startAddingDocuments(null /* parentDocumentId */); - for (final MtpDeviceRecord device : devices) { - if (mDatabase.getMapper().putDeviceDocument(device)) { + try { + mDatabase.getMapper().startAddingDocuments(null /* parentDocumentId */); + for (final MtpDeviceRecord device : devices) { + if (mDatabase.getMapper().putDeviceDocument(device)) { + changed = true; + } + } + if (mDatabase.getMapper().stopAddingDocuments( + null /* parentDocumentId */)) { changed = true; } - } - if (mDatabase.getMapper().stopAddingDocuments(null /* parentDocumentId */)) { - changed = true; + } catch (FileNotFoundException exception) { + // The top root (ID is null) must exist always. + // FileNotFoundException is unexpected. + Log.e(MtpDocumentsProvider.TAG, "Unexpected FileNotFoundException", exception); + throw new AssertionError("Unexpected exception for the top parent", exception); } // Update roots. @@ -139,12 +148,17 @@ final class RootScanner { if (documentId == null) { continue; } - mDatabase.getMapper().startAddingDocuments(documentId); - if (mDatabase.getMapper().putStorageDocuments(documentId, device.roots)) { - changed = true; - } - if (mDatabase.getMapper().stopAddingDocuments(documentId)) { - changed = true; + try { + mDatabase.getMapper().startAddingDocuments(documentId); + if (mDatabase.getMapper().putStorageDocuments(documentId, device.roots)) { + changed = true; + } + if (mDatabase.getMapper().stopAddingDocuments(documentId)) { + changed = true; + } + } catch (FileNotFoundException exception) { + Log.e(MtpDocumentsProvider.TAG, "Parent document is gone.", exception); + continue; } } diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java index af1fed49f272..6e28e33e8520 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java @@ -36,16 +36,23 @@ public class DocumentLoaderTest extends AndroidTestCase { private TestContentResolver mResolver; private DocumentLoader mLoader; final private Identifier mParentIdentifier = new Identifier( - 0, 0, 0, "1", MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE); + 0, 0, 0, "2", MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE); @Override - public void setUp() { + public void setUp() throws Exception { mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { + + mDatabase.getMapper().startAddingDocuments(null); + mDatabase.getMapper().putDeviceDocument( + new MtpDeviceRecord(1, "Device", true, new MtpRoot[0], null, null)); + mDatabase.getMapper().stopAddingDocuments(null); + + mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - mDatabase.getMapper().stopAddingDocuments("deviceDocId"); + mDatabase.getMapper().stopAddingDocuments("1"); + mManager = new BlockableTestMtpManager(getContext()); mResolver = new TestContentResolver(); mLoader = new DocumentLoader(mManager, mResolver, mDatabase); diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java index a49dc6784af4..9005152a5ae9 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java @@ -95,7 +95,8 @@ public class MtpDatabaseTest extends AndroidTestCase { assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); assertEquals(1, getInt(cursor, COLUMN_STORAGE_ID)); assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals(DocumentsContract.Document.MIME_TYPE_DIR, getString(cursor, COLUMN_MIME_TYPE)); + assertEquals( + DocumentsContract.Document.MIME_TYPE_DIR, getString(cursor, COLUMN_MIME_TYPE)); assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); assertTrue(isNull(cursor, COLUMN_SUMMARY)); assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED)); @@ -103,7 +104,8 @@ public class MtpDatabaseTest extends AndroidTestCase { assertEquals(0, getInt(cursor, COLUMN_FLAGS)); assertEquals(1000, getInt(cursor, COLUMN_SIZE)); assertEquals( - MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE, getInt(cursor, COLUMN_DOCUMENT_TYPE)); + MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE, + getInt(cursor, COLUMN_DOCUMENT_TYPE)); cursor.close(); } @@ -138,8 +140,10 @@ public class MtpDatabaseTest extends AndroidTestCase { } public void testPutStorageDocuments() throws Exception { - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { + addTestDevice(); + + mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 1, "Storage", 1000, 2000, ""), new MtpRoot(0, 2, "Storage", 2000, 4000, ""), new MtpRoot(0, 3, "/@#%&<>Storage", 3000, 6000,"") @@ -150,7 +154,7 @@ public class MtpDatabaseTest extends AndroidTestCase { assertEquals(3, cursor.getCount()); cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); assertEquals(1, getInt(cursor, COLUMN_STORAGE_ID)); assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE)); @@ -165,11 +169,11 @@ public class MtpDatabaseTest extends AndroidTestCase { MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE, getInt(cursor, COLUMN_DOCUMENT_TYPE)); cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals("/@#%&<>Storage", getString(cursor, COLUMN_DISPLAY_NAME)); cursor.close(); @@ -186,18 +190,21 @@ public class MtpDatabaseTest extends AndroidTestCase { } public void testPutChildDocuments() throws Exception { - mDatabase.getMapper().startAddingDocuments("parentId"); - mDatabase.getMapper().putChildDocuments(0, "parentId", new MtpObjectInfo[] { + addTestDevice(); + addTestStorage("1"); + + mDatabase.getMapper().startAddingDocuments("2"); + mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] { createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024), createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024) }); - final Cursor cursor = mDatabase.queryChildDocuments(COLUMN_NAMES, "parentId"); + final Cursor cursor = mDatabase.queryChildDocuments(COLUMN_NAMES, "2"); assertEquals(3, cursor.getCount()); cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID)); assertEquals(100, getInt(cursor, COLUMN_OBJECT_HANDLE)); @@ -216,7 +223,7 @@ public class MtpDatabaseTest extends AndroidTestCase { MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT, getInt(cursor, COLUMN_DOCUMENT_TYPE)); cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID)); assertEquals(101, getInt(cursor, COLUMN_OBJECT_HANDLE)); @@ -235,7 +242,7 @@ public class MtpDatabaseTest extends AndroidTestCase { MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT, getInt(cursor, COLUMN_DOCUMENT_TYPE)); cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(5, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID)); assertEquals(102, getInt(cursor, COLUMN_OBJECT_HANDLE)); @@ -263,8 +270,10 @@ public class MtpDatabaseTest extends AndroidTestCase { DocumentsContract.Document.COLUMN_DISPLAY_NAME }; - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { + // Add device and two storages. + addTestDevice(); + mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 100, "Storage A", 1000, 0, ""), new MtpRoot(0, 101, "Storage B", 1001, 0, "") }); @@ -273,63 +282,40 @@ public class MtpDatabaseTest extends AndroidTestCase { final Cursor cursor = mDatabase.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID)); assertEquals("Storage A", getString(cursor, COLUMN_DISPLAY_NAME)); cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(101, getInt(cursor, COLUMN_STORAGE_ID)); assertEquals("Storage B", getString(cursor, COLUMN_DISPLAY_NAME)); cursor.close(); } + // Clear mapping and add a device. mDatabase.getMapper().clearMapping(); + addTestDevice(); { final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertTrue(isNull(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage A", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertTrue(isNull(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage B", getString(cursor, COLUMN_DISPLAY_NAME)); + assertEquals(0, cursor.getCount()); cursor.close(); } - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { + // Add two storages, but one's name is different from previous one. + mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 200, "Storage A", 2000, 0, ""), new MtpRoot(0, 202, "Storage C", 2002, 0, "") }); + mDatabase.getMapper().stopAddingDocuments("1"); { - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(3, cursor.getCount()); - cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertTrue(isNull(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage A", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertTrue(isNull(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage B", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.moveToNext(); - assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(202, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage C", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.close(); - } - - mDatabase.getMapper().stopAddingDocuments("deviceDocId"); - - { + // After compeleting mapping, Storage A can be obtained with new storage ID. final Cursor cursor = mDatabase.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(200, getInt(cursor, COLUMN_STORAGE_ID)); assertEquals("Storage A", getString(cursor, COLUMN_DISPLAY_NAME)); cursor.moveToNext(); @@ -346,69 +332,49 @@ public class MtpDatabaseTest extends AndroidTestCase { MtpDatabaseConstants.COLUMN_OBJECT_HANDLE, DocumentsContract.Document.COLUMN_DISPLAY_NAME }; - mDatabase.getMapper().startAddingDocuments("parentId"); - mDatabase.getMapper().putChildDocuments(0, "parentId", new MtpObjectInfo[] { + + addTestDevice(); + addTestStorage("1"); + + mDatabase.getMapper().startAddingDocuments("2"); + mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] { createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024), createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024) }); mDatabase.getMapper().clearMapping(); - { - final Cursor cursor = mDatabase.queryChildDocuments(columns, "parentId"); - assertEquals(3, cursor.getCount()); - - cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("note.txt", getString(cursor, COLUMN_DISPLAY_NAME)); - - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("image.jpg", getString(cursor, COLUMN_DISPLAY_NAME)); - - cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("music.mp3", getString(cursor, COLUMN_DISPLAY_NAME)); + addTestDevice(); + addTestStorage("1"); + { + // Don't return objects that lost MTP object handles. + final Cursor cursor = mDatabase.queryChildDocuments(columns, "2"); + assertEquals(0, cursor.getCount()); cursor.close(); } - mDatabase.getMapper().startAddingDocuments("parentId"); - mDatabase.getMapper().putChildDocuments(0, "parentId", new MtpObjectInfo[] { + mDatabase.getMapper().startAddingDocuments("2"); + mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] { createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), createDocument(203, "video.mp4", MtpConstants.FORMAT_MP4_CONTAINER, 1024), }); + mDatabase.getMapper().stopAddingDocuments("2"); { - final Cursor cursor = mDatabase.queryChildDocuments(columns, "parentId"); - assertEquals(4, cursor.getCount()); - - cursor.moveToPosition(3); - assertEquals(5, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(203, getInt(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("video.mp4", getString(cursor, COLUMN_DISPLAY_NAME)); - - cursor.close(); - } - - mDatabase.getMapper().stopAddingDocuments("parentId"); - - { - final Cursor cursor = mDatabase.queryChildDocuments(columns, "parentId"); + final Cursor cursor = mDatabase.queryChildDocuments(columns, "2"); assertEquals(2, cursor.getCount()); cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(200, getInt(cursor, COLUMN_OBJECT_HANDLE)); assertEquals("note.txt", getString(cursor, COLUMN_DISPLAY_NAME)); cursor.moveToNext(); - assertEquals(5, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(6, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(203, getInt(cursor, COLUMN_OBJECT_HANDLE)); assertEquals("video.mp4", getString(cursor, COLUMN_DISPLAY_NAME)); + cursor.close(); } } @@ -424,10 +390,10 @@ public class MtpDatabaseTest extends AndroidTestCase { Root.COLUMN_AVAILABLE_BYTES }; mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument( - new MtpDeviceRecord(0, "Device A", true, new MtpRoot[0], null, null)); - mDatabase.getMapper().putDeviceDocument( - new MtpDeviceRecord(1, "Device B", true, new MtpRoot[0], null, null)); + mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( + 0, "Device A", true, new MtpRoot[0], null, null)); + mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( + 1, "Device B", true, new MtpRoot[0], null, null)); mDatabase.getMapper().stopAddingDocuments(null); mDatabase.getMapper().startAddingDocuments("1"); @@ -467,6 +433,13 @@ public class MtpDatabaseTest extends AndroidTestCase { mDatabase.getMapper().clearMapping(); + mDatabase.getMapper().startAddingDocuments(null); + mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( + 0, "Device A", true, new MtpRoot[0], null, null)); + mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( + 1, "Device B", true, new MtpRoot[0], null, null)); + mDatabase.getMapper().stopAddingDocuments(null); + mDatabase.getMapper().startAddingDocuments("1"); mDatabase.getMapper().startAddingDocuments("2"); mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { @@ -511,45 +484,71 @@ public class MtpDatabaseTest extends AndroidTestCase { MtpDatabaseConstants.COLUMN_OBJECT_HANDLE }; - mDatabase.getMapper().startAddingDocuments("parentId1"); - mDatabase.getMapper().startAddingDocuments("parentId2"); - mDatabase.getMapper().putChildDocuments(0, "parentId1", new MtpObjectInfo[] { + // Add device, storage, and two directories. + addTestDevice(); + addTestStorage("1"); + mDatabase.getMapper().startAddingDocuments("2"); + mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] { + createDocument(50, "A", MtpConstants.FORMAT_ASSOCIATION, 0), + createDocument(51, "B", MtpConstants.FORMAT_ASSOCIATION, 0), + }); + mDatabase.getMapper().stopAddingDocuments("2"); + + // Put note.txt in each directory. + mDatabase.getMapper().startAddingDocuments("3"); + mDatabase.getMapper().startAddingDocuments("4"); + mDatabase.getMapper().putChildDocuments(0, "3", new MtpObjectInfo[] { createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), }); - mDatabase.getMapper().putChildDocuments(0, "parentId2", new MtpObjectInfo[] { + mDatabase.getMapper().putChildDocuments(0, "4", new MtpObjectInfo[] { createDocument(101, "note.txt", MtpConstants.FORMAT_TEXT, 1024), }); + + // Clear mapping. mDatabase.getMapper().clearMapping(); - mDatabase.getMapper().startAddingDocuments("parentId1"); - mDatabase.getMapper().startAddingDocuments("parentId2"); - mDatabase.getMapper().putChildDocuments(0, "parentId1", new MtpObjectInfo[] { + // Add device, storage, and two directories again. + addTestDevice(); + addTestStorage("1"); + mDatabase.getMapper().startAddingDocuments("2"); + mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] { + createDocument(50, "A", MtpConstants.FORMAT_ASSOCIATION, 0), + createDocument(51, "B", MtpConstants.FORMAT_ASSOCIATION, 0), + }); + mDatabase.getMapper().stopAddingDocuments("2"); + + // Add note.txt in each directory again. + mDatabase.getMapper().startAddingDocuments("3"); + mDatabase.getMapper().startAddingDocuments("4"); + mDatabase.getMapper().putChildDocuments(0, "3", new MtpObjectInfo[] { createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), }); - mDatabase.getMapper().putChildDocuments(0, "parentId2", new MtpObjectInfo[] { + mDatabase.getMapper().putChildDocuments(0, "4", new MtpObjectInfo[] { createDocument(201, "note.txt", MtpConstants.FORMAT_TEXT, 1024), }); - mDatabase.getMapper().stopAddingDocuments("parentId1"); + mDatabase.getMapper().stopAddingDocuments("3"); + mDatabase.getMapper().stopAddingDocuments("4"); + // Check if the two note.txt are mapped correctly. { - final Cursor cursor = mDatabase.queryChildDocuments(columns, "parentId1"); + final Cursor cursor = mDatabase.queryChildDocuments(columns, "3"); assertEquals(1, cursor.getCount()); cursor.moveToNext(); - assertEquals(1, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(5, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(200, getInt(cursor, COLUMN_OBJECT_HANDLE)); cursor.close(); } { - final Cursor cursor = mDatabase.queryChildDocuments(columns, "parentId2"); + final Cursor cursor = mDatabase.queryChildDocuments(columns, "4"); assertEquals(1, cursor.getCount()); cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE)); + assertEquals(6, getInt(cursor, COLUMN_DOCUMENT_ID)); + assertEquals(201, getInt(cursor, COLUMN_OBJECT_HANDLE)); cursor.close(); } } - public void testClearMtpIdentifierBeforeResolveRootDocuments() { + public void testClearMtpIdentifierBeforeResolveRootDocuments() throws Exception { final String[] columns = new String[] { DocumentsContract.Document.COLUMN_DOCUMENT_ID, MtpDatabaseConstants.COLUMN_STORAGE_ID, @@ -560,10 +559,7 @@ public class MtpDatabaseTest extends AndroidTestCase { Root.COLUMN_AVAILABLE_BYTES }; - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument( - new MtpDeviceRecord(0, "Device", false, new MtpRoot[0], null, null)); - mDatabase.getMapper().stopAddingDocuments(null); + addTestDevice(); mDatabase.getMapper().startAddingDocuments("1"); mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { @@ -571,12 +567,28 @@ public class MtpDatabaseTest extends AndroidTestCase { }); mDatabase.getMapper().clearMapping(); + mDatabase.getMapper().startAddingDocuments(null); + mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( + 0, "Device", false, new MtpRoot[0], null, null)); + mDatabase.getMapper().stopAddingDocuments(null); + + try (final Cursor cursor = mDatabase.queryRoots(resources, rootColumns)) { + assertEquals(1, cursor.getCount()); + cursor.moveToNext(); + assertEquals("1", getString(cursor, Root.COLUMN_ROOT_ID)); + } + mDatabase.getMapper().startAddingDocuments("1"); mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 200, "Storage", 2000, 0, ""), }); mDatabase.getMapper().clearMapping(); + mDatabase.getMapper().startAddingDocuments(null); + mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( + 0, "Device", false, new MtpRoot[0], null, null)); + mDatabase.getMapper().stopAddingDocuments(null); + mDatabase.getMapper().startAddingDocuments("1"); mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 300, "Storage", 3000, 0, ""), @@ -609,39 +621,45 @@ public class MtpDatabaseTest extends AndroidTestCase { DocumentsContract.Document.COLUMN_DISPLAY_NAME }; - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { - new MtpRoot(0, 100, "Storage", 0, 0, ""), - }); + // Add a device and a storage. + addTestDevice(); + addTestStorage("1"); + + // Disconnect devices. mDatabase.getMapper().clearMapping(); - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { + // Add a device and two storages that has same name. + addTestDevice(); + mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 200, "Storage", 2000, 0, ""), new MtpRoot(0, 201, "Storage", 2001, 0, ""), }); - mDatabase.getMapper().stopAddingDocuments("deviceDocId"); + mDatabase.getMapper().stopAddingDocuments("1"); { final Cursor cursor = mDatabase.queryRootDocuments(columns); assertEquals(2, cursor.getCount()); + + // First storage reuse document ID of previous storage. cursor.moveToNext(); + // One reuses exisitng document ID 1. assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(200, getInt(cursor, COLUMN_STORAGE_ID)); assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); + + // Second one has new document ID. cursor.moveToNext(); assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); assertEquals(201, getInt(cursor, COLUMN_STORAGE_ID)); assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); + cursor.close(); } } - public void testReplaceExistingRoots() { - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument( - new MtpDeviceRecord(0, "Device", true, new MtpRoot[0], null, null)); - mDatabase.getMapper().stopAddingDocuments(null); + public void testReplaceExistingRoots() throws Exception { + addTestDevice(); // The client code should be able to replace existing rows with new information. // Add one. @@ -686,67 +704,60 @@ public class MtpDatabaseTest extends AndroidTestCase { } } - public void testFailToReplaceExisitingUnmappedRoots() { + public void testFailToReplaceExisitingUnmappedRoots() throws Exception { // The client code should not be able to replace rows before resolving 'unmapped' rows. // Add one. - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument( - new MtpDeviceRecord(0, "Device", true, new MtpRoot[0], null, null)); - mDatabase.getMapper().stopAddingDocuments(null); - + addTestDevice(); mDatabase.getMapper().startAddingDocuments("1"); mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 100, "Storage A", 0, 0, ""), }); mDatabase.getMapper().clearMapping(); - final Cursor oldCursor = mDatabase.queryRoots(resources, strings(Root.COLUMN_ROOT_ID)); - assertEquals(1, oldCursor.getCount()); - - // Add one. - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { - new MtpRoot(0, 101, "Storage B", 1000, 1000, ""), - }); - // Add one more before resolving unmapped documents. - mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { - new MtpRoot(0, 102, "Storage B", 1000, 1000, ""), - }); - mDatabase.getMapper().stopAddingDocuments("1"); - // Because the roots shares the same name, the roots should have new IDs. - final Cursor newCursor = mDatabase.queryChildDocuments( - strings(Document.COLUMN_DOCUMENT_ID), "1"); - assertEquals(2, newCursor.getCount()); - oldCursor.moveToNext(); - newCursor.moveToNext(); - assertFalse(oldCursor.getString(0).equals(newCursor.getString(0))); - newCursor.moveToNext(); - assertFalse(oldCursor.getString(0).equals(newCursor.getString(0))); - - oldCursor.close(); - newCursor.close(); + addTestDevice(); + try (final Cursor oldCursor = + mDatabase.queryRoots(resources, strings(Root.COLUMN_ROOT_ID))) { + assertEquals(1, oldCursor.getCount()); + oldCursor.moveToNext(); + assertEquals("1", getString(oldCursor, Root.COLUMN_ROOT_ID)); + + // Add one. + mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { + new MtpRoot(0, 101, "Storage B", 1000, 1000, ""), + }); + // Add one more before resolving unmapped documents. + mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { + new MtpRoot(0, 102, "Storage B", 1000, 1000, ""), + }); + mDatabase.getMapper().stopAddingDocuments("1"); + + // Because the roots shares the same name, the roots should have new IDs. + try (final Cursor newCursor = mDatabase.queryChildDocuments( + strings(Document.COLUMN_DOCUMENT_ID), "1")) { + assertEquals(2, newCursor.getCount()); + newCursor.moveToNext(); + assertFalse(oldCursor.getString(0).equals(newCursor.getString(0))); + newCursor.moveToNext(); + assertFalse(oldCursor.getString(0).equals(newCursor.getString(0))); + } + } } - public void testQueryDocuments() { - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 0, 0, ""), - }); - mDatabase.getMapper().stopAddingDocuments("deviceDocId"); + public void testQueryDocuments() throws Exception { + addTestDevice(); + addTestStorage("1"); - final Cursor cursor = mDatabase.queryDocument("1", strings(Document.COLUMN_DISPLAY_NAME)); + final Cursor cursor = mDatabase.queryDocument("2", strings(Document.COLUMN_DISPLAY_NAME)); assertEquals(1, cursor.getCount()); cursor.moveToNext(); - assertEquals("Storage A", getString(cursor, Document.COLUMN_DISPLAY_NAME)); + assertEquals("Storage", getString(cursor, Document.COLUMN_DISPLAY_NAME)); cursor.close(); } - public void testQueryRoots() { + public void testQueryRoots() throws Exception { // Add device document. - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument( - new MtpDeviceRecord(0, "Device", false, new MtpRoot[0], null, null)); - mDatabase.getMapper().stopAddingDocuments(null); + addTestDevice(); // It the device does not have storages, it shows a device root. { @@ -790,55 +801,54 @@ public class MtpDatabaseTest extends AndroidTestCase { } public void testGetParentId() throws FileNotFoundException { - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { + addTestDevice(); + + mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] { new MtpRoot(0, 100, "Storage A", 0, 0, ""), }); - mDatabase.getMapper().stopAddingDocuments("deviceDocId"); + mDatabase.getMapper().stopAddingDocuments("1"); - mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().startAddingDocuments("2"); mDatabase.getMapper().putChildDocuments( 0, - "1", + "2", new MtpObjectInfo[] { createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), }); - mDatabase.getMapper().stopAddingDocuments("1"); + mDatabase.getMapper().stopAddingDocuments("2"); - assertEquals("1", mDatabase.getParentIdentifier("2").mDocumentId); + assertEquals("2", mDatabase.getParentIdentifier("3").mDocumentId); } - public void testDeleteDocument() { - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 0, 0, ""), - }); - mDatabase.getMapper().stopAddingDocuments("deviceDocId"); + public void testDeleteDocument() throws Exception { + addTestDevice(); + addTestStorage("1"); - mDatabase.getMapper().startAddingDocuments("1"); + mDatabase.getMapper().startAddingDocuments("2"); mDatabase.getMapper().putChildDocuments( 0, - "1", + "2", new MtpObjectInfo[] { createDocument(200, "dir", MtpConstants.FORMAT_ASSOCIATION, 1024), }); - mDatabase.getMapper().stopAddingDocuments("1"); + mDatabase.getMapper().stopAddingDocuments("2"); - mDatabase.getMapper().startAddingDocuments("2"); + mDatabase.getMapper().startAddingDocuments("3"); mDatabase.getMapper().putChildDocuments( 0, - "2", + "3", new MtpObjectInfo[] { createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), }); - mDatabase.getMapper().stopAddingDocuments("2"); + mDatabase.getMapper().stopAddingDocuments("3"); - mDatabase.deleteDocument("2"); + mDatabase.deleteDocument("3"); { // Do not query deleted documents. final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "1"); + mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2"); assertEquals(0, cursor.getCount()); cursor.close(); } @@ -846,64 +856,61 @@ public class MtpDatabaseTest extends AndroidTestCase { { // Child document should be deleted also. final Cursor cursor = - mDatabase.queryDocument("3", strings(Document.COLUMN_DOCUMENT_ID)); + mDatabase.queryDocument("4", strings(Document.COLUMN_DOCUMENT_ID)); assertEquals(0, cursor.getCount()); cursor.close(); } } - public void testPutNewDocument() { - mDatabase.getMapper().startAddingDocuments("deviceDocId"); - mDatabase.getMapper().putStorageDocuments("deviceDocId", new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 0, 0, ""), - }); - mDatabase.getMapper().stopAddingDocuments("deviceDocId"); + public void testPutNewDocument() throws Exception { + addTestDevice(); + addTestStorage("1"); assertEquals( - "2", + "3", mDatabase.putNewDocument( - 0, "1", createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024))); + 0, "2", createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024))); { final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "1"); + mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2"); assertEquals(1, cursor.getCount()); cursor.moveToNext(); - assertEquals("2", cursor.getString(0)); + assertEquals("3", cursor.getString(0)); cursor.close(); } // The new document should not be mapped with existing invalidated document. mDatabase.getMapper().clearMapping(); - mDatabase.getMapper().startAddingDocuments("1"); + addTestDevice(); + addTestStorage("1"); + + mDatabase.getMapper().startAddingDocuments("2"); mDatabase.putNewDocument( 0, - "1", + "2", createDocument(201, "note.txt", MtpConstants.FORMAT_TEXT, 1024)); - mDatabase.getMapper().stopAddingDocuments("1"); + mDatabase.getMapper().stopAddingDocuments("2"); { final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "1"); + mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2"); assertEquals(1, cursor.getCount()); cursor.moveToNext(); - assertEquals("3", cursor.getString(0)); + assertEquals("4", cursor.getString(0)); cursor.close(); } } - public void testGetDocumentIdForDevice() { - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument( - new MtpDeviceRecord(100, "Device", true, new MtpRoot[0], null, null)); - mDatabase.getMapper().stopAddingDocuments(null); - assertEquals("1", mDatabase.getDocumentIdForDevice(100)); + public void testGetDocumentIdForDevice() throws Exception { + addTestDevice(); + assertEquals("1", mDatabase.getDocumentIdForDevice(0)); } - public void testGetClosedDevice() { + public void testGetClosedDevice() throws Exception { mDatabase.getMapper().startAddingDocuments(null); mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", /* opened is */ false , new MtpRoot[0], null, null)); + 0, "Device", /* opened is */ false, new MtpRoot[0], null, null)); mDatabase.getMapper().stopAddingDocuments(null); final String[] columns = new String [] { @@ -919,4 +926,19 @@ public class MtpDatabaseTest extends AndroidTestCase { assertTrue(cursor.isNull(2)); } } + + private void addTestDevice() throws FileNotFoundException { + mDatabase.getMapper().startAddingDocuments(null); + mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( + 0, "Device", /* opened is */ true, new MtpRoot[0], null, null)); + mDatabase.getMapper().stopAddingDocuments(null); + } + + private void addTestStorage(String parentId) throws FileNotFoundException { + mDatabase.getMapper().startAddingDocuments(parentId); + mDatabase.getMapper().putStorageDocuments(parentId, new MtpRoot[] { + new MtpRoot(0, 100, "Storage", 1024, 1024, ""), + }); + mDatabase.getMapper().stopAddingDocuments(parentId); + } } diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 49d9f1715eca..741e51d32f46 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Laat altyd Wi-Fi-swerfskanderings toe"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Gebruik vorige DHCP-kliënt"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Sellulêre data altyd aktief"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Wys opsies vir draadlose skermsertifisering"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Verhoog Wi-Fi-aantekeningvlak, wys per SSID RSSI in Wi‑Fi-kieser"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Wanneer dit geaktiveer is, sal Wi-Fi meer aggressief wees om die dataverbinding na selfoon oor te dra wanneer die Wi-Fi-sein swak is"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Hierdie instellings is bedoel net vir ontwikkelinggebruik. Dit kan jou toestel en die programme daarop breek of vreemde dinge laat doen."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifieer programme oor USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontroleer programme wat via ADB/ADT geïnstalleer is vir skadelike gedrag."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Plaaslike terminaal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Aktiveer terminaalprogram wat plaaslike skermtoegang bied"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-kontrolering"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Flits skerm as programme lang handelinge doen op die hoofdraad"</string> <string name="pointer_location" msgid="6084434787496938001">"Wyserligging"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Skermlaag wys huidige raakdata"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Wys tikke"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Wys visuele terugvoer vir tikke"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Wys oppervlakopdaterings"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Flits vensteroppervlaktes in geheel wanneer dit opdateer"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Wys GPU-aansigopdaterings"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Aktiveer steun vir eksperimentele vormvrye-Windows."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Werkskerm-rugsteunwagwoord"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Volle rekenaarrugsteune word nie tans beskerm nie"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Tik om die wagwoord vir volledige rekenaarrugsteune te verander of te verwyder"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nuwe rugsteunwagwoord ingestel"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nuwe wagwoord en bevestiging stem nie ooreen nie"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Rugsteunwagwoord kon nie ingestel word nie"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Kleure vir digitale inhoud geoptimeer"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Onaktiewe programme"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Onaktief. Tik om te wissel."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktief. Tik om te wissel."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Lopende dienste"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Sien en beheer dienste wat tans loop"</string> <string name="night_mode_title" msgid="2594133148531256513">"Nagmodus"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index ab3d30445196..0237124138bf 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ሁልጊዜ የWi‑Fi ማንቀሳቀስ ቅኝቶችን ይፍቀዱ"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"የቆየ የDHCP ደንበኛ ይጠቀሙ"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"የተንቀስቃሽ ስልክ ውሂብ ሁልጊዜ ንቁ"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ፍጹማዊ ድምፅን አሰናክል"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"የገመድ አልባ ማሳያ እውቅና ማረጋገጫ አማራጮችን አሳይ"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"የWi‑Fi ምዝግብ ማስታወሻ አያያዝ ደረጃ ጨምር፣ በWi‑Fi መምረጫ ውስጥ በአንድ SSID RSSI አሳይ"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ሲነቃ የWi‑Fi ምልክት ዝቅተኛ ሲሆን Wi‑Fi የውሂብ ግንኙነት ለተንቀሳቃሽ ማስረከብ ላይ ይበልጥ አስገዳጅ ይሆናል"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"እነዚህ ቅንብሮች የታሰቡት ለግንባታ አጠቃቀም ብቻ ናቸው። መሳሪያህን እና በሱ ላይ ያሉትን መተግበሪያዎች እንዲበለሹ ወይም በትክክል እንዳይሰሩ ሊያደርጉ ይችላሉ።"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"መተግበሪያዎች በUSB በኩል ያረጋግጡ"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"በADB/ADT በኩል የተጫኑ መተግበሪያዎች ጎጂ ባህሪ ካላቸው ያረጋግጡ።"</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"እንደ ተቀባይነት በሌለው ደረጃ ድምፁ ከፍ ማለት ወይም መቆጣጠር አለመቻል ያሉ ከሩቅ መሣሪያዎች ጋር የድምፅ ችግር በሚኖርበት ጊዜ የብሉቱዝ ፍጹማዊ ድምፅን ባሕሪ ያሰናክላል።"</string> <string name="enable_terminal_title" msgid="95572094356054120">"አካባቢያዊ ተርሚናል"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"የአካባቢያዊ ሼል መዳረሻ የሚያቀርብ የተርሚናል መተግበሪያ አንቃ"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"የHDCP ምልከታ"</string> @@ -309,6 +311,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ኃይል እየሞላ አይደለም"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ሙሉነው"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"በአስተዳዳሪ የተሰናከለ"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"መነሻ"</string> </resources> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 12d3323b4e11..7ac794058e59 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"السماح دائمًا بعمليات فحص Wi-Fi للتجوال"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"استخدام برنامج DHCP القديم"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"بيانات الجوّال نشطة دائمًا"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"عرض خيارات شهادة عرض شاشة لاسلكي"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"زيادة مستوى تسجيل Wi-Fi، وعرض لكل SSID RSSI في منتقي Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"عند تمكينه، سيكون Wi-Fi أكثر حدة في تسليم اتصال البيانات إلى الشبكة الخلوية، وذلك عندما تكون إشارة WiFi منخفضة"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"هذه الإعدادات مخصصة لاستخدام التطوير فقط. قد يتسبب هذا في حدوث أعطال أو خلل في أداء الجهاز والتطبيقات المثبتة عليه."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"التحقق من التطبيقات عبر USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"التحقق من التطبيقات المثبتة عبر ADB/ADT لكشف السلوك الضار"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"تطبيق طرفي محلي"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"تمكين تطبيق طرفي يوفر إمكانية الدخول إلى واجهة النظام المحلية"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"التحقق من HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"وميض الشاشة عند إجراء التطبيقات عمليات طويلة في سلسلة المحادثات الرئيسية"</string> <string name="pointer_location" msgid="6084434787496938001">"موقع المؤشر"</string> <string name="pointer_location_summary" msgid="840819275172753713">"عرض تراكب الشاشة لبيانات اللمس الحالية"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"عرض النقرات"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"عرض التعليقات المرئية للنقرات"</string> <string name="show_screen_updates" msgid="5470814345876056420">"عرض تحديثات السطح"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"وميض أسطح النوافذ بالكامل عندما يتم تحديثها"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"إظهار تحديثات عرض GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"لتمكين إتاحة استخدام النوافذ الحرة التجريبية."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"كلمة مرور احتياطية للكمبيوتر"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"النسخ الاحتياطية الكاملة لسطح المكتب غير محمية في الوقت الحالي"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"انقر لتغيير كلمة مرور النسخ الاحتياطية الكاملة لسطح المكتب أو إزالتها."</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"تم تعيين كلمة مرور احتياطية جديدة"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"كلمة المرور الجديدة وتأكيدها لا يتطابقان"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"أخفق تعيين كلمة مرور احتياطية"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"الألوان المحسَّنة للمحتوى الرقمي"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"التطبيقات غير النشطة"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"غير نشط، انقر للتبديل."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"نشط، انقر للتبديل."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"الخدمات قيد التشغيل"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"عرض الخدمات قيد التشغيل في الوقت الحالي والتحكم فيها"</string> <string name="night_mode_title" msgid="2594133148531256513">"الوضع الليلي"</string> @@ -314,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"لا يتم الشحن"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ممتلئة"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"تم التعطيل بواسطة المشرف"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"الشاشة الرئيسية"</string> </resources> diff --git a/packages/SettingsLib/res/values-az-rAZ/strings.xml b/packages/SettingsLib/res/values-az-rAZ/strings.xml index 6c6903ec9b54..47f6d620f499 100644 --- a/packages/SettingsLib/res/values-az-rAZ/strings.xml +++ b/packages/SettingsLib/res/values-az-rAZ/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi axtarışlarına həmişə icazə verin"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Köhnə DHCP klient istifadə edin"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobil data həmişə aktivdir"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Simsiz displey sertifikatlaşması üçün seçimləri göstərir"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi giriş səviyyəsini qaldırın, Wi‑Fi seçəndə hər SSID RSSI üzrə göstərin"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Aktiv olanda, Wi‑Fi sianqlı zəif olan zaman, Mobil şəbəkə data bağlantısına nisbətən, Wi‑Fi daha aqressiv olacaq"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Bu parametrlər yalnız inkişafetdirici istifadə üçün nəzərdə tutulub. Onlar cihaz və tətbiqlərinizin sınması və ya pis işləməsinə səbəb ola bilər."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB üzərindən tətbiqləri yoxlayın"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT vasitəsi ilə quraşdırılmış tətbiqləri zərərli davranış üzrə yoxlayın."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Yerli terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Yerli örtük girişini təklif edən terminal tətbiqi aktiv edin"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP yoxlanılır"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 669b92dba48d..fd264b94a798 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvek dozvoli skeniranje Wi‑Fi-ja u romingu"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Koristi zastareli DHCP klijent"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Podaci za mobilne uređaje su uvek aktivni"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Prikaz opcija za sertifikaciju bežičnog ekrana"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećava nivo evidentiranja za Wi‑Fi. Prikaz po SSID RSSI-u u biraču Wi‑Fi mreže"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kada se omogući, Wi‑Fi će biti agresivniji pri prebacivanju mreže za prenos podataka na Mobilnu, kada je Wi‑Fi signal slab"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ova podešavanja su namenjena samo za programiranje. Mogu da izazovu prestanak funkcionisanja ili neočekivano ponašanje uređaja i aplikacija na njemu."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifikuj aplikacije preko USB-a"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Proverava da li su aplikacije instalirane preko ADB-a/ADT-a štetne."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Omogući aplik. terminala za pristup lokalnom komandnom okruženju"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP provera"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Neka ekran treperi kada aplikacije obavljaju duge operacije na glavnoj niti"</string> <string name="pointer_location" msgid="6084434787496938001">"Lokacija pokazivača"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Postav. element sa trenutnim podacima o dodiru"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Prikazuj dodire"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Prikazuj vizuelne povratne informacije za dodire"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Prikaži ažuriranja površine"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Osvetli sve površine prozora kada se ažuriraju"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Prikaži ažur. GPU prikaza"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Omogućava podršku za eksperimentalne prozore proizvoljnog formata."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Lozinka rezervne kopije za računar"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Rezervne kopije čitavog sistema trenutno nisu zaštićene"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Dodirnite da biste promenili ili uklonili lozinku za pravljenje rezervnih kopija čitavog sistema na računaru"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Postavljena je nova lozinka rezervne kopije"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nova lozinka i njena potvrda se ne podudaraju"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Postavljanje lozinke rezervne kopije nije uspelo"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Boje optimizovane za digitalni sadržaj"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktivne aplikacije"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Neaktivna. Dodirnite da biste je aktivirali."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivna. Dodirnite da biste je deaktivirali."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Pokrenute usluge"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Prikaz i kontrola trenutno pokrenutih usluga"</string> <string name="night_mode_title" msgid="2594133148531256513">"Noćni režim"</string> @@ -314,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Ne puni se"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puno"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Onemogućio je administrator"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Početni"</string> </resources> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index a87e3d534120..1c80e46203aa 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Сканирането за роуминг на Wi-Fi да е разрешено винаги"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Наследена клиентска програма за DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Винаги активни клетъчни данни"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показване на опциите за сертифициране на безжичния дисплей"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"По-подробно регистр. на Wi‑Fi – данни за RSSI на SSID в инстр. за избор на Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"При активиране предаването на връзката за данни от Wi-Fi към мобилната мрежа ще е по-агресивно, когато Wi-Fi сигналът е слаб"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Тези настройки са предназначени само за програмиране. Те могат да доведат до прекъсване на работата или неправилно функциониране на устройството ви и приложенията в него."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Потвържд. на прил. през USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Проверка на инсталираните чрез ADB/ADT приложения за опасно поведение."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Локален терминал"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Актив. на прил. за терминал с достъп до локалния команден ред"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Проверка с HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Примигване на екрана при дълги операции в главната нишка"</string> <string name="pointer_location" msgid="6084434787496938001">"Mестопол. на показалеца"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Насл. на екран показва текущи данни при докосване"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Показване на докосванията"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Показване на визуална обр. връзка за докосванията"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Актуал. на повърхн: Показв."</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Примигв. на целите повърхности на прозорците при актуализирането им"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Показв. на актуал. на изгледа от GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Активира поддръжката за експерименталните прозорци в свободна форма."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Наст. комп.: Парола"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Понастоящем пълните резервни копия за настолен компютър не са защитени"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Докоснете, за да промените или премахнете паролата за пълни резервни копия на настолния компютър"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Зададена е нова парола за резервно копие"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Новата парола и въведената за потвърждаване не съвпадат"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Задаването на парола за резервно копие не бе успешно"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Цветове, оптимизирани за дигитално съдържание"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Неактивни приложения"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Неактивно. Докоснете, за да превключите."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Активно. Докоснете, за да превключите."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Изпълнявани услуги:"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Преглед и контрол върху изпълняващите се понастоящем услуги"</string> <string name="night_mode_title" msgid="2594133148531256513">"Нощен режим"</string> diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml index 82d70b948409..7cf5bc0c283f 100644 --- a/packages/SettingsLib/res/values-bn-rBD/strings.xml +++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"সর্বদা Wifi রোম স্ক্যানকে অনুমতি দিন"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"লেগাসি DHCP ক্লায়েন্ট ব্যবহার করুন"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"সেলুলার ডেটা সর্বদাই সক্রিয় থাকে"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ওয়্যারলেস প্রদর্শন সার্টিফিকেশন জন্য বিকল্পগুলি দেখান"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi লগিং স্তর বাড়ান, Wi‑Fi চয়নকারীতে SSID RSSI অনুযায়ী দেখান"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"সক্ষম করা থাকলে, নিম্নমানের Wi‑Fi সিগন্যালের ক্ষেত্রে, সেলুলার-এ ডেটা সংযোগ প্রদান করতে Wi‑Fi আরো বেশি শক্তিশালীভাবে কাজ করবে"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"এইসব সেটিংস কেবলমাত্র উন্নত করার উদ্দেশ্য। সেগুলি কারণে আপনার ডিভাইস ভেঙ্গে এবং অ্যাপ্লিকেশানগুলি ভালো ভাবে কাজ করা নাও কারতে পারে।"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB এর অ্যাপ্লিকেশানগুলি যাচাই করুন"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ক্ষতিকারক ক্রিয়াকলাপ করছে কিনা তার জন্য ADB/ADT মারফত ইনস্টল করা অ্যাপ্লিকেশানগুলি চেক করুন।"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"স্থানীয় টার্মিনাল"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"স্থানীয় শেল অ্যাক্সেসের প্রস্তাব করে এমন টার্মিনাল অ্যাপ্লিকেশন সক্ষম করুন"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP পরীক্ষণ"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"মুখ্য থ্রেডে অ্যাপ্লিকেশানগুলির দীর্ঘ কার্যকলাপের সময় স্ক্রীন ফ্ল্যাশ করে"</string> <string name="pointer_location" msgid="6084434787496938001">"পয়েন্টারের অবস্থান"</string> <string name="pointer_location_summary" msgid="840819275172753713">"স্ক্রীন ওভারলে বর্তমান স্পর্শ ডেটা দেখাচ্ছে"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"আলতো চাপ দেখান"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"আলতো চাপ দিলে ভিজ্যুয়াল প্রতিক্রিয়া দেখান"</string> <string name="show_screen_updates" msgid="5470814345876056420">"সারফেস আপডেটগুলি দেখান"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"সম্পূর্ণ উইন্ডোর সারফেস আপডেট হয়ে গেলে সেটিকে ফ্ল্যাশ করুন"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU দৃশ্য আপডেটগুলি প্রদর্শন করুন"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"পরীক্ষামূলক ফ্রি-ফর্ম উইন্ডোগুলির জন্য সহায়তা সক্ষম করুন৷"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"ডেস্কটপ ব্যাকআপ পাসওয়ার্ড"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ডেস্কটপ পূর্ণ ব্যাকআপ বর্তমানে সুরক্ষিত নয়"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"ডেস্কটপের সম্পূর্ণ ব্যাকআপের পাসওয়ার্ডটি পরিবর্তন করতে বা মুছে ফেলতে আলতো চাপুন"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"নতুন ব্যাকআপ পাসওয়ার্ড সেট করুন"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"নতুন পাসওয়ার্ড এবং নিশ্চিতকরণ মিলছে না"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ব্যাকআপ পাসওয়ার্ড সেট করা ব্যর্থ"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"ডিজিট্যাল সামগ্রীর জন্য অপ্টিমাইজ করা রঙগুলি"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"নিষ্ক্রিয় অ্যাপ্লিকেশানগুলি"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"নিষ্ক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"সক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"এখন চলছে যে পরিষেবাগুলি"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"বর্তমান চলমান পরিষেবাগুলি দেখুন এবং নিয়ন্ত্রণ করুন"</string> <string name="night_mode_title" msgid="2594133148531256513">"রাতের মোড"</string> diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index f09e1cab9f3c..50cf27bd6333 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -226,6 +226,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvijek dopustiti Wi-Fi lutajuće skeniranje"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Koristi zastareli DHCP klijent"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobilni podaci uvijek aktivni"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaži opcije za certifikaciju Bežičnog prikaza"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećajte nivo Wi-Fi zapisivanja, pokazati po SSID RSSI Wi-Fi Picker"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kada je omogućeno, Wi-Fi će biti agresivniji u predavanju podatkovne veze mobilnoj, kada je Wi-Fi signal slab"</string> @@ -246,6 +248,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ove postavke su namijenjene samo za svrhe razvoja. Mogu izazvati pogrešno ponašanje uređaja i aplikacija na njemu."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifikuj aplikacije putem USB-a"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Provjerava da li se u aplikacijama instaliranim putem ADB-a/ADT-a javlja zlonamerno ponašanje."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Omogući terminalnu aplik. koja nudi pristup lok. kom. okruženju"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP provjeravanje"</string> @@ -268,7 +272,7 @@ <string name="pointer_location" msgid="6084434787496938001">"Lokacija pokazivača"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Trenutni podaci o dodirivanju prikazuje se u nadsloju preko ekrana"</string> <string name="show_touches" msgid="2642976305235070316">"Prikaži dodirivanja"</string> - <string name="show_touches_summary" msgid="6101183132903926324">"Prikaži vizualne povratne podatke za dodirivanja"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Prikaži vizuelne povratne informacije za dodirivanja"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Prikaži ažuriranja za površinu"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Prikazi cijele površine prozora uz treptanje prilikom ažuriranja"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Pok. ažur. za GPU prikaz"</string> @@ -318,7 +322,7 @@ <skip /> <string name="local_backup_password_title" msgid="3860471654439418822">"Lozinka za rezervnu kopiju za radnu površinu"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Potpune sigurnosne kopije za računare trenutno nisu zaštićene"</string> - <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Dodirnite da biste promijenili ili uklonili lozinku za potpune rezervne kopije sa radne površine"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Dodirnite da promijenite ili uklonite lozinku za potpune rezervne kopije sa radne površine"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova lozinka za rezervnu kopiju postavljena"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nova lozinka i potvrda se ne podudaraju"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nije uspjelo postavljanje lozinke za rezervnu kopiju"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index bfca38114298..8c64cc0ba529 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permet sempre cerca de Wi-Fi en ininerància"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Utilitza el client DHCP heretat"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Dades mòbils sempre actives"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra les opcions de certificació de pantalla sense fil"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Augmenta nivell de registre Wi‑Fi i mostra\'l per SSID RSSI al Selector de Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si s\'activa, la Wi-Fi serà més agressiva en transferir la connexió de dades al mòbil, si el senyal de la Wi-Fi no és estable"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Aquesta configuració només està prevista per a usos de desenvolupament. Pot fer que el dispositiu i que les aplicacions s\'interrompin o tinguin un comportament inadequat."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifica aplicacions per USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Comprova les aplicacions instal·lades mitjançant ADB/ADT per detectar possibles comportaments perillosos"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Activa l\'aplicació de terminal que ofereix accés al shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Comprovació HDCP"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index beba7c35a61c..cdcfd8bcb46a 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vždy povolit Wi-Fi roaming"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Použít starý klient DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobilní data jsou vždy aktivní"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Zobrazit možnosti certifikace bezdrátového displeje"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zvýšit úroveň protokolování Wi‑Fi zobrazenou v SSID a RSSI při výběru sítě Wi‑Fi."</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Pokud je tato možnost zapnuta, bude síť Wi-Fi agresivnější při předávání datového připojení mobilní síti při slabém signálu Wi-Fi."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Tato nastavení jsou určena pouze pro vývojáře. Mohou způsobit rozbití nebo nesprávné fungování zařízení a nainstalovaných aplikací."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Ověřit aplikace z USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrolovat škodlivost aplikací nainstalovaných pomocí nástroje ADB/ADT"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Místní terminál"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Aktivovat terminálovou aplikaci pro místní přístup k prostředí shell"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Kontrola HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Rozblikat obrazovku při dlouhých operacích hlavního vlákna"</string> <string name="pointer_location" msgid="6084434787496938001">"Umístění ukazatele"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Zobrazit překryvnou vrstvu s aktuálními daty o dotycích"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Zobrazovat klepnutí"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Zobrazování vizuální zpětné vazby pro klepnutí"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Zobrazit obnovení obsahu"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Rozblikat obsah okna při aktualizaci"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Zobrazit obnovení s GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Aktivuje podporu experimentálních oken s volným tvarem."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Heslo pro zálohy v počítači"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Úplné zálohy v počítači nejsou v současné době chráněny"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Tuto možnost vyberte, chcete-li změnit nebo odebrat heslo pro úplné zálohy do počítače"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nové heslo pro zálohy je nastaveno"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nové heslo se neshoduje s potvrzením hesla."</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nastavení hesla pro zálohy selhalo"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Barvy optimalizované pro digitální obsah"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktivní aplikace"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Neaktivní. Klepnutím možnost přepnete."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivní. Klepnutím možnost přepnete."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Spuštěné služby"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Umožňuje zobrazit a ovládat aktuálně spuštěné služby"</string> <string name="night_mode_title" msgid="2594133148531256513">"Noční režim"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index f00a49af7b05..32e657d8947c 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillad altid scanning af Wi-Fi-roaming"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Brug ældre DHCP-klient"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobildata altid aktiveret"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Deaktiver absolut lydstyrke"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vis valgmuligheder for certificering af trådløs skærm"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Øg mængden af Wi‑Fi-logføring. Vis opdelt efter SSID RSSI i Wi‑Fi-vælgeren"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Når dette er aktiveret, gennemtvinges en overdragelse af dataforbindelsen fra Wi-Fi til mobilnetværk, når Wi-Fi-signalet er svagt"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Disse indstillinger er kun beregnet til brug i forbindelse med udvikling. De kan forårsage, at din enhed og dens applikationer går ned eller ikke fungerer korrekt."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Kontrollér apps via USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrollér apps, der er installeret via ADB/ADT, for skadelig adfærd."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Deaktiverer funktionen til absolut lydstyrke via Bluetooth i tilfælde af problemer med lydstyrken på eksterne enheder, f.eks. uacceptabel høj lyd eller manglende kontrol."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Lokal terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Aktivér terminalappen, der giver lokal shell-adgang"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-kontrol"</string> @@ -206,10 +208,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Blink med skærmen, når apps foretager handlinger på hovedtråd"</string> <string name="pointer_location" msgid="6084434787496938001">"Markørens placering"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Skærmoverlejringen viser de aktuelle berøringsdata"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Vis tryk"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Vis visuel feedback ved tryk"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Vis overfladeopdateringer"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Fremhæv hele vinduesoverflader, når de opdateres"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Vis opdat. af GPU-eksp."</string> @@ -253,8 +253,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Aktiverer understøttelse af eksperimentelle vinduer i frit format."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Kode til lokal sikkerhedskopi"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Lokale fuldstændige sikkerhedskopieringer er i øjeblikket ikke beskyttet"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Tryk for at skifte eller fjerne adgangskoden til fuld lokal sikkerhedskopiering"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Ny adgangskode til sikkerhedskopi er angivet"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Ny adgangskode og bekræftelse matcher ikke"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Fejl ved angivelse af adgangskode til sikkerhedskopi"</string> @@ -269,10 +268,8 @@ <item msgid="5363960654009010371">"Farver, der er optimeret til digitalt indhold"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Inaktive apps"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inaktiv. Tryk for at skifte."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Tryk for at skifte."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Kørende tjenester"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Vis og kontrollér kørende tjenester"</string> <string name="night_mode_title" msgid="2594133148531256513">"Nattilstand"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index e39e4640676c..2bc0c3700a98 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"WLAN-Roamingsuchen immer zulassen"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Alten DHCP-Client verwenden"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobile Datennutzung immer aktiviert"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Level für WLAN-Protokollierung erhöhen, in WiFi Picker pro SSID-RSSI anzeigen"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Wenn diese Option aktiviert ist, ist WLAN bei schwachem Signal bei der Übergabe der Datenverbindung an den Mobilfunk aggressiver."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Diese Einstellungen sind ausschließlich für Entwicklungszwecke gedacht. Sie können dein Gerät und die darauf installierten Apps beschädigen oder zu unerwünschtem Verhalten führen."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Apps über USB bestätigen"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Überprüft installierte Apps über ADB/ADT auf schädliches Verhalten"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Lokales Terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Terminal-App mit Zugriff auf lokale Shell aktivieren"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-Prüfung"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Wird nicht geladen"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Voll"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Vom Administrator deaktiviert"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Startseite"</string> </resources> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index e71d4063591a..4c7d0125613a 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Να επιτρέπεται πάντα η σάρωση Wi-Fi κατά την περιαγωγή"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Χρήση εφαρμογής-πελάτη DHCP παλαιού τύπου"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Πάντα ενεργά δεδομένα κινητής τηλεφωνίας"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Εμφάνιση επιλογών για πιστοποίηση ασύρματης οθόνης"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Αύξηση επιπέδου καταγ. Wi-Fi, εμφάνιση ανά SSID RSSI στο εργαλείο επιλογής Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Όταν είναι ενεργό, το Wi-Fi θα μεταβιβάζει πιο επιθετικά τη σύνδ.δεδομένων σε δίκτυο κινητής τηλ., όταν το σήμα Wi-Fi είναι χαμηλό"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Αυτές οι ρυθμίσεις προορίζονται για χρήση κατά την ανάπτυξη. Μπορούν να προκαλέσουν προβλήματα στη λειτουργία της συσκευής και των εφαρμογών σας."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Επαλήθευση εφαρμογών μέσω USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Έλεγχος εφαρμογών που έχουν εγκατασταθεί μέσω ADB/ADT για επιβλαβή συμπεριφορά."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Τοπική τερματική εφαρμογή"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Ενεργοπ.τερμ.εφαρμογής που προσφέρει πρόσβαση στο τοπικό κέλυφος"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Έλεγχος HDCP"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Δεν φορτίζει"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Πλήρης"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Απενεργοποιήθηκε από το διαχειριστή"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Αρχική οθόνη"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index dd152459462c..7df08fc037be 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Use legacy DHCP client"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobile data always active"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"When enabled, Wi‑Fi will be more aggressive in handing over the data connection to Mobile, when Wi‑Fi signal is low"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behaviour."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Enable terminal app that offers local shell access"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP checking"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index dd152459462c..7df08fc037be 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Use legacy DHCP client"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobile data always active"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"When enabled, Wi‑Fi will be more aggressive in handing over the data connection to Mobile, when Wi‑Fi signal is low"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behaviour."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Enable terminal app that offers local shell access"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP checking"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index dd152459462c..7df08fc037be 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Use legacy DHCP client"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobile data always active"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"When enabled, Wi‑Fi will be more aggressive in handing over the data connection to Mobile, when Wi‑Fi signal is low"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behaviour."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Enable terminal app that offers local shell access"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP checking"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 09d569520a22..adaafc004b24 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Usar cliente DHCP heredado"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Datos móviles siempre activos"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opciones de certificación de pantalla inalámbrica"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar nivel de registro Wi-Fi; mostrar por SSID RSSI en el selector de Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si está habilitada, la conexión Wi‑Fi será más intensa al transferir la conexión de datos al celular (si la señal Wi‑Fi es débil)."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Estos parámetros de configuración están destinados únicamente a los programadores. Pueden hacer que el dispositivo o sus aplicaciones no funcionen correctamente."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar aplicaciones por USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Comprobar que las aplicaciones instaladas mediante ADB/ADT no ocasionen daños"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Habilitar aplicac. de terminal que ofrece acceso al shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Comprobación HDCP"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 79c35e1fc14d..10d917801324 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Usar cliente DHCP heredado"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Datos móviles siempre activos"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opciones para la certificación de la pantalla inalámbrica"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar el nivel de logging de Wi-Fi, mostrar por SSID RSSI en el selector Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si está habilitada, la conexión Wi‑Fi será más agresiva al transferir la conexión de datos al móvil (si la señal Wi‑Fi no es estable)"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Estos ajustes están destinados únicamente a los desarrolladores. Pueden provocar que el dispositivo o las aplicaciones no funcionen correctamente."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar aplicaciones por USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Comprueba las aplicaciones instaladas mediante ADB/ADT para detectar comportamientos dañinos"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Habilitar aplicación de terminal que ofrece acceso a shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Comprobación de HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Parpadear si las aplicaciones tardan mucho en el thread principal"</string> <string name="pointer_location" msgid="6084434787496938001">"Ubicación del puntero"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Superponer los datos de las pulsaciones en la pantalla"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Mostrar toques"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Mostrar la ubicación de los toques en la pantalla"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Cambios de superficie"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Actualizar superficies de ventana al actualizarse"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Actualizaciones GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Permite utilizar ventanas de forma libre experimentales."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Contraseña para copias de ordenador"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Las copias de seguridad completas de ordenador no están protegidas"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Toca para cambiar o quitar la contraseña de las copias de seguridad completas del escritorio"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nueva contraseña de seguridad establecida"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"La nueva contraseña y la de confirmación no coinciden"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Error al establecer la contraseña de seguridad"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Colores optimizados para contenido digital"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Aplicaciones inactivas"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactiva. Toca para alternar."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Activa. Toca para alternar."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Servicios en ejecución"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar los servicios en ejecución"</string> <string name="night_mode_title" msgid="2594133148531256513">"Modo nocturno"</string> diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml index 2f9532be5616..acb860b9a9f5 100644 --- a/packages/SettingsLib/res/values-et-rEE/strings.xml +++ b/packages/SettingsLib/res/values-et-rEE/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Luba alati WiFi-rändluse skannimine"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"DHCP pärandkliendi kasutamine"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobiilne andmeside on alati aktiivne"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Keela absoluutne helitugevus"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Juhtmeta ekraaniühenduse sertifitseerimisvalikute kuvamine"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Suurenda WiFi logimistaset, kuva WiFi valijas SSID RSSI järgi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kui see on lubatud, siis püüab WiFi nõrga WiFi-signaali korral agressiivsemalt anda andmeside ühenduse üle mobiilsele andmesidele"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Need seaded on mõeldud ainult arendajatele. Need võivad põhjustada seadme ja seadmes olevate rakenduste rikkeid või valesti toimimist."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Kinnita rakendus USB kaudu"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrolli, kas ADB/ADT-ga installitud rakendused on ohtlikud."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Keelatakse Bluetoothi absoluutse helitugevuse funktsioon, kui kaugseadmetega on helitugevuse probleeme (nt liiga vali heli või juhitavuse puudumine)."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Kohalik terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Luba kohalikku turvalist juurdepääsu pakkuv terminalirakendus"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-kontrollimine"</string> @@ -309,6 +311,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Ei lae"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Täis"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Administraator on keelanud"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Avaekraan"</string> </resources> diff --git a/packages/SettingsLib/res/values-eu-rES/strings.xml b/packages/SettingsLib/res/values-eu-rES/strings.xml index 8cd36faf2228..e64ef22f9ad1 100644 --- a/packages/SettingsLib/res/values-eu-rES/strings.xml +++ b/packages/SettingsLib/res/values-eu-rES/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Onartu beti ibiltaritzan Wi-Fi sareak bilatzea"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Erabili aurreko bertsioko DHCP bezeroa"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mugikorreko datuak beti aktibo"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Erakutsi hari gabeko bistaratze-egiaztapenaren aukerak"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Erakutsi datu gehiago Wi-Fi sareetan saioa hasterakoan. Erakutsi sarearen identifikatzailea eta seinalearen indarra Wi‑Fi sareen hautagailuan."</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Aukera hori gaituz gero, gailua errazago aldatuko da datu mugikorren konexiora Wi-Fi seinalea ahultzen dela nabaritutakoan"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ezarpen hauek garapen-xedeetarako pentsatu dira soilik. Baliteke ezarpenen eraginez gailua matxuratzea edo funtzionamendu okerra izatea."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Egiaztatu USBko aplikazioak."</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Egiaztatu ADB/ADT bidez instalatutako aplikazioak portaera kaltegarriak antzemateko."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Tokiko terminala"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Gaitu tokiko shell-sarbidea duen terminal-aplikazioa"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP egiaztapena"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index dd6d0c4664ef..c2d5f719d311 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"اسکنهای رومینگ Wi‑Fi همیشه مجاز است"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"استفاده از کلاینت DHCP قدیمی"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"داده سلولی همیشه فعال"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"نمایش گزینهها برای گواهینامه نمایش بیسیم"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"افزایش سطح گزارشگیری Wi‑Fi، نمایش به ازای SSID RSSI در انتخابکننده Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"وقتی فعال است، در شرایط پایین بودن سیگنال، Wi‑Fi برای واگذار کردن اتصال داده به شبکه سلولی فعالتر خواهد بود."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"این تنظیمات فقط برای برنامهنویسی در نظر گرفته شده است. ممکن است استفاده از این تنظیمات موجب خرابی یا عملکرد نادرست دستگاه یا برنامههای شما شود."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"تأیید برنامههای نصب شده از طریق USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"برنامههای نصب شده از طریق ADB/ADT را ازنظر رفتار مخاطرهآمیز بررسی کنید."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"ترمینال محلی"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"فعال کردن ترمینال برنامه کاربردی که دسترسی به برنامه محلی را پیشنهاد میکند"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"بررسی HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"چشمک زدن صفحه هنگام انجام عملیات طولانی توسط برنامهها در رشته اصلی"</string> <string name="pointer_location" msgid="6084434787496938001">"محل اشارهگر"</string> <string name="pointer_location_summary" msgid="840819275172753713">"همپوشانی صفحهٔ نمایش با نمایش داده لمسی فعلی"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"نمایش ضربهها"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"نمایش بازخورد تصویری برای ضربهها"</string> <string name="show_screen_updates" msgid="5470814345876056420">"نمایش بهروزرسانی سطح"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"هنگام بهروزرسانی سطوح پنجره همه فلش شوند"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"نمایش به روزرسانیهای نمای GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"پشتیبانی برای پنجرههای آزاد آزمایشی را امکانپذیر میکند"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"گذرواژه پشتیبانگیری محلی"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"پشتیبانگیری کامل رایانه درحال حاضر محافظت نمیشود"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"برای تغییر یا حذف گذرواژه برای نسخههای پشتیبان کامل رایانهای ضربه بزنید"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"گذرواژه جدید نسخهٔ پشتیبان تنظیم شد"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"گذرواژه جدید و تأیید آن با یکدیگر مطابقت ندارند"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"گذرواژه پشتیبانگیری تنظیم نشد"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"رنگهای بهینهشده برای محتوای دیجیتالی"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"برنامههای غیرفعال"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"غیرفعال. برای تغییر حالت ضربه بزنید."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"فعال. برای تغییر حالت ضربه بزنید."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"سرویسهای در حال اجرا"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"مشاهده و کنترل سرویسهای در حال اجرای فعلی"</string> <string name="night_mode_title" msgid="2594133148531256513">"حالت شب"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 2f3f5da9a675..ad15fe9a6076 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Salli Wi-Fi-verkkovierailuskannaus aina"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Käytä vanhaa DHCP-asiakassovellusta"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobiilidata on aina käytössä"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Näytä langattoman näytön sertifiointiin liittyvät asetukset"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Lisää Wi‑Fin lokikirjaustasoa, näytä SSID RSSI -kohtaisesti Wi‑Fi-valitsimessa."</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kun asetus on käytössä, Wi-Fi siirtää datayhteyden aggressiivisemmin matkapuhelinverkolle, jos Wi-Fi-signaali on heikko."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Nämä asetukset on tarkoitettu vain kehityskäyttöön, ja ne voivat aiheuttaa haittaa laitteellesi tai sen sovelluksille."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Tarkista USB:n kautta asennetut"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Tarkista ADB:n/ADT:n kautta asennetut sovellukset haitallisen toiminnan varalta."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Paikallinen pääte"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Ota käyttöön päätesov. joka mahdollistaa paikall. liittymäkäytön"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-tarkistus"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 679d209233ef..de3fb63b1291 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Toujours autoriser la détection de réseaux Wi-Fi en itinérance"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Utiliser l\'ancien client DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Données cellulaires toujours actives"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options pour la certification d\'affichage sans fil"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler davantage les données Wi-Fi, afficher par SSID RSSI dans sélect. Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si cette option est activée, le passage du Wi-Fi aux données cellulaires est forcé lorsque le signal Wi-Fi est faible"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ces paramètres sont en cours de développement. Ils peuvent endommager votre appareil et les applications qui s\'y trouvent, ou provoquer leur dysfonctionnement."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Vérifier les applis via USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Vérifiez que les applications installées par ADB/ADT ne présentent pas de comportement dangereux."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Activer l\'application Terminal permettant l\'accès au shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Vérification HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Afficher un cadre rouge si le thread principal reste occupé"</string> <string name="pointer_location" msgid="6084434787496938001">"Emplacement du curseur"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Superposition écran indiquant données actuelles"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Afficher éléments sélect."</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Afficher repère visuel pour éléments sélectionnés"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Affich. mise à jour surface"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Faire clignoter les surfaces à chaque mise à jour"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Afficher mises à jour GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Active la compatibilité avec les fenêtres de forme libre expérimentales."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Mot de passe sauvegarde PC"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Les sauvegardes complètes sur PC ne sont pas protégées actuellement."</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Touchez pour modifier ou supprimer le mot de passe utilisé pour les sauvegardes complètes sur ordinateur."</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Le nouveau mot de passe de secours a bien été défini."</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Le nouveau mot de passe et sa confirmation ne correspondent pas."</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Échec de la définition du mot de passe de secours."</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Couleurs optimisées pour le contenu numérique"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Applications inactives"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Application inactive. Touchez ici pour l\'activer."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Application active. Touchez ici pour la désactiver."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Services en cours d\'exécution"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Afficher et contrôler les services en cours d\'exécution"</string> <string name="night_mode_title" msgid="2594133148531256513">"Mode Nuit"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 556edaf38d4d..a0dba63f3260 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Toujours autoriser la détection de réseaux Wi-Fi en itinérance"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Utiliser l\'ancien client DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Données mobiles toujours actives"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options de la certification de l\'affichage sans fil"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler plus infos Wi-Fi, afficher par RSSI de SSID dans outil sélection Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Si cette option est activée, le passage du Wi-Fi aux données mobiles est forcé en cas de signal Wi-Fi faible."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ces paramètres sont en cours de développement. Ils peuvent endommager votre appareil et les applications qui s\'y trouvent, ou provoquer leur dysfonctionnement."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Vérifier les applis via USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Vérifiez que les applications installées par ADB/ADT ne présentent pas de comportement dangereux."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Activer l\'application Terminal permettant l\'accès au shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Vérification HDCP"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Débranchée"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"pleine"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Désactivé par l\'administrateur"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Accueil"</string> </resources> diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml index ca49d2d9153b..79fd4e862c2f 100644 --- a/packages/SettingsLib/res/values-gl-rES/strings.xml +++ b/packages/SettingsLib/res/values-gl-rES/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir sempre buscas de itinerancia da wifi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Usar cliente DHCP herdado"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Datos móbiles sempre activados"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra opcións para o certificado de visualización sen fíos"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nivel de rexistro da wifi, mostrar por SSID RSSI no selector de wifi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Cando está activada esta función, a wifi será máis agresiva ao entregar a conexión de datos ao móbil, cando o sinal wifi é feble"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Esta configuración só está destinada á programación. Esta pode provocar que o dispositivo e as aplicacións fallen ou se comporten incorrectamente."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar aplicacións por USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Comprobar as aplicacións instaladas a través de ADB/ADT para detectar comportamento perigoso."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Activa a aplicación terminal que ofrece acceso ao shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Comprobación HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Pestanexa se aplicacións tardan moito no proceso principal"</string> <string name="pointer_location" msgid="6084434787496938001">"Localización do punteiro"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Superpoñer datos dos toques na pantalla"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Mostrar toques"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Mostra a información visual dos toques"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Cambios de superficie"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Iluminar superficies de ventás ao actualizarse"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Actualizacións GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Activa a compatibilidade con ventás de forma libre experimentais."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Contrasinal para copias"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"As copias de seguridade de ordenador completas non están protexidas"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Toca para cambiar ou eliminar o contrasinal para as copias de seguranza completas do escritorio"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Novo contrasinal de copia de seguranza definido"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"O contrasinal novo e a confirmación non coinciden"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Erro ao definir un contrasinal de copia de seguranza"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Cores optimizadas para contido dixital"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Aplicacións inactivas"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Aplicación inactiva. Toca para alternar a configuración."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aplicación activa. Toca para alternar a configuración."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Servizos en execución"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver e controlar servizos actualmente en execución"</string> <string name="night_mode_title" msgid="2594133148531256513">"Modo nocturno"</string> diff --git a/packages/SettingsLib/res/values-gu-rIN/strings.xml b/packages/SettingsLib/res/values-gu-rIN/strings.xml index 2aa8c5f295ec..b05da62daa3a 100644 --- a/packages/SettingsLib/res/values-gu-rIN/strings.xml +++ b/packages/SettingsLib/res/values-gu-rIN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"હંમેશા Wi‑Fi રોમ સ્કૅન્સને મંજૂરી આપો"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"લેગેસી DHCP ક્લાઇન્ટનો ઉપયોગ કરો"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"સેલ્યુલર ડેટા હંમેશા સક્રિય"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi લોગિંગ સ્તર વધારો, Wi‑Fi પીકરમાં SSID RSSI દીઠ બતાવો"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"જ્યારે સક્ષમ હોય, ત્યારે Wi‑Fi સિગ્નલ ઓછા હોવા પર, સેલ્યુલર પર ડેટા કનેક્શન મોકલવામાં વધુ આક્રમક હશે"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"આ સેટિંગ્સ ફક્ત વિકાસનાં ઉપયોગ માટે જ હેતુબદ્ધ છે. તે તમારા ઉપકરણ અને તેના પરની એપ્લિકેશન્સનાં ભંગ થવા અથવા ખરાબ વર્તનનું કારણ બની શકે છે."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB પર એપ્લિકેશનો ચકાસો"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"હાનિકારક વર્તણૂંક માટે ADB/ADT મારફતે ઇન્સ્ટોલ કરવામાં આવેલી એપ્લિકેશનો તપાસો."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"સ્થાનિક ટર્મિનલ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"સ્થાનિક શેલ અૅક્સેસની ઑફર કરતી ટર્મિનલ એપ્લિકેશનને સક્ષમ કરો"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP તપાસણી"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 8f382c5a26d6..725e8bf5f194 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"हमेशा वाई-फ़ाई रोम स्कैन करने दें"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"लीगेसी DHCP क्लाइंट"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"सेल्युलर डेटा हमेशा सक्रिय"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस दिखाई देने के लिए प्रमाणन विकल्प दिखाएं"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाई-फ़ाई प्रवेश स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"इसके सक्षम होने पर, जब वाई-फ़ाई संकेत कमज़ोर हों तो वाई-फ़ाई, डेटा कनेक्शन को सेल्यूलर पर अधिक बलपूर्वक भेजेगा"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ये सेटिंग केवल विकास संबंधी उपयोग के प्रयोजन से हैं. वे आपके डिवाइस और उस पर स्थित ऐप्स को खराब कर सकती हैं या उनके दुर्व्यवहार का कारण हो सकती हैं."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB पर ऐप्स सत्यापित करें"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"नुकसानदेह व्यवहार के लिए ADB/ADT के द्वारा इंस्टॉल किए गए ऐप्स जांचें."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"स्थानीय टर्मिनल"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"स्थानीय शेल एक्सेस ऑफ़र करने वाला टर्मिनल ऐप्स सक्षम करें"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP जांच"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"चार्ज नहीं हो रही है"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"पूरी"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"व्यवस्थापक के द्वारा अक्षम किया गया"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"होम"</string> </resources> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 266e4d71d573..f38037b692c4 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvijek dopusti slobodno traženje Wi-Fi mreže"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Upotrebljavaj stari DHCP klijent"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobilni podaci uvijek aktivni"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Prikaži opcije za certifikaciju bežičnog prikaza"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećana razina prijave na Wi‑Fi, prikaz po SSID RSSI-ju u Biraču Wi‑Fi-ja"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Ako je omogućeno, Wi-Fi će aktivno prebacivati podatkovnu vezu mobilnoj mreži kada je Wi-Fi signal slab."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ove su postavke namijenjene samo razvojnim programerima. One mogu uzrokovati kvar ili neželjeno ponašanje vašeg uređaja i aplikacija na njemu."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Potvrdi aplikacije putem USB-a"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Provjerite uzrokuju li aplikacije instalirane putem ADB-a/ADT-a poteškoće."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Omogući aplikaciju terminala koja nudi pristup lokalnoj ovojnici"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP provjera"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Ne puni se"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puna"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Onemogućio administrator"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Početni zaslon"</string> </resources> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index f2dc5ce92adb..5b450d3b6808 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi-roaming ellenőrzésének engedélyezése mindig"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Korábbi DHCP-kliens használata"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"A mobilhálózati adatforgalom mindig aktív"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Abszolút hangerő funkció letiltása"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vezeték nélküli kijelző tanúsítványával kapcsolatos lehetőségek megjelenítése"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi-naplózási szint növelése, RSSI/SSID megjelenítése a Wi‑Fi-választóban"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Ha engedélyezi, a Wi-Fi agresszívebben fogja átadni az adatkapcsolatot a mobilhálózatnak gyenge Wi-Fi-jel esetén"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ezek a beállítások csak fejlesztői használatra szolgálnak. Használatuk esetén eszköze vagy alkalmazásai meghibásodhatnak, illetve nem várt módon viselkedhetnek."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB-n keresztül telepített alkalmazások ellenőrzése"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Az ADB/ADT útján telepített alkalmazások ellenőrzése kártékony viselkedésre."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Letiltja a Bluetooth abszolút hangerő funkcióját a távoli eszközökkel kapcsolatos hangerőproblémák – például elfogadhatatlanul magas vagy nem vezérelhető hangerő – esetén."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Helyi végpont"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Végalkalmazás engedélyezése a helyi rendszerhéj eléréséhez"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP ellenőrzés"</string> @@ -309,6 +311,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Nem töltődik"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Feltöltve"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Letiltva a rendszergazda által"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Főoldal"</string> </resources> diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml index bd0a33906feb..5026fa9fb26e 100644 --- a/packages/SettingsLib/res/values-hy-rAM/strings.xml +++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Միշտ թույլատրել Wi‑Fi ռոումինգի որոնումը"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Օգտագործել DHCP ծրագրի ավելի հին տարբերակները"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Բջջային տվյալները՝ միշտ ակտիվացրած"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ցույց տալ անլար էկրանի վկայագրման ընտրանքները"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Բարձրացնել մակարդակը, Wi‑Fi ընտրիչում ամեն մի SSID-ի համար ցույց տալ RSSI"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Եթե այս գործառույթը միացված է, Wi‑Fi-ի թույլ ազդանշանի դեպքում Wi‑Fi ինտերնետից անցումը բջջային ինտերնետին ավելի կտրուկ կլինի"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Այս կարգավորումները միայն ծրագրավորման նպատակների համար են նախատեսված: Դրանք կարող են խանգարել ձեր սարքի կամ ծրագրի աշխատանքին:"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Ստուգել հավելվածները USB-ի նկատմամբ"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Ստուգեք տեղադրված հավելվածը ADB/ADT-ի միջոցով կասկածելի աշխատանքի պատճառով:"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Տեղային տերմինալ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Միացնել տերմինալային հավելվածը, որն առաջարկում է մուտք տեղային խեցի"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP ստուգում"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Լուսավորել էկրանը` ծրագրի գլխավոր շղթայի վրա երկար աշխատելիս"</string> <string name="pointer_location" msgid="6084434787496938001">"Նշիչի տեղադրություն"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Էկրանի վերադրումը ցույց է տալիս ընթացիկ հպման տվյալները"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Ցույց տալ հպումները"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Ցույց տալ հպումների տեսանելի արձագանքը"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Ցույց տալ մակերեսի թարմացումները"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Թող պատուհանի ամբողջական մակերեսները առկայծեն, երբ թարմացվում են"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Ցույց տալ GPU տեսքի թարմացումները"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Ակտիվացնում է կամայական ձևի փորձնական պատուհանների աջակցումը:"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Աշխատասեղանի պահուստավորման գաղտնաբառ"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Աշխատասեղանի ամբողջական պահուստավորումները այժմ պաշտպանված չեն"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Հպեք՝ աշխատասեղանի ամբողջական պահուստավորման գաղտնաբառը փոխելու կամ հեռացնելու համար"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Պահուստավորման նոր գաղտնաբառը սահմանված է"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Նոր գաղտնաբառը և հաստատումը չեն համընկնում"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Ձախողում գաղտնաբառի պահուստավորման կարգավորման ընթացքում"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Թվային բովանդակության համար հարմարեցված գույներ"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Միացրած հավելվածներ"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Ակտիվ չէ: Հպեք՝ փոխելու համար:"</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Ակտիվ է: Հպեք՝ փոխելու համար:"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Աշխատեցվող ծառայություններ"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Դիտել և վերահսկել ընթացիկ աշխատեցվող ծառայությունները"</string> <string name="night_mode_title" msgid="2594133148531256513">"Գիշերային ռեժիմ"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 2aa96d8981c3..1892bd9a89ed 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Selalu izinkan Pemindaian Roaming Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Gunakan klien DHCP lawas"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Data seluler selalu aktif"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Nonaktifkan volume absolut"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Tampilkan opsi untuk sertifikasi layar nirkabel"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tingkatkan level pencatatan log Wi-Fi, tampilkan per SSID RSSI di Pemilih Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Jika diaktifkan, Wi-Fi akan menjadi lebih agresif dalam mengalihkan sambungan data ke Seluler saat sinyal Wi-Fi lemah"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Setelan ini hanya dimaksudkan untuk penggunaan pengembangan. Setelan dapat menyebabkan perangkat dan aplikasi yang menerapkannya rusak atau tidak berfungsi semestinya."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifikasi aplikasi melalui USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Periksa perilaku membahayakan dalam aplikasi yang terpasang melalui ADB/ADT."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Menonaktifkan fitur volume absolut Bluetooth jika terjadi masalah volume dengan perangkat jarak jauh seperti volume yang terlalu keras atau kurangnya kontrol."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal lokal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Aktifkan aplikasi terminal yang menawarkan akses kerangka lokal"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Pemeriksaan HDCP"</string> @@ -309,6 +311,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Tidak mengisi daya"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Penuh"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Dinonaktifkan oleh administrator"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Layar Utama"</string> </resources> diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml index b78cb0b9c53b..1ef4d26f6511 100644 --- a/packages/SettingsLib/res/values-is-rIS/strings.xml +++ b/packages/SettingsLib/res/values-is-rIS/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Leyfa alltaf reikileit með Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Nota gamlan DHCP-biðlara"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Alltaf kveikt á farsímagögnum"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Sýna valkosti fyrir vottun þráðlausra skjáa"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Auka skráningarstig Wi-Fi, sýna RSSI fyrir hvert SSID í Wi-Fi vali"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Þegar þetta er virkt mun Wi-Fi ganga harðar fram í að færa gagnatenginguna yfir til símkerfisins þegar Wi-Fi merkið er lélegt"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Þessar stillingar eru einungis ætlaðar í þróunarskyni. Þær geta valdið því að tækið og forrit þess bili eða starfi á rangan hátt."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Staðfesta forrit gegnum USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kanna skaðlega hegðun forrita sem sett eru upp frá ADB/ADT."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Staðbundin skipanalína"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Virkja skipanalínuforrit sem leyfir staðbundinn skeljaraðgang"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-athugun"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Blikka skjá ef forrit gera tímafreka hluti á aðalþræði"</string> <string name="pointer_location" msgid="6084434787496938001">"Staðsetning bendils"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Skjáyfirlögn sem sýnir rauntímagögn um snertingar"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Sýna snertingar"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Sýna snertingar myndrænt"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Sýna yfirborðsuppfærslur"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Láta allt yfirborð glugga blikka við uppfærslu"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Sýna uppfærslur skjákorts"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Kveikir á stuðningi við glugga með frjálsu sniði á tilraunastigi."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Aðgangsorð tölvuafritunar"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Heildarafritun á tölvu er ekki varin sem stendur."</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Ýttu til að breyta eða fjarlægja aðgangsorðið fyrir heildarafritun á tölvu"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nýtt aðgangsorð fyrir afritun valið"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nýja aðgangsorðið og staðfestingaraðgangsorðið eru ekki eins"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Villa við að velja aðgangsorð fyrir afritun"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Litir sérhannaðir fyrir stafrænt efni"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Óvirk forrit"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Óvirkt. Ýttu til að breyta."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Virkt. Ýttu til að breyta."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Þjónustur í gangi"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Skoða og stjórna þjónustum í gangi"</string> <string name="night_mode_title" msgid="2594133148531256513">"Næturstilling"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index c8e482e8cf73..d4675ef112bf 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Consenti sempre scansioni roaming Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Usa client DHCP precedente"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Dati cellulare sempre attivi"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra opzioni per la certificazione display wireless"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumenta il livello di registrazione Wi-Fi, mostrando il SSID RSSI nel selettore Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Quando questa impostazione è attivata, il Wi-Fi sarà più aggressivo nel passare la connessione dati al cellulare, quando il segnale Wi-Fi è basso"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Queste impostazioni sono utilizzabili solo a scopo di sviluppo. Possono causare l\'arresto o il comportamento anomalo del dispositivo e delle applicazioni su di esso."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifica app tramite USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Controlla che le applicazioni installate tramite ADB/ADT non abbiano un comportamento dannoso."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminale locale"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Abilita l\'app Terminale che offre l\'accesso alla shell locale"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Verifica HDCP"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Non in carica"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Carica"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Disattivata dall\'amministratore"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Home page"</string> </resources> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index c12a050973c4..f5a9019a58e4 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"התר תמיד סריקות נדידה של Wi‑Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"השתמש בלקוח DHCP מדור קודם"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"נתונים סלולריים פעילים תמיד"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"הצג אפשרויות עבור אישור של תצוגת WiFi"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"כשתכונה זו מופעלת, Wi-Fi יתנהג בצורה אגרסיבית יותר בעת העברת חיבור הנתונים לרשת הסלולרית כשאות ה-Wi-Fi חלש."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"הגדרות אלה מיועדות לשימוש בפיתוח בלבד. הן עלולות לגרום למכשיר או לאפליקציות המותקנות בו לקרוס או לפעול באופן לא תקין."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"אמת אפליקציות באמצעות USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"בדוק אפליקציות שהותקנו באמצעות ADB/ADT לאיתור התנהגות מזיקה."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"מסוף מקומי"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"הפעל אפליקציית מסוף המציעה גישה מקומית למעטפת"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"בדיקת HDCP"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index c26882c55254..d2a2cdc9fe78 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fiローミングスキャンを常に許可する"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"従来のDHCPクライアントを使用する"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"モバイルデータを常にON"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ワイヤレスディスプレイ認証のオプションを表示"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fiログレベルを上げて、Wi-Fi選択ツールでSSID RSSIごとに表示します"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"有効にすると、Wi-Fiの電波強度が弱い場合は強制的にモバイルデータ接続に切り替わるようになります"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"これらの設定は開発専用に設計されています。そのため端末や端末上のアプリが故障したり正常に動作しなくなったりするおそれがあります。"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB経由のアプリを確認"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT経由でインストールされたアプリに不正な動作がないかを確認する"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"ローカルターミナル"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"ローカルシェルアクセスを提供するターミナルアプリを有効にします"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCPチェック"</string> @@ -311,6 +315,5 @@ <!-- no translation found for battery_info_status_full (2824614753861462808) --> <skip /> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"管理者によって無効にされています"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"ホーム"</string> </resources> diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml index 2a09ec08e073..fbbb941126d2 100644 --- a/packages/SettingsLib/res/values-ka-rGE/strings.xml +++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi Roam სკანირების მუდამ დაშვება"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"მოძველებული DHCP კლიენტის გამოყენება"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"ფიჭური მონაცემები ყოველთვის აქტიურია"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"უსადენო ეკრანის სერტიფიცირების ვარიანტების ჩვენება"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi-ს აღრიცხვის დონის გაზრდა, Wi‑Fi ამომრჩეველში ყოველ SSID RSSI-ზე ჩვენება"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"თუ ჩართულია, Wi‑Fi სიგნალის შესუსტების შემთხვევაში Wi-Fi უფრო აქტიურად შეეცდება გადაიყვანოს ინტერნეტ-კავშირი მობილურ ინტერნეტზე"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ამ პარამეტრების გამოყენება დასაშვებია მხოლოდ დეველოპერული მიზნებით. მათმა გამოყენებამ შეიძლება გამოიწვიოს თქვენი მოწყობილობის და მისი აპლიკაციების დაზიანება ან გაუმართავი მუშაობა."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"აპლიკაციების USB-ს საშუალებით შემოწმება"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"შეამოწმეთ, რამდენად უსაფრთხოა ADB/ADT-ის საშუალებით ინსტალირებული აპლიკაციები."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"ადგილობრივი ტერმინალი"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"ლოკალურ გარსზე წვდომის ტერმინალური აპლიკაციის ჩართვა"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP შემოწმება"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Flash screen when apps do long operations on main thread"</string> <string name="pointer_location" msgid="6084434787496938001">"მაჩვენებლის მდებარეობა"</string> <string name="pointer_location_summary" msgid="840819275172753713">"ეკრანის გადაფარვა შეხების მონაცემების ჩვენებით"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"შეხებების ჩვენება"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"შეხებებისთვის ვიზუალური უკუკავშირის ჩვენება"</string> <string name="show_screen_updates" msgid="5470814345876056420">"ზედაპირის განახლებების ჩვენება"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"ფანჯრის მთელი ზედაპირის აციმციმება მისი განახლებისას"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ხედის განახლებების ჩვენება"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"ჩართავს თავისუფალი ფორმის მქონე ფანჯრების მხარდაჭერის ექსპერიმენტულ ფუნქციას"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"დესკტოპის სარეზერვო ასლის პაროლი"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"დესკტოპის სრული სარეზერვო ასლები ამჟამად დაცული არ არის"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"შეეხეთ დესკტოპის სრული სარეზერვო ასლების პაროლის შესაცვლელად ან წასაშლელად"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"ახალი სარეზერვო პაროლის დაყენება"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ახალი და დადასტურებული პაროლები არ შეესატყვისება ერთმანეთს"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"სარეზერვო პაროლის დაყენება ვერ მოხერხდა"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"ციფრული კონტენტისთვის ოპტიმიზებული ფერები"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"უმოქმედო აპები"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"უმოქმედო. შეეხეთ გადასართავად."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"აქტიური. შეეხეთ გადასართავად."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"მიმდინარე სერვისები"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"ამჟამად მოქმედი სერვისების ნახვა და მართვა"</string> <string name="night_mode_title" msgid="2594133148531256513">"ღამის რეჟიმი"</string> diff --git a/packages/SettingsLib/res/values-kk-rKZ/strings.xml b/packages/SettingsLib/res/values-kk-rKZ/strings.xml index 2841af55bb73..317c38410274 100644 --- a/packages/SettingsLib/res/values-kk-rKZ/strings.xml +++ b/packages/SettingsLib/res/values-kk-rKZ/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi роумингін іздеулерге әрқашан рұқсат ету"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Бұрынғы DHCP клиентін пайдалану"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Ұялы деректер әрқашан белсенді"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Сымсыз дисплей растау опцияларын көрсету"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi жур. тір. дең. арт., Wi‑Fi желісін таңдағышта әр SSID RSSI бойынша көрсету"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Wi‑Fi сигналы әлсіз болғанда, деректер байланысы мәжбүрлі түрде ұялы желіге ауысады"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Бұл параметрлер жетілдіру мақсатында ғана қолданылады. Олар құрылғыңыз бен қолданбаларыңыздың бұзылуына немесе әдеттен тыс әрекеттерге себеп болуы мүмкін."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB арқылы орнатылған қолданбаларды растау"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT арқылы орнатылған қолданбалардың залалды болмауын тексеру."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Жергілікті терминал"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Жергілікті шелл-код қол жетімділігін ұсынатын терминалды қолданбаны қосу"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP (жоғары кең жолақты сандық мазмұнды қорғау) тексеру"</string> diff --git a/packages/SettingsLib/res/values-km-rKH/strings.xml b/packages/SettingsLib/res/values-km-rKH/strings.xml index 5f913092e63a..1ce0d0daf7fe 100644 --- a/packages/SettingsLib/res/values-km-rKH/strings.xml +++ b/packages/SettingsLib/res/values-km-rKH/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"តែងតែអនុញ្ញាតការវិភាគរ៉ូមវ៉ាយហ្វាយ"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"ប្រើម៉ាស៊ីនកូន DHCP ចាស់"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"ទិន្នន័យចល័តសកម្មជានិច្ច"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"បង្ហាញជម្រើសសម្រាប់វិញ្ញាបនបត្របង្ហាញឥតខ្សែ"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"បង្កើនកម្រិតកំណត់ហេតុវ៉ាយហ្វាយបង្ហាញក្នុង SSID RSSI ក្នុងកម្មវិធីជ្រើសវ៉ាយហ្វាយ"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ពេលបានបើក វ៉ាយហ្វាយនឹងកាន់តែបង្ខំក្នុងការបញ្ជូនការភ្ជាប់ទិន្នន័យទៅបណ្ដាញចល័ត នៅពេលសញ្ញាវ៉ាយហ្វាយយឺត"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ការកំណត់ទាំងនេះសម្រាប់តែការប្រើក្នុងការអភិវឌ្ឍប៉ុណ្ណោះ។ ពួកវាអាចធ្វើឲ្យឧបករណ៍ និងកម្មវិធីរបស់អ្នកខូច ឬដំណើរមិនត្រឹមត្រូវ។"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"ផ្ទៀងផ្ទាត់កម្មវិធីតាមយូអេសប៊ី"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ពិនិត្យកម្មវិធីបានដំឡើងតាមរយៈ ADB/ADT សម្រាប់ឥរិយាបថដែលគ្រោះថ្នាក់។"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"ស្ថានីយមូលដ្ឋាន"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"បើកកម្មវិធីស្ថានីយដែលផ្ដល់ការចូលសែលមូលដ្ឋាន"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"ពិនិត្យ HDCP"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"មិនបញ្ចូលថ្ម"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ពេញ"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"បានបិទដំណើរការដោយអ្នកគ្រប់គ្រង"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"ដើម"</string> </resources> diff --git a/packages/SettingsLib/res/values-kn-rIN/strings.xml b/packages/SettingsLib/res/values-kn-rIN/strings.xml index f24bd080cf2f..b7fbd60362a3 100644 --- a/packages/SettingsLib/res/values-kn-rIN/strings.xml +++ b/packages/SettingsLib/res/values-kn-rIN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi ರೋಮ್ ಸ್ಕ್ಯಾನ್ಗಳನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"ಹಿಂದಿನ DHCP ಕ್ಲೈಂಟ್ ಬಳಸಿ"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"ಸೆಲ್ಯುಲರ್ ಡೇಟಾ ಯಾವಾಗಲೂ ಸಕ್ರಿಯ"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ವೈರ್ಲೆಸ್ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸು"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ಲಾಗಿಂಗ್ ಮಟ್ಟನ್ನು ಹೆಚ್ಚಿಸಿ, Wi‑Fi ಆಯ್ಕೆಯಲ್ಲಿ ಪ್ರತಿಯೊಂದು SSID RSSI ತೋರಿಸಿ"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ಸಕ್ರಿಯಗೊಂಡರೆ, Wi‑Fi ಸಿಗ್ನಲ್ ದುರ್ಬಲವಾಗಿದ್ದರೂ ಕೂಡ, ಸೆಲ್ಯುಲರ್ಗೆ ಡೇಟಾ ಸಂಪರ್ಕವನ್ನು ಹಸ್ತಾಂತರಿಸುವಲ್ಲಿ Wi‑Fi ಹೆಚ್ಚು ಆಕ್ರಮಣಕಾರಿಯಾಗಿರುತ್ತದೆ"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ಈ ಸೆಟ್ಟಿಂಗ್ಗಳು ಅಭಿವೃದ್ಧಿಯ ಬಳಕೆಗೆ ಮಾತ್ರ. ಅವುಗಳು ನಿಮ್ಮ ಸಾಧನ ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಧಕ್ಕೆ ಮಾಡಬಹುದು ಅಥವಾ ಅವು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರುವಂತೆ ಮಾಡಬಹುದು."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ಮೂಲಕ ಆಪ್ ಪರಿಶೀಲಿಸಿ"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ಹಾನಿಮಾಡುವಂತಹ ವರ್ತನೆಗಾಗಿ ADB/ADT ಮೂಲಕ ಸ್ಥಾಪಿಸಲಾದ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"ಸ್ಥಳೀಯ ಟರ್ಮಿನಲ್"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"ಸ್ಥಳೀಯ ಶೆಲ್ ಪ್ರವೇಶವನ್ನು ಒದಗಿಸುವ ಟರ್ಮಿನಲ್ ಅಪ್ಲಿಕೇಶನ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP ಪರೀಕ್ಷಿಸುವಿಕೆ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index dc55956fdac8..db7b66af1ecd 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi 로밍 스캔 항상 허용"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"이전 DHCP 클라이언트 사용"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"모바일 데이터 항상 활성화"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"무선 디스플레이 인증서 옵션 표시"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi 로깅 수준을 높이고, Wi‑Fi 선택도구에서 SSID RSSI당 값을 표시합니다."</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"사용 설정하면 Wi-Fi 신호가 약할 때 데이터 연결을 Wi-Fi에서 데이터 네트워크로 더욱 적극적으로 핸드오버합니다."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"이 설정은 개발자용으로만 설계되었습니다. 이 설정을 사용하면 기기 및 애플리케이션에 예기치 않은 중단이나 오류가 발생할 수 있습니다."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB를 통해 설치된 앱 확인"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT을 통해 설치된 앱에 유해한 동작이 있는지 확인"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"로컬 터미널"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"로컬 셸 액세스를 제공하는 터미널 앱 사용"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP 확인"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"충전 안함"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"충전 완료"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"관리자가 사용 중지함"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"홈"</string> </resources> diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index 4e3bfdba842f..ac10512646d5 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi Роуминг Скандоо мүмкүнчүлүгүнө ар дайым уруксат берилсин"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Эскирген DHCP кардарын колдонуу"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Уюлдук дайындар ар дайым активдүү"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Зымсыз дисплейди сертификатто мүмкүнчүлүктөрүн көргөзүү"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi Кармагычта Wi‑Fi протокол деңгээлин жогорулатуу жана ар бир SSID RSSI үчүн көрсөтүү."</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Иштетилгенде, Wi-Fi байланышы үзүл-кесил болуп жатканда, Wi-Fi дайындарды уюктук операторго өжөрлүк менен өткөрөт."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Бул орнотуулар өндүрүүчүлөр үчүн гана берилген. Булар түзмөгүңүздүн колдонмолорун бузулушуна же туура эмес иштешине алып келиши мүмкүн."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB аркылуу келген колдонмолорду ырастоо"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT аркылуу орнотулган колдонмолорду зыянкечтикке текшерүү."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Жергиликтүү терминал"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Жергиликтүү буйрук кабыгын сунуштаган терминалга уруксат берүү"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP текшерүү"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Колдонмолор негизги жикте узак иш-аракеттерди аткарганда экран жаркылдасын"</string> <string name="pointer_location" msgid="6084434787496938001">"Көрсөткүчтүн жайгшкн жери"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Учурдагы басылган дайндрд көрсөтүүчү экран катмары"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Таптоолорду көрсөтүү"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Экранда тапталган жерлерди көрсөтүү"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Экран жаңыруусун көрсөтүү"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Экран жаңырганда аны бүт бойдон жарык кылуу"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU көрүнүш жаңыртуулары"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Эркин формадагы терезелерди түзүү боюнча сынамык функцияны иштетүү"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Компүтердеги бэкаптын сырсөзү"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Компүтердеги толук бэкап учурда корголгон эмес"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Иш тактасынын камдалган сырсөзүн өзгөртүү же алып салуу үчүн таптап коюңуз"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Жаңы бэкапка сырсөз коюулду"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Жаңы сырсөз жана анын ырастоосу дал келген жок"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Жаңы бэкапка сырсөз коюлган жок"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Санарип мазмун үчүн оптималдаштырылган түстөр"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Иштебеген колдонмолор"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Иштеген жок. Которуштуруу үчүн таптап коюңуз."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Иштеп турат. Которуштуруу үчүн таптап коюңуз."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Иштеп жаткан кызматтар"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Учурда иштеп жаткан кызматтарды көрүү жана көзөмөлдөө"</string> <string name="night_mode_title" msgid="2594133148531256513">"Түнкү режим"</string> diff --git a/packages/SettingsLib/res/values-lo-rLA/strings.xml b/packages/SettingsLib/res/values-lo-rLA/strings.xml index 0e3eebde2bde..bddc1dffd678 100644 --- a/packages/SettingsLib/res/values-lo-rLA/strings.xml +++ b/packages/SettingsLib/res/values-lo-rLA/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ອະນຸຍາດການສະແກນການໂຣມ Wi‑Fi ສະເໝີ"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"ໃຊ້ລູກຄ້າ DHCP ຕຳນານ"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"ຂໍ້ມູນມືຖືເປີດຢູ່ສະເໝີ"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ສະແດງໂຕເລືອກສຳລັບການສະແດງການຮັບຮອງລະບົບໄຮ້ສາຍ"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ເພີ່ມລະດັບການເກັບປະຫວັດ Wi‑Fi, ສະແດງຕໍ່ SSID RSSI ໃນ Wi‑Fi Picker"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ເມື່ອເປີດນຳໃຊ້ແລ້ວ, ເຄືອຂ່າຍ Wi-Fi ຈະຖືກປ່ຽນໄປໃຊ້ເຄືອຂ່າຍໂທລະສັບແທນຫາກສັນຍານ Wi-Fi ອ່ອນ"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ການຕັ້ງຄ່າເຫຼົ່ານີ້ແມ່ນມີຈຸດປະສົງເພື່ອການພັດທະນາເທົ່ານັ້ນ. ພວກມັນສາມາດເຮັດໃຫ້ອຸປະກອນ ແລະແອັບພລິເຄຊັນຂອງທ່ານຢຸດເຮັດວຽກ ຫຼືເຮັດວຽກຜິດປົກກະຕິໄດ້."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"ຢືນຢັນແອັບຯຜ່ານທາງ USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ກວດສອບແອັບຯທີ່ຕິດຕັ້ງແລ້ວຜ່ານທາງ ADB/ADT ເພື່ອກວດຫາພຶດຕິກຳທີ່ເປັນອັນຕະລາຍ."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal ໃນໂຕເຄື່ອງ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"ເປີດນຳໃຊ້ແອັບຯ Terminal ທີ່ໃຫ້ການເຂົ້າເຖິງ shell ໃນໂຕເຄື່ອງໄດ້"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"ການກວດສອບ HDCP"</string> @@ -251,7 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"ເປີດໃຊ້ການຮອງຮັບໜ້າຕ່າງຮູບແບບອິດສະຫຼະທີ່ທົດລອງໃຊ້."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"ລະຫັດຜ່ານການສຳຮອງຂໍ້ມູນເດັກສະທັອບ"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ການສຳຮອງຂໍ້ມູນເຕັມຮູບແບບໃນເດັກສະທັອບຍັງບໍ່ໄດ້ຮັບການປ້ອງກັນໃນເວລານີ້"</string> - <string name="local_backup_password_summary_change" msgid="5376206246809190364">"ແຕະເພື່ອປ່ຽນ ຫຼືລຶບລະຫັດຂອງການສຳຮອງຂໍ້ມູນເຕັມຮູບແບບໃນເດັສທັອບ"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"ແຕະເພື່ອປ່ຽນ ຫຼືລຶບລະຫັດຂອງການສຳຮອງຂໍ້ມູນເຕັມຮູບແບບໃນເດັກສະທັອບ"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"ຕັ້ງລະຫັດສຳຮອງໃໝ່ແລ້ວ"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ລະຫັດຜ່ານໃໝ່ ແລະລະຫັດຢືນຢັນບໍ່ກົງກັນ"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ການຕັ້ງລະຫັດສຳຮອງຂໍ້ມູນລົ້ມເຫລວ"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ບໍ່ໄດ້ສາກໄຟ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ເຕັມ"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"ຖືກປິດໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບ"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"ໜ້າຫຼັກ"</string> </resources> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 109fa09cd873..7e54a9c53f43 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Visada leisti „Wi-Fi“ tarptiklinio ryšio nuskaitymą"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Naudoti seną DHCP kliento programą"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Korinio ryšio duomenys visada aktyvūs"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Rodyti belaidžio rodymo sertifikavimo parinktis"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Padidinti „Wi‑Fi“ įrašymo į žurnalą lygį, rodyti SSID RSSI „Wi-Fi“ rinkiklyje"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Jei įgalinta ši parinktis, „Wi‑Fi“ agresyviau perduos duomenų ryšį į mobiliojo ryšio tinklą, kai „Wi‑Fi“ signalas bus silpnas"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Šie nustatymai skirti tik kūrėjams. Nustačius juos įrenginys ir jame naudojamos programos gali nustoti veikti arba veikti netinkamai."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Patvirtinti progr. naudojant USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Patikrinkite, ar programų, įdiegtų naudojant ADB / ADT, veikimas nėra žalingas."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Vietinis terminalas"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Įgal. terminalo progr., siūlančią prieigą prie viet. apvalkalo"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP tikrinimas"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Ekr. blyksės, kai pr. atl. ilgus proc. pgr. gijoje"</string> <string name="pointer_location" msgid="6084434787496938001">"Žymiklio vieta"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Ekrano perdanga rodo dabartinius lietimo duomenis"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Rodyti palietimus"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Rodyti vaizdinius palietimų atsiliepimus"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Rodyti paviršiaus naujin."</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Naujinant mirginti visus langų paviršius"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Rodyt GPU rodinių naujin."</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Įgalinamas eksperimentinių laisvos formos langų palaikymas."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Viet. atsrg. kop. slapt."</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Šiuo metu visos vietinės atsarginės kopijos neapsaugotos"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Jei norite pakeisti ar pašalinti visų stalinio kompiuterio atsarginių kopijų slaptažodį, palieskite"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nustatytas naujas atsarginės kopijos slaptažodis"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Naujas slaptažodis ir patvirtinimas neatitinka"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nustatant atsarginės kopijos slaptažodį įvyko klaida"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Skaitmeniniam turiniui optimizuotos spalvos"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktyvios programos"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Neaktyvi. Palieskite, kad perjungtumėte."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktyvi. Palieskite, kad perjungtumėte."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Vykdomos paslaugos"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Žiūrėti ir valdyti dabar vykdomas paslaugas"</string> <string name="night_mode_title" msgid="2594133148531256513">"Naktinis režimas"</string> @@ -314,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Nekraunama"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Visiškai įkrautas"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Išjungė administratorius"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Pagrindinis ekranas"</string> </resources> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 9a5483e269c5..268a3ffeb0e9 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vienmēr atļaut Wi‑Fi meklēšanu"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Lietot mantoto DHCP klientu"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Vienmēr aktīvs mobilo datu savienojums"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Rādīt bezvadu attēlošanas sertifikācijas iespējas"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Palieliniet Wi‑Fi reģistrēšanas līmeni; rādīt katram SSID RSSI Wi‑Fi atlasītājā."</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Ja opcija ir iespējota un Wi‑Fi signāls ir vājš, datu savienojuma pāreja no Wi-Fi uz mobilo tīklu tiks veikta agresīvāk."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Šie iestatījumi ir paredzēti tikai izstrādei. To dēļ var tikt pārtraukta vai traucēta ierīces un lietojumprogrammu darbība."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificēt, ja instalētas no USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Pārbaudīt, vai lietotņu, kuru instalēšanai izmantots ADB/ADT, darbība nav kaitīga."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Vietējā beigu lietotne"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Iespējot beigu lietotni, kurā piedāvāta vietējā čaulas piekļuve"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP pārbaude"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Zibsnīt ekrānu, ja liet. ilgi darbojas galv. pav."</string> <string name="pointer_location" msgid="6084434787496938001">"Rādītāja atrašanās vieta"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Ekrāna pārklājums ar aktuāliem pieskāriena datiem"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Rādīt pieskārienus"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Rādīt vizuālo reakciju pēc pieskārieniem"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Rādīt virsmas atjauninājumus WL: 294"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Atjaunināt visa loga virsmas, kad tās tiek atjauninātas WL: 294"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Rādīt GPU skat. atjaun."</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Iespējo eksperimentālo brīvās formas logu atbalstu."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Datora dublējuma parole"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Darbvirsmas pilnie dublējumi pašlaik nav aizsargāti."</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Pieskarieties, lai mainītu vai noņemtu paroli pilniem datora dublējumiem."</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Jaunā dublējuma parole ir iestatīta."</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Jaunā parole un apstiprinājums neatbilst."</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Iestatot dublējuma paroli, radās kļūme."</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Digitālajam saturam optimizētas krāsas"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktīvās lietotnes"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Neaktīva. Pieskarieties, lai pārslēgtu."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktīva. Pieskarieties, lai pārslēgtu."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Aktīvie pakalpojumi"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Pašreiz darbojošos pakalpojumu skatīšana un vadība"</string> <string name="night_mode_title" msgid="2594133148531256513">"Nakts režīms"</string> @@ -314,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Nenotiek uzlāde"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Pilns"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Atspējojis administrators"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Sākums"</string> </resources> diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml index 17de45b61d4e..b96e0c274bf9 100644 --- a/packages/SettingsLib/res/values-mk-rMK/strings.xml +++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Секогаш дозволувај Wi‑Fi скенирање во роаминг"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Користете наследен клиент на DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Мобилниот интернет е секогаш активен"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Покажи ги опциите за безжичен приказ на сертификат"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Зголеми Wi‑Fi ниво на пријавување, прикажи по SSID RSSI во Wi‑Fi бирач"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Кога е вклучено, Wi-Fi ќе биде поагресивно при предавање на поврзувањето со податоци на мобилната мрежа при слаб сигнал на Wi-Fi."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Овие подесувања се наменети само за употреба за развој. Тие може да предизвикаат уредот и апликациите во него да се расипат или да се однесуваат необично."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Потврди апликации преку УСБ"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Провери апликации инсталирани преку ADB/ADT за штетно однесување."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Локален терминал"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Овозможи апликација на терминал што овозможува локален пристап кон школка."</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Проверување HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Осветли екран при. долги операции на главна нишка"</string> <string name="pointer_location" msgid="6084434787496938001">"Локација на покажувач"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Прекривката на екран ги покажува тековните податоци на допир"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Прикажувај допири"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Прикажи визуелни повратни информации за допири"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Прикажи ажурир. површина"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Осветли површ. на прозорци при нивно ажурирање"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Прикажи ажурир. со GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Овозможува поддршка за експериментални прозорци со слободна форма."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Резервна лозинка за работна површина"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Целосни резервни копии на работната површина кои во моментов не се заштитени"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Допрете за да се промени или отстрани лозинката за целосни резервни копии на работната површина"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Подесена нова лозинка на резервна копија"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Новата лозинка и потврдата не се исти"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Неуспешно подесување лозинка на резервна копија"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Оптимизирани бои за дигитална содржина"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Неактивни апликации"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Неактивно. Допрете за да смените."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Активно. Допрете за да смените."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Активни услуги"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Погледнете и контролирајте услуги што се моментално активни"</string> <string name="night_mode_title" msgid="2594133148531256513">"Ноќен режим"</string> @@ -314,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Не се полни"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Целосна"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Оневозможено од администраторот"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Почетна страница"</string> </resources> diff --git a/packages/SettingsLib/res/values-ml-rIN/strings.xml b/packages/SettingsLib/res/values-ml-rIN/strings.xml index 7df1cf35a0b5..630f499d1b52 100644 --- a/packages/SettingsLib/res/values-ml-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ml-rIN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"എപ്പോഴും വൈഫൈ റോം സ്കാൻ അനുവദിക്കൂ"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"പഴയ DHCP ക്ലയന്റ് ഉപയോഗിക്കുക"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"സെല്ലുലാർ ഡാറ്റ എല്ലായ്പ്പോഴും സജീവം"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"വയർലെസ് ഡിസ്പ്ലേ സർട്ടിഫിക്കേഷനായി ഓപ്ഷനുകൾ ദൃശ്യമാക്കുക"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"വൈഫൈ പിക്കറിൽ ഓരോ SSID RSSI പ്രകാരം കാണിക്കാൻ വൈഫൈ ലോഗിംഗ് നില വർദ്ധിപ്പിക്കുക"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"പ്രവർത്തനക്ഷമമായിരിക്കുമ്പോൾ, വൈഫൈ സിഗ്നൽ കുറവായിരിക്കുന്ന സമയത്ത് സെല്ലുലാറിലേക്ക് ഡാറ്റ കണക്ഷൻ മുഖേന കൈമാറുന്നതിൽ വൈഫൈ കൂടുതൽ പ്രവർത്തനക്ഷമമാകും"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ഈ ക്രമീകരണങ്ങൾ വികസന ഉപയോഗത്തിന് മാത്രമായുള്ളതാണ്. അവ നിങ്ങളുടെ ഉപകരണവും അതിലെ അപ്ലിക്കേഷനുകളും തകരാറിലാക്കുന്നതിനോ തെറ്റായി പ്രവർത്തിക്കുന്നതിനോ ഇടയാക്കാം."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB വഴി ആപ്സ് പരിശോധിച്ചുറപ്പിക്കൂ"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"കേടാക്കുന്ന പ്രവർത്തനരീതിയുള്ള ADB/ADT വഴി ഇൻസ്റ്റാളുചെയ്ത അപ്ലിക്കേഷനുകൾ പരിശോധിക്കുക."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"പ്രാദേശിക ടെർമിനൽ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"പ്രാദേശിക ഷെൽ ആക്സസ് നൽകുന്ന ടെർമിനൽ അപ്ലിക്കേഷൻ പ്രവർത്തനക്ഷമമാക്കുക"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP പരിശോധന"</string> @@ -266,8 +270,8 @@ <item msgid="5363960654009010371">"ഡിജിറ്റൽ ഉള്ളടക്കത്തിനായി വർണ്ണങ്ങൾ ഒപ്റ്റിമൈസ് ചെയ്തു"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"നിഷ്ക്രിയ ആപ്പ്സ്"</string> - <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"നിഷ്ക്രിയം. ടോഗിൾ ചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string> - <string name="inactive_app_active_summary" msgid="4174921824958516106">"സജീവം. ടോഗിൾ ചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"നിഷ്ക്രിയം. മാറ്റുന്നതിനു ടാപ്പുചെയ്യുക."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"സജീവം. മാറ്റുന്നതിന് ടാപ്പുചെയ്യുക."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"നിലവിൽ പ്രവർത്തിക്കുന്ന സേവങ്ങൾ കാണുക, നിയന്ത്രിക്കുക"</string> <string name="night_mode_title" msgid="2594133148531256513">"നൈറ്റ് മോഡ്"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ചാർജ്ജുചെയ്യുന്നില്ല"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"നിറഞ്ഞു"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"അഡ്മിനിസ്ട്രേറ്റർ പ്രവർത്തനരഹിതമാക്കി"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"ഹോം"</string> </resources> diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml index d4a3d44cbae1..525742692bc4 100644 --- a/packages/SettingsLib/res/values-mn-rMN/strings.xml +++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi Роум сканыг байнга зөвшөөрөх"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Хуучин DHCP харилцагчийг хэрэглэх"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Үүрэн холбооны датаг үргэлж идэвхтэй байлгана"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Утасгүй дэлгэцийн сертификатын сонголтыг харуулах"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi лог-н түвшинг нэмэгдүүлэх, Wi‑Fi Сонгогч дээрх SSID-д ногдох RSSI-г харуулах"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Идэвхжүүлсэн үед Wi‑Fi дохио сул бол дата холболтыг Үүрэн рүү шилжүүлэхдээ илүү идэвхтэй байх болно"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Эдгээр тохиргоо нь зөвхөн хөгжүүлэлтэд ашиглах зорилготой. Эдгээр нь таны төхөөрөмж буюу түүн дээрх аппликешнүүдийг эвдрэх, буруу ажиллах шалтгаан нь болж болно."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Апп-г USB-р тулгах"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT-р суулгасан апп-уудыг хорлонтой авиртай эсэхийг шалгах."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Локал терминал"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Локал суурьт хандалт хийх боломж олгодог терминалын апп-г идэвхжүүлэх"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP шалгах"</string> diff --git a/packages/SettingsLib/res/values-mr-rIN/strings.xml b/packages/SettingsLib/res/values-mr-rIN/strings.xml index 6a2bd61f80c0..546d3add40e0 100644 --- a/packages/SettingsLib/res/values-mr-rIN/strings.xml +++ b/packages/SettingsLib/res/values-mr-rIN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"वाय-फाय रोम स्कॅनला नेहमी अनुमती द्या"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"परंपरागत DHCP क्लायंटचा वापर करा"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"सेल्युलर डेटा नेहमी सक्रिय"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस प्रदर्शन प्रमाणिकरणासाठी पर्याय दर्शवा"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाय-फाय लॉगिंग स्तर वाढवा, वाय-फाय निवडकामध्ये प्रति SSID RSSI दर्शवा"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"सक्षम केल्यास, वाय-फाय सिग्नल निम्न असताना, वाय-फाय डेटा कनेक्शन सेल्युलरवर बळपूर्वक स्विच करेल."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"या सेटिंग्जचा हेतू फक्त विकास करण्याच्या वापरासाठी आहे. त्यामुळे आपले डिव्हाइस आणि त्यावरील अनुप्रयोग विघटित होऊ शकतात किंवा गैरवर्तन करू शकतात."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB वरील अॅप्स सत्यापित करा"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"हानीकारक वर्तनासाठी ADB/ADT द्वारे स्थापित अॅप्स तपासा."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"स्थानिक टर्मिनल"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"स्थानिक शेल प्रवेश देणारा टर्मिनल अॅप सक्षम करा"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP तपासणी"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"मुख्य थ्रेडवर अॅप्स मोठी कार्ये करतात तेव्हा स्क्रीन फ्लॅश करा"</string> <string name="pointer_location" msgid="6084434787496938001">"पॉइंटर स्थान"</string> <string name="pointer_location_summary" msgid="840819275172753713">"वर्तमान स्पर्श डेटा दर्शविणारे स्क्रीन आच्छादन"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"टॅप दर्शवा"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"टॅपसाठी दृश्यमान अभिप्राय दर्शवा"</string> <string name="show_screen_updates" msgid="5470814345876056420">"पृष्ठभाग अद्यतने दर्शवा"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"संपूर्ण विंडो पृष्ठभाग अद्ययावत होतात तेव्हा ते फ्लॅश करा"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU दृश्य अद्यतने दर्शवा"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"प्रायोगिक मुक्तस्वरूपाच्या विंडोसाठी समर्थन सक्षम करते."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"डेस्कटॉप बॅकअप संकेतशब्द"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"डेस्कटॉप पूर्ण बॅक अप सध्या संरक्षित नाहीत"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"डेस्कटॉपच्या पूर्ण बॅकअपसाठी असलेला संकेतशब्द बदलण्यासाठी किंवा काढण्यासाठी टॅप करा"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"नवीन बॅक अप संकेतशब्द सेट झाला"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"नवीन संकेतशब्द आणि पुष्टीकरण जुळत नाही"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"बॅक अप संकेतशब्द सेट करणे अयशस्वी"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"डिजिटल सामग्रीसाठी ऑप्टिमाइझ केलेले रंग"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"निष्क्रिय अॅप्स"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"निष्क्रिय. टॉगल करण्यासाठी टॅप करा."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करण्यासाठी टॅप करा."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"चालू सेवा"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"सध्या चालत असलेल्या सेवा पहा आणि नियंत्रित करा"</string> <string name="night_mode_title" msgid="2594133148531256513">"रात्र मोड"</string> diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml index 42e9ddd40d6c..1066e02bb98b 100644 --- a/packages/SettingsLib/res/values-ms-rMY/strings.xml +++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sentiasa benarkan Imbasan Perayauan Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Gunakan pelanggan DHCP lama"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Data selular sentiasa aktif"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Apabila didayakan, Wi-Fi akan menjadi lebih agresif dalam menyerahkan sambungan data ke Selular, apabila isyarat Wi-Fi rendah"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Tetapan ini adalah untuk penggunaan pembangunan sahaja. Peranti dan aplikasi yang terdapat padanya boleh rosak atau tidak berfungsi dengan betul."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Sahkan apl melalui USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Semak apl yang dipasang melalui ADB/ADT untuk tingkah laku yang berbahaya."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal setempat"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Dayakan apl terminal yang menawarkan akses shell tempatan"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Penyemakan HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Kelip skrin apabila apl beroperasi lama pada urutan utama"</string> <string name="pointer_location" msgid="6084434787496938001">"Lokasi penuding"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Tindihan skrin menunjukkan data sentuh semasa"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Tunjukkan ketikan"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Tunjukkan maklum balas visual untuk ketikan"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Tunjuk kemas kini permukaan"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Denyar permukaan tetingkap apabila dikemas kini"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Tunjuk kemas kini GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Mendayakan sokongan untuk tetingkap bentuk bebas percubaan."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Kata laluan sandaran komputer meja"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Sandaran penuh komputer meja tidak dilindungi pada masa ini"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Ketik untuk menukar atau mengalih keluar kata laluan untuk sandaran penuh desktop"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Kata laluan sandaran baharu telah ditetapkan"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Kata laluan baharu dan pengesahan tidak sepadan"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Gagal menetapkan kata laluan sandaran"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Warna dioptimumkan untuk kandungan digital"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Apl yang tidak aktif"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Tidak aktif. Ketik untuk menogol."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktif. Ketik untuk menogol."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Perkhidmatan dijalankan"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Lihat dan kawal perkhidmatan yang sedang dijalankan"</string> <string name="night_mode_title" msgid="2594133148531256513">"Mod malam"</string> diff --git a/packages/SettingsLib/res/values-my-rMM/strings.xml b/packages/SettingsLib/res/values-my-rMM/strings.xml index bace8b645dd4..05cdcad7f3a3 100644 --- a/packages/SettingsLib/res/values-my-rMM/strings.xml +++ b/packages/SettingsLib/res/values-my-rMM/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi ရွမ်းရှာဖွေမှုကို အမြဲတမ်း ခွင့်ပြုမည်"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"DHCP ကလိုင်းယင့် အဟောင်းအားသုံးရန်"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"ဆဲလ်လူလာဒေတာ အမြဲတမ်းဖွင့်ထားသည်"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ကြိုးမဲ့ အခင်းအကျင်း အသိအမှတ်ပြုလက်မှတ်အတွက် ရွေးချယ်စရာများပြရန်"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi မှတ်တမ်းတင်ခြင်း နှုန်းအားမြင့်ကာ၊ Wi‑Fi ရွေးရာတွင် SSID RSSI ဖြင့်ပြပါ"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ဖွင့်ထားလျှင်၊ Wi‑Fi မှ ဆယ်လူလာသို့ အချက်လက် ချိတ်ဆက်မှုအား လွှဲပြောင်းရာ၌ ပိုမိုထိရောက်ပါသည်၊ WIFI အားနည်းနေချိန်တွင်"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ဤဆက်တင်းများကို တည်ဆောက်ပြုပြင်ရာတွင် သုံးရန်အတွက်သာ ရည်ရွယ်သည်။ ၎င်းတို့သည် သင်၏စက်နှင့် အပလီကေးရှင်းများကို ရပ်စေခြင်း သို့ လုပ်ဆောင်ချက်မမှန်ကန်ခြင်းများ ဖြစ်ပေါ်စေနိုင်သည်။"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USBပေါ်မှ အပလီကေးရှင်းများကို အတည်ပြုစိစစ်ရန်"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT မှတဆင့် ထည့်သွင်းသော အပလီကေးရှင်းများကို အန္တရာယ်ဖြစ်နိုင်ခြင်း ရှိမရှိ စစ်ဆေးရန်။"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"လိုကယ်တာမီနယ်"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"local shell အသုံးပြုခွင့်ကမ်းလှမ်းသော တာမင်နယ်အပလီကေးရှင်းဖွင့်ပါ"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP စစ်ဆေးမှု"</string> @@ -251,7 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"စမ်းသပ်မှု အခမဲ့ပုံစံ ဝင်းဒိုးများအတွက် ပံ့ပိုးမှုကို ဖွင့်ပါ။"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Desktop အရန်စကားဝှက်"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"အလုပ်ခုံတွင် အရန်သိမ်းဆည်းခြင်းများကို လောလောဆယ် မကာကွယ်နိုင်ပါ။"</string> - <string name="local_backup_password_summary_change" msgid="5376206246809190364">"အလုပ်ခုံစက် အပြည့်အဝအရံကူးထားရန်အတွက် စကားဝှက်ကို ပြောင်းရန် သို့မဟုတ် ဖယ်ရှားရန် တို့ပါ။"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"စားပွဲတင်ကွန်ပျူတာကို အပြည့်အဝအရံကူးထားရန်အတွက် စကားဝှက်ကို ပြောင်းရန် သို့မဟုတ် ဖယ်ရှားရန် တို့ပါ။"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"အရန်သိမ်းဆည်းခြင်းအတွက် စကားဝှက်အသစ်ကို သတ်မှတ်ပြီးပြီ။"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"စကားဝှက်အသစ်နှင့် အတည်ပြုချက် ကွဲလွဲနေသည်။"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"အရန်သိမ်းဆည်းခြင်းအတွက် စကားဝှက်သတ်မှတ်ချက် မအောင်မြင်ပါ။"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"အားသွင်းမနေပါ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"အပြည့်"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"စီမံခန့်ခွဲသူမှ ပိတ်ထားသည်"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"ပင်မ"</string> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 6843839eab2b..060dc8f2b544 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillat alltid skanning for Wi-Fi-roaming"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Bruk eldre DHCP-klient"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobildata er alltid aktiv"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vis alternativer for sertifisering av trådløs skjerm"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Øk Wi-Fi-loggenivå – vis per SSID RSSI i Wi-Fi-velgeren"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Hvis dette slås på, overfører Wi-Fi-nettverket datatilkoblingen til mobil mer aggressivt når Wi-Fi-signalet er lavt"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Disse innstillingene er bare beregnet for bruk under programutvikling. De kan forårsake problemer med enheten din og tilhørende apper."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Bekreft apper via USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Sjekk apper som er installert via ADB/ADT for skadelig adferd."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Lokal terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Aktiver terminalappen som gir lokal kommandolistetilgang"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-kontroll"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Skjermblink ved lange apphandlinger på hovedtråd"</string> <string name="pointer_location" msgid="6084434787496938001">"Pekerplassering"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Skjermoverlegg viser aktuelle berøringsdata"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Vis trykk"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Vis visuell tilbakemelding for trykk"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Vis overflateoppdateringer"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Fremhev hele vindusoverflater når de oppdateres"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Vis GPU-visningsoppdateringer"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Slår på støtte for vinduer i eksperimentelt fritt format."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Passord for sikkerhetskopiering på datamaskin"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Fullstendig sikkerhetskopiering på datamaskin beskyttes ikke for øyeblikket."</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Trykk for å endre eller fjerne passordet for fullstendige sikkerhetskopier på datamaskinen"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nytt passord for sikkerhetskopiering er angitt."</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Gjentakelsen av passordet er ikke identisk med det første du skrev inn"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Kunne ikke angi nytt passord for sikkerhetskopiering"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Farger som er optimalisert for digitalt innhold"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Inaktive apper"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Ikke aktiv. Trykk for å slå av/på."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Trykk for å slå av/på."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Aktive tjenester"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Se og kontrollér tjenester som kjører for øyeblikket"</string> <string name="night_mode_title" msgid="2594133148531256513">"Nattmodus"</string> diff --git a/packages/SettingsLib/res/values-ne-rNP/strings.xml b/packages/SettingsLib/res/values-ne-rNP/strings.xml index a5fd19488f97..8493d66c9830 100644 --- a/packages/SettingsLib/res/values-ne-rNP/strings.xml +++ b/packages/SettingsLib/res/values-ne-rNP/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"वाइफाइ घुम्ने स्क्यान गर्न सधैँ अनुमति दिनुहोस्"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"लिगेसी DHCP ग्राहक प्रयोग गर्नुहोस्"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"सेलुलर डेटा सधैं सक्रिय"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाइफाइ लग स्तर बढाउनुहोस्, वाइफाइ चयनकर्तामा प्रति SSID RSSI देखाइन्छ"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"वाइफाइ संकेत कम हुँदा, सक्षम जब गरिन्छ, वाइफाइ सेलुलर लागि डेटा जडान सुम्पनामा बढी आक्रामक हुनेछ"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"यी सेटिङहरू केवल विकास प्रयोगको लागि विचार गरिएको हो। तिनीहरूले तपाईंको उपकरण र अनुप्रयोगहरूलाई विच्छेदन गर्न वा दुर्व्यवहार गर्न सक्दछ।"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB मा अनुप्रयोगहरू रुजु गर्नुहोस्"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"हानिकारक व्यवहारको लागि ADB/ADT को माध्यमबाट स्थापित अनुप्रयोगहरूको जाँच गर्नुहोस्।"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"स्थानीय टर्मिनल"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"स्थानीय सेल पहुँच प्रदान गर्ने टर्मिनल अनुप्रयोग सक्षम गर्नुहोस्"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP जाँच गर्दै"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"चार्ज हुँदै छैन"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"पूर्ण"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"प्रशासकद्वारा असक्षम गरिएको"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"गृह"</string> </resources> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 99c09321349e..3eb9b4c658bc 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Altijd roamingscans voor wifi toestaan"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Oude DHCP-client gebruiken"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobiele gegevens altijd actief"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Absoluut volume uitschakelen"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Opties weergeven voor certificering van draadloze weergave"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Indien ingeschakeld, is wifi agressiever bij het overgeven van de gegevensverbinding aan mobiel wanneer het wifi-signaal zwak is"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Deze instellingen zijn uitsluitend bedoeld voor ontwikkelingsgebruik. Je apparaat en apps kunnen hierdoor vastlopen of anders reageren."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Apps verifiëren via USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Apps die zijn geïnstalleerd via ADB/ADT, controleren op schadelijk gedrag"</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Hiermee wordt de functie voor absoluut volume van Bluetooth uitgeschakeld in geval van volumeproblemen met externe apparaten, zoals een onacceptabel hoog volume of geen volumeregeling."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Lokale terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Terminal-app inschakelen die lokale shell-toegang biedt"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-controle"</string> diff --git a/packages/SettingsLib/res/values-pa-rIN/strings.xml b/packages/SettingsLib/res/values-pa-rIN/strings.xml index 407ec95ca3b2..fe9d0b0d4579 100644 --- a/packages/SettingsLib/res/values-pa-rIN/strings.xml +++ b/packages/SettingsLib/res/values-pa-rIN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ਹਮੇਸ਼ਾਂ Wi‑Fi Roam Scans ਦੀ ਆਗਿਆ ਦਿਓ"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"ਲੀਗੇਸੀ DHCP ਕਲਾਈਂਟ ਵਰਤੋ"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"ਸੈਲਿਊਲਰ ਡੇਟਾ ਹਮੇਸ਼ਾ ਕਿਰਿਆਸ਼ੀਲ"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ਵਾਇਰਲੈਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਦਿਖਾਓ"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, Wi‑Fi Picker ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ਜਦੋਂ ਸਮਰਥਿਤ ਹੋਵੇ, ਤਾਂ Wi‑Fi ਸੈਲਿਊਲਰ ਨੂੰ ਡਾਟਾ ਕਨੈਕਸ਼ਨ ਹੈਂਡ ਓਵਰ ਕਰਨ ਵਿੱਚ ਵੱਧ ਅਗ੍ਰੈਸਿਵ ਹੋ ਜਾਏਗਾ, ਜਦੋਂ Wi‑Fi ਸਿਗਨਲ ਘੱਟ ਹੋਵੇ"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ਇਹ ਸੈਟਿੰਗਾਂ ਕੇਵਲ ਵਿਕਾਸਕਾਰ ਦੀ ਵਰਤੋਂ ਲਈ ਹਨ। ਇਹ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਅਤੇ ਇਸਤੇ ਮੌਜੂਦ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬ੍ਰੇਕ ਕਰਨ ਜਾਂ ਦੁਰਵਿਵਹਾਰ ਕਰਨ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੇ ਹਨ।"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ਤੇ ਐਪਸ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਕਰੋ"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ਹਾਨੀਕਾਰਕ ਵਿਵਹਾਰ ਲਈ ADB/ADT ਰਾਹੀਂ ਇੰਸਟੌਲ ਕੀਤੇ ਐਪਸ ਦੀ ਜਾਂਚ ਕਰੋ।"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"ਸਥਾਨਕ ਟਰਮੀਨਲ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"ਟਰਮੀਨਲ ਐਪ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ ਜੋ ਸਥਾਨਕ ਸ਼ੈਲ ਪਹੁੰਚ ਆੱਫਰ ਕਰਦਾ ਹੈ"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP ਜਾਂਚ"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ਪੂਰੀ"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"ਮੁੱਖ ਸਕ੍ਰੀਨ"</string> </resources> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 9902ad7df141..0c16a817502a 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Zawsze szukaj Wi-Fi w roamingu"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Użyj starszego klienta DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Dane komórkowe zawsze aktywne"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaż opcje certyfikacji wyświetlacza bezprzewodowego"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Po włączeniu połączenie danych będzie bardziej agresywnie przełączać się z Wi-Fi na sieć komórkową przy słabym sygnale Wi-Fi"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Te ustawienia są przeznaczone wyłącznie dla programistów. Ich użycie może spowodować uszkodzenie lub nieprawidłowe działanie urządzenia i zainstalowanych na nim aplikacji."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Zweryfikuj aplikacje przez USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Sprawdź, czy aplikacje zainstalowane przez ADB/ADT nie zachowują się w szkodliwy sposób"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal lokalny"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Włącz terminal, który umożliwia dostęp do powłoki lokalnej"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Sprawdzanie HDCP"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 923482bdd4cc..4f24f43ce76b 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sempre permitir verif. de roaming de Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Usar cliente DHCP legado"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Dados da rede celular sempre ativos"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções de certificação de Display sem fio"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de registro do Wi-Fi; mostrar conforme o RSSI de SSID na Seleção de Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Quando ativada, o Wi-Fi será mais agressivo em transferir a conexão de dados para celular, quando o sinal de Wi-Fi estiver fraco"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Essas configurações são destinadas apenas para o uso de desenvolvedores. Elas podem causar a desativação ou mau funcionamento do dispositivo e dos apps contidos nele."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar apps por USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Verificar comportamento nocivo em apps instalados via ADB/ADT."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Ativar o app terminal que oferece acesso ao shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Verificação HDCP"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 840bd4179bed..a1497f01ad62 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -165,6 +165,7 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir sempre a deteção de Wi-Fi em roaming"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Utilizar cliente DHCP antigo"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Dados móveis sempre ativados"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desativar volume absoluto"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções da certificação de display sem fios"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de reg. de Wi-Fi, mostrar por RSSI de SSID no Selec. de Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Se estiver ativado, o Wi-Fi será mais agressivo ao transmitir a lig. de dados p/ a rede móvel quando o sinal Wi-Fi estiver fraco"</string> @@ -185,6 +186,7 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Estas definições destinam-se apenas a programação. Podem fazer com que o seu aparelho e as aplicações nele existentes falhem ou funcionem mal."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar aplicações de USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Verificar as aplicações instaladas via ADB/ADT para detetar comportamento perigoso."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Desativa a funcionalidade de volume absoluto do Bluetooth caso existam problemas de volume com dispositivos remotos, como um volume insuportavelmente alto ou a ausência de controlo."</string> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Ativar aplicação terminal que oferece acesso local à shell"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Verificação HDCP"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 923482bdd4cc..4f24f43ce76b 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Sempre permitir verif. de roaming de Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Usar cliente DHCP legado"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Dados da rede celular sempre ativos"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opções de certificação de Display sem fio"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar o nível de registro do Wi-Fi; mostrar conforme o RSSI de SSID na Seleção de Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Quando ativada, o Wi-Fi será mais agressivo em transferir a conexão de dados para celular, quando o sinal de Wi-Fi estiver fraco"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Essas configurações são destinadas apenas para o uso de desenvolvedores. Elas podem causar a desativação ou mau funcionamento do dispositivo e dos apps contidos nele."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificar apps por USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Verificar comportamento nocivo em apps instalados via ADB/ADT."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Ativar o app terminal que oferece acesso ao shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Verificação HDCP"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 02cc80eecf54..491a07b17268 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Se permite întotdeauna scanarea traficului Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Folosiți vechiul client DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Conexiunea de date mobile este întotdeauna activată"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afișați opțiunile pentru certificarea Ecran wireless"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Măriți niv. de înr. prin Wi‑Fi, afișați în fcț. de SSID RSSI în Selectorul Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Când este activată, funcția Wi-Fi va fi mai agresivă la predarea conexiunii de date către mobil când semnalul Wi-Fi este slab"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Aceste setări sunt destinate exclusiv utilizării pentru dezvoltare. Din cauza lor, este posibil ca dispozitivul dvs. și aplicațiile de pe acesta să nu mai funcţioneze sau să funcţioneze necorespunzător."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verificați aplicațiile prin USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Verificați aplicațiile instalate utilizând ADB/ADT, pentru a detecta un comportament dăunător."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Aplicație terminal locală"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Activați aplicația terminal care oferă acces la shell local"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Verificare HDCP"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 57d288332478..55f279ccca34 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Всегда включать поиск сетей Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Использовать устаревший DHCP-клиент"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Не отключать передачу данных"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показывать параметры сертификации беспроводных мониторов"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"При выборе Wi‑Fi указывать в журнале RSSI для каждого SSID"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Принудительно переключаться на мобильную сеть, если сигнал Wi-Fi слабый"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Только для разработчиков. Изменение этих настроек может привести к сбоям или неправильной работе устройства и приложений."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Установка через USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Проверка безопасности приложений, устанавливаемых через ADB/ADT"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Локальный терминальный доступ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Разрешить терминальный доступ к локальной оболочке"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Проверка HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Подсвечивать экран во время длительных операций"</string> <string name="pointer_location" msgid="6084434787496938001">"Отображать касания"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Визуализировать на экране нажатия и жесты"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Визуальный отклик"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Показывать места нажатия на экране"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Показ. обнов. поверхности"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Подсвечивать окна полностью при их обновлении"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Показывать обнов. экрана"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Включить экспериментальную функцию создания окон произвольной формы"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Пароль для резервного копирования"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Полные резервные копии в настоящее время не защищены"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Нажмите, чтобы изменить или удалить пароль для резервного копирования"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Новый пароль для резервной копии установлен"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Пароли не совпадают"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Не удалось установить пароль для резервной копии"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Цвета, оптимизированные для цифрового контента"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Неактивные приложения"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Выключено. Нажмите, чтобы включить."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Включено. Нажмите, чтобы отключить."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Работающие приложения"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Просмотр и управление работающими приложениями"</string> <string name="night_mode_title" msgid="2594133148531256513">"Ночной режим"</string> diff --git a/packages/SettingsLib/res/values-si-rLK/strings.xml b/packages/SettingsLib/res/values-si-rLK/strings.xml index 6d178a90162b..e2ba5f288d5b 100644 --- a/packages/SettingsLib/res/values-si-rLK/strings.xml +++ b/packages/SettingsLib/res/values-si-rLK/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi රෝම් පරිලෝකන වෙතට සැමවිට අවසර දෙන්න"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"ලෙගසි DHCP සේවාලාභියා භාවිත කරන්න"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"සෙලියුලර් දත්ත සැමවිට ක්රියාකාරීය"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"නොරැහැන් සංදර්ශක සහතිකය සඳහා විකල්ප පෙන්වන්න"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ලොග් මට්ටම වැඩි කරන්න, Wi‑Fi තෝරනයෙහි SSID RSSI අනුව පෙන්වන්න"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"සබල විට Wi‑Fi සිග්නලය අඩු විට Wi‑Fi දත්ත සම්බන්ධතාවය සෙලියුලර් වෙත භාර දීමට වඩා ආක්රමණික වේ"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"මෙම සැකසීම් වර්ධක භාවිතය සඳහා පමණි. ඔබගේ උපාංගයේ සහ යෙදුම්වල අක්රිය වීමට හෝ වැරදි ක්රියා කෙරුමකට ඒවා බලපෑ හැක."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ඔස්සේ යෙදුම් සත්යාපනය කරගන්න"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT හරහා ස්ථාපනය වූ යෙදුම්, විනාශකාරී ක්රියාවන් ඇත්දැයි පරික්ෂාකර බලන්න."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"අභ්යන්තර අන්තය"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"දේශීය ෂෙල් ප්රවේශනය පිරිනමන ටර්මිනල් යෙදුම සබල කරන්න"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP පරික්ෂාව"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"මූලික පොටේ යෙදුම්, දිගු මෙහෙයුම් කරන විට තිරය ෆ්ලෑෂ් කරන්න"</string> <string name="pointer_location" msgid="6084434787496938001">"සූචක පිහිටීම"</string> <string name="pointer_location_summary" msgid="840819275172753713">"තිර උඩැතිරිය වර්තමාන ස්පර්ශ දත්ත පෙන්වයි"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"තට්ටු කිරීම් පෙන්වන්න"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"තට්ටු කිරීම් සඳහා දෘශ්ය ප්රතිපෝෂණ පෙන්වන්න"</string> <string name="show_screen_updates" msgid="5470814345876056420">"පෘෂ්ඨ යාවත්කාලීන පෙන්වන්න"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"යාවත්කාලින වනවිට මුළු කවුළු තලයම දැල්වෙන්න"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU පෙනුම් යාවත්කාලීන පෙන්වන්න"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"පරීක්ෂණාත්මක අනියම් හැඩැති කවුළු සඳහා සහාය සබල කරයි."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"ඩෙස්ක්ටොප් උපස්ථ මුරපදය"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ඩෙස්ක්ටොප් සම්පූර්ණ උපස්ථ දැනට ආරක්ෂා කර නොමැත"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"ඩෙස්ක්ටොප් සම්පූර්ණ උපස්ථ සඳහා මුරපදය වෙනස් කිරීමට හෝ ඉවත් කිරීමට තට්ටු කරන්න"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"නව උපස්ථ මුරපදය සකසන ලදි"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"නව මුරපදය සහ සත්යාපනය නොගැළපුනි"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"උපස්ථ මුරපදය පිහිටුවීම අසාර්ථකය"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"ඩිජිටල් අන්තර්ගතය සඳහා වර්ණ ප්රශස්ත කරන ලද"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"අක්රිය යෙදුම්"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"අක්රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"සක්රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"ධාවනය වන සේවා"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"දැනට ධාවනය වන සේවා බලන්න සහ පාලනය කරන්න"</string> <string name="night_mode_title" msgid="2594133148531256513">"රාත්රී ප්රකාරය"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 658b01440070..4fcc8f9048e7 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vždy povoliť funkciu Wi-Fi Roam Scans"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Použiť starý klient DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobilné dáta vždy aktívne"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Zobraziť možnosti certifikácie bezdrôtového zobrazenia"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zvýšiť úroveň denníkov Wi-Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Keď túto možnosť zapnete, Wi-Fi bude agresívnejšie odovzdávať dát. pripoj. na mob. sieť vtedy, keď bude slabý signál Wi-Fi"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Tieto nastavenia sú určené len pre vývojárov. Môžu spôsobiť poruchu alebo nesprávne fungovanie zariadenia a nainštalovaných aplikácií."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Overovať aplikácie z USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrolovať škodlivosť aplikácií nainštalovaných pomocou nástroja ADB alebo ADT"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Miestny terminál"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Povoliť terminálovú apl. na miestny prístup k prostrediu shell"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Kontrola HDCP"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 7b63d5d6e943..c158cd9fef8f 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vedno omogoči iskanje omrežij Wi-Fi za gostovanje"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Uporaba starejšega odjemalca DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Prenos podatkov v mobilnih omrežjih je vedno aktiven"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaži možnosti za potrdilo brezžičnega zaslona"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povečaj raven zapis. dnev. za Wi-Fi; v izbir. Wi‑Fi-ja pokaži glede na SSID RSSI"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Če je ta možnost omogočena, Wi-Fi odločneje preda podatkovno povezavo mobilnemu omrežju, ko je signal Wi-Fi šibek"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Te nastavitve so namenjene samo za razvijanje in lahko povzročijo prekinitev ali napačno delovanje naprave in aplikacij v njej."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Preveri aplikacije prek USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Preveri, ali so aplikacije, nameščene prek ADB/ADT, škodljive."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Omogočanje terminalske aplikacije za dostop do lokalne lupine"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Preverjanje HDCP"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Se ne polni"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Poln"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Onemogočil skrbnik"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Začetni zaslon"</string> </resources> diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml index f5f3cf2c2031..fd961404fdc8 100644 --- a/packages/SettingsLib/res/values-sq-rAL/strings.xml +++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Lejo gjithmonë skanimet për Wi-Fi edhe kur je në lëvizje"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Përdor klientin DHCP të versionit paraprak"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Të dhënat celulare gjithmonë aktive"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Shfaq opsionet për certifikimin e ekranit valor"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Rrit nivelin regjistrues të Wi‑Fi duke shfaqur SSID RSSI-në te Zgjedhësi i Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kur ky funksion aktivizohet, Wi‑Fi bëhet më agresiv në kalimin e lidhjes së të dhënave te rrjeti celular, në rastet kur sinjali Wi‑Fi është i dobët"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Këto cilësime janë të projektuara vetëm për përdorim në programim. Ato mund të shkaktojnë që pajisja dhe aplikacionet në të, të mos punojnë ose të veprojnë në mënyrë të gabuar."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifiko apl. përmes USB-së"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrollo aplikacionet e instaluara nëpërmjet ADB/ADT për sjellje të dëmshme."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Terminali lokal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Aktivizo aplikacionin terminal që ofron qasje në guaskën lokale"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Kontrolli HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Ndriço ekranin kur aplikacionet kryejnë operacione të gjata teksa bashkëveprojnë"</string> <string name="pointer_location" msgid="6084434787496938001">"Vendndodhja e treguesit"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Mbivendosja e ekranit tregon të dhënat e prekjes"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Shfaq trokitjet"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Shfaq reagimet vizuale për trokitjet"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Shfaq përditësimet e sipërfaqes"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Ndriço të gjitha sipërfaqet e dritares kur ato të përditësohen"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Shfaq përditësimet e pamjes së GPU-së"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Aktivizon mbështetjen për dritaret eksperimentale me formë të lirë."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Fjalëkalimi rezervë i kompjuterit"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Rezervimet e plota në kompjuter nuk janë të mbrojtura aktualisht"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Trokit për të ndryshuar ose hequr fjalëkalimin për rezervime të plota të desktopit"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Fjalëkalimi i ri u vendos"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Fjalëkalimi i ri dhe konfirmimi nuk përputhen"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Vendosja e fjalëkalimit dështoi"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Ngjyra të optimizuara për përmbajtjet dixhitale"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Aplikacionet joaktive"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Joaktiv. Trokit për ta ndryshuar."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Trokit për ta ndryshuar."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Shërbimet në ekzekutim"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Shiko dhe kontrollo shërbimet që po ekzekutohen aktualisht"</string> <string name="night_mode_title" msgid="2594133148531256513">"Modaliteti i natës"</string> @@ -314,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Nuk po ngarkohet"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"E mbushur"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Çaktivizuar nga administratori"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Kreu"</string> </resources> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index e7b66f4ff41a..355079f197c8 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Увек дозволи скенирање Wi‑Fi-ја у ромингу"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Користи застарели DHCP клијент"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Подаци за мобилне уређаје су увек активни"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Приказ опција за сертификацију бежичног екрана"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Повећава ниво евидентирања за Wi‑Fi. Приказ по SSID RSSI-у у бирачу Wi‑Fi мреже"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Када се омогући, Wi‑Fi ће бити агресивнији при пребацивању мреже за пренос података на Мобилну, када је Wi‑Fi сигнал слаб"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ова подешавања су намењена само за програмирање. Могу да изазову престанак функционисања или неочекивано понашање уређаја и апликација на њему."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Верификуј апликације преко USB-а"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Проверава да ли су апликације инсталиране преко ADB-а/ADT-а штетне."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Локални терминал"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Омогући аплик. терминала за приступ локалном командном окружењу"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP провера"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Нека екран трепери када апликације обављају дуге операције на главној нити"</string> <string name="pointer_location" msgid="6084434787496938001">"Локација показивача"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Постав. елемент са тренутним подацима о додиру"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Приказуј додире"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Приказуј визуелне повратне информације за додире"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Прикажи ажурирања површине"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Осветли све површине прозора када се ажурирају"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Прикажи ажур. GPU приказа"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Омогућава подршку за експерименталне прозоре произвољног формата."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Лозинка резервне копије за рачунар"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Резервне копије читавог система тренутно нису заштићене"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Додирните да бисте променили или уклонили лозинку за прављење резервних копија читавог система на рачунару"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Постављена је нова лозинка резервне копије"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Нова лозинка и њена потврда се не подударају"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Постављање лозинке резервне копије није успело"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Боје оптимизоване за дигитални садржај"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Неактивне апликације"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Неактивна. Додирните да бисте је активирали."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Активна. Додирните да бисте је деактивирали."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Покренуте услуге"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Приказ и контрола тренутно покренутих услуга"</string> <string name="night_mode_title" msgid="2594133148531256513">"Ноћни режим"</string> @@ -314,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Не пуни се"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Пуно"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Онемогућио је администратор"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Почетни"</string> </resources> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 35c2e33d40da..563f885867af 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillåt alltid sökning efter Wi-Fi-roaming"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Använd äldre DHCP-klient"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobildata alltid aktiverad"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Visa certifieringsalternativ för Wi-Fi-skärmdelning"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Öka loggningsnivån för Wi-Fi, visa per SSID RSSI i Wi‑Fi Picker"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"När funktionen har aktiverats kommer dataanslutningen lämnas över från Wi-Fi till mobilen på ett aggressivare sätt när Wi-Fi-signalen är svag"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Inställningarna är endast avsedda att användas för utvecklingsändamål. De kan orsaka problem med enheten eller apparna som finns installerade på den."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifiera appar via USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kontrollera om appar som installeras via ADB/ADT kan vara skadliga."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Lokal terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Aktivera en terminalapp som ger åtkomst till hyllor lokalt"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP-kontroll"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index de30b764b3d9..371f25a0f310 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Ruhusu Uchanganuzi wa Matumizi ya Mitandao mingine"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Tumia kiteja cha DHCP kilichopitwa na wakati"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Data ya kifaa cha mkononi inatumika kila wakati"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Onyesha chaguo za cheti cha kuonyesha pasiwaya"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Ongeza hatua ya uwekaji kumbukumbu ya Wi-Fi, onyesha kwa kila SSID RSSI kwenye Kichukuzi cha Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Ikiwashwa, Wifi itakabidhi kwa hima muunganisho wa data kwa mtandao wa Simu za Mkononi, mawimbi ya Wifi yanapokuwa hafifu"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Mipangilio hii imekusudiwa kwa matumizi ya usanidi tu. Inaweza kusababisha kifaa chako na programu zilizoko kuvunjika au kutofanya kazi vizuri."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Thibitisha programu kupitia USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kagua programu zilizosakinishwa kupitia ADB/ADT kwa tabia ya kudhuru."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Kituo cha karibu"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Washa programu ya mwisho inayotoa ufikiaji mkuu wa karibu"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Inakagua HDCP"</string> diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index af2d9c3a3405..8945d28b6c7b 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"எப்போதும் வைஃபை ரோமிங் ஸ்கேன்களை அனுமதி"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"அதிகாரப்பூர்வ DHCP க்ளையன்ட்டைப் பயன்படுத்து"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"செல்லுலார் தரவு எப்போதும் இயக்கத்தில்"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டு"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wifi நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"இயக்கப்பட்டதும், வைஃபை சிக்னல் குறையும் போது, வைஃபை முழுமையாக ஒத்துழைக்காமல் இருப்பதால் செல்லுலாரின் தரவு இணைப்புக்கு மாறும்"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"இந்த அமைப்பு மேம்பட்டப் பயன்பாட்டிற்காக மட்டுமே. உங்கள் சாதனம் மற்றும் அதில் உள்ள பயன்பாடுகளைச் சிதைக்கும் அல்லது தவறாகச் செயல்படும் வகையில் பாதிப்பை ஏற்படுத்தும்."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB பயன்பாடுகளை சரிபார்"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"தீங்கு விளைவிக்கும் செயல்பாட்டை அறிய ADB/ADT மூலம் நிறுவப்பட்டப் பயன்பாடுகளைச் சரிபார்."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"அக முனையம்"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"அக ஷெல் அணுகலை வழங்கும் இறுதிப் பயன்பாட்டை இயக்கு"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP சரிபார்ப்பு"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"முக்கிய தொடரிழையில் நீண்ட நேரம் செயல்படும்போது திரையைக் காட்சிப்படுத்து"</string> <string name="pointer_location" msgid="6084434787496938001">"குறிப்பான் இடம்"</string> <string name="pointer_location_summary" msgid="840819275172753713">"திரையின் மேல் அடுக்கானது தற்போது தொடப்பட்டிருக்கும் தரவைக் காண்பிக்கிறது"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"தட்டல்களைக் காட்டு"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"தட்டல்கள் குறித்த காட்சி வடிவக் கருத்தைக் காட்டு"</string> <string name="show_screen_updates" msgid="5470814345876056420">"மேலோட்ட புதுப்பிப்புகளைக் காட்டு"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"சாளரத்தின் பரப்புநிலைகள் புதுப்பிக்கப்படும்போது, அவற்றை முழுவதுமாகக் காட்டு"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU காட்சி புதுப்பிப்புகளைக் காட்டு"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"பரிசோதனைக்குரிய குறிப்பிட்ட வடிவமில்லாத சாளரங்களுக்கான ஆதரவை இயக்கும்."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"டெஸ்க்டாப் காப்புப்பிரதி கடவுச்சொல்"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"டெஸ்க்டாப்பின் முழு காப்புப்பிரதிகள் தற்போது பாதுகாக்கப்படவில்லை"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"டெஸ்க்டாப்பின் முழுக் காப்புப் பிரதிகளுக்கான கடவுச்சொல்லை மாற்ற அல்லது அகற்ற, தட்டவும்"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"புதிய காப்புப் பிரதியின் கடவுச்சொல் அமைக்கப்பட்டது"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"புதிய கடவுச்சொல்லும், உறுதிப்படுத்தலுக்கான கடவுச்சொல்லும் பொருந்தவில்லை"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"காப்புப் பிரதி கடவுச்சொல்லை அமைப்பதில் தோல்வி"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"டிஜிட்டல் உள்ளடக்கத்திற்கு ஏற்ப மேம்படுத்தப்பட்ட வண்ணங்கள்"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"செயலில் இல்லாத பயன்பாடுகள்"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"செயலில் இல்லை. மாற்ற, தட்டவும்."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"செயலில் உள்ளது. மாற்ற, தட்டவும்."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"இயங்கும் சேவைகள்"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"தற்போது இயக்கத்தில் இருக்கும் சேவைகளைப் பார்த்து கட்டுப்படுத்து"</string> <string name="night_mode_title" msgid="2594133148531256513">"இரவு பயன்முறை"</string> diff --git a/packages/SettingsLib/res/values-te-rIN/strings.xml b/packages/SettingsLib/res/values-te-rIN/strings.xml index e7de5b5f7e6a..cd7ee44cf662 100644 --- a/packages/SettingsLib/res/values-te-rIN/strings.xml +++ b/packages/SettingsLib/res/values-te-rIN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi‑Fi సంచార స్కాన్లను ఎల్లప్పుడూ అనుమతించు"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"లెగసీ DHCP క్లయింట్ను ఉపయోగించు"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"ఎల్లప్పుడూ సెల్యులార్ డేటాను సక్రియంగా ఉంచు"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"వైర్లెస్ ప్రదర్శన ప్రమాణపత్రం కోసం ఎంపికలను చూపు"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"ప్రారంభించబడినప్పుడు, Wi‑Fi సిగ్నల్ బలహీనంగా ఉంటే డేటా కనెక్షన్ను సెల్యులార్కి మార్చేలా Wi‑Fiపై మరింత తీవ్ర ఒత్తిడి కలుగుతుంది"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"ఈ సెట్టింగ్లు అభివృద్ధి వినియోగం కోసం మాత్రమే ఉద్దేశించబడినవి. వీటి వలన మీ పరికరం మరియు దీనిలోని అనువర్తనాలు విచ్ఛిన్నం కావచ్చు లేదా తప్పుగా ప్రవర్తించవచ్చు."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ద్వారా అనువర్తనాలను ధృవీకరించు"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"హానికరమైన ప్రవర్తన కోసం ADB/ADT ద్వారా ఇన్స్టాల్ చేయబడిన అనువర్తనాలను తనిఖీ చేయి."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"స్థానిక టెర్మినల్"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"స్థానిక షెల్ ప్రాప్యతను అందించే టెర్మినల్ అనువర్తనాన్ని ప్రారంభించు"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP తనిఖీ"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ఛార్జ్ కావడం లేదు"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"నిండింది"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"నిర్వాహకుడు నిలిపివేసారు"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"హోమ్"</string> </resources> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 0e7ab5eaf86e..2cace1330a32 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ใช้การสแกน Wi-Fi ข้ามเครือข่ายเสมอ"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"ใช้ไคลเอ็นต์ DHCP เดิม"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"เปิดใช้ข้อมูลมือถือเสมอ"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"แสดงตัวเลือกสำหรับการรับรองการแสดงผล แบบไร้สาย"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"เมื่อเปิดใช้แล้ว Wi-Fi จะส่งผ่านการเชื่อมต่อข้อมูลไปยังเครือข่ายมือถือในทันทีที่พบสัญญาณ Wi-Fi อ่อน"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"การตั้งค่านี้มีไว้เพื่อการพัฒนาเท่านั้น จึงอาจทำให้อุปกรณ์และแอปพลิเคชันที่มีอยู่เสียหายหรือทำงานผิดพลาดได้"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"ยืนยันแอปพลิเคชันผ่าน USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ตรวจสอบแอปพลิเคชันที่ติดตั้งผ่าน ADB/ADT เพื่อตรวจดูพฤติกรรมที่เป็นอันตราย"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"เทอร์มินัลในตัวเครื่อง"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"เปิดใช้งานแอปเทอร์มินัลที่ให้การเข้าถึงเชลล์ในตัวเครื่อง"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"การตรวจสอบ HDCP"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ไม่ได้ชาร์จ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"เต็ม"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"ปิดใช้โดยผู้ดูแลระบบ"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"หน้าแรก"</string> </resources> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 77da07bc1a77..e1e94120ac56 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Palaging payagan ang Mga Pag-scan sa Roaming ng Wi‑Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Gumamit ng legacy na DHCP client"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Palaging aktibo ang cellular data"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ipakita ang mga opsyon para sa certification ng wireless display"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Pataasin ang antas ng Wi‑Fi logging, ipakita sa bawat SSID RSSI sa Wi‑Fi Picker"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Kapag naka-enable, mas magiging agresibo ang Wi‑Fi sa paglipat ng koneksyon ng data sa Cellular, kapag mahina ang signal ng Wi‑Fi"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Nilalayon ang mga setting na ito para sa paggamit sa pag-develop lamang. Maaaring magsanhi ang mga ito ng pagkasira o hindi paggana nang maayos ng iyong device at mga application na nandito."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"I-verify ang mga app sa USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Tingnan kung may nakakahamak na pagkilos sa apps na na-install sa pamamagitan ng ADB/ADT."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Lokal na terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Paganahin ang terminal app na nag-aalok ng lokal na shell access"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Pagsusuring HDCP"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Hindi nagkakarga"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puno"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Na-disable ng administrator"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Home"</string> </resources> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 9780953a7c37..e8391a00d4f5 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Kablosuz Dolaşım Taramalarına daima izin ver"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Eski DHCP istemcisini kullan"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Hücresel veri her zaman etkin"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Kablosuz ekran sertifikası seçeneklerini göster"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Kablosuz günlük kaydı seviyesini artır. Kablosuz Seçici\'de her bir SSID RSSI için göster."</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Etkinleştirildiğinde, Kablosuz ağ sinyali zayıfken veri bağlantısının Hücresel ağa geçirilmesinde daha agresif olunur"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Bu ayarlar yalnızca geliştirme amaçlıdır. Cihazınızın veya cihazdaki uygulamaların bozulmasına veya hatalı çalışmasına neden olabilir."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB\'den yüklenen uygulamaları doğrula"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT üzerinden yüklenen uygulamaları zararlı davranışlara karşı denetle."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Yerel terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Yerel kabuk erişimi sunan terminal uygulamasını etkinleştir"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP denetimi"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Uyg. ana işlem parçasında uzun işlem yap. ekr. yakıp söndür"</string> <string name="pointer_location" msgid="6084434787496938001">"İşaretçi konumu"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Mevcut dokunmatik verilerini gösteren yer paylaşımı"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Hafifçe dokunmayı göster"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Hafifçe dokunmalarda görsel geri bildirim göster"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Yüzey güncellemelerini göster"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Güncelleme sırasında tüm pencere yüzeylerini çiz"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU görünüm güncellemelerini göster"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Deneysel serbest biçimli pencereleri etkinleştirir."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Masaüstü yedekleme şifresi"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Masaüstü tam yedeklemeleri şu an korunmuyor"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Masaüstü tam yedeklemelerinin şifresini değiştirmek veya kaldırmak için hafifçe dokunun"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Yeni yedekleme şifresi ayarlandı"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Yeni şifre ve onayı eşleşmiyor."</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Yedekleme şifresi ayarlanamadı"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Dijital içerik için optimize edilmiş renkler"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Devre dışı uygulamalar"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Etkin değil. Geçiş yapmak için hafifçe dokunun."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Etkin. Geçiş yapmak için hafifçe dokunun."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Çalışan hizmetler"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Şu anda çalışan hizmetleri görüntüle ve denetle"</string> <string name="night_mode_title" msgid="2594133148531256513">"Gece modu"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 15419bd42fce..dd13a343b987 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Завжди шукати мережі Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Використовувати старий клієнт DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Не вимикати передавання даних"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показати параметри сертифікації бездротового екрана"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Показувати в журналі RSSI для кожного SSID під час вибору Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Примусово перемикатися на мобільну мережу, коли сигнал Wi-Fi слабкий"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ці налаштування застосовуються лише з метою розробки. Вони можуть спричиняти вихід з ладу або неправильне функціонування вашого пристрою чи програм у ньому."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Встановлення через USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Перевіряти безпеку додатків, установлених через ADB/ADT."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Локальний термінал"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Увімк. програму-термінал, що надає локальний доступ до оболонки"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Перевірка HDCP"</string> diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml index e2eac3f8d4cc..2ffee944780f 100644 --- a/packages/SettingsLib/res/values-ur-rPK/strings.xml +++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"ہمیشہ Wi‑Fi روم اسکینز کی اجازت دیں"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"پرانا DHCP کلائنٹ استعمال کریں"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"سیلولر ڈیٹا کو ہمیشہ فعال رکھیں"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"وائرلیس ڈسپلے سرٹیفیکیشن کیلئے اختیارات دکھائیں"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi لاگنگ لیول میں اضافہ کریں، Wi‑Fi منتخب کنندہ میں فی SSID RSSI دکھائیں"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"فعال ہونے پر، جب Wi‑Fi سگنل کمزور ہوگا تو Wi‑Fi سیلولر پر ڈیٹا کنکشن بھیجنے کیلئے مزید جارحانہ کاروائی کرے گا۔"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"یہ ترتیبات صرف ڈویلپمنٹ استعمال کے ارادے سے ہیں۔ ان سے آپ کا آلہ اور اس پر موجود ایپلیکیشنز بریک ہو سکتی یا غلط برتاؤ کر سکتی ہیں۔"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB پر ایپس کی توثیق کریں"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"نقصان دہ رویے کے مدنظر ADB/ADT کی معرفت انسٹال شدہ ایپس کی جانچ کریں۔"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"مقامی ٹرمینل"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"مقامی شیل رسائی پیش کرنے والی ٹرمینل ایپ فعال کریں"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP چیکنگ"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"ایپس کے اصل تھریڈ پر طویل اعمال انجام دیتے وقت اسکرین کو فلیش کریں"</string> <string name="pointer_location" msgid="6084434787496938001">"پوائنٹر مقام"</string> <string name="pointer_location_summary" msgid="840819275172753713">"موجودہ ٹچ ڈیٹا دکھانے والا اسکرین اوور لے"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"تھپتھپاہٹیں دکھائیں"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"تھپتھپاہٹوں کیلئے بصری تاثرات دکھائیں"</string> <string name="show_screen_updates" msgid="5470814345876056420">"سطح کے اپ ڈیٹس دکھائیں"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"اپ ڈیٹ ہونے پر ونڈو کی پوری سطحیں جھلملائیں"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU منظر اپ ڈیٹس دکھائیں"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"تجرباتی freeform ونڈوز کے لئے سپورٹ فعال کرتا ہے۔"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"ڈیسک ٹاپ کا بیک اپ پاس ورڈ"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ڈیسک ٹاپ کے مکمل بیک اپس فی الحال محفوظ کیے ہوئے نہیں ہیں"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"ڈیسک ٹاپ کے مکمل بیک اپس کیلئے پاس ورڈ کو تبدیل کرنے یا ہٹانے کیلئے تھپتھپائیں"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"بیک اپ کا نیا پاس ورڈ سیٹ کر دیا گیا"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"نیا پاس ورڈ اور تصدیق مماثل نہیں ہے"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"بیک اپ پاس ورڈ ترتیب دینے میں ناکامی"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"ڈیجیٹیل مواد کیلئے بہترین کردہ رنگ"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"غیر فعال ایپس"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"غیر فعال۔ ٹوگل کرنے کیلئے تھپتھپائیں۔"</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"فعال۔ ٹوگل کرنے کیلئے تھپتھپائیں۔"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"چل رہی سروسز"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"فی الحال چل رہی سروسز دیکھیں اور انہیں کنٹرول کریں"</string> <string name="night_mode_title" msgid="2594133148531256513">"رات موڈ"</string> diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml index 12d0e8c659bc..c06d155e45e9 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi tarmoqlarini qidirishga doim ruxsat"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Eski DHCP mijoz-dasturidan foydalanish"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Mobil internet o‘chirilmasin"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Simsiz monitorlarni sertifikatlash parametrini ko‘rsatish"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi ulanishini tanlashda har bir SSID uchun jurnalda ko‘rsatilsin"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Agar ushbu funksiya yoqilsa, Wi-Fi signali past bo‘lganda internetga ulanish majburiy ravishda mobil internetga o‘tkaziladi."</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Bu sozlamalar faqat dasturlash maqsadlariga mo‘ljallangan. Shuning uchun, ular qurilmangizga va undagi ilovalariga shikast yetkazib, noto‘g‘ri ishlashiga sabab bo‘lishi mumkin."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB orqali o‘rnatish"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT orqali o‘rnatilgan ilovalar xavfsizligini tekshiring"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Mahalliy terminal"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Mahalliy terminalga kirishga ruxsat beruvchi terminal ilovani faollashtirish"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP tekshiruvi"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Uzun amallar vaqtida ekranni miltillatish"</string> <string name="pointer_location" msgid="6084434787496938001">"Kursor joylashuvi"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Ekranda bosilgan va tegilgan joylarni vizuallashtirish"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Bosishlarni ko‘rsatish"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Ekranda bosilgan joylardagi nuqtalarni ko‘rsatish"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Yuza yangilanishlarini ko‘rsatish"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Yangilangandan so‘ng to‘liq oyna sirtlarini miltillatish"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Ekran yangilanishlarini ko‘rsatish"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Tajribaviy erkin shakldagi oynalar ta’minotini yoqadi"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Zaxira nusxa uchun parol"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Kompyuterdagi zaxira nusxalar hozirgi vaqtda himoyalanmagan"</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Ish stoli to‘liq zaxira nusxalari parolini o‘zgartirish yoki o‘chirish uchun bu yerni bosing"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Yangi zaxira paroli o‘rnatildi"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Parollar bir-biriga mos kelmadi"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Zaxira parolini o‘rnatib bo‘lmadi"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Raqamli kontentga moslashtirilgan ranglar"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Nofaol ilovalar"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Nofaol. O‘zgartirish uchun bu yerga bosing."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Faol. O‘zgartirish uchun bu yerga bosing."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Ishlab turgan ilovalar"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Ishlab turgan ilovalarni ko‘rish va boshqarish"</string> <string name="night_mode_title" msgid="2594133148531256513">"Tungi rejim"</string> @@ -310,7 +309,7 @@ <string name="battery_info_status_charging_ac" msgid="2909861890674399949">"Quvvat olmoqda (AC)"</string> <string name="battery_info_status_charging_usb" msgid="2207489369680923929">"Quvvat olmoqda (USB)"</string> <string name="battery_info_status_charging_wireless" msgid="3574032603735446573">"Simsiz quvvat olmoqda"</string> - <string name="battery_info_status_discharging" msgid="310932812698268588">"Quvvatlantirilmayapti"</string> + <string name="battery_info_status_discharging" msgid="310932812698268588">"Quvvat olmayapti"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Quvvatlanmayapti"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"To‘la"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Administrator tomonidan o‘chirib qo‘yilgan"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index a1499691c7c5..d60427752ec9 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Luôn cho phép quét chuyển vùng Wi‑Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Sử dụng ứng dụng DHCP cũ"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Dữ liệu di động luôn hoạt động"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Hiển thị tùy chọn chứng nhận hiển thị không dây"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tăng mức ghi nhật ký Wi‑Fi, hiển thị mỗi SSID RSSI trong bộ chọn Wi‑Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Khi được bật, Wi‑Fi sẽ tích cực hơn trong việc chuyển vùng kết nối dữ liệu sang mạng di động khi tín hiệu Wi‑Fi yếu"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Những cài đặt này chỉ dành cho mục đích phát triển. Chúng có thể làm cho thiết bị và ứng dụng trên thiết bị của bạn bị lỗi và hoạt động sai."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Xác minh ứng dụng qua USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Kiểm tra các ứng dụng được cài đặt qua ADB/ADT để xem có hoạt động gây hại hay không."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Dòng lệnh cục bộ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Bật ứng dụng dòng lệnh cung cấp quyền truy cập vỏ cục bộ"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Kiểm tra HDCP"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Hiện không sạc"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Đầy"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Bị tắt bởi quản trị viên"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Màn hình chính"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 27e89720806a..568a616858fa 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"一律允许WLAN漫游扫描"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"使用旧版 DHCP 客户端"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"始终开启移动数据网络"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"显示无线显示认证选项"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"提升WLAN日志记录级别(在WLAN选择器中显示每个SSID的RSSI)"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"开启此设置后,系统会在WLAN信号较弱时,主动将网络模式从WLAN网络切换到移动数据网络"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"这些设置仅适用于开发工作。一旦启用,会导致您的设备以及设备上的应用崩溃或出现异常。"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"通过USB验证应用"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"通过 ADB/ADT 检查安装的应用是否存在有害行为。"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"本地终端"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"启用终端应用,以便在本地访问 Shell"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP 检查"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index af1223c549f6..3cf288aabef1 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"永遠允許 Wi-Fi 漫遊掃瞄"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"使用舊的 DHCP 用戶端"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"經常啟用流動數據"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"顯示無線螢幕分享認證的選項"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"啟用時,Wi-Fi 連線會在訊號不穩的情況下更積極轉換成流動數據連線"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"這些設定僅供開發用途,可能會導致您的裝置及應用程式損毀或運作不正常。"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"透過 USB 驗證應用程式"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"透過 ADB/ADT 檢查安裝的應用程式有否有害的行為。"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"本機終端機"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"啟用可提供本機命令介面存取權的終端機應用程式"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP 檢查"</string> @@ -206,8 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"當應用程式在主執行緒中進行長時間作業時,讓螢幕閃爍"</string> <string name="pointer_location" msgid="6084434787496938001">"指標位置"</string> <string name="pointer_location_summary" msgid="840819275172753713">"在螢幕上重疊顯示目前的觸控資料"</string> - <string name="show_touches" msgid="2642976305235070316">"顯示觸控回應"</string> - <string name="show_touches_summary" msgid="6101183132903926324">"顯示觸控位置的視覺回應"</string> + <string name="show_touches" msgid="2642976305235070316">"顯示輕按回應"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"顯示輕按位置的視覺回應"</string> <string name="show_screen_updates" msgid="5470814345876056420">"顯示表層更新"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"更新表層時閃動整個視窗表層"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"顯示 GPU 畫面更新"</string> @@ -251,7 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"啟用實驗版自由形態視窗的支援功能。"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"桌面電腦備份密碼"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"桌上電腦的完整備份目前未受保護"</string> - <string name="local_backup_password_summary_change" msgid="5376206246809190364">"輕按即可變更或移除電腦完整備份的密碼"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"輕按即可變更或移除桌上電腦完整備份的密碼"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"已設定新備份密碼"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"新密碼與確認密碼不符"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"無法設定備份密碼"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"未開始充電"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"電量已滿"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"管理員已停用此設定"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"主畫面"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index f268ff94e365..443e427048f2 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"一律允許 Wi-Fi 漫遊掃描"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"使用舊版 DHCP 用戶端"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"行動數據連線一律保持啟用狀態"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"顯示無線螢幕分享認證的選項"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"啟用時,Wi-Fi 連線在訊號不穩的情況下會更積極轉換成行動數據連線"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"這些設定僅供開發之用,可能導致您的裝置及裝置中的應用程式毀損或運作異常。"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"透過 USB 驗證應用程式"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"透過 ADB/ADT 檢查安裝的應用程式是否出現有害的行為。"</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"本機終端機"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"啟用可提供本機命令介面存取權的終端機應用程式"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP 檢查"</string> @@ -309,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"非充電中"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"電力充足"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"已由管理員停用"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"主畫面"</string> </resources> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index f372057a3dda..7944e5697478 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -165,6 +165,8 @@ <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Vumela njalo ukuskena kokuzula kwe-Wi-Fi"</string> <string name="legacy_dhcp_client" msgid="694426978909127287">"Sebenzisa iklayenti le-legacy le-DHCP"</string> <string name="mobile_data_always_on" msgid="7745605759775320362">"Idatha yeselula ihlala isebenza"</string> + <!-- no translation found for bluetooth_disable_absolute_volume (2660673801947898809) --> + <skip /> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Bonisa izinketho zokunikeza isitifiketi ukubukeka okungenantambo"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"khuphula izinga lokungena le-Wi-Fi, bonisa nge-SSID RSSI engayodwana kusikhethi se-Wi-Fi"</string> <string name="wifi_aggressive_handover_summary" msgid="6328455667642570371">"Uma inikwe amandla, i-Wi-Fi izoba namandla kakhulu ekunikezeleni ukuxhumeka kwedatha kuselula, uma isiginali ye-Wi-Fi iphansi"</string> @@ -185,6 +187,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"Lezi zilungiselelo zenzelwe ukusetshenziswa ukuthuthukisa kuphela. Zingadala ukuthi idivayisi yakho kanye nensiza ekuyona ukuthi iphuke noma iziphathe kabi."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Qiniseka izinhlelo zokusebenza nge-USB"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Hlola izinhlelo zokusebenza ezifakiwe nge-ADB/ADT ngokuziphatha okuyingozi."</string> + <!-- no translation found for bluetooth_disable_absolute_volume_summary (6031284410786545957) --> + <skip /> <string name="enable_terminal_title" msgid="95572094356054120">"Itheminali yasendaweni"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"Nika amandla uhlelo lokusebenza letheminali olunikeza ukufinyelela kwasendaweni kwe-shell"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"Ihlola i-HDCP"</string> @@ -206,10 +210,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Ukuphazimisa isikrini uma izinhlelo zokusebenza ziyenza umsebenzi ngesikhathi eside kuchungechunge olukhulu"</string> <string name="pointer_location" msgid="6084434787496938001">"Isikhombi sendawo"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Imbondela yesikrini ibonisa idatha yokuthinta yamanje"</string> - <!-- no translation found for show_touches (2642976305235070316) --> - <skip /> - <!-- no translation found for show_touches_summary (6101183132903926324) --> - <skip /> + <string name="show_touches" msgid="2642976305235070316">"Bonisa amathebhu"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Bonisa izmpendulo ebukekayo ngamathebhu"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Buka izibuyekezo ezibonakalayo"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Khanyisa ukubonakala kwalo lonke iwindi uma libuyekezwa"</string> <string name="show_hw_screen_updates" msgid="5036904558145941590">"Buka izibuyekezo ze-GPU"</string> @@ -253,8 +255,7 @@ <string name="enable_freeform_support_summary" msgid="2252563497485436534">"Inika amandla usekelo lwamawindi okuhlola e-freeform."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Iphasiwedi yokusekela ngokulondoloza ye-Desktop"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Ukusekela ngokulondoloza okugcwele kwe-Desktop akuvikelekile okwamanje."</string> - <!-- no translation found for local_backup_password_summary_change (5376206246809190364) --> - <skip /> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Thepha ukushintsha noma ukususa iphasiwedi yokwenziwa kwezipele ngokugcwele kwideskithophu"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Iphasiwedi entsha eyisipele isethiwe"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Iphasiwedi entsha nokuqinisekisa akufani"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Ukungaphumeleli kokusetha iphasiwedi eyisipele"</string> @@ -269,10 +270,8 @@ <item msgid="5363960654009010371">"Imibala elungiselelwe yokuqukethwe kwedijithali"</item> </string-array> <string name="inactive_apps_title" msgid="1317817863508274533">"Izinhlelo zokusebenza ezingasebenzi"</string> - <!-- no translation found for inactive_app_inactive_summary (5091363706699855725) --> - <skip /> - <!-- no translation found for inactive_app_active_summary (4174921824958516106) --> - <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Akusebenzi. Thepha ukuze ushintshe."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Kuyasebenza. Thepha ukuze ushintshe."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Amasevisi asebenzayo"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Buka futhi ulawule amasevisi asebenzayo okwamanje"</string> <string name="night_mode_title" msgid="2594133148531256513">"Imodi yasebusuku"</string> @@ -314,6 +313,5 @@ <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Ayishaji"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Kugcwele"</string> <string name="disabled_by_admin_summary_text" msgid="7787027069207263048">"Ikhutshazwe umlawuli"</string> - <!-- no translation found for home (8263346537524314127) --> - <skip /> + <string name="home" msgid="8263346537524314127">"Ekhaya"</string> </resources> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 32699ebacdc7..6d047d0e51c8 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -416,6 +416,8 @@ <string name="legacy_dhcp_client">Use legacy DHCP client</string> <!-- Setting Checkbox title whether to always keep cellular data active. [CHAR LIMIT=80] --> <string name="mobile_data_always_on">Cellular data always active</string> + <!-- Setting Checkbox title for disabling Bluetooth absolute volume --> + <string name="bluetooth_disable_absolute_volume">Disable absolute volume</string> <!-- setting Checkbox summary whether to show options for wireless display certification --> <string name="wifi_display_certification_summary">Show options for wireless display certification</string> @@ -456,6 +458,8 @@ <string name="verify_apps_over_usb_title">Verify apps over USB</string> <!-- Summary of checkbox setting to perform package verification on apps installed over USB/ADT/ADB [CHAR LIMIT=NONE] --> <string name="verify_apps_over_usb_summary">Check apps installed via ADB/ADT for harmful behavior.</string> + <!-- Summary of checkbox for disabling Bluetooth absolute volume --> + <string name="bluetooth_disable_absolute_volume_summary">Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control.</string> <!-- Title of checkbox setting that enables the terminal app. [CHAR LIMIT=32] --> <string name="enable_terminal_title">Local terminal</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java index f03e94d4b342..231fc695d344 100644 --- a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java +++ b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java @@ -63,14 +63,15 @@ public class RecentLocationApps { (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); List<AppOpsManager.PackageOps> appOps = aoManager.getPackagesForOps(LOCATION_OPS); + final int appOpsCount = appOps != null ? appOps.size() : 0; + // Process the AppOps list and generate a preference list. - ArrayList<Request> requests = new ArrayList<>(appOps.size()); + ArrayList<Request> requests = new ArrayList<>(appOpsCount); final long now = System.currentTimeMillis(); final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); final List<UserHandle> profiles = um.getUserProfiles(); - final int appOpsN = appOps.size(); - for (int i = 0; i < appOpsN; ++i) { + for (int i = 0; i < appOpsCount; ++i) { AppOpsManager.PackageOps ops = appOps.get(i); // Don't show the Android System in the list - it's not actionable for the user. // Also don't show apps belonging to background users except managed users. diff --git a/packages/Shell/res/values-af/strings.xml b/packages/Shell/res/values-af/strings.xml index b9a7c24f0363..c4a889f4ff8c 100644 --- a/packages/Shell/res/values-af/strings.xml +++ b/packages/Shell/res/values-af/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Tuisskerm"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Foutverslag word tans gegenereer"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Foutverslag vasgevang"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Voeg tans besonderhede by die foutverslag"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Wag asseblief …"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Swiep na links om jou foutverslag te deel"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Raak om jou foutverslag te deel"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Foutverslae bevat data van die stelsel se verskillende loglêers af, insluitend persoonlike en private inligting. Deel foutverslae net met programme en mense wat jy vertrou."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Wys hierdie boodskap volgende keer"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Foutverslae"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"naamloos"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Besonderhede"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Skermkiekie"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Skermkiekie suksesvol geneem."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Kon nie skermkiekie neem nie."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Foutverslagbesonderhede"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Lêernaam"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titel"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Gedetailleerde beskrywing"</string> diff --git a/packages/Shell/res/values-am/strings.xml b/packages/Shell/res/values-am/strings.xml index 7c5519ef2403..254522218678 100644 --- a/packages/Shell/res/values-am/strings.xml +++ b/packages/Shell/res/values-am/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"ቀፎ"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"የሳንካ ሪፓርት እየመነጨ ነው"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"የሳንካ ሪፖርት ተይዟል"</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_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="3559904746859400732">"የሳንካ ሪፖርትዎን ለማጋራት ይንክኩ"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"የሳንካ ሪፖርትዎን ለማጋራት መታ ያድርጉ"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"የሳንካ ሪፖርቶች የግል መረጃን ጨምሮ ከበርካታ የስርዓቱ ምዝግብ ማስታወሻዎች የመጣ ውሂብን ይዟል። የሳንካ ሪፖርቶች ለሚያምኗቸው መተግበሪያዎችን እና ሰዎችን ብቻ ያጋሩ።"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ይህን መልዕክት በሚቀጥለው ጊዜ አሳይ"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"የሳንካ ሪፖርቶች"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"ያልተሰየመ"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"ዝርዝሮች"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ቅጽበታዊ ገጽ እይታ"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"ቅጽበታዊ ገጽ እይታ በስኬት ተነስቷል።"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ቅጽበታዊ ገጽ እይታ በተሳካ ሁኔታ ተነስቷል"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ቅጽበታዊ ገጽ እይታ ሊነሳ አይችልም"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"የሳንካ ሪፖርት ዝርዝሮች"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"የሳንካ ሪፖርት <xliff:g id="ID">#%d</xliff:g> ዝርዝሮች"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"የፋይል ስም"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"ርዕስ"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"ዝርዝር መግለጫ"</string> diff --git a/packages/Shell/res/values-ar/strings.xml b/packages/Shell/res/values-ar/strings.xml index b10793199e6c..7593110a0d00 100644 --- a/packages/Shell/res/values-ar/strings.xml +++ b/packages/Shell/res/values-ar/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"جارٍ إنشاء تقرير الخطأ"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"تم الحصول على تقرير الأخطاء"</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_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="3559904746859400732">"المس لمشاركة تقرير الأخطاء"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"انقر لمشاركة تقرير الخطأ."</string> <string name="bugreport_confirm" msgid="5130698467795669780">"تحتوي تقارير الأخطاء على بيانات من ملفات سجلات النظام المتنوعة، بما في ذلك معلومات شخصية وخاصة. لا تشارك تقارير الأخطاء إلا مع التطبيقات والأشخاص الموثوق بهم."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"إظهار هذه الرسالة في المرة القادمة"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"تقارير الأخطاء"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"بدون اسم"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"التفاصيل"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"لقطة شاشة"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"تم التقاط لقطة الشاشة بنجاح."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"تم تسجيل لقطة الشاشة بنجاح."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"تعذر التقاط لقطة الشاشة."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"تفاصيل تقرير الخطأ"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"تفاصيل تقرير الخطأ <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"اسم الملف"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"العنوان"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"وصف تفصيلي"</string> diff --git a/packages/Shell/res/values-az-rAZ/strings.xml b/packages/Shell/res/values-az-rAZ/strings.xml index d01ae2af8ed7..beefc5ab0bd2 100644 --- a/packages/Shell/res/values-az-rAZ/strings.xml +++ b/packages/Shell/res/values-az-rAZ/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Bug hesabat yaradıldı"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Baq raport alındı"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Detallar baq hesabatına əlavə olunur"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Lütfən, gözləyin..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Baq raportunu paylaşmaq üçün sola sürüşdürün"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Xətanı şikayətini paylaşmaq üçün toxunun"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Baq raportları sistemin müxtəlif jurnal fayllarından data içərir ki, buna şəxsi və konfidensial məlumatlar da aiddir. Yalnız inandığınız adamlarla baq raportlarını paylaşın."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Bu mesajı növbəti dəfə göstər"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Baq hesabatları"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"adsız"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detallar"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"displey görüntüsü"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Displey görüntüsü uğurla çəkildi."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Displey görüntüsü əlçatan deyil."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Baq hesabat detalları"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Fayl adı"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Başlıq"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Ətraflı təsvir"</string> diff --git a/packages/Shell/res/values-b+sr+Latn/strings.xml b/packages/Shell/res/values-b+sr+Latn/strings.xml index f39dbcb37a4e..597e5457ce6c 100644 --- a/packages/Shell/res/values-b+sr+Latn/strings.xml +++ b/packages/Shell/res/values-b+sr+Latn/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Izveštaj o grešci se generiše"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Izveštaj o grešci je snimljen"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Izveštaj o grešci <xliff:g id="ID">#%d</xliff:g> se generiše"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Izveštaj o grešci <xliff:g id="ID">#%d</xliff:g> je snimljen"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Dodaju se detalji u izveštaj o grešci"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Sačekajte..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Prevucite ulevo da biste delili izveštaj o greškama"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Dodirnite da biste delili izveštaj o grešci"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Dodirnite da biste delili izveštaj o grešci"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Izveštaji o greškama sadrže podatke iz različitih sistemskih datoteka evidencije, uključujući lične i privatne podatke. Delite izveštaje o greškama samo sa aplikacijama i ljudima u koje imate poverenja."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Prikaži ovu poruku sledeći put"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Izveštaji o greškama"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"neimenovano"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalji"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Snimci ekrana"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Snimanje ekrana je uspelo."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Snimak ekrana je napravljen."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Snimanje ekrana nije uspelo."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalji izveštaja o grešci"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detalji izveštaja o grešci <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Naziv datoteke"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Naslov"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljni opis"</string> diff --git a/packages/Shell/res/values-bg/strings.xml b/packages/Shell/res/values-bg/strings.xml index 068bcd35492d..ced2fcc26d8e 100644 --- a/packages/Shell/res/values-bg/strings.xml +++ b/packages/Shell/res/values-bg/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Команден ред"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Сигналът за програмна грешка се генерира"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Отчетът за програмни грешки е записан"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"Докоснете, за да споделите отчета си за програмни грешки"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Отчетите за програмни грешки съдържат данни от различни регистрационни файлове на системата, включително лична и поверителна информация. Споделяйте ги само с приложения и хора, на които имате доверие."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Това съобщение да се показва следващия път"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Отчети за прогр. грешки"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"без име"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Подробности"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Екранна снимка"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Екранната снимка бе направена успешно."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Екранната снимка не можа да бъде направена."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Подробности за сигнала за програмна грешка"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Име на файла"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Заглавие"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Подробно описание"</string> diff --git a/packages/Shell/res/values-bn-rBD/strings.xml b/packages/Shell/res/values-bn-rBD/strings.xml index a97358624fc2..bbc9cb52c674 100644 --- a/packages/Shell/res/values-bn-rBD/strings.xml +++ b/packages/Shell/res/values-bn-rBD/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"শেল"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"ত্রুটির প্রতিবেদন তৈরি করা হচ্ছে"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"ত্রুটির প্রতিবেদন নেওয়া হয়েছে"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"আপনার ত্রুটির প্রতিবেদন শেয়ার করতে স্পর্শ করুন"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"ত্রুটির প্রতিবেদনগুলিতে থাকা ডেটা, সিস্টেমের বিভিন্ন লগ ফাইলগুলি থেকে আসে, যাতে ব্যক্তিগত এবং গোপনীয় তথ্য অন্তর্ভুক্ত থাকে৷ আপনি বিশ্বাস করেন শুধুমাত্র এমন অ্যাপ্লিকেশান এবং ব্যক্তিদের সাথে ত্রুটির প্রতিবেদনগুলি ভাগ করুন৷"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"এই বার্তাটি পরের বার দেখান"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"ত্রুটির প্রতিবেদনগুলি"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"নামবিহীন"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"বিশদ বিবরণ"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"স্ক্রীনশট"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"স্ক্রীনশট সফলভাবে নেওয়া হয়েছে৷"</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"স্ক্রীনশট নেওয়া যায়নি৷"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"ত্রুটি প্রতিবেদনের বিবরণ"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"ফাইলের নাম"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"শীর্ষক"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"বিস্তারিত বিবরণ"</string> diff --git a/packages/Shell/res/values-bs-rBA/strings.xml b/packages/Shell/res/values-bs-rBA/strings.xml index 55a9341ce9c7..f29661918aa9 100644 --- a/packages/Shell/res/values-bs-rBA/strings.xml +++ b/packages/Shell/res/values-bs-rBA/strings.xml @@ -18,15 +18,15 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for app_label (3701846017049540910) --> <skip /> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> <skip /> - <!-- no translation found for bugreport_finished_title (2293711546892863898) --> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Dodavanje detalja u izvještaj o greškama"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Pričekajte..."</string> <!-- no translation found for bugreport_finished_text (8389172248433597683) --> <skip /> - <!-- no translation found for bugreport_finished_text (3559904746859400732) --> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> <skip /> <!-- no translation found for bugreport_confirm (5130698467795669780) --> <skip /> @@ -42,11 +42,11 @@ <skip /> <!-- no translation found for bugreport_screenshot_action (8677781721940614995) --> <skip /> - <!-- no translation found for bugreport_screenshot_taken (7175343181767429088) --> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> <skip /> <!-- no translation found for bugreport_screenshot_failed (5853049140806834601) --> <skip /> - <!-- no translation found for bugreport_info_dialog_title (3113549839798564645) --> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> <skip /> <!-- no translation found for bugreport_info_name (4414036021935139527) --> <skip /> diff --git a/packages/Shell/res/values-ca/strings.xml b/packages/Shell/res/values-ca/strings.xml index 14c21dac44cd..24bf4a45ad8f 100644 --- a/packages/Shell/res/values-ca/strings.xml +++ b/packages/Shell/res/values-ca/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Protecció"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"S\'està generant l\'informe d\'errors"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"S\'ha registrat l\'informe d\'error"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"S\'estan afegint detalls a l\'informe d\'errors"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Espera…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Llisca cap a l\'esquerra per compartir l\'informe d\'errors."</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toca aquí per compartir el teu informe d\'error."</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Els informes d\'error contenen dades dels diferents fitxers de registre del sistema, inclosa informació privada i personal. Comparteix els informes d\'error només amb les aplicacions i amb les persones en qui confies."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostra aquest missatge la propera vegada"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes d\'error"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sense nom"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalls"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Captura de pantalla"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"La captura de pantalla s\'ha fet correctament."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"No s\'ha pogut fer la captura de pantalla."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalls de l\'informe d\'errors"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nom del fitxer"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Títol"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descripció detallada"</string> diff --git a/packages/Shell/res/values-cs/strings.xml b/packages/Shell/res/values-cs/strings.xml index 19a4453b367e..b96148d97d3d 100644 --- a/packages/Shell/res/values-cs/strings.xml +++ b/packages/Shell/res/values-cs/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Vytváří se zpráva o chybě"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Bylo vytvořeno chybové hlášení"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Přidávání podrobností do zprávy o chybě"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Čekejte prosím…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Chcete-li hlášení chyby sdílet, přejeďte doleva."</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Chybové hlášení můžete sdílet klepnutím."</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Chybová hlášení obsahují data z různých souborů protokolů systému včetně osobních a soukromých informací. Chybová hlášení sdílejte pouze s aplikacemi a uživateli, kterým důvěřujete."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Zobrazit tuto zprávu příště"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Zprávy o chybách"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"bez názvu"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Podrobnosti"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Snímek obrazovky"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Snímek obrazovky byl úspěšně pořízen."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Snímek obrazovky se nepodařilo pořídit."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Podrobnosti zprávy o chybě"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Název souboru"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Název"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Podrobný popis"</string> diff --git a/packages/Shell/res/values-da/strings.xml b/packages/Shell/res/values-da/strings.xml index a03276a9d508..eaf3d9f54a5e 100644 --- a/packages/Shell/res/values-da/strings.xml +++ b/packages/Shell/res/values-da/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Fejlrapport genereres"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Fejlrapporten er registreret"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Tilføjelse af oplysninger til fejlrapporten"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Vent et øjeblik…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Stryg til venstre for at dele din fejlrapport"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Tryk for at dele din fejlrapport"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Fejlrapporter indeholder data fra systemets forskellige logfiler, f.eks. personlige og private oplysninger. Del kun fejlrapporter med apps og personer, du har tillid til."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Vis denne underretning næste gang"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Fejlrapporter"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"ikke navngivet"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Oplysninger"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Skærmbillede"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Der blev taget et skærmbillede."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Der kunne ikke tages et skærmbillede."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Fejlrapportoplysninger"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Filnavn"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titel"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljeret beskrivelse"</string> diff --git a/packages/Shell/res/values-de/strings.xml b/packages/Shell/res/values-de/strings.xml index 4f5e6c5cf5e8..07f889890ba5 100644 --- a/packages/Shell/res/values-de/strings.xml +++ b/packages/Shell/res/values-de/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Fehlerbericht wird generiert"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Fehlerbericht erfasst"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Fehlerbericht <xliff:g id="ID">#%d</xliff:g> wird generiert"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Fehlerbericht <xliff:g id="ID">#%d</xliff:g> erfasst"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Informationen werden zum Fehlerbericht hinzugefügt"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Bitte warten…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Wische nach links, um deinen Fehlerbericht zu teilen."</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Tippen, um Fehlerbericht zu teilen"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Zum Teilen des Fehlerberichts tippen"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Fehlerberichte enthalten Daten aus verschiedenen Protokolldateien des Systems, darunter auch personenbezogene und private Daten. Teile Fehlerberichte nur mit Apps und Personen, denen du vertraust."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Diese Nachricht nächstes Mal zeigen"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Fehlerberichte"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"Unbenannt"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Details"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Screenshot wurde aufgenommen."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Screenshot wurde aufgenommen."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot konnte nicht aufgenommen werden."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Details des Fehlerberichts"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Details zum Fehlerbericht <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Dateiname"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titel"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detaillierte Beschreibung"</string> diff --git a/packages/Shell/res/values-el/strings.xml b/packages/Shell/res/values-el/strings.xml index 71debd7e52cb..674697685dd5 100644 --- a/packages/Shell/res/values-el/strings.xml +++ b/packages/Shell/res/values-el/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Κέλυφος"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Δημιουργείται αναφορά σφάλματος"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Η λήψη της αναφοράς ήταν επιτυχής"</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_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="3559904746859400732">"Αγγίξτε για να μοιραστείτε τη αναφορά σφαλμάτων"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Πατήστε για κοινή χρήση της αναφοράς σφάλματος"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Οι αναφορές σφαλμάτων περιέχουν δεδομένα από τα διάφορα αρχεία καταγραφής του συστήματος, συμπεριλαμβανομένων προσωπικών και ιδιωτικών πληροφοριών. Να μοιράζεστε αναφορές σφαλμάτων μόνο με εφαρμογές και άτομα που εμπιστεύεστε."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Εμφάνιση αυτού του μηνύματος την επόμενη φορά"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Αναφορές σφαλμάτων"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"ανώνυμη"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Λεπτομέρειες"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Στιγμιότυπο οθόνης"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Η λήψη του στιγμιότυπου οθόνης ολοκληρώθηκε με επιτυχία."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Η λήψη του στιγμιότυπου οθόνης ολοκληρώθηκε με επιτυχία."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Δεν ήταν δυνατή η λήψη του στιγμιότυπου οθόνης."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Λεπτομέρειες αναφοράς σφαλμάτων"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Λεπτομέρειες της αναφοράς σφάλματος <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Όνομα αρχείου"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Τίτλος"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Αναλυτική περιγραφή"</string> diff --git a/packages/Shell/res/values-en-rAU/strings.xml b/packages/Shell/res/values-en-rAU/strings.xml index a1bd9799df8b..77ff0212c43d 100644 --- a/packages/Shell/res/values-en-rAU/strings.xml +++ b/packages/Shell/res/values-en-rAU/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Bug report is being generated"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Bug report captured"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Adding details to the bug report"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Please wait…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Swipe left to share your bug report"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Touch to share your bug report"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Bug reports contain data from the system\'s various log files, including personal and private information. Only share bug reports with apps and people that you trust."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Show this message next time"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Bug reports"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"unnamed"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Details"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Screenshot taken successfully."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot could not be taken."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Bug report details"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Title"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detailed description"</string> diff --git a/packages/Shell/res/values-en-rGB/strings.xml b/packages/Shell/res/values-en-rGB/strings.xml index a1bd9799df8b..77ff0212c43d 100644 --- a/packages/Shell/res/values-en-rGB/strings.xml +++ b/packages/Shell/res/values-en-rGB/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Bug report is being generated"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Bug report captured"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Adding details to the bug report"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Please wait…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Swipe left to share your bug report"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Touch to share your bug report"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Bug reports contain data from the system\'s various log files, including personal and private information. Only share bug reports with apps and people that you trust."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Show this message next time"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Bug reports"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"unnamed"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Details"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Screenshot taken successfully."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot could not be taken."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Bug report details"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Title"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detailed description"</string> diff --git a/packages/Shell/res/values-en-rIN/strings.xml b/packages/Shell/res/values-en-rIN/strings.xml index a1bd9799df8b..77ff0212c43d 100644 --- a/packages/Shell/res/values-en-rIN/strings.xml +++ b/packages/Shell/res/values-en-rIN/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Bug report is being generated"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Bug report captured"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Adding details to the bug report"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Please wait…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Swipe left to share your bug report"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Touch to share your bug report"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Bug reports contain data from the system\'s various log files, including personal and private information. Only share bug reports with apps and people that you trust."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Show this message next time"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Bug reports"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"unnamed"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Details"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Screenshot taken successfully."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot could not be taken."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Bug report details"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Title"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detailed description"</string> diff --git a/packages/Shell/res/values-es-rUS/strings.xml b/packages/Shell/res/values-es-rUS/strings.xml index f86fea0741d2..cd4166520ce1 100644 --- a/packages/Shell/res/values-es-rUS/strings.xml +++ b/packages/Shell/res/values-es-rUS/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"El informe de errores se está generando"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Informe de errores capturado"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Agregando 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 errores."</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toca para compartir tu informe de errores."</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Los informes de errores contienen datos de los distintos archivos de registro del sistema, incluida la información personal y privada. Comparte los informes de errores únicamente con aplicaciones y personas en las 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 errores"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sin nombre"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalles"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Captura de pantalla"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Se tomó la captura de pantalla correctamente."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"No se pudo tomar la captura de pantalla."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalles del informe de errores"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nombre del archivo"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descripción completa"</string> diff --git a/packages/Shell/res/values-es/strings.xml b/packages/Shell/res/values-es/strings.xml index 8f6cdebbd1ed..efb8927ca332 100644 --- a/packages/Shell/res/values-es/strings.xml +++ b/packages/Shell/res/values-es/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Se está generando el informe de errores"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Informe de error registrado"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"Toca para compartir tu informe de error"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <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> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sin nombre"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalles"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Captura de pantalla"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"La captura de pantalla se ha realizado correctamente."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"No se puede realizar la captura de pantalla."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalles del informe de errores"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nombre de archivo"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descripción completa"</string> diff --git a/packages/Shell/res/values-et-rEE/strings.xml b/packages/Shell/res/values-et-rEE/strings.xml index 3ebd56df6969..bc469bcd93ee 100644 --- a/packages/Shell/res/values-et-rEE/strings.xml +++ b/packages/Shell/res/values-et-rEE/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Kest"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Veaaruande loomine"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Veaaruanne jäädvustati"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Luuakse veaaruannet <xliff:g id="ID">#%d</xliff:g>"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Jäädvustati veaaruanne <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Üksikasjade lisamine veaaruandesse"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Oodake …"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Veaaruande jagamiseks pühkige vasakule"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Veaaruande jagamiseks puudutage"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Veaaruande jagamiseks puudutage"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Veaaruanded sisaldavad andmeid erinevatest süsteemi logifailidest, sh isiklikku ja privaatset teavet. Jagage veaaruandeid ainult usaldusväärsete rakenduste ja inimestega."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Kuva see sõnum järgmisel korral"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Veaaruanded"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"nimeta"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Üksikasjad"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Ekraanipilt"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Ekraanipildi tegemine õnnestus."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Ekraanipildi jäädvustamine õnnestus."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ekraanipilti ei saanud teha."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Veaaruande üksikasjad"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Veaaruande <xliff:g id="ID">#%d</xliff:g> üksikasjad"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Faili nimi"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Pealkiri"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Üksikasjalik kirjeldus"</string> diff --git a/packages/Shell/res/values-eu-rES/strings.xml b/packages/Shell/res/values-eu-rES/strings.xml index 93fdb60965fb..3673b7c50809 100644 --- a/packages/Shell/res/values-eu-rES/strings.xml +++ b/packages/Shell/res/values-eu-rES/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell-interfazea"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Sortzen ari gara akatsen txostena"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Akatsen txostena jaso da"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Akatsen txostenean xehetasunak gehitzen"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Itxaron, mesedez…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Programa-akatsen txostena partekatzeko, pasatu hatza ezkerrera"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Akatsen txostena partekatzeko, ukitu"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Akatsen txostenek sistemaren erregistro-fitxategietako datuak dauzkate, informazio pertsonala eta pribatua barne. Akatsen txostenak partekatzen badituzu, partekatu soilik aplikazio eta pertsona fidagarriekin."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Erakutsi mezu hau hurrengoan"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Akatsen txostenak"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"izengabea"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Xehetasunak"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Pantaila-argazkia"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Atera da pantaila-argazkia."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ezin izan da atera pantaila-argazkia."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Akatsen txostenaren xehetasunak"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Fitxategi-izena"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Izena"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Azalpen xehatua"</string> diff --git a/packages/Shell/res/values-fa/strings.xml b/packages/Shell/res/values-fa/strings.xml index c4ec8b42cb1b..a58d0a056a25 100644 --- a/packages/Shell/res/values-fa/strings.xml +++ b/packages/Shell/res/values-fa/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"گزارش اشکال در حال ایجاد شدن است"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"گزارش اشکال دریافت شد"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"جهت اشتراکگذاری گزارش اشکال خود لمس کنید"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"گزارشهای اشکال حاوی دادههایی از فایلهای گزارش مختلف در سیستم هستند، شامل اطلاعات شخصی و خصوصی. گزارشهای اشکال را فقط با افراد و برنامههای مورد اعتماد خود به اشتراک بگذارید."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"دفعه بعد این پیام نشان داده شود"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"گزارش اشکال"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"بینام"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"جزئیات"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"عکس صفحهنمایش"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"عکس صفحهنمایش با موفقیت گرفته شد."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"نمیتوان عکس صفحهنمایش گرفت."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"جزئیات گزارش اشکال"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"نام فایل"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"عنوان"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"جزئیات دقیق"</string> diff --git a/packages/Shell/res/values-fi/strings.xml b/packages/Shell/res/values-fi/strings.xml index 0fc4b77ab89a..8db1c577011c 100644 --- a/packages/Shell/res/values-fi/strings.xml +++ b/packages/Shell/res/values-fi/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Komentotulkki"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Luodaan virheraporttia"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Virheraportti tallennettu"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Lisätään tietoja virheraporttiin"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Odota…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Jaa virheraportti pyyhkäisemällä vasemmalle"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Jaa virheraportti koskettamalla tätä"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Virheraportit sisältävät järjestelmän lokitietoja, ja niihin voi sisältyä henkilökohtaisia ja yksityisiä tietoja. Jaa virheraportteja vain luotettaville sovelluksille ja käyttäjille."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Näytä tämä viesti seuraavalla kerralla"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Virheraportit"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"nimetön"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Tietoja"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Kuvakaappaus"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Kuvakaappaus tallennettu."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Kuvakaappauksen tallentaminen epäonnistui."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Virheraportin tiedot"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Tiedostonimi"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Otsikko"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Yksityiskohtainen kuvaus"</string> diff --git a/packages/Shell/res/values-fr-rCA/strings.xml b/packages/Shell/res/values-fr-rCA/strings.xml index d2ef54caf82b..6c061028ab97 100644 --- a/packages/Shell/res/values-fr-rCA/strings.xml +++ b/packages/Shell/res/values-fr-rCA/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Le rapport de bogue est en cours de création"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Rapport de bogue enregistré"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Ajout de détails au rapport de bogue"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Veuillez patienter…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Faites glisser le doigt vers la gauche pour partager votre rapport de bogue."</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Appuyer ici pour partager votre rapport de bogue"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Les rapports de bogue contiennent des données des fichiers journaux du système, y compris des informations personnelles et privées. Ne partagez les rapports de bogue qu\'avec les applications et les personnes que vous estimez fiables."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Afficher ce message la prochaine fois"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapports de bogues"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sans nom"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Détails"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Saisie d\'écran"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"La saisie d\'écran a réussi."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Une erreur s\'est produite lors de la saisie d\'écran."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Détails du rapport de bogue"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nom de fichier"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titre"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Description détaillée"</string> diff --git a/packages/Shell/res/values-fr/strings.xml b/packages/Shell/res/values-fr/strings.xml index ca135edf02b9..74025d90c5c5 100644 --- a/packages/Shell/res/values-fr/strings.xml +++ b/packages/Shell/res/values-fr/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Le rapport de bug est en cours de création."</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Rapport de bug enregistré"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Le rapport de bug \"<xliff:g id="ID">#%d</xliff:g>\" est en cours de création"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Le rapport de bug \"<xliff:g id="ID">#%d</xliff:g>\" a bien été enregistré"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Ajout d\'informations au rapport de bug"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Veuillez patienter…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Faites glisser le doigt vers la gauche pour partager votre rapport d\'erreur."</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Appuyez ici pour partager le rapport de bug"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Appuyer pour partager votre rapport de bug"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Les rapports de bug contiennent des données des fichiers journaux du système, y compris des informations personnelles et privées. Ne partagez les rapports de bug qu\'avec les applications et les personnes que vous estimez fiables."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Afficher ce message la prochaine fois"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapports d\'erreur"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sans nom"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Détails"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Captures d\'écran"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"La capture d\'écran a bien été effectuée."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"La capture d\'écran a bien été effectuée."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Impossible d\'effectuer une capture d\'écran."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Détails du rapport de bug"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Informations sur le rapport de bug \"<xliff:g id="ID">#%d</xliff:g>\""</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nom de fichier"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titre"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Description détaillée"</string> diff --git a/packages/Shell/res/values-gl-rES/strings.xml b/packages/Shell/res/values-gl-rES/strings.xml index 612d346db766..8c5f2eefe58d 100644 --- a/packages/Shell/res/values-gl-rES/strings.xml +++ b/packages/Shell/res/values-gl-rES/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Estase xerando o informe de erro"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Informe de erros rexistrado"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toca aquí para compartir o teu informe de erros"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Os informes de erros conteñen datos dos distintos ficheiros de rexistro do sistema, incluída información persoal e privada. Comparte os informes de erros unicamente con aplicacións e persoas de confianza."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostrar esta mensaxe a próxima vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes de erros"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sen nome"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalles"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Captura de pantalla"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"A captura de pantalla realizouse correctamente."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Non se puido realizar a captura de pantalla."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalles do informe de erros"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome do ficheiro"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descrición detallada"</string> diff --git a/packages/Shell/res/values-gu-rIN/strings.xml b/packages/Shell/res/values-gu-rIN/strings.xml index 7baefe7875f8..d1fe7a191063 100644 --- a/packages/Shell/res/values-gu-rIN/strings.xml +++ b/packages/Shell/res/values-gu-rIN/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"શેલ"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"બગ રિપોર્ટ જનરેટ કરવામાં આવી રહી છે"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"બગ રિપોર્ટ કેપ્ચર કરી"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"તમારી બગ રિપોર્ટ શેર કરવા માટે ટચ કરો"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"બગ રિપોર્ટ્સ વ્યક્તિગત અને ખાનગી માહિતી સહિત, સિસ્ટમની વિભિન્ન લૉગ ફાઇલોનો ડેટા ધરાવે છે. બગ રિપોર્ટ્સ ફક્ત તમે વિશ્વાસ કરતા હો તે એપ્લિકેશનો અને લોકો સાથે જ શેર કરો."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"આગલી વખતે આ સંદેશ બતાવો"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"બગ રિપોર્ટ્સ"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"અનામાંકિત"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"વિગતો"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"સ્ક્રીનશોટ"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"સ્ક્રીનશોટ સફળતાપૂર્વક લેવાયો."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"સ્ક્રીનશોટ લઇ શકાયો નથી."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"બગ રિપોર્ટની વિગતો"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"ફાઇલનું નામ"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"શીર્ષક"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"વિગતવાર વર્ણન"</string> diff --git a/packages/Shell/res/values-hi/strings.xml b/packages/Shell/res/values-hi/strings.xml index c21213e45c0f..8858bc3202e4 100644 --- a/packages/Shell/res/values-hi/strings.xml +++ b/packages/Shell/res/values-hi/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"शेल"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"बग रिपोर्ट जेनरेट हो रही है"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"बग रिपोर्ट कैप्चर कर ली गई"</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_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="3559904746859400732">"अपनी बग रिपोर्ट साझा करने के लिए स्पर्श करें"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"अपनी बग रिपोर्ट साझा करने के लिए टैप करें"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"बग रिपोर्ट में व्यक्तिगत और निजी जानकारी सहित, सिस्टम की विभिन्न लॉग फ़ाइलों का डेटा होता है. बग रिपोर्ट केवल विश्वसनीय ऐप्स और व्यक्तियों से ही साझा करें."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"यह संदेश अगली बार दिखाएं"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"बग रिपोर्ट"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"अनामांकित"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"विवरण"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"स्क्रीनशॉट"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"स्क्रीनशॉट सफलतापूर्वक लिया गया."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"स्क्रीनशॉट सफलतापूर्वक लिया गया."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"स्क्रीनशॉट नहीं लिया जा सका."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"बग रिपोर्ट के विवरण"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"बग रिपोर्ट <xliff:g id="ID">#%d</xliff:g> के विवरण"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"फ़ाइल नाम"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"शीर्षक"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"विस्तृत वर्णन"</string> diff --git a/packages/Shell/res/values-hr/strings.xml b/packages/Shell/res/values-hr/strings.xml index 810ad3a437db..3e08eb2eec9a 100644 --- a/packages/Shell/res/values-hr/strings.xml +++ b/packages/Shell/res/values-hr/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Ljuska"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Generira se izvješće o programskoj pogrešci"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Prijava programske pogreške snimljena je"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Generira se izvješće o programskoj pogrešci <xliff:g id="ID">#%d</xliff:g>"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Izvješće o programskoj pogrešci <xliff:g id="ID">#%d</xliff:g> snimljeno"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Dodavanje pojedinosti u izvješće o progr. pogrešci"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Pričekajte..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Prijeđite prstom ulijevo da biste poslali izvješće o programskim pogreškama"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Dodirnite za dijeljenje prijave programske pogreške"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Dodirnite da biste podijelili izvješće o programskoj pogrešci"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Prijave programskih pogrešaka sadržavaju podatke iz različitih datoteka zapisnika sustava, uključujući osobne i privatne informacije. Prijave programskih pogrešaka dijelite samo s aplikacijama i osobama koje smatrate pouzdanima."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Prikaži tu poruku sljedeći put"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Izvj. o prog. pogreš."</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"bez naziva"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Pojedinosti"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Snimka zaslona"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Zaslon je snimljen."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Snimka zaslona uspješno je izrađena."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Snimanje zaslona nije uspjelo."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Pojedinosti izvješća o programskoj pogrešci"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Pojedinosti izvješća o programskoj pogrešci <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Naziv datoteke"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Naslov"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljan opis"</string> diff --git a/packages/Shell/res/values-hu/strings.xml b/packages/Shell/res/values-hu/strings.xml index b78fc61e5a57..390cd2f3ca3a 100644 --- a/packages/Shell/res/values-hu/strings.xml +++ b/packages/Shell/res/values-hu/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Héj"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Hibajelentés létrehozása folyamatban"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Programhiba-jelentés rögzítve"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Hibajelentés (<xliff:g id="ID">#%d</xliff:g>) létrehozása folyamatban"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Hibajelentés (<xliff:g id="ID">#%d</xliff:g>) rögzítve"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Információk hozzáadása a hibajelentéshez"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Kérjük, várjon..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Húzza ujját balra a hibajelentés megosztásához"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Érintse meg a programhiba-jelentés megosztásához"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Koppintson a hibajelentés megosztásához"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"A programhiba-jelentések a rendszer különféle naplófájljaiból származó adatokat tartalmaznak, köztük személyes és magánjellegű információkat is. Csak olyan alkalmazásokkal és személyekkel osszon meg programhiba-jelentéseket, amelyekben vagy akikben megbízik."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Üzenet mutatása legközelebb"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Hibajelentések"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"névtelen"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Részletek"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Képernyőkép"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Sikerült elkészíteni a képernyőképet."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Képernyőkép sikeresen rögzítve."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Nem sikerült elkészíteni a képernyőképet."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Hibajelentés részletei"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Hibajelentés (<xliff:g id="ID">#%d</xliff:g>) részletei"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Fájlnév"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Név"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Részletes leírás"</string> diff --git a/packages/Shell/res/values-hy-rAM/strings.xml b/packages/Shell/res/values-hy-rAM/strings.xml index 4912d542b6a1..8db1ec994d6f 100644 --- a/packages/Shell/res/values-hy-rAM/strings.xml +++ b/packages/Shell/res/values-hy-rAM/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Խեցի"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Վրիպակի զեկույցը ստեղծվում է"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Վրիպակի զեկույց է ստացվել"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"Հպեք` ձեր վրիպակի մասին զեկույցը տարածելու համար"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Վրիպակի զեկույցները պարունակում են տվյալներ համակարգի տարբեր մուտքի ֆայլերից, այդ թվում նաև անհատական և գաղտնի տեղեկություններ: Վրիպակի զեկույցները կիսեք միայն այն հավելվածների և մարդկանց հետ, որոնց վստահում եք:"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Այս հաղորդագրությունը ցույց տալ հաջորդ անգամ"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Վրիպակների հաշվետվություններ"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"անանուն"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Մանրամասներ"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Էկրանի պատկեր"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Էկրանի պատկերը հաջողությամբ ստացվեց:"</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Չհաջողվեց ստանալ էկրանի պատկերը:"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Վրիպակի զեկույցի մանրամասները"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Ֆայլի անունը"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Անվանումը"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Մանրամասն նկարագրություն"</string> diff --git a/packages/Shell/res/values-in/strings.xml b/packages/Shell/res/values-in/strings.xml index e774de99ea3e..4416fc725b0b 100644 --- a/packages/Shell/res/values-in/strings.xml +++ b/packages/Shell/res/values-in/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Kerangka"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Laporan bug sedang dibuat"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Laporan bug tercatat"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Laporan bug <xliff:g id="ID">#%d</xliff:g> sedang dibuat"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Laporan bug <xliff:g id="ID">#%d</xliff:g> dijepret"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Menambahkan detail ke laporan bug"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Harap tunggu..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Gesek ke kiri untuk membagikan laporan bug Anda"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Sentuh untuk membagikan laporan bug Anda"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Ketuk untuk membagikan laporan bug"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Laporan bug berisi data dari berbagai file log sistem, termasuk informasi pribadi dan rahasia. Hanya bagikan laporan bug dengan aplikasi dan orang yang Anda percaya."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Tampilkan pesan ini lain kali"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Laporan bug"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"tanpa nama"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detail"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Tangkapan layar"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Tangkapan layar berhasil diambil."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Tangkapan layar berhasil diambil."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Tangkapan layar tidak dapat diambil."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detail laporan bug"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detail laporan bug <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nama file"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Judul"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Deskripsi detail"</string> diff --git a/packages/Shell/res/values-is-rIS/strings.xml b/packages/Shell/res/values-is-rIS/strings.xml index d175b4f95195..662fa91293c2 100644 --- a/packages/Shell/res/values-is-rIS/strings.xml +++ b/packages/Shell/res/values-is-rIS/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Skipanalína"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Verið er að búa til villutilkynningu"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Villutilkynning útbúin"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Bætir upplýsingum við villutilkynningu"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Augnablik..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Strjúktu til vinstri til að deila villuskýrslunni"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Snertu til að deila villutilkynningunni"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Villutilkynningar innihalda gögn úr hinum ýmsu annálsskrám kerfisins, þ. á m. persónuleg gögn og trúnaðarupplýsingar. Deildu villutilkynningum eingöngu með forritum og fólki sem þú treystir."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Sýna þessi skilaboð næst"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Villutilkynningar"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"án heitis"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Nánar"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Skjámynd"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Tókst að taka skjámynd."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ekki tókst að taka skjámynd."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Upplýsingar um villutilkynningu"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Skráarheiti"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titill"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Ítarleg lýsing"</string> diff --git a/packages/Shell/res/values-it/strings.xml b/packages/Shell/res/values-it/strings.xml index a954b0ca78f8..fc9383a2ca32 100644 --- a/packages/Shell/res/values-it/strings.xml +++ b/packages/Shell/res/values-it/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Generazione segnalazione di bug in corso"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Segnalazione di bug acquisita"</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_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="3559904746859400732">"Tocca per condividere la segnalazione di bug"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Tocca per condividere la segnalazione di bug"</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> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"senza nome"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Dettagli"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Screenshot acquisito."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Screenshot acquisito."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Impossibile acquisire lo screenshot."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Dettagli della segnalazione di bug"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Dettagli sulla segnalazione di bug <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome file"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titolo"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descrizione dettagliata"</string> diff --git a/packages/Shell/res/values-iw/strings.xml b/packages/Shell/res/values-iw/strings.xml index 40bd73b4661d..abef5fa41075 100644 --- a/packages/Shell/res/values-iw/strings.xml +++ b/packages/Shell/res/values-iw/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"מעטפת"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"מופק דוח על באג"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"דוח הבאגים צולם"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"גע כדי לשתף את דוח הבאגים שלך"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"דוחות על באגים כוללים נתונים מקובצי היומן השונים במערכת, כולל מידע אישי ופרטי. שתף דוחות באגים רק עם אפליקציות ואנשים שאתה סומך עליהם."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"הצג את ההודעה הזו בפעם הבאה"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"דוחות באגים"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"ללא שם"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"פרטים"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"צילום מסך"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"צילום המסך בוצע בהצלחה."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"לא ניתן היה לצלם מסך."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"פרטי דוח על באג"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"שם קובץ"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"כותרת"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"תיאור מפורט"</string> diff --git a/packages/Shell/res/values-ja/strings.xml b/packages/Shell/res/values-ja/strings.xml index f0183b5e9d82..b98b05fa1f19 100644 --- a/packages/Shell/res/values-ja/strings.xml +++ b/packages/Shell/res/values-ja/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"シェル"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"バグレポートを生成しています"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"バグレポートが記録されました"</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_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="3559904746859400732">"バグレポートを共有するにはタップします"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"バグレポートを共有するにはタップします"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"バグレポートには、個人の非公開情報など、システムのさまざまなログファイルのデータが含まれます。共有する場合は信頼するアプリとユーザーのみを選択してください。"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"このメッセージを次回も表示する"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"バグレポート"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"名前なし"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"詳細"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"スクリーンショット"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"スクリーンショットを撮影しました。"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"スクリーンショットを正常に撮影しました。"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"スクリーンショットを撮影できませんでした。"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"バグレポートの詳細"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"バグレポート <xliff:g id="ID">#%d</xliff:g> の詳細"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ファイル名"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"タイトル"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"詳細説明"</string> diff --git a/packages/Shell/res/values-ka-rGE/strings.xml b/packages/Shell/res/values-ka-rGE/strings.xml index a7ad694465ba..a51c0b50bd68 100644 --- a/packages/Shell/res/values-ka-rGE/strings.xml +++ b/packages/Shell/res/values-ka-rGE/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"გარეკანი"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"მიმდინარეობს ხარვეზის შესახებ ანგარიშის გენერირება"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"ანგარიში ხარვეზების შესახებ შექმნილია"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"შეეხეთ თქვენი ხარვეზების ანგარიშის გასაზიარებლად"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"ხარვეზის ანგარიშები მოიცავს მონაცემებს სხვადასხვა სისტემური ჟურნალის ფაილებიდან, მათ შორის პირად და კონფიდენციალურ ინფორმაციას."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"შემდგომში აჩვენე ეს შეტყობინება"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"შეცდომების ანგარიშები"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"უსახელო"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"დეტალები"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ეკრანის ანაბეჭდი"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"ეკრანის ანაბეჭდი გადაღებულია წარმატებით."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ეკრანის ანაბეჭდის გადაღება ვერ მოხერხდა."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"ხარვეზის შესახებ ანგარიშის დეტალები"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"ფაილის სახელი"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"სათაური"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"დეტალური აღწერა"</string> diff --git a/packages/Shell/res/values-kk-rKZ/strings.xml b/packages/Shell/res/values-kk-rKZ/strings.xml index 25a387914daa..5878b17a7a5a 100644 --- a/packages/Shell/res/values-kk-rKZ/strings.xml +++ b/packages/Shell/res/values-kk-rKZ/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Қабыршық"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Қате туралы есеп жасалып жатыр"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Вирус туралы баянат қабылданды"</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_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="3559904746859400732">"Бөліс үшін, вирус туралы баянатты түртіңіз."</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Қате туралы есепті бөлісу үшін түртіңіз"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Вирус туралы баянатта жүйеде тіркелген әртүрлі файлдар туралы деректер болады, оған жеке және құпия ақпарат та кіреді. Вирус баянаттарын сенімді қолданбалар және сенімді адамдармен ғана бөлісіңіз."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Бұл хабарды келесі жолы көрсетіңіз"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Қате туралы баяндамалар"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"атаусыз"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Мәліметтер"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Скриншот"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Скриншот сәтті түсірілді."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Скриншот сәтті түсірілді."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Скриншот түсіру мүмкін болмады."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Қате туралы есептің мәліметтері"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"<xliff:g id="ID">#%d</xliff:g> қате туралы есебі туралы мәліметтер"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Файл атауы"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Атауы"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Егжей-тегжейлі сипаттама"</string> diff --git a/packages/Shell/res/values-km-rKH/strings.xml b/packages/Shell/res/values-km-rKH/strings.xml index 844c3177b9f6..9c95e9849efc 100644 --- a/packages/Shell/res/values-km-rKH/strings.xml +++ b/packages/Shell/res/values-km-rKH/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"សែល"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"របាយការណ៍កំហុសកំពុងត្រូវបានបង្កើត"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"បានចាប់យករបាយការណ៍កំហុស"</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_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="3559904746859400732">"ប៉ះ ដើម្បីចែករំលែករបាយការណ៍កំហុសរបស់អ្នក"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"ប៉ះដើម្បីចែករំលែករបាយការណ៍កំហុសរបស់អ្នក"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"របាយការណ៍កំហុសរួមមានឯកសារកំណត់ហេតុផ្សេងៗរបស់ប្រព័ន្ធ រួមមានព័ត៌មានផ្ទាល់ខ្លួន និងឯកជន។ ចែករំលែករបាយការណ៍កំហុសជាមួយកម្មវិធី និងមនុស្សដែលអ្នកទុកចិត្ត។"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"បង្ហាញសារនេះពេលក្រោយ"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"រាយការណ៍ពីកំហុស"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"គ្មានឈ្មោះ"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"ព័ត៌មានលម្អិត"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"រូបថតអេក្រង់"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"បានថតរូបថតអេក្រង់ដោយជោគជ័យ"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"រូបថតអេក្រង់ត្រូវបានថតដោយជោគជ័យ"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"មិនអាចថតរូបថតអេក្រង់បានទេ"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"ព័ត៌មានលម្អិតពីរបាយការណ៍កំហុស"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ព័ត៌មានលម្អិតពី <xliff:g id="ID">#%d</xliff:g> របាយការណ៍កំហុស"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ឈ្មោះឯកសារ"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"ចំណងជើង"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"ការពិពណ៌នាលម្អិត"</string> diff --git a/packages/Shell/res/values-kn-rIN/strings.xml b/packages/Shell/res/values-kn-rIN/strings.xml index a3c9b95fecc0..b78607f14c67 100644 --- a/packages/Shell/res/values-kn-rIN/strings.xml +++ b/packages/Shell/res/values-kn-rIN/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"ಶೆಲ್"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"ದೋಷ ವರದಿಯನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"ದೋಷದ ವರದಿಯನ್ನು ಸೆರೆಹಿಡಿಯಲಾಗಿದೆ"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"ನಿಮ್ಮ ದೋಷದ ವರದಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಸ್ಪರ್ಶಿಸಿ"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"ವೈಯಕ್ತಿಕ ಮತ್ತು ಖಾಸಗಿ ಮಾಹಿತಿಯು ಸೇರಿದಂತೆ, ಸಿಸ್ಟಂನ ಹಲವಾರು ಲಾಗ್ ಫೈಲ್ಗಳಿಂದ ಡೇಟಾವನ್ನು ದೋಷದ ವರದಿಗಳು ಒಳಗೊಂಡಿವೆ. ನೀವು ನಂಬುವಂತಹ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಜನರೊಂದಿಗೆ ಮಾತ್ರ ದೋಷದ ವರದಿಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ಈ ಸಂದೇಶವನ್ನು ಮುಂದಿನ ಬಾರಿ ತೋರಿಸಿ"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"ದೋಷ ವರದಿಗಳು"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"ಹೆಸರಿಸದಿರುವುದು"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"ವಿವರಗಳು"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಯಶಸ್ವಿಯಾಗಿ ತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"ಬಗ್ ವರದಿ ವಿವರಗಳು"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"ಫೈಲ್ಹೆಸರು"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"ಶೀರ್ಷಿಕೆ"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"ವಿವರವಾದ ವಿವರಣೆ"</string> diff --git a/packages/Shell/res/values-ko/strings.xml b/packages/Shell/res/values-ko/strings.xml index 912d940a58ac..70df8e2efb36 100644 --- a/packages/Shell/res/values-ko/strings.xml +++ b/packages/Shell/res/values-ko/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"셸"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"버그 신고 생성 중"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"버그 신고서 캡처됨"</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_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="3559904746859400732">"버그 신고서를 공유하려면 터치하세요."</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"버그 신고를 공유하려면 탭하세요."</string> <string name="bugreport_confirm" msgid="5130698467795669780">"버그 신고서는 시스템의 다양한 로그 파일 데이터(예: 개인 및 비공개 정보)를 포함합니다. 신뢰할 수 있는 앱과 사용자에게만 버그 신고서를 공유하세요."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"다음에 이 메시지 표시"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"버그 신고"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"이름 없음"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"세부정보"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"스크린샷"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"스크린샷을 찍었습니다."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"스크린샷을 찍었습니다."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"스크린샷을 찍을 수 없습니다."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"버그 신고 세부정보"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"버그 신고 <xliff:g id="ID">#%d</xliff:g> 세부정보"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"파일 이름"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"제목"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"자세한 설명"</string> diff --git a/packages/Shell/res/values-ky-rKG/strings.xml b/packages/Shell/res/values-ky-rKG/strings.xml index 8ad785c98df5..32a0cfe5822b 100644 --- a/packages/Shell/res/values-ky-rKG/strings.xml +++ b/packages/Shell/res/values-ky-rKG/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Командалык кабык"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Мүчүлүштүктөр тууралуу билдирүү түзүлүүдө"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Ката тууралуу билдирүү түзүлдү"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"Ката тууралуу билдирүүңүздү жөнөтүш үчүн, тийиңиз"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Ката тууралуу билдирүүлөр системанын ар кандай лог файлдарынын берилиштерин камтыйт, аларга өздүк жана купуя маалыматтар дагы кирет. Ката тууралуу билдирүүлөрдү сиз ишенген колдонмолор жана адамдар менен гана бөлүшүңүз."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Бул билдирүү кийин көрсөтүлсүн"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Мүчүлүштүктөрдү кабарлоолор"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"аталышы жок"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Чоо-жайы"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Скриншот"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Скриншот ийгиликтүү тартылды."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Скриншот тартылбай койду."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Мүчүлүштүктөр жөнүндө кабардын чоо-жайы"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Файлдын аталышы"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Аталышы"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Кененирээк маалымат"</string> diff --git a/packages/Shell/res/values-lo-rLA/strings.xml b/packages/Shell/res/values-lo-rLA/strings.xml index d1592540b721..61b06c891a3a 100644 --- a/packages/Shell/res/values-lo-rLA/strings.xml +++ b/packages/Shell/res/values-lo-rLA/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"ກຳລັງສ້າງລາຍງານບັນຫາ"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"ລາຍງານຈຸດບົກພ່ອງຖືກເກັບກຳແລ້ວ"</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_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="3559904746859400732">"ແຕະເພື່ອສົ່ງການລາຍງານປັນຫາຂອງທ່ານ"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"ແຕະເພື່ອແບ່ງປັນລາຍງານຂໍ້ຜິດພາດຂອງທ່ານ"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"ການລາຍງານຂໍ້ຜິດພາດປະກອບມີ ຂໍ້ມູນຈາກໄຟລ໌ບັນທຶກຂອງລະບົບຫຼາຍໄຟລ໌, ຮວມທັງຂໍ້ມູນສ່ວນໂຕນຳ. ທ່ານຕ້ອງແບ່ງປັນລາຍງານຂໍ້ຜິດພາດໃຫ້ແອັບຯ ແລະຄົນທີ່ທ່ານເຊື່ອຖືໄດ້ເທົ່ານັ້ນ."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ສະແດງຂໍ້ຄວາມນີ້ອີກໃນເທື່ອຕໍ່ໄປ"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"ລາຍງານບັນຫາ"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"ບໍ່ມີຊື່"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"ລາຍລະອຽດ"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ພາບໜ້າຈໍ"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"ຖ່າຍພາບໜ້າຈໍສຳເລັດແລ້ວ."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ຖ່າຍພາບໜ້າຈໍສຳເລັດແລ້ວ."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ບໍ່ສາມາດຖ່າຍພາບໜ້າຈໍໄດ້."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"ລາຍລະອຽດການລາຍງານບັນຫາ"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ລາຍລະອຽດຂອງລາຍງານຂໍ້ຜິດພາດ <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ຊື່ໄຟລ໌"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"ຊື່"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"ຄຳອະທິບາຍແບບລະອຽດ"</string> diff --git a/packages/Shell/res/values-lt/strings.xml b/packages/Shell/res/values-lt/strings.xml index 0c069c681ec0..34182131f7a1 100644 --- a/packages/Shell/res/values-lt/strings.xml +++ b/packages/Shell/res/values-lt/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Apvalkalas"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Pranešimas apie riktą generuojamas"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Riktų ataskaita užfiksuota"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Pranešimas apie riktą (<xliff:g id="ID">#%d</xliff:g>) generuojamas"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Pranešimas apie riktą (<xliff:g id="ID">#%d</xliff:g>) užfiksuotas"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Pridedama informacijos prie pranešimo apie riktą"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Palaukite…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Perbraukite kairėn, kad bendrintumėte rikto ataskaitą"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Palieskite, kad bendrintumėte riktų ataskaitą"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Palieskite, kad bendrintumėte pranešimą apie riktą"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Riktų ataskaitose pateikiami duomenys iš įvairių sistemos žurnalo failų, įskaitant asmeninę ir privačią informaciją. Riktų ataskaitas bendrinkite tik su patikimomis programomis ir žmonėmis."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Rodyti šį pranešimą kitą kartą"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Riktų ataskaitos"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"be pavadinimo"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Informacija"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Ekrano kopija"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Ekrano kopija sėkmingai padaryta."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Ekrano kopija sėkmingai sukurta."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Nepavyko padaryti ekrano kopijos."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Išsami pranešimo apie riktą informacija"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Išsami informacija apie pranešimą apie riktą (<xliff:g id="ID">#%d</xliff:g>)"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Failo pavadinimas"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Pavadinimas"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Išsamus aprašas"</string> diff --git a/packages/Shell/res/values-lv/strings.xml b/packages/Shell/res/values-lv/strings.xml index 1baa3435d776..61087164b577 100644 --- a/packages/Shell/res/values-lv/strings.xml +++ b/packages/Shell/res/values-lv/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Aizsargs"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Notiek kļūdas pārskata izveide"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Izveidots kļūdu pārskats"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Kļūdas pārskats <xliff:g id="ID">#%d</xliff:g> tiek ģenerēts"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Kļūdas pārskats <xliff:g id="ID">#%d</xliff:g> reģistrēts"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Informācijas pievienošana kļūdas pārskatam"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Lūdzu, uzgaidiet..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Velciet pa kreisi, lai kopīgotu savu kļūdu ziņojumu."</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Pieskarieties, lai kopīgotu kļūdu pārskatu."</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Pieskarieties, lai kopīgotu kļūdas pārskatu."</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Kļūdu pārskatā ir iekļauti dati no dažādiem sistēmas žurnālfailiem, tostarp personas dati un privāta informācija. Kļūdu pārskatus ieteicams kopīgot tikai ar uzticamām lietotnēm un lietotājiem."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Rādīt šo ziņojumu nākamajā reizē"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Kļūdu ziņojumi"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"bez nosaukuma"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalizēta informācija"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Ekrānuzņēmums"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Ekrānuzņēmums ir veikts sekmīgi."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Ekrānuzņēmums ir veikts sekmīgi."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Nevarēja veikt ekrānuzņēmumu."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Kļūdas pārskata informācija"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Kļūdas pārskats <xliff:g id="ID">#%d</xliff:g>: detalizēta informācija"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Faila nosaukums"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Nosaukums"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detalizēts apraksts"</string> diff --git a/packages/Shell/res/values-mk-rMK/strings.xml b/packages/Shell/res/values-mk-rMK/strings.xml index efbec8ec7687..500196d10ff8 100644 --- a/packages/Shell/res/values-mk-rMK/strings.xml +++ b/packages/Shell/res/values-mk-rMK/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Обвивка"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Се генерира извештајот за грешки"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Извештајот за грешка е снимен"</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_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="3559904746859400732">"Допри да се сподели твојот извештај за грешка"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Допрете за да го споделите извештајот за грешки"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Извештаите за грешка содржат податоци од разни датотеки за евиденција на системот, вклучувајќи лични и приватни информации. Извештаите за грешка споделувајте ги само со апликации и луѓе на коишто им верувате."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Прикажи ја поракава следниот пат"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Извештаи за грешки"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"неименувани"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Детали"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Слика од екранот"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Успешно е направена слика од екранот."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Успешно е направена слика од екранот."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Не може да се направи слика од екранот."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Детали на извештајот за грешка"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Детали за извештајот за грешки <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Име на датотека"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Наслов"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Детален опис"</string> diff --git a/packages/Shell/res/values-ml-rIN/strings.xml b/packages/Shell/res/values-ml-rIN/strings.xml index 82cfd6d9d911..696aab2ca79c 100644 --- a/packages/Shell/res/values-ml-rIN/strings.xml +++ b/packages/Shell/res/values-ml-rIN/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"ഷെൽ"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"ബഗ് റിപ്പോർട്ട് സൃഷ്ടിച്ചുകൊണ്ടിരിക്കുന്നു"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"ബഗ് റിപ്പോർട്ട് ക്യാപ്ചർ ചെയ്തു"</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_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="3559904746859400732">"നിങ്ങളുടെ ബഗ് റിപ്പോർട്ട് പങ്കിടാൻ സ്പർശിക്കുക"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"നിങ്ങളുടെ ബഗ് റിപ്പോർട്ട് പങ്കിടാൻ ടാപ്പുചെയ്യുക"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"വ്യക്തിഗതവും സ്വകാര്യവുമായ വിവരങ്ങൾ ഉൾപ്പെടെ, സിസ്റ്റത്തിന്റെ നിരവധി ലോഗ് ഫയലുകളിൽ നിന്നുള്ള ഡാറ്റ, ബഗ് റിപ്പോർട്ടുകളിൽ അടങ്ങിയിരിക്കുന്നു. നിങ്ങൾ വിശ്വസിക്കുന്ന അപ്ലിക്കേഷനുകൾക്കും ആളുകൾക്കും മാത്രം ബഗ് റിപ്പോർട്ടുകൾ പങ്കിടുക."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ഈ സന്ദേശം അടുത്ത തവണ ദൃശ്യമാക്കുക"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"ബഗ് റിപ്പോർട്ടുകൾ"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"പേരില്ലാത്തവർ"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"വിശദാംശങ്ങൾ"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"സ്ക്രീൻഷോട്ട്"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"സ്ക്രീൻഷോട്ട് എടുത്തു."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"സ്ക്രീൻഷോട്ട് എടുത്തു."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"സ്ക്രീൻഷോട്ട് എടുക്കാൻ കഴിഞ്ഞില്ല."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"ബഗ് റിപ്പോർട്ട് വിശദാംശങ്ങൾ"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ബഗ് റിപ്പോർട്ട് <xliff:g id="ID">#%d</xliff:g> വിശദാംശങ്ങൾ"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ഫയല്നാമം"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"പേര്"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"വിശദമായ വിവരണം"</string> diff --git a/packages/Shell/res/values-mn-rMN/strings.xml b/packages/Shell/res/values-mn-rMN/strings.xml index 856803da4f7d..9ec380156261 100644 --- a/packages/Shell/res/values-mn-rMN/strings.xml +++ b/packages/Shell/res/values-mn-rMN/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Шел"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Алдааны тайланг үүсгэсэн"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Алдааны мэдээлэл хүлээн авав"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"Та алдааны мэдэгдлийг хуваалцах бол хүрнэ үү"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Алдааны репорт нь хувийн болон нууц мэдээлэл зэргийг агуулсан системийн төрөл бүрийн лог файлын датаг агуулна. Алдааны репортыг зөвхөн итгэлтэй апп болон хүмүүст хуваалцана уу."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Энэ мессежийг дараагийн удаа харуулах"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Гэмтлийн тухай тайлан"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"нэр байхгүй"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Дэлгэрэнгүй"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Дэлгэцийн зураг"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Дэлгэцийн зургийг амжилттай авлаа."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Дэлгэцийн зураг авах боломжгүй."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Алдааны дэлгэрэнгүй тайлан"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Файлын нэр"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Гарчиг"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Дэлгэрэнгүй тайлбар"</string> diff --git a/packages/Shell/res/values-mr-rIN/strings.xml b/packages/Shell/res/values-mr-rIN/strings.xml index 763eec62a990..165cd683fa4f 100644 --- a/packages/Shell/res/values-mr-rIN/strings.xml +++ b/packages/Shell/res/values-mr-rIN/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"शेल"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"दोष अहवाल तयार केला जात आहे"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"दोष अहवाल कॅप्चर केला"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"आपला दोष अहवाल सामायिक करण्यासाठी स्पर्श करा"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"दोष अहवालांमध्ये वैयक्तिक आणि खाजगी माहितीसह, सिस्टमच्या अनेक लॉग फायलींमधील डेटा असतो. केवळ आपला विश्वास असलेल्या अॅप्स आणि लोकांसह दोष अहवाल सामायिक करा."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"पुढील वेळी हा संदेश दर्शवा"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"दोष अहवाल"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"अनामित"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"तपशील"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"स्क्रीनशॉट"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"स्क्रीनशॉट यशस्वीपणे घेतला."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"स्क्रीनशॉट घेणे शक्य झाले नाही."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"दोष अहवाल तपशील"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"फाईलनाव"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"शीर्षक"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"तपशीलवार वर्णन"</string> diff --git a/packages/Shell/res/values-ms-rMY/strings.xml b/packages/Shell/res/values-ms-rMY/strings.xml index 1afe430a96c0..ae51faf3e317 100644 --- a/packages/Shell/res/values-ms-rMY/strings.xml +++ b/packages/Shell/res/values-ms-rMY/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Laporan pepijat sedang dijana"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Laporan pepijat telah ditangkap"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Menambahkan butiran pada laporan pepijat"</string> <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="3559904746859400732">"Sentuh untuk berkongsi laporan pepijat anda"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <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> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"tidak bernama"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Butiran"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Tangkapan skrin"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Tangkapan skrin berjaya diambil."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Tangkapan skrin tidak dapat diambil."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Butiran laporan pepijat"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nama fail"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Tajuk"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Perihalan terperinci"</string> diff --git a/packages/Shell/res/values-my-rMM/strings.xml b/packages/Shell/res/values-my-rMM/strings.xml index e94111112a8c..f63c8c592dbe 100644 --- a/packages/Shell/res/values-my-rMM/strings.xml +++ b/packages/Shell/res/values-my-rMM/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"အခွံ"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"ချွတ်ယွင်းမှု အစီရင်ခံစာကို ထုတ်ပေးနေသည်"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"အမှားအယွင်းမှတ်တမ်းကို အောင်မြင်စွာ သိမ်းဆည်းပြီး"</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_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="3559904746859400732">"အမှားအယွင်း မှတ်တမ်းကို မျှဝေရန် ထိလိုက်ပါ"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"သင့်ချွတ်ယွင်းမှုအစီရင်ခံချက်ကို မျှဝေရန် တို့ပါ"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"အမှားအယွင်း မှတ်တမ်းမှာ ပါရှိသော အချက်အလက်များမှာ ကိုယ်ရေးကိုယ်တာ နဲ့ လုံခြုံရေး အချက်အလက်များပါဝင်သော စနစ်မှ ပြုလုပ်မှု မှတ်တမ်းများ ဖြစ်ပါသည်၊ အမှားအယွင်း မှတ်တမ်းများကို ယုံကြည်ရသော အပလီကေးရှင်းများနဲ့ လူများကိုသာ ပေးဝေပြသမှု လုပ်ပါရန်။"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ဤစာတန်းကို နောက်တစ်ခါတွင် ပြရန်"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"ချို့ယွင်းမှု အစီရင်ခံစာများ"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"အမည်မဲ့"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"အသေးစိတ်များ"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"မျက်နှာပြင် လျှပ်တစ်ပြက်ပုံ"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"မျက်နှာပြင် လျှပ်တစ်ပြက်ပုံကို အောင်မြင်စွာ ရိုက်ပြီးပြီ။"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ဖန်သားပြင်ဓာတ်ပုံ အောင်မြင်စွာရိုက်ပြီးပါပြီ။"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"မျက်နှာပြင် လျှပ်တစ်ပြက်ပုံ မရိုက်နိုင်ပါ"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"ချွတ်ယွင်းချက်အစီရင်ခံစာ အသေးစိတ်များ"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ချွတ်ယွင်းမှုအစီရင်ခံချက် <xliff:g id="ID">#%d</xliff:g> အသေးစိတ်များ"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ဖိုင်အမည်"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"ခေါင်းစဉ်"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"အသေးစိတ် ဖော်ပြချက်"</string> diff --git a/packages/Shell/res/values-nb/strings.xml b/packages/Shell/res/values-nb/strings.xml index 87b3530c4210..f4dd3033497c 100644 --- a/packages/Shell/res/values-nb/strings.xml +++ b/packages/Shell/res/values-nb/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Kommandoliste"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Feilrapporten blir generert"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Feilrapporten er lagret"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Legger til detaljer i feilrapporten"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Vent litt"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Sveip til venstre for å dele feilrapporten din"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Trykk for å dele feilrapporten din"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Feilrapporter inkluderer data fra systemets forskjellige loggfiler. Dette omfatter personlig og privat informasjon. Du bør bare dele feilrapporter med apper og folk du stoler på."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Vis denne meldingen neste gang"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Feilrapporter"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"uten navn"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detaljer"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Skjermdump"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Skjermdumpen er tatt."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Skjermdumpen kunne ikke tas."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detaljer om feilrapporten"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Filnavn"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Tittel"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljert beskrivelse"</string> diff --git a/packages/Shell/res/values-ne-rNP/strings.xml b/packages/Shell/res/values-ne-rNP/strings.xml index 5b68ece1ec22..e8cb2162cf70 100644 --- a/packages/Shell/res/values-ne-rNP/strings.xml +++ b/packages/Shell/res/values-ne-rNP/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"सेल"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"बग रिपोर्ट उत्पन्न भइरहेको छ"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"बग प्रतिवेदन समातियो"</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_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="3559904746859400732">"तपाईंको बग रिपोर्ट साझेदारी गर्न छुनुहोस्"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"तपाईंको बग रिपोर्ट साझेदारी गर्न ट्याप गर्नुहोस्"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"बग रिपोर्टहरूमा प्रणालीका विभिन्न लग फाइलहरूबाट व्यक्तिगत तथा नीजि सूचनासहितको डेटा रहन्छ। बग रिपोर्टहरू अनुप्रयोगहरू र तपाईँले विश्वास गरेका व्यक्तिहरूसँग मात्र साझेदारी गर्नुहोस्।"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"यो सन्देश अर्को पटक देखाउनुहोस्"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"बग रिपोर्टहरू"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"(नामविहीन)"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"विवरण"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"स्क्रिनशट"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"स्क्रिनशट सफलतापूर्वक लिइयो।"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"स्क्रिनशट सफलतापूर्वक लिइयो।"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"स्क्रिनशट लिन सकिएन।"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"बग रिपोर्टको विवरण"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"बग रिपोर्ट <xliff:g id="ID">#%d</xliff:g> विवरणहरू"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"फाइलको नाम"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"शीर्षक"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"विस्तृत विवरण"</string> diff --git a/packages/Shell/res/values-nl/strings.xml b/packages/Shell/res/values-nl/strings.xml index dd67ccd05529..e1537228c4af 100644 --- a/packages/Shell/res/values-nl/strings.xml +++ b/packages/Shell/res/values-nl/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Bugrapport wordt gegenereerd"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Foutenrapport vastgelegd"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Details toevoegen aan het bugrapport"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Even geduld…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Veeg naar links om je bugmelding te delen"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Raak aan om je foutenrapport te delen"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Foutenrapporten bevatten gegevens uit de verschillende logbestanden van het systeem, waaronder persoonlijke en privégegevens. Deel foutenrapporten alleen met apps en mensen die u vertrouwt."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Dit bericht de volgende keer weergeven"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Foutenrapporten"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"naamloos"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Details"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Screenshot is gemaakt."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot kan niet worden gemaakt."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Details van bugrapport"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Bestandsnaam"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titel"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Gedetailleerde beschrijving"</string> diff --git a/packages/Shell/res/values-pa-rIN/strings.xml b/packages/Shell/res/values-pa-rIN/strings.xml index 96addbf037f6..dc2277f58c79 100644 --- a/packages/Shell/res/values-pa-rIN/strings.xml +++ b/packages/Shell/res/values-pa-rIN/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"ਸ਼ੈਲ"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"ਬੱਗ ਰਿਪੋਰਟ ਸਿਰਜੀ ਜਾ ਰਹੀ ਹੈ"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"ਬਗ ਰਿਪੋਰਟ ਕੈਪਚਰ ਕੀਤੀ"</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_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="3559904746859400732">"ਆਪਣੀ ਬਗ ਰਿਪੋਰਟ ਸ਼ੇਅਰ ਕਰਨ ਲਈ ਛੋਹਵੋ"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"ਆਪਣੀ ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"ਬਗ ਰਿਪੋਰਟਾਂ ਵਿੱਚ ਸਿਸਟਮ ਦੀਆਂ ਭਿੰਨ ਲੌਗ ਫਾਈਲਾਂ ਦਾ ਡਾਟਾ ਹੁੰਦਾ ਹੈ, ਨਿੱਜੀ ਅਤੇ ਪ੍ਰਾਈਵੇਟ ਜਾਣਕਾਰੀ ਸਮੇਤ। ਕੇਵਲ ਉਹਨਾਂ ਐਪਸ ਅਤੇ ਲੋਕਾਂ ਨਾਲ ਬਗ ਰਿਪੋਰਟਾਂ ਸ਼ੇਅਰ ਕਰੋ, ਜਿਹਨਾਂ ਤੇ ਤੁਸੀਂ ਭਰੋਸਾ ਕਰਦੇ ਹੋ।"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ਅਗਲੀ ਵਾਰ ਇਹ ਸੁਨੇਹਾ ਦਿਖਾਓ"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"ਬਗ ਰਿਪੋਰਟਾਂ"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"ਬਿਨਾਂ-ਨਾਮ"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"ਵੇਰਵੇ"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸਫਲਤਾਪੂਰਵਕ ਲਿਆ ਗਿਆ।"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸਫਲਤਾਪੂਰਵਕ ਲਿਆ ਗਿਆ।"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਨਹੀਂ ਲਿਆ ਜਾ ਸਕਿਆ।"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"ਬੱਗ ਰਿਪੋਰਟ ਵੇਰਵੇ"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"ਬੱਗ ਰਿਪੋਰਟ <xliff:g id="ID">#%d</xliff:g> ਵੇਰਵੇ"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ਫ਼ਾਈਲ ਨਾਮ"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"ਸਿਰਲੇਖ"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"ਵਿਸਥਾਰ ਸਹਿਤ ਵਰਣਨ"</string> diff --git a/packages/Shell/res/values-pl/strings.xml b/packages/Shell/res/values-pl/strings.xml index 7a67ac686286..1a26d5e14fda 100644 --- a/packages/Shell/res/values-pl/strings.xml +++ b/packages/Shell/res/values-pl/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Powłoka"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Trwa generowanie raportu o błędzie"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Raport o błędach został zapisany"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Dodaję szczegóły do raportu o błędzie"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Czekaj..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Przesuń palcem w lewo, by udostępnić swoje zgłoszenie błędu"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Kliknij, by udostępnić raport o błędach"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Raporty o błędach zawierają dane z różnych plików dzienników systemu, w tym dane osobowe i prywatne. Udostępniaj je tylko aplikacjom i osobom, którym ufasz."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Pokaż ten komunikat następnym razem"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Raporty o błędach"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"bez nazwy"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Szczegóły"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Zrzut ekranu"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Zrobiono zrzut ekranu."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Nie udało się zrobić zrzutu ekranu."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Szczegóły zgłoszenia błędu"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nazwa pliku"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Tytuł"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Szczegółowy opis"</string> diff --git a/packages/Shell/res/values-pt-rBR/strings.xml b/packages/Shell/res/values-pt-rBR/strings.xml index 471e959c9488..0e609ba35229 100644 --- a/packages/Shell/res/values-pt-rBR/strings.xml +++ b/packages/Shell/res/values-pt-rBR/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Um relatório do bug está sendo gerado"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Relatório de bugs capturado"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Adicionando detalhes ao relatório do bug"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Aguarde…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Deslize para a esquerda para compartilhar seu relatório de bugs"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toque para compartilhar seu relatório de bugs"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Os relatórios de bugs contêm dados de diversos arquivos de registro do sistema, inclusive informações pessoais e particulares. Compartilhe relatórios de bugs somente com apps e pessoas nos quais você confia."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostrar esta mensagem da próxima vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Relatórios de bugs"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sem nome"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalhes"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Capturas de tela"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Captura de tela concluída."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Não foi possível fazer a captura de tela."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalhes do relatório do bug"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome do arquivo"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descrição detalhada"</string> diff --git a/packages/Shell/res/values-pt-rPT/strings.xml b/packages/Shell/res/values-pt-rPT/strings.xml index ed78f55a1211..b6f90fefe56e 100644 --- a/packages/Shell/res/values-pt-rPT/strings.xml +++ b/packages/Shell/res/values-pt-rPT/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"O relatório de erro está a ser criado"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Relatório de erros capturado"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"A adicionar detalhes ao relatório de erro"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Aguarde..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Deslizar rapidamente para a esquerda para partilhar o seu relatório de erros"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toque para partilhar o relatório de erros"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Os relatórios de erros incluem dados de vários ficheiros de registo do sistema, nomeadamente informações pessoais e privadas. Partilhe relatórios de erros apenas com aplicações e pessoas fidedignas."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostrar esta mensagem da próxima vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Relatórios de erros"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sem nome"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalhes"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Captura de ecrã"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Captura de ecrã tirada com êxito."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Não foi possível tirar a captura de ecrã."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalhes do relatório de erro"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome do ficheiro"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descrição detalhada"</string> diff --git a/packages/Shell/res/values-pt/strings.xml b/packages/Shell/res/values-pt/strings.xml index 471e959c9488..0e609ba35229 100644 --- a/packages/Shell/res/values-pt/strings.xml +++ b/packages/Shell/res/values-pt/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Um relatório do bug está sendo gerado"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Relatório de bugs capturado"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Adicionando detalhes ao relatório do bug"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Aguarde…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Deslize para a esquerda para compartilhar seu relatório de bugs"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toque para compartilhar seu relatório de bugs"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Os relatórios de bugs contêm dados de diversos arquivos de registro do sistema, inclusive informações pessoais e particulares. Compartilhe relatórios de bugs somente com apps e pessoas nos quais você confia."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostrar esta mensagem da próxima vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Relatórios de bugs"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"sem nome"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalhes"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Capturas de tela"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Captura de tela concluída."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Não foi possível fazer a captura de tela."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalhes do relatório do bug"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Nome do arquivo"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Título"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descrição detalhada"</string> diff --git a/packages/Shell/res/values-ro/strings.xml b/packages/Shell/res/values-ro/strings.xml index af67bc6d5209..633570507e1a 100644 --- a/packages/Shell/res/values-ro/strings.xml +++ b/packages/Shell/res/values-ro/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Se generează raportul de eroare"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Raportul despre erori a fost creat"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Se adaugă detaliile la raportul de eroare"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Așteptați…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Glisați la stânga pentru a trimite raportul de erori"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Atingeți pentru a permite accesul la raportul despre erori"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Rapoartele despre erori conțin date din diferite fișiere de jurnal ale sistemului, inclusiv informații private și personale. Permiteți accesul la rapoartele despre erori numai aplicațiilor și persoanelor în care aveți încredere."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Afișați acest mesaj data viitoare"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapoarte de erori"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"fără nume"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalii"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Captură de ecran"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Captura de ecran a fost făcută."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Captura de ecran nu a putut fi făcută."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detalii privind raportul de eroare"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Numele fișierului"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titlu"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Descriere detaliată"</string> diff --git a/packages/Shell/res/values-ru/strings.xml b/packages/Shell/res/values-ru/strings.xml index a5e2bd2807ab..6b2ed1e5891f 100644 --- a/packages/Shell/res/values-ru/strings.xml +++ b/packages/Shell/res/values-ru/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Оболочка"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Создание отчета об ошибке…"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Отчет об ошибке сохранен"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"Нажмите, чтобы отправить отчет об ошибках"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Отчеты об ошибках содержат данные различных системных журналов и могут включать личную информацию. Рекомендуем открывать к ним доступ только лицам и приложениям, заслуживающим доверие."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Показать это сообщение в следующий раз"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Отчеты об ошибках"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"без названия"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Детали"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Скриншоты"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Скриншот готов"</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Не удалось сделать скриншот"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Детали отчета об ошибке"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Название файла"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Название"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Подробное описание"</string> diff --git a/packages/Shell/res/values-si-rLK/strings.xml b/packages/Shell/res/values-si-rLK/strings.xml index 866c0f7c788f..289ac8831eb6 100644 --- a/packages/Shell/res/values-si-rLK/strings.xml +++ b/packages/Shell/res/values-si-rLK/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"ෂෙල්"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"දෝෂ වාර්තාවක් ජනනය කරමින් පවතී"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"දෝෂ වාර්තාව ලබාගන්නා ලදි"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"ඔබගේ දෝෂ වාර්තාව බෙදා ගැනීමට ස්පර්ශ කරන්න"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"පුද්ගලික සහ පෞද්ගලික තොරතුරු ඇතුළත්ව පද්ධතියේ විවිධ ලොග් ගොනු වල දත්ත දෝෂ වාර්තාවේ අඩංගු වේ. ඔබට විශ්වාසවන්ත යෙදුම් සහ පුද්ගලයින් සමඟ පමණක් දෝෂ වාර්තා බෙදා ගන්න."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"ඊළඟ වෙලාවේ මෙම පණිවිඩය පෙන්වන්න"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"දෝෂ වාර්තා"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"නම් නොකළ"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"විස්තර"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"තිර රුව"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"සාර්ථකව තිර රුවක් ගන්නා ලදී."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"තිර රුවක් ගත නොහැකි විය."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"දෝෂ වාර්තා විස්තර"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"ගොනුවේ නම"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"මාතෘකාව"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"සවිස්තර විස්තරය"</string> diff --git a/packages/Shell/res/values-sk/strings.xml b/packages/Shell/res/values-sk/strings.xml index f207480ec552..9eb6572606e2 100644 --- a/packages/Shell/res/values-sk/strings.xml +++ b/packages/Shell/res/values-sk/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Prostredie"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Generuje sa hlásenie chyby"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Hlásenie o chybách bolo vytvorené"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Hlásenie o chybách môžete zdielať klepnutím"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Správy o chybách obsahujú údaje z rôznych súborov denníkov systému vrátane osobných a súkromných informácií. Zdieľajte ich iba s dôveryhodnými aplikáciami a ľuďmi."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Zobraziť túto správu nabudúce"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Hlásenia chýb"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"bez názvu"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Podrobnosti"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Snímka obrazovky"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Snímka obrazovky bola zaznamenaná."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Snímku obrazovky sa nepodarilo zaznamenať."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Podrobnosti hlásenia chyby"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Názov súboru"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Názov"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Podrobný popis"</string> diff --git a/packages/Shell/res/values-sl/strings.xml b/packages/Shell/res/values-sl/strings.xml index c249961eba4e..f37267eb186e 100644 --- a/packages/Shell/res/values-sl/strings.xml +++ b/packages/Shell/res/values-sl/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Lupina"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Poročilo o napakah se pripravlja"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Poročilo o napaki je posneto"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Poročilo o napaki <xliff:g id="ID">#%d</xliff:g> se pripravlja"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Poročilo o napaki <xliff:g id="ID">#%d</xliff:g> zajeto"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Dodajanje podrobnosti v poročilo o napakah"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Počakajte ..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Povlecite v levo, če želite poslati sporočilo o napaki"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Dotaknite se, če želite deliti sporočilo o napaki z drugimi"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Dotaknite se, če želite poročilo o napaki dati v skupno rabo"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Poročila o napakah vsebujejo podatke iz različnih dnevniških datotek sistema, vključno z osebnimi in zasebnimi podatki. Poročila o napakah delite samo z aplikacijami in ljudmi, ki jim zaupate."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Pokaži to sporočilo naslednjič"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Poročila o napakah"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"neimenovano"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Podrobnosti"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Posnetek zaslona"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Posnetek zaslon je bil uspešno ustvarjen."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Posnetek zaslona je bil uspešno ustvarjen."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Posnetka zaslon ni bilo mogoče ustvariti."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Podrobnosti o poročilu o napakah"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Podrobnosti poročila o napaki <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Ime datoteke"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Naslov"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Podroben opis"</string> diff --git a/packages/Shell/res/values-sq-rAL/strings.xml b/packages/Shell/res/values-sq-rAL/strings.xml index 8a306b333ca9..5e3c70695900 100644 --- a/packages/Shell/res/values-sq-rAL/strings.xml +++ b/packages/Shell/res/values-sq-rAL/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Guaska"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Po krijohet raporti i defekteve në kod"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Raporti i defektit në kod u regjistrua"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Raporti i defekteve në kod <xliff:g id="ID">#%d</xliff:g> po krijohet"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Raporti i defekteve në kod <xliff:g id="ID">#%d</xliff:g> u regjistrua"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Po shtohen detajet te raporti i defekteve në kod"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Qëndro në pritje..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Rrëshqit majtas për të ndarë raportin e defektit në kod"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Prek për të ndarë raportin e defektit në kod"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Trokit për të ndarë raportin e defekteve në kod"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Raportet e gabimeve përmbajnë të dhëna nga skedarë të ndryshëm ditarësh sistemi, përfshi informacione personale dhe private. Shpërndaji publikisht raportet e gabimeve vetëm me aplikacionet dhe personat që iu beson."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Tregoje këtë mesazh herën tjetër"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Raportet e gabimeve"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"e paemërtuar"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detajet"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Pamja e ekranit"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Pamja e ekranit u realizua me sukses."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Pamja e ekranit u regjistrua me sukses."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Pamja e ekranit nuk mund të realizohej."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Detajet e raportimit të gabimeve në kod"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Detajet e raportit të defekteve në kod <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Emri i skedarit"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Titulli"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Përshkrimi i detajuar"</string> diff --git a/packages/Shell/res/values-sr/strings.xml b/packages/Shell/res/values-sr/strings.xml index 9bff65cd727c..55119b633080 100644 --- a/packages/Shell/res/values-sr/strings.xml +++ b/packages/Shell/res/values-sr/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Извештај о грешци се генерише"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Извештај о грешци је снимљен"</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_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="3559904746859400732">"Додирните да бисте делили извештај о грешци"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Додирните да бисте делили извештај о грешци"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Извештаји о грешкама садрже податке из различитих системских датотека евиденције, укључујући личне и приватне податке. Делите извештаје о грешкама само са апликацијама и људима у које имате поверења."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Прикажи ову поруку следећи пут"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Извештаји о грешкама"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"неименовано"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Детаљи"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Снимци екрана"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Снимање екрана је успело."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Снимак екрана је направљен."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Снимање екрана није успело."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Детаљи извештаја о грешци"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Детаљи извештаја о грешци <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Назив датотеке"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Наслов"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Детаљни опис"</string> diff --git a/packages/Shell/res/values-sv/strings.xml b/packages/Shell/res/values-sv/strings.xml index fb962bfbf863..4a6e477efc68 100644 --- a/packages/Shell/res/values-sv/strings.xml +++ b/packages/Shell/res/values-sv/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Skal"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Felrapporten genereras"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Felrapporten har skapats"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Lägger till information i felrapporten"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Vänta …"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Svep åt vänster om du vill dela felrapporten"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Tryck om du vill dela felrapporten"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Felrapporter innehåller data från systemets olika loggfiler, inklusive personliga och privata uppgifter. Dela bara felrapporter med personer du litar på."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Visa det här meddelandet nästa gång"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Felrapporter"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"namnlös"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Information"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Skärmdump"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"En skärmdump har tagits."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Det gick inte att ta skrämdump."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Information för felrapporten"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Filnamn"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Namn"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detaljerad beskrivning"</string> diff --git a/packages/Shell/res/values-sw/strings.xml b/packages/Shell/res/values-sw/strings.xml index de464148fe32..56aaf98691c0 100644 --- a/packages/Shell/res/values-sw/strings.xml +++ b/packages/Shell/res/values-sw/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Ganda"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Inatayarisha ripoti ya hitilafu"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Ripoti ya hitilafu imenaswa"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Inaongeza maelezo kwenye ripoti ya hitilafu"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Tafadhali subiri…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Telezesha kidole kushoto ili ushiriki ripoti yako ya hitilafu"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Gusa ili ushiriki ripoti yako ya hitilafu"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Ripoti ya hitilafu ina data kutoka kwenye faili za kumbukumbu mbalimbali za mfumo, pamoja na maelezo ya kibinafsi na faragha. Shiriki ripoti ya hitilafu na programu na watu unaowaamini pekee."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Onyesha ujumbe huu wakati mwingine"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Ripoti za hitilafu"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"Isiyo na jina"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Maelezo"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Picha ya skrini"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Imepiga picha ya skrini."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Haikupiga picha ya skrini."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Maelezo kuhusu ripoti ya hitilafu"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Jina la faili"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Kichwa"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Maelezo ya kina"</string> diff --git a/packages/Shell/res/values-ta-rIN/strings.xml b/packages/Shell/res/values-ta-rIN/strings.xml index 15c7014ab5dc..c6ecec65b729 100644 --- a/packages/Shell/res/values-ta-rIN/strings.xml +++ b/packages/Shell/res/values-ta-rIN/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"ஷெல்"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"பிழை அறிக்கை உருவாக்கப்படுகிறது"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"பிழை அறிக்கைகள் படமெடுக்கப்பட்டன"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"உங்கள் பிழை அறிக்கையைப் பகிர, தொடவும்"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"பிழை அறிக்கைகளில், சொந்த வாழ்க்கை மற்றும் தனிப்பட்ட தகவல் உள்பட கணினியின் பல்வேறு பதிவுகளில் உள்ள தரவு இருக்கும். நீங்கள் நம்பும் பயன்பாடுகள் மற்றும் நபர்களுடன் மட்டும் பிழை அறிக்கைகளைப் பகிரவும்."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"இந்தச் செய்தியை அடுத்த முறைக் காட்டு"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"பிழை அறிக்கைகள்"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"பெயரிடப்படாதது"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"விவரங்கள்"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ஸ்கிரீன் ஷாட்"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"ஸ்கிரீன் ஷாட் எடுக்கப்பட்டது."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ஸ்கிரீன் ஷாட்டை எடுக்க முடியவில்லை."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"பிழை அறிக்கை விவரங்கள்"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"கோப்புப்பெயர்"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"தலைப்பு"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"விரிவான விளக்கம்"</string> diff --git a/packages/Shell/res/values-te-rIN/strings.xml b/packages/Shell/res/values-te-rIN/strings.xml index c84ec9a64342..6ba816b19646 100644 --- a/packages/Shell/res/values-te-rIN/strings.xml +++ b/packages/Shell/res/values-te-rIN/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"షెల్"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"బగ్ నివేదిక ఉత్పాదించబడుతోంది"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"బగ్ నివేదిక క్యాప్చర్ చేయబడింది"</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_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="3559904746859400732">"మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి తాకండి"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి నొక్కండి"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"బగ్ నివేదికలు వ్యక్తిగతమైన మరియు రహస్యమైన సమాచారంతో సహా సిస్టమ్ యొక్క విభిన్న లాగ్ ఫైల్ల్లోని డేటాను కలిగి ఉంటాయి. కనుక బగ్ నివేదికలను మీరు విశ్వసించే అనువర్తనాలు మరియు వ్యక్తులతో మాత్రమే భాగస్వామ్యం చేయండి."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"తదుపరిసారి ఈ సందేశాన్ని చూపు"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"బగ్ నివేదికలు"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"పేరు లేనివి"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"వివరాలు"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"స్క్రీన్షాట్"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"స్క్రీన్షాట్ విజయవంతంగా తీయబడింది."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"స్క్రీన్షాట్ విజయవంతంగా తీయబడింది."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"స్క్రీన్షాట్ను తీయడం సాధ్యపడలేదు."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"బగ్ నివేదిక వివరాలు"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"బగ్ నివేదిక <xliff:g id="ID">#%d</xliff:g> వివరాలు"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ఫైల్ పేరు"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"శీర్షిక"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"సమగ్ర వివరణ"</string> diff --git a/packages/Shell/res/values-th/strings.xml b/packages/Shell/res/values-th/strings.xml index f29978e81bae..1e42a3184a8b 100644 --- a/packages/Shell/res/values-th/strings.xml +++ b/packages/Shell/res/values-th/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"กำลังสร้างรายงานข้อบกพร่อง"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"จับภาพรายงานข้อบกพร่องแล้ว"</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_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="3559904746859400732">"แตะเพื่อแชร์รายงานข้อบกพร่องของคุณ"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"แตะเพื่อแบ่งปันรายงานข้อบกพร่องของคุณ"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"รายงานข้อบกพร่องมีข้อมูลจากไฟล์บันทึกต่างๆ ของระบบ รวมถึงข้อมูลส่วนตัว แชร์รายงานข้อบกพร่องกับแอปและบุคคลที่คุณไว้ใจเท่านั้น"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"แสดงข้อความนี้ในครั้งต่อไป"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"รายงานข้อบกพร่อง"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"ไม่มีชื่อ"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"รายละเอียด"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ภาพหน้าจอ"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"จับภาพหน้าจอสำเร็จแล้ว"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"จับภาพหน้าจอสำเร็จแล้ว"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ไม่สามารถจับภาพหน้าจอได้"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"รายละเอียดรายงานข้อบกพร่อง"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"รายละเอียดรายงานข้อบกพร่อง <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"ชื่อไฟล์"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"ชื่อ"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"คำอธิบายโดยละเอียด"</string> diff --git a/packages/Shell/res/values-tl/strings.xml b/packages/Shell/res/values-tl/strings.xml index c12191a1e849..432eb9053806 100644 --- a/packages/Shell/res/values-tl/strings.xml +++ b/packages/Shell/res/values-tl/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Binubuo na ang ulat ng bug"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Na-capture ang ulat ng bug"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Binubuo na ang ulat ng bug na <xliff:g id="ID">#%d</xliff:g>"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Na-capture ang ulat ng bug na <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Pagdaragdag ng mga detalye sa ulat ng bug"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Mangyaring maghintay..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Mag-swipe pakaliwa upang ibahagi ang iyong ulat ng bug"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Pindutin upang ibahagi ang iyong ulat ng bug"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Mag-tap upang ibahagi ang iyong ulat ng bug"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Naglalaman ang mga ulat ng bug ng data mula sa iba\'t ibang file ng log ng system, kabilang ang personal at pribadong impormasyon. Magbahagi lang ng mga ulat ng bug sa apps at mga tao na pinagkakatiwalaan mo."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Ipakita ang mensaheng ito sa susunod"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Mga ulat sa bug"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"walang pangalan"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Mga Detalye"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Nakunan ng screenshot."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Matagumpay na nakakuha ng screenshot."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Hindi makunan ng screenshot."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Mga detalye ng ulat ng bug"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Mga detalye ng ulat ng bug na <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Pamagat"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Detalyadong paglalarawan"</string> diff --git a/packages/Shell/res/values-tr/strings.xml b/packages/Shell/res/values-tr/strings.xml index 3f562d7d9416..639048a45294 100644 --- a/packages/Shell/res/values-tr/strings.xml +++ b/packages/Shell/res/values-tr/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Kabuk"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Hata raporu oluşturuluyor"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Hata raporu kaydedildi"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Hata raporuna ayrıntılar ekleniyor"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Lütfen bekleyin…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Hata raporunuzu paylaşmak için hızlıca sola kaydırın"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Hata raporunuzu paylaşmak için dokunun"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Hata raporları, kişisel ve özel bilgiler dahil olmak üzere sistemin çeşitli günlük dosyalarından veriler içerir. Hata raporlarını sadece güvendiğiniz uygulamalar ve kişilerle paylaşın."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Bir dahaki sefere bu iletiyi göster"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Hata raporları"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"adsız"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Ayrıntılar"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Ekran görüntüsü"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Ekran görüntüsü başarıyla alındı."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Ekran görüntüsü alınamadı."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Hata raporu ayrıntıları"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Dosya adı"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Başlık"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Ayrıntılı açıklama"</string> diff --git a/packages/Shell/res/values-uk/strings.xml b/packages/Shell/res/values-uk/strings.xml index 93e65110868d..843e580156b0 100644 --- a/packages/Shell/res/values-uk/strings.xml +++ b/packages/Shell/res/values-uk/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Оболонка"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Генерується повідомлення про помилку"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Звіт про помилки створено"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"Торкніться, щоб надіслати звіт про помилки"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"Звіти про помилки містять дані з різних файлів журналу системи, зокрема особисті та конфіденційні. Надсилайте звіт про помилки лише тим, кому довіряєте."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Показати це повідомлення наступного разу"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Звіти про помилки"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"без назви"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Деталі"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Знімок екрана"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Знімок екрана зроблено."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Не вдалося зробити знімок екрана."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Деталі повідомлення про помилку"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Назва файлу"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Назва"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Детальний опис"</string> diff --git a/packages/Shell/res/values-ur-rPK/strings.xml b/packages/Shell/res/values-ur-rPK/strings.xml index 52a45a033b28..2329fa99bb9c 100644 --- a/packages/Shell/res/values-ur-rPK/strings.xml +++ b/packages/Shell/res/values-ur-rPK/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"شیل"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"بگ رپورٹ تخلیق ہو رہی ہے"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"بَگ رپورٹ کیپچر کر لی گئی"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"اپنی بَگ رپورٹ کا اشتراک کرنے کیلئے ٹچ کریں"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"بَگ رپورٹس میں سسٹم کی مختلف لاگ فائلوں سے ڈیٹا شامل ہوتا ہے، بشمول ذاتی اور نجی معلومات۔ بَگ رپورٹس کا اشتراک صرف اپنے بھروسے مند ایپس اور لوگوں کے ساتھ کریں۔"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"یہ پیغام اگلی بار دکھائیں"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"بگ رپورٹس"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"بغیر نام"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"تفصیلات"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"اسکرین شاٹ"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"اسکرین شاٹ کامیابی سے لے لیا گیا۔"</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"سکرین شاٹ نہیں لیا جا سکا۔"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"بگ رپورٹ کی تفصیلات"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"فائل کا نام"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"عنوان"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"تفصیلی وضاحت"</string> diff --git a/packages/Shell/res/values-uz-rUZ/strings.xml b/packages/Shell/res/values-uz-rUZ/strings.xml index 56e096577721..7b6d20a09e2c 100644 --- a/packages/Shell/res/values-uz-rUZ/strings.xml +++ b/packages/Shell/res/values-uz-rUZ/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Terminal"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Xatoliklar hisoboti tayyorlanmoqda"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Xatolik hisobotini yozib olindi"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <string name="bugreport_updating_title" msgid="4423539949559634214">"Xatoliklar hisobotiga tafsilotlar qo‘shilmoqda"</string> <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="3559904746859400732">"Xatolik hisobotini bo‘lishish uchun barmog‘ingizni tegizing."</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <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> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"nomsiz"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Tafsilotlar"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Skrinshot"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Skrinshot tayyor."</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Skrinshot olib bo‘lmadi."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Xatoliklar hisoboti tafsilotlari"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"Fayl nomi"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Nomi"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Batafsil ta’rif"</string> diff --git a/packages/Shell/res/values-vi/strings.xml b/packages/Shell/res/values-vi/strings.xml index 2642b89ff034..16ffaffdf1cb 100644 --- a/packages/Shell/res/values-vi/strings.xml +++ b/packages/Shell/res/values-vi/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Báo cáo lỗi đang được tạo"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Báo cáo lỗi đã được chụp"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Báo cáo lỗi <xliff:g id="ID">#%d</xliff:g> đang được tạo"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Đã chụp báo cáo lỗi <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Đang thêm thông tin chi tiết vào báo cáo lỗi"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Vui lòng đợi…"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Vuốt sang trái để chia sẻ báo cáo lỗi của bạn"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Chạm để chia sẻ báo cáo lỗi của bạn"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Nhấn để chia sẻ báo cáo lỗi của bạn"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Các báo cáo lỗi chứa dữ liệu từ nhiều tệp nhật ký khác nhau của hệ thống, bao gồm cả thông tin cá nhân và riêng tư. Chỉ chia sẻ báo cáo lỗi với các ứng dụng và những người mà bạn tin tưởng."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Hiển thị thông báo này vào lần tới"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Báo cáo lỗi"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"chưa được đặt tên"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Chi tiết"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Ảnh chụp màn hình"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Đã chụp ảnh màn hình thành công."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Đã chụp ảnh màn hình thành công."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Không thể chụp ảnh màn hình."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Chi tiết báo cáo lỗi"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Chi tiết báo cáo lỗi <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Tên tệp"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Tiêu đề"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Mô tả chi tiết"</string> diff --git a/packages/Shell/res/values-zh-rCN/strings.xml b/packages/Shell/res/values-zh-rCN/strings.xml index c933961d7871..a5c5730dd7ab 100644 --- a/packages/Shell/res/values-zh-rCN/strings.xml +++ b/packages/Shell/res/values-zh-rCN/strings.xml @@ -17,12 +17,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"正在生成错误报告"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"已抓取错误报告"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> <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="3559904746859400732">"触摸即可分享您的错误报告"</string> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> <string name="bugreport_confirm" msgid="5130698467795669780">"错误报告包含的数据来自于系统的各个日志文件,其中包含个人信息和隐私信息。请务必只与您信任的应用和用户分享错误报告。"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"下次再显示这条讯息"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"错误报告"</string> @@ -30,9 +33,11 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"未命名"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"详细信息"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"屏幕截图"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"已成功截图。"</string> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"无法截图。"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"错误报告详细信息"</string> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> <string name="bugreport_info_name" msgid="4414036021935139527">"文件名"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"标题"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"详细说明"</string> diff --git a/packages/Shell/res/values-zh-rHK/strings.xml b/packages/Shell/res/values-zh-rHK/strings.xml index 7a35eef8980d..a6360f18aa30 100644 --- a/packages/Shell/res/values-zh-rHK/strings.xml +++ b/packages/Shell/res/values-zh-rHK/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"命令介面"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"正在產生錯誤報告"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"已擷取錯誤報告"</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_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="3559904746859400732">"輕觸即可分享您的錯誤報告"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"輕按即可分享錯誤報告"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"錯誤報告中有來自系統各個記錄檔案的資料,包括個人和私人資料。請只與您信任的應用程式和使用者分享錯誤報告。"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"下次再顯示這則訊息"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"錯誤報告"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"未命名"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"詳細資訊"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"螢幕擷取畫面"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"成功拍攝螢幕擷取畫面。"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"已成功拍攝螢幕擷取畫面。"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"無法擷取螢幕畫面。"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"錯誤報告詳情"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"錯誤報告 <xliff:g id="ID">#%d</xliff:g> 的詳細資料"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"檔案名稱"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"標題"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"詳細說明"</string> diff --git a/packages/Shell/res/values-zh-rTW/strings.xml b/packages/Shell/res/values-zh-rTW/strings.xml index ec66878a7237..7a1ab77622a7 100644 --- a/packages/Shell/res/values-zh-rTW/strings.xml +++ b/packages/Shell/res/values-zh-rTW/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"殼層"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"正在產生錯誤報告"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"已擷取錯誤報告"</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_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="3559904746859400732">"輕觸即可分享您的錯誤報告"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"輕按即可分享錯誤報告"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"錯誤報告的資料來自系統各個紀錄檔,包括個人和私密資訊。請務必只與您信任的應用程式和使用者分享錯誤報告。"</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"下次仍顯示這則訊息"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"錯誤報告"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"未命名"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"詳細資料"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"螢幕擷取畫面"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"已成功拍攝螢幕擷取畫面。"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"已成功拍攝螢幕擷取畫面。"</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"無法拍攝螢幕擷取畫面。"</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"錯誤報告詳細資料"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"錯誤報告 <xliff:g id="ID">#%d</xliff:g> 的詳細資料"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"檔案名稱"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"標題"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"詳細說明"</string> diff --git a/packages/Shell/res/values-zu/strings.xml b/packages/Shell/res/values-zu/strings.xml index c2642244f481..29b7dd8329bc 100644 --- a/packages/Shell/res/values-zu/strings.xml +++ b/packages/Shell/res/values-zu/strings.xml @@ -17,12 +17,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"I-Shell"</string> - <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Kukhiqizwa umbiko wesiphazamisi"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Umbiko wesiphazamisi uthwetshuliwe"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Umbiko wesiphazamisi ongu-<xliff:g id="ID">#%d</xliff:g> uyacutshungulwa"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Umbiko wesiphazamisi ongu-<xliff:g id="ID">#%d</xliff:g> uthwetshuliwe"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Ingeza imininingwane kumbiko wesiphazamisi"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Sicela ulinde..."</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Swayiphela kwesokunxele ukuze wabelane umbiko wesiphazamiso sakho"</string> - <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Thinta ukuze wabelane ngombiko wakho wesiphazamisi"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Thepha ukuze wabelane ngombiko wakho wesiphazamisi"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Imibiko yeziphazamisi iqukethe idatha yamafayela wokungena ahlukile wesistimu, afaka ulwazi lomuntu siqu noma lobumfihlo. Yabelana kuphela ngemibiko yeziphazamisi nezinhlelo zokusebenza nabantu obathembayo."</string> <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Bonisa lo mlayezo ngesikhathi esilandelayo"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Imibiko yeziphazamiso"</string> @@ -30,9 +30,9 @@ <string name="bugreport_unnamed" msgid="2800582406842092709">"awunikiwe igama"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Imininingwane"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Isithombe-skrini"</string> - <string name="bugreport_screenshot_taken" msgid="7175343181767429088">"Isithombe-skrini sithathwe ngempumelelo."</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Isithombe-skrini sithathwe ngempumelelo."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Isithombe-skrini asikwazanga ukuthathwa."</string> - <string name="bugreport_info_dialog_title" msgid="3113549839798564645">"Imininingwane yombiko wesiphazamisi"</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Imininingwane yombiko wesiphazamisi ongu-<xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"Igama lefayela"</string> <string name="bugreport_info_title" msgid="5599558206004371052">"Isihloko"</string> <string name="bugreport_info_description" msgid="4117088998733546784">"Incazelo enemininingwane"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 8b1e568af523..96f24b8a4e8c 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -446,7 +446,7 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Mostra els segons del rellotge a la barra d\'estat. Això pot afectar la durada de la bateria."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Reorganitza Configuració ràpida"</string> <string name="show_brightness" msgid="6613930842805942519">"Mostra la brillantor a Configuració ràpida"</string> - <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"Accelerador per activar pantalla dividida en lliscar amunt"</string> + <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"Activa la pantalla dividida en lliscar amunt"</string> <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Activa el gest per entrar al mode de pantalla dividida en lliscar cap amunt des del botó Visió general"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vols activar el Bluetooth?"</string> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index 29efca3c004f..d2d507878418 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -446,7 +446,7 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Абал тилкесинен сааттын секунддары көрсөтүлсүн. Батареянын кубаты көбүрөөк сарпталышы мүмкүн."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Ыкчам жөндөөлөрдү кайра коюу"</string> <string name="show_brightness" msgid="6613930842805942519">"Ыкчам жөндөөлөрдөн жарык деңгээлин көрсөтүү"</string> - <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"Өйдө серпип экранды бөлүүчү ылдамдаткычты иштетүү"</string> + <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"Өйдө серпип экранды бөлгүчтү иштетүү"</string> <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Сереп баскычынан өйдө серпип, экранды бөлүү режимин киргизүү үчүн жаңсоону иштетиңиз"</string> <string name="experimental" msgid="6198182315536726162">"Сынамык"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth күйгүзүлсүнбү?"</string> @@ -520,5 +520,5 @@ <string name="keycode_description" msgid="1403795192716828949">"Бул баскычтын жардамы менен баскычтоптогу баскычтарды чабыттоо тилкесине кошууга болот. Ал үчүн баскычты жана тийиштүү баскычтын көрүнүшүн тандаңыз."</string> <string name="select_keycode" msgid="7413765103381924584">"Баскычтоптогу баскычты тандоо"</string> <string name="preview" msgid="9077832302472282938">"Алдын ала көрүү"</string> - <string name="drag_to_add_tiles" msgid="7058945779098711293">"Тайлдарды кошуу үчүн сүйрөңүз"</string> + <string name="drag_to_add_tiles" msgid="7058945779098711293">"Керектүү нерселерди сүйрөп кошуңуз"</string> </resources> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 564adffe2456..ec86492fb844 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -447,7 +447,7 @@ <string name="qs_rearrange" msgid="8060918697551068765">"ຈັດວາງການຕັ້ງຄ່າດ່ວນຄືນໃໝ່"</string> <string name="show_brightness" msgid="6613930842805942519">"ສະແດງຄວາມແຈ້ງຢູ່ໃນການຕັ້ງຄ່າດ່ວນ"</string> <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"ເປີດໃຊ້ຕົວເລັ່ງຄວາມໄວການປັດຂຶ້ນຂອງໜ້າຈໍແບບແຍກກັນ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ເປີດໃຊ້ທ່າທາງເພື່ອເຂົ້າສູ່ໜ້າຈໍແບບແຍກກັນ ໂດຍການປັດຂຶ້ນຈາກປຸ່ມພາບລວມ"</string> + <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ເປີດໃຊ້ທ່າທາງເພື່ອເຂົ້າສູ່ໜ້າຈໍແບບແຍກກັນ ໂດຍການປັດຂຶ້ນຈາກປຸ່ມພາບຮວມ"</string> <string name="experimental" msgid="6198182315536726162">"ຍັງຢູ່ໃນການທົດລອງ"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ເປີດໃຊ້ Bluetooth ບໍ່?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"ເພື່ອເຊື່ອມຕໍ່ແປ້ນພິມຂອງທ່ານກັບແທັບເລັດຂອງທ່ານ, ກ່ອນອື່ນໝົດທ່ານຕ້ອງເປີດ Bluetooth."</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index bfc2070d2a94..e00e8a7359c6 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -447,7 +447,7 @@ <string name="qs_rearrange" msgid="8060918697551068765">"အမြန် ဆက်တင်များကို ပြန်စီစဉ်ရန်"</string> <string name="show_brightness" msgid="6613930842805942519">"အမြန် ဆက်တင်များထဲက တောက်ပမှုကို ပြရန်"</string> <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"မျက်နှာပြင်ခွဲကြည့်ရန် အပေါ်သို့ပွတ်ဆွဲခြင်း လုပ်ဆောင်ချက်ကိုဖွင့်ပါ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ခြုံကြည့်သည့်ခလုတ်မှ အပေါ်သို့ပွတ်ဆွဲခြင်းဖြင့် မျက်နှာပြင်ခွဲကြည့်ရန် လက်အမူအယာကိုဖွင့်ပါ"</string> + <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ခြုံကြည့်သည့်ခလုတ်မှ အပေါ်သို့ပွတ်ဆွဲခြင်းဖြင့် မျက်နှာပြင်ခွဲကြည့်ရန် လက်ဟန်ကိုဖွင့်ပါ"</string> <string name="experimental" msgid="6198182315536726162">"စမ်းသပ်ရေး"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ဘလူးတုသ် ဖွင့်ရမလား။"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"ကီးဘုတ်ကို တပ်ဘလက်နှင့် ချိတ်ဆက်ရန်၊ ပမထဦးစွာ ဘလူးတုသ်ကို ဖွင့်ပါ။"</string> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index b26ed6b56ef8..af8502113261 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -447,7 +447,7 @@ <string name="qs_rearrange" msgid="8060918697551068765">"द्रुत सेटिङहरू पुनः व्यवस्थित गर्नुहोस्"</string> <string name="show_brightness" msgid="6613930842805942519">"द्रुत सेटिङहरूमा उज्यालो देखाउनुहोस्"</string> <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"विभाजित-स्क्रिनको स्वाइप-अप एक्सेलेटर सक्रिय गर्नुहोस्"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"परिदृश्य बटनदेखि माथि स्वाइप गरी विभाजित-स्क्रिन प्रविष्ट गर्न गेस्चरलाई सक्रिय गर्नुहोस्"</string> + <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"परिदृश्य बटनदेखि माथि स्वाइप गरी विभाजित-स्क्रिन प्रविष्ट गर्न इसारालाई सक्रिय गर्नुहोस्"</string> <string name="experimental" msgid="6198182315536726162">"प्रयोगात्मक"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ब्लुटुथ सक्रिय पार्ने हो?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"आफ्नो ट्याब्लेटसँग किबोर्ड जोड्न, पहिले तपाईँले ब्लुटुथ सक्रिय गर्नुपर्छ।"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 7e44fb0eed13..848c51f13f32 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -448,8 +448,8 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Prikaže sekunde pri uri v vrstici stanja. To lahko vpliva na čas delovanja pri akumulatorskem napajanju."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Preuredi hitre nastavitve"</string> <string name="show_brightness" msgid="6613930842805942519">"Prikaz svetlosti v hitrih nastavitvah"</string> - <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"Omogočanje pospeš. za razdeljeni zaslon z vlečenjem navzgor"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Omogočanje poteze za zagon razdeljenega zaslona, tako da uporabnik od gumba za pregled povleče s prstom navzgor"</string> + <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"Omogočanje vklopa razdeljenega zaslona z vlečenjem navzgor"</string> + <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Omogočanje poteze za vklop razdeljenega zaslona, tako da uporabnik od gumba za pregled povleče s prstom navzgor"</string> <string name="experimental" msgid="6198182315536726162">"Poskusno"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Želite vklopiti Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Če želite povezati tipkovnico in tablični računalnik, vklopite Bluetooth."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 6a61f13c0929..fa7db1386778 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -446,8 +446,8 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"แสดงวินาทีของนาฬิกาในแถบสถานะ อาจส่งผลต่ออายุแบตเตอรี"</string> <string name="qs_rearrange" msgid="8060918697551068765">"จัดเรียงการตั้งค่าด่วนใหม่"</string> <string name="show_brightness" msgid="6613930842805942519">"แสดงความสว่างในการตั้งค่าด่วน"</string> - <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"เปิดใช้ตัวเร่งการกวาดขึ้นเพื่อแยกหน้าจอ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"เปิดใช้ท่าทางสัมผัสเพื่อเข้าสู่โหมดแยกหน้าจอโดยกวาดขึ้นจากปุ่มภาพรวม"</string> + <string name="overview_nav_bar_gesture" msgid="1852503363271291341">"เปิดใช้ตัวเร่งการเลื่อนขึ้นเพื่อแยกหน้าจอ"</string> + <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"เปิดใช้ท่าทางสัมผัสเพื่อเข้าสู่โหมดแยกหน้าจอโดยเลื่อนขึ้นจากปุ่มภาพรวม"</string> <string name="experimental" msgid="6198182315536726162">"ทดสอบ"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"เปิดบลูทูธไหม"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"หากต้องการเชื่อมต่อแป้นพิมพ์กับแท็บเล็ต คุณต้องเปิดบลูทูธก่อน"</string> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 315a86909796..a7f3286bf808 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -67,12 +67,12 @@ <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"Bu qurilmaga ayni paytda o‘z hisobi bilan kirgan foydalanuvchi USB orqali tuzatish funksiyasini faollashtira olmaydi. Undan foydalanish uchun administrator profiliga o‘ting."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Ekranga moslashtirish"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ekran hajmida cho‘zish"</string> - <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ekran surati saqlanmoqda…"</string> - <string name="screenshot_saving_title" msgid="8242282144535555697">"Ekran surati saqlanmoqda…"</string> - <string name="screenshot_saving_text" msgid="2419718443411738818">"Ekran surati saqlanadi."</string> - <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekran surati olindi."</string> + <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skrinshot saqlanmoqda…"</string> + <string name="screenshot_saving_title" msgid="8242282144535555697">"Skrinshot saqlanmoqda…"</string> + <string name="screenshot_saving_text" msgid="2419718443411738818">"Skrinshot saqlanmoqda."</string> + <string name="screenshot_saved_title" msgid="6461865960961414961">"Skrinshot saqlandi."</string> <string name="screenshot_saved_text" msgid="1152839647677558815">"Ekraningiz suratini ko‘rish uchun bosing."</string> - <string name="screenshot_failed_title" msgid="705781116746922771">"Ekran surati olinmadi."</string> + <string name="screenshot_failed_title" msgid="705781116746922771">"Skrinshot saqlanmadi."</string> <string name="screenshot_failed_text" msgid="1260203058661337274">"Ekrandan suratga olib bo‘lmadi: xotirada joy kam yoki ilova/tashkilot bunga ruxsat bermagan."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB fayl ko‘chirish moslamalari"</string> <string name="use_mtp_button_title" msgid="4333504413563023626">"Media pleyer sifatida ulash (MTP)"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index e5e5710cd68a..6702cefeb3e8 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -282,9 +282,6 @@ <!-- The padding between freeform workspace tasks --> <dimen name="recents_freeform_workspace_task_padding">8dp</dimen> - <!-- Space reserved for the cards behind the top card in the top stack --> - <dimen name="top_stack_peek_amount">12dp</dimen> - <!-- Space reserved for the cards behind the top card in the bottom stack --> <dimen name="bottom_stack_peek_amount">12dp</dimen> @@ -295,9 +292,6 @@ <!-- The height of the area before the bottom stack in which the notifications slow down --> <dimen name="bottom_stack_slow_down_length">12dp</dimen> - <!-- The height of the area before the top stack in which the notifications slow down --> - <dimen name="top_stack_slow_down_length">12dp</dimen> - <!-- Z distance between notifications if they are in the stack --> <dimen name="z_distance_between_notifications">0.5dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index 3b49d3785384..9d4f4256b761 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -240,11 +240,11 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD /** * Dismisses recents if we are already visible and the intent is to toggle the recents view. */ - boolean dismissRecentsToFocusedTask() { + boolean dismissRecentsToFocusedTask(int logCategory) { SystemServicesProxy ssp = Recents.getSystemServices(); if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) { // If we have a focused Task, launch that Task now - if (mRecentsView.launchFocusedTask()) return true; + if (mRecentsView.launchFocusedTask(logCategory)) return true; } return false; } @@ -270,7 +270,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD SystemServicesProxy ssp = Recents.getSystemServices(); if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) { // If we have a focused Task, launch that Task now - if (mRecentsView.launchFocusedTask()) return true; + if (mRecentsView.launchFocusedTask(0 /* logCategory */)) return true; // If none of the other cases apply, then just go Home dismissRecentsToHome(true /* animateTaskViews */); return true; @@ -360,7 +360,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD mIterateTrigger = new DozeTrigger(mFocusTimerDuration, new Runnable() { @Override public void run() { - dismissRecentsToFocusedTask(); + dismissRecentsToFocusedTask(MetricsEvent.OVERVIEW_SELECT_TIMEOUT); } }); @@ -634,7 +634,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD // Focus the next task EventBus.getDefault().send(new FocusNextTaskViewEvent(timerIndicatorDuration)); - MetricsLogger.action(this, MetricsEvent.ACTION_OVERVIEW_PAGE); + MetricsLogger.action(this, MetricsEvent.OVERVIEW_PAGE); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java index f7ebd945f761..82e786140e77 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java @@ -66,8 +66,9 @@ public class RecentsActivityLaunchState { */ public int getInitialFocusTaskIndex(int numTasks) { RecentsDebugFlags debugFlags = Recents.getDebugFlags(); + RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState(); if (launchedFromAppWithThumbnail) { - if (debugFlags.isFastToggleRecentsEnabled()) { + if (!launchState.launchedWithAltTab && debugFlags.isFastToggleRecentsEnabled()) { // If fast toggling, focus the front most task so that the next tap will focus the // N-1 task return numTasks - 1; @@ -76,7 +77,7 @@ public class RecentsActivityLaunchState { // If coming from another app, focus the next task return numTasks - 2; } else { - if (debugFlags.isFastToggleRecentsEnabled()) { + if (!launchState.launchedWithAltTab && debugFlags.isFastToggleRecentsEnabled()) { // If fast toggling, defer focusing until the next tap (which will automatically // focus the front most task) return -1; diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 5890b5f959d3..9da5c2bd3f02 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -124,6 +124,10 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener public void onPinnedActivityRestartAttempt() { } + @Override + public void onPinnedStackAnimationEnded() { + } + /** Preloads the next task */ public void run() { RecentsConfiguration config = Recents.getConfiguration(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java index 5eeda72637ea..d7b9b9e71d69 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java @@ -161,7 +161,7 @@ public class RecentsHistoryAdapter extends RecyclerView.Adapter<RecentsHistoryAd ssp.startActivityFromRecents(v.getContext(), task.key.id, task.title, ActivityOptions.makeBasic()); - MetricsLogger.action(v.getContext(), MetricsEvent.ACTION_OVERVIEW_SELECT, + MetricsLogger.action(v.getContext(), MetricsEvent.OVERVIEW_SELECT, task.key.getComponent().toString()); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryItemTouchCallbacks.java b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryItemTouchCallbacks.java index acad0ea1695a..3d1ea8eedfbe 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryItemTouchCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryItemTouchCallbacks.java @@ -21,6 +21,7 @@ import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.recents.Constants; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.ui.DeleteTaskDataEvent; @@ -72,6 +73,8 @@ public class RecentsHistoryItemTouchCallbacks extends ItemTouchHelper.SimpleCall // Keep track of deletions by swiping within history MetricsLogger.histogram(mContext, "overview_task_dismissed_source", Constants.Metrics.DismissSourceHistorySwipeGesture); + MetricsLogger.action(mContext, MetricsEvent.OVERVIEW_DISMISS, + taskRow.task.key.getComponent().toString()); } } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java index 4deea542610a..52043f400bd7 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java @@ -62,6 +62,8 @@ public class Utilities { } }; + public static final RectFEvaluator RECTF_EVALUATOR = new RectFEvaluator(); + /** * @return the first parent walking up the view hierarchy that has the given class type. * diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java index 42ebfa95c662..f3201d0346b4 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java @@ -318,13 +318,13 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: { SystemServicesProxy ssp = Recents.getSystemServices(); - PipManager.getInstance().showPipMenu(); + PipManager.getInstance().resizePinnedStack(PipManager.STATE_PIP_MENU); ssp.focusPinnedStack(); return true; } case KeyEvent.KEYCODE_DPAD_DOWN: { SystemServicesProxy ssp = Recents.getSystemServices(); - PipManager.getInstance().showPipOverlay(false); + PipManager.getInstance().resizePinnedStack(PipManager.STATE_PIP_OVERLAY); ssp.focusHomeStack(); return true; } 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 d4624f58f09c..42aaa9782712 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -248,13 +248,18 @@ public class RecentsView extends FrameLayout { } /** Launches the focused task from the first stack if possible */ - public boolean launchFocusedTask() { + public boolean launchFocusedTask(int logEvent) { if (mTaskStackView != null) { Task task = mTaskStackView.getFocusedTask(); if (task != null) { TaskView taskView = mTaskStackView.getChildViewForTask(task); EventBus.getDefault().send(new LaunchTaskEvent(taskView, task, null, INVALID_STACK_ID, false)); + + if (logEvent != 0) { + MetricsLogger.action(getContext(), logEvent, + task.key.getComponent().toString()); + } return true; } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java index 7eaa1930f6a6..76972d75d9f0 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java @@ -23,6 +23,7 @@ import android.content.res.Resources; import android.graphics.Path; import android.graphics.RectF; import android.view.View; +import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import com.android.systemui.Interpolators; @@ -34,6 +35,7 @@ import com.android.systemui.recents.misc.ReferenceCountedTrigger; import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.TaskStack; +import java.util.ArrayList; import java.util.List; /** @@ -81,9 +83,18 @@ public class TaskStackAnimationHelper { private static final PathInterpolator EXIT_TO_HOME_ALPHA_INTERPOLATOR = new PathInterpolator(0.4f, 0, 1f, 1f); + private static final PathInterpolator FOCUS_NEXT_TASK_INTERPOLATOR = + new PathInterpolator(0.4f, 0, 0, 1f); + private static final PathInterpolator FOCUS_IN_FRONT_NEXT_TASK_INTERPOLATOR = + new PathInterpolator(0, 0, 0, 1f); + private static final PathInterpolator FOCUS_BEHIND_NEXT_TASK_INTERPOLATOR = + new PathInterpolator(0.4f, 0, 0.2f, 1f); + private TaskStackView mStackView; private TaskViewTransform mTmpTransform = new TaskViewTransform(); + private ArrayList<TaskViewTransform> mTmpCurrentTaskTransforms = new ArrayList<>(); + private ArrayList<TaskViewTransform> mTmpFinalTaskTransforms = new ArrayList<>(); public TaskStackAnimationHelper(Context context, TaskStackView stackView) { mStackView = stackView; @@ -418,4 +429,92 @@ public class TaskStackAnimationHelper { mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation); } } + + /** + * Starts the animation to focus the next {@link TaskView} when paging through recents. + * + * @return whether or not this will trigger a scroll in the stack + */ + public boolean startScrollToFocusedTaskAnimation(Task newFocusedTask, + boolean requestViewFocus) { + TaskStackLayoutAlgorithm stackLayout = mStackView.getStackAlgorithm(); + TaskStackViewScroller stackScroller = mStackView.getScroller(); + TaskStack stack = mStackView.getStack(); + + final float newScroll = stackLayout.getStackScrollForTask(newFocusedTask); + boolean willScrollToFront = newScroll > stackScroller.getStackScroll(); + boolean willScroll = Float.compare(newScroll, stackScroller.getStackScroll()) != 0; + + // Get the current set of task transforms + ArrayList<Task> stackTasks = stack.getStackTasks(); + mStackView.getCurrentTaskTransforms(stackTasks, mTmpCurrentTaskTransforms); + + // Pick up the newly visible views after the scroll + mStackView.bindVisibleTaskViews(newScroll); + + // Update the internal state + stackLayout.setFocusState(TaskStackLayoutAlgorithm.STATE_FOCUSED); + stackScroller.setStackScroll(newScroll, null /* animation */); + mStackView.cancelDeferredTaskViewLayoutAnimation(); + + // Get the final set of task transforms + mStackView.getLayoutTaskTransforms(newScroll, stackTasks, mTmpFinalTaskTransforms); + + // Focus the task view + TaskView newFocusedTaskView = mStackView.getChildViewForTask(newFocusedTask); + newFocusedTaskView.setFocusedState(true, requestViewFocus); + + // Setup the end listener to return all the hidden views to the view pool after the + // focus animation + AnimatorListenerAdapter endListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mStackView.bindVisibleTaskViews(newScroll); + } + }; + + List<TaskView> taskViews = mStackView.getTaskViews(); + int taskViewCount = taskViews.size(); + int newFocusTaskViewIndex = taskViews.indexOf(newFocusedTaskView); + for (int i = 0; i < taskViewCount; i++) { + TaskView tv = taskViews.get(i); + Task task = tv.getTask(); + + if (mStackView.isIgnoredTask(task)) { + continue; + } + + int taskIndex = stackTasks.indexOf(task); + TaskViewTransform fromTransform = mTmpCurrentTaskTransforms.get(taskIndex); + TaskViewTransform toTransform = mTmpFinalTaskTransforms.get(taskIndex); + + // Update the task to the initial state (for the newly picked up tasks) + mStackView.updateTaskViewToTransform(tv, fromTransform, AnimationProps.IMMEDIATE); + + int duration; + Interpolator interpolator; + if (willScrollToFront) { + duration = Math.max(100, 100 + ((i - 1) * 50)); + interpolator = FOCUS_BEHIND_NEXT_TASK_INTERPOLATOR; + } else { + if (i < newFocusTaskViewIndex) { + duration = 150 + ((newFocusTaskViewIndex - i - 1) * 50); + interpolator = FOCUS_BEHIND_NEXT_TASK_INTERPOLATOR; + } else if (i > newFocusTaskViewIndex) { + duration = Math.max(100, 150 - ((i - newFocusTaskViewIndex - 1) * 50)); + interpolator = FOCUS_IN_FRONT_NEXT_TASK_INTERPOLATOR; + } else { + duration = 200; + interpolator = FOCUS_NEXT_TASK_INTERPOLATOR; + } + } + + AnimationProps anim = new AnimationProps() + .setDuration(AnimationProps.BOUNDS, duration) + .setInterpolator(AnimationProps.BOUNDS, interpolator) + .setListener(endListener); + mStackView.updateTaskViewToTransform(tv, toTransform, anim); + } + return willScroll; + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java index bd37c3bfd761..19ac1e7dd44d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java @@ -457,7 +457,7 @@ public class TaskStackLayoutAlgorithm { launchTaskIndex - 1)); } } else { - float offsetPct = (float) (mTaskRect.height() / 2) / mStackRect.height(); + float offsetPct = (float) (mTaskRect.height() / 3) / mStackRect.height(); float normX = mUnfocusedCurveInterpolator.getX(offsetPct); mInitialScrollP = Math.max(mMinScrollP, Math.min(mMaxScrollP, launchTaskIndex - mUnfocusedRange.getAbsoluteX(normX))); 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 bb74de493f58..fb3515a26380 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -20,6 +20,8 @@ import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.INVALID_STACK_ID; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.ComponentName; @@ -41,8 +43,12 @@ import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.Interpolator; +import android.view.animation.PathInterpolator; import android.widget.FrameLayout; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.recents.Recents; @@ -113,6 +119,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal private static final ArraySet<Task.TaskKey> EMPTY_TASK_SET = new ArraySet<>(); + LayoutInflater mInflater; TaskStack mStack; TaskStackLayoutAlgorithm mLayoutAlgorithm; TaskStackViewScroller mStackScroller; @@ -142,16 +149,15 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal boolean mScreenPinningEnabled; // The stable stack bounds are the full bounds that we were measured with from RecentsView - Rect mStableStackBounds = new Rect(); + private Rect mStableStackBounds = new Rect(); // The current stack bounds are dynamic and may change as the user drags and drops - Rect mStackBounds = new Rect(); + private Rect mStackBounds = new Rect(); - int[] mTmpVisibleRange = new int[2]; - Rect mTmpRect = new Rect(); - ArrayMap<Task.TaskKey, TaskView> mTmpTaskViewMap = new ArrayMap<>(); - List<TaskView> mTmpTaskViews = new ArrayList<>(); - TaskViewTransform mTmpTransform = new TaskViewTransform(); - LayoutInflater mInflater; + private int[] mTmpVisibleRange = new int[2]; + private Rect mTmpRect = new Rect(); + private ArrayMap<Task.TaskKey, TaskView> mTmpTaskViewMap = new ArrayMap<>(); + private List<TaskView> mTmpTaskViews = new ArrayList<>(); + private TaskViewTransform mTmpTransform = new TaskViewTransform(); // A convenience update listener to request updating clipping of tasks private ValueAnimator.AnimatorUpdateListener mRequestUpdateClippingListener = @@ -396,6 +402,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal int frontMostVisibleIndex = -1; int backMostVisibleIndex = -1; boolean useTargetStackScroll = Float.compare(curStackScroll, targetStackScroll) != 0; + boolean targetScrollIsInFront = targetStackScroll > curStackScroll; // We can reuse the task transforms where possible to reduce object allocation Utilities.matchTaskListSize(tasks, taskTransforms); @@ -439,7 +446,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal frontMostVisibleIndex = i; } backMostVisibleIndex = i; - } else { + } else if (!targetScrollIsInFront) { if (backMostVisibleIndex != -1) { // We've reached the end of the visible range, so going down the rest of the // stack, we can just reset the transforms accordingly @@ -531,7 +538,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } // Skip the invisible non-freeform stack tasks - if (i > visibleStackRange[0] && !task.isFreeformTask()) { + if (!task.isFreeformTask() && !transform.visible) { continue; } @@ -671,12 +678,20 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal for (int i = tasks.size() - 1; i >= 0; i--) { Task task = tasks.get(i); TaskViewTransform transform = transformsOut.get(i); - mLayoutAlgorithm.getStackTransform(task, stackScroll, transform, null); + mLayoutAlgorithm.getStackTransform(task, stackScroll, transform, null, + true /* forceUpdate */); transform.visible = true; } } /** + * Cancels the next deferred task view layout. + */ + void cancelDeferredTaskViewLayoutAnimation() { + mDeferredTaskViewLayoutAnimation = null; + } + + /** * Cancels all {@link TaskView} animations. * * @see #cancelAllTaskViewAnimations(ArraySet<Task.TaskKey>) @@ -716,7 +731,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal TaskView frontTv = null; int clipBottom = 0; - if (mIgnoreTasks.contains(tv.getTask().key)) { + if (isIgnoredTask(tv.getTask())) { // For each of the ignore tasks, update the translationZ of its TaskView to be // between the translationZ of the tasks immediately underneath it if (prevVisibleTv != null) { @@ -804,15 +819,15 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } /** - * Sets the focused task to the provided (bounded taskIndex). + * Sets the focused task to the provided (bounded focusTaskIndex). * * @return whether or not the stack will scroll as a part of this focus change */ - private boolean setFocusedTask(int taskIndex, boolean scrollToTask, - final boolean requestViewFocus, final int timerIndicatorDuration) { + private boolean setFocusedTask(int focusTaskIndex, boolean scrollToTask, + boolean requestViewFocus, int timerIndicatorDuration) { // Find the next task to focus int newFocusedTaskIndex = mStack.getTaskCount() > 0 ? - Math.max(0, Math.min(mStack.getTaskCount() - 1, taskIndex)) : -1; + Math.max(0, Math.min(mStack.getTaskCount() - 1, focusTaskIndex)) : -1; final Task newFocusedTask = (newFocusedTaskIndex != -1) ? mStack.getStackTasks().get(newFocusedTaskIndex) : null; @@ -830,7 +845,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } boolean willScroll = false; - mFocusedTask = newFocusedTask; if (newFocusedTask != null) { @@ -845,33 +859,20 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } } - Runnable focusTaskRunnable = new Runnable() { - @Override - public void run() { - final TaskView tv = getChildViewForTask(newFocusedTask); - if (tv != null) { - tv.setFocusedState(true, requestViewFocus); - } - } - }; - if (scrollToTask) { // Cancel any running enter animations at this point when we scroll or change focus if (!mEnterAnimationComplete) { cancelAllTaskViewAnimations(); } - // TODO: Center the newly focused task view, only if not freeform - float newScroll = mLayoutAlgorithm.getStackScrollForTask(newFocusedTask); - if (Float.compare(newScroll, mStackScroller.getStackScroll()) != 0) { - mStackScroller.animateScroll(newScroll, focusTaskRunnable); - willScroll = true; - } else { - focusTaskRunnable.run(); - } - mLayoutAlgorithm.animateFocusState(TaskStackLayoutAlgorithm.STATE_FOCUSED); + willScroll = mAnimationHelper.startScrollToFocusedTaskAnimation(newFocusedTask, + requestViewFocus); } else { - focusTaskRunnable.run(); + // Focus the task view + TaskView newFocusedTaskView = getChildViewForTask(newFocusedTask); + if (newFocusedTaskView != null) { + newFocusedTaskView.setFocusedState(true, requestViewFocus); + } } } return willScroll; @@ -1276,7 +1277,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal Task task = tasks.get(i); // Ignore deleting tasks - if (mIgnoreTasks.contains(task.key)) { + if (isIgnoredTask(task)) { if (i == tasks.size() - 1) { isFrontMostTask.value = true; } @@ -1390,7 +1391,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } @Override - public void prepareViewToEnterPool(TaskView tv) { + public void onReturnViewToPool(TaskView tv) { final Task task = tv.getTask(); // Report that this tasks's data is no longer being used @@ -1411,7 +1412,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } @Override - public void prepareViewToLeavePool(TaskView tv, Task task, boolean isNewView) { + public void onPickUpViewFromPool(TaskView tv, Task task, boolean isNewView) { // Find the index where this task should be placed in the stack int taskIndex = mStack.indexOfStackTask(task); int insertIndex = findTaskViewInsertIndex(task, taskIndex); @@ -1601,6 +1602,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal public final void onBusEvent(TaskViewDismissedEvent event) { removeTaskViewFromStack(event.taskView, event.task); EventBus.getDefault().send(new DeleteTaskDataEvent(event.task)); + + MetricsLogger.action(getContext(), MetricsEvent.OVERVIEW_DISMISS, + event.task.key.getComponent().toString()); } public final void onBusEvent(FocusNextTaskViewEvent event) { 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 c641d75c7bc8..d1bce55c324e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java @@ -191,21 +191,27 @@ public class TaskStackViewScroller { stopScroller(); stopBoundScrollAnimation(); - mFinalAnimatedScroll = newScroll; - mScrollAnimator = ObjectAnimator.ofFloat(this, STACK_SCROLL, getStackScroll(), newScroll); - mScrollAnimator.setDuration(mContext.getResources().getInteger( - R.integer.recents_animate_task_stack_scroll_duration)); - mScrollAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); - mScrollAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (postRunnable != null) { - postRunnable.run(); + 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.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); + mScrollAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (postRunnable != null) { + postRunnable.run(); + } + mScrollAnimator.removeAllListeners(); } - mScrollAnimator.removeAllListeners(); + }); + mScrollAnimator.start(); + } else { + if (postRunnable != null) { + postRunnable.run(); } - }); - mScrollAnimator.start(); + } } /** Aborts any current stack scrolls */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java index d6680fdf23e2..5d1bb66f0dac 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java @@ -34,6 +34,7 @@ import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.SwipeHelper; @@ -58,8 +59,6 @@ import java.util.List; class TaskStackViewTouchHandler implements SwipeHelper.Callback { private static final int INACTIVE_POINTER_ID = -1; - - private static final RectFEvaluator RECT_EVALUATOR = new RectFEvaluator(); private static final Interpolator STACK_TRANSFORM_INTERPOLATOR = new PathInterpolator(0.73f, 0.33f, 0.42f, 0.85f); @@ -230,6 +229,8 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { if (parent != null) { parent.requestDisallowInterceptTouchEvent(true); } + + MetricsLogger.action(mSv.getContext(), MetricsEvent.OVERVIEW_SCROLL); } } if (mIsScrolling) { @@ -542,8 +543,8 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { mTmpTransform.copyFrom(fromTransform); // We only really need to interpolate the bounds, progress and translation - mTmpTransform.rect.set(RECT_EVALUATOR.evaluate(dismissFraction, fromTransform.rect, - toTransform.rect)); + mTmpTransform.rect.set(Utilities.RECTF_EVALUATOR.evaluate(dismissFraction, + fromTransform.rect, toTransform.rect)); mTmpTransform.p = fromTransform.p + (toTransform.p - fromTransform.p) * dismissFraction; mTmpTransform.translationZ = fromTransform.translationZ + (toTransform.translationZ - fromTransform.translationZ) * dismissFraction; diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java index 439d96f7d27b..850e36e73e36 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -38,6 +38,8 @@ import android.view.View; import android.view.ViewOutlineProvider; import android.view.animation.AccelerateInterpolator; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.recents.Recents; @@ -585,6 +587,9 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks } EventBus.getDefault().send(new LaunchTaskEvent(this, mTask, null, INVALID_STACK_ID, screenPinningRequested)); + + MetricsLogger.action(v.getContext(), MetricsEvent.OVERVIEW_SELECT, + mTask.key.getComponent().toString()); } /**** View.OnLongClickListener Implementation ****/ diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java b/packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java index 31fbd3e15705..a287fe642002 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java @@ -29,8 +29,8 @@ public class ViewPool<V, T> { /* An interface to the consumer of a view pool */ public interface ViewPoolConsumer<V, T> { public V createView(Context context); - public void prepareViewToEnterPool(V v); - public void prepareViewToLeavePool(V v, T prepareData, boolean isNewView); + public void onReturnViewToPool(V v); + public void onPickUpViewFromPool(V v, T prepareData, boolean isNewView); public boolean hasPreferredData(V v, T preferredData); } @@ -46,7 +46,7 @@ public class ViewPool<V, T> { /** Returns a view into the pool */ void returnViewToPool(V v) { - mViewCreator.prepareViewToEnterPool(v); + mViewCreator.onReturnViewToPool(v); mPool.push(v); } @@ -73,7 +73,7 @@ public class ViewPool<V, T> { v = mPool.pop(); } } - mViewCreator.prepareViewToLeavePool(v, prepareData, isNewView); + mViewCreator.onPickUpViewFromPool(v, prepareData, isNewView); return v; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 7f1316fe2de7..84b2031491fd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -947,6 +947,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } } + public boolean mustStayOnScreen() { + return mIsHeadsUp; + } + private void updateClearability() { // public versions cannot be dismissed mVetoButton.setVisibility(isClearable() && !mShowingPublic ? View.VISIBLE : View.GONE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index a0fb34aecbf9..8042b60714b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -399,6 +399,10 @@ public abstract class ExpandableView extends FrameLayout { return false; } + public boolean mustStayOnScreen() { + return false; + } + /** * A listener notifying when {@link #getActualHeight} changes. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java index 5abd1d5c4b03..dd6d6f381c02 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java @@ -35,6 +35,8 @@ import android.widget.RadioButton; import android.widget.SeekBar; import android.widget.TextView; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settingslib.Utils; import com.android.systemui.R; @@ -51,6 +53,7 @@ public class NotificationGuts extends LinearLayout { private SeekBar mSeekBar; private Notification.Topic mTopic; private INotificationManager mINotificationManager; + private int mStartingImportance; public NotificationGuts(Context context, AttributeSet attrs) { super(context, attrs); @@ -103,6 +106,7 @@ public class NotificationGuts extends LinearLayout { void bindImportance(final StatusBarNotification sbn, final ExpandableNotificationRow row, final int importance) { + mStartingImportance = importance; mINotificationManager = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); mTopic = sbn.getNotification().getTopic() == null @@ -151,6 +155,7 @@ public class NotificationGuts extends LinearLayout { } updateTitleAndSummary(progress); if (fromUser) { + MetricsLogger.action(mContext, MetricsEvent.ACTION_MODIFY_IMPORTANCE_SLIDER); if (appUsesTopics) { mApplyToTopic.setVisibility(View.VISIBLE); mApplyToTopic.setText( @@ -205,6 +210,8 @@ public class NotificationGuts extends LinearLayout { void saveImportance(final StatusBarNotification sbn) { int progress = mSeekBar.getProgress(); + MetricsLogger.action(mContext, MetricsEvent.ACTION_SAVE_IMPORTANCE, + progress - mStartingImportance); try { mINotificationManager.setImportance(sbn.getPackageName(), sbn.getUid(), mApplyToTopic.isChecked() ? mTopic : null, progress); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index e20936b7dec4..08cd053b5903 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -109,6 +109,10 @@ public class CarStatusBar extends PhoneStatusBar { } @Override + public void onPinnedStackAnimationEnded() { + } + + @Override public void onTaskStackChanged() { mHandler.removeCallbacks(this); mHandler.post(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java index b5b7f4383917..79c21f348270 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java @@ -79,7 +79,8 @@ public class HeadsUpTouchHelper implements Gefingerpoken { mTouchingHeadsUpView = false; if (child instanceof ExpandableNotificationRow) { mPickedChild = (ExpandableNotificationRow) child; - mTouchingHeadsUpView = mPickedChild.isHeadsUp() && mPickedChild.isPinned(); + mTouchingHeadsUpView = !mStackScroller.isExpanded() + && mPickedChild.isHeadsUp() && mPickedChild.isPinned(); } break; case MotionEvent.ACTION_POINTER_UP: diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 5f5974ea94b3..0febbd20eedf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -738,9 +738,9 @@ public class NavigationBarView extends LinearLayout { + (offscreen ? " OFFSCREEN!" : "")); pw.println(String.format(" mCurrentView: id=%s (%dx%d) %s", - getResourceName(mCurrentView.getId()), - mCurrentView.getWidth(), mCurrentView.getHeight(), - visibilityToString(mCurrentView.getVisibility()))); + getResourceName(getCurrentView().getId()), + getCurrentView().getWidth(), getCurrentView().getHeight(), + visibilityToString(getCurrentView().getVisibility()))); pw.println(String.format(" disabled=0x%08x vertical=%s menu=%s", mDisabledFlags, 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 09a7bf08ec19..50a49a1dbd2c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -519,7 +519,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, */ protected boolean mStartedGoingToSleep; - private static final int VISIBLE_LOCATIONS = StackViewState.LOCATION_FIRST_CARD + private static final int VISIBLE_LOCATIONS = StackViewState.LOCATION_FIRST_HUN | StackViewState.LOCATION_MAIN_AREA; private final OnChildLocationsChangedListener mNotificationLocationsChangedListener = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index cc0e67df39cb..49e9c3db9f30 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -75,7 +75,7 @@ public class NotificationStackScrollLayout extends ViewGroup ExpandableView.OnHeightChangedListener, NotificationGroupManager.OnGroupChangeListener { public static final float BACKGROUND_ALPHA_DIMMED = 0.7f; - private static final String TAG = "NotificationStackScrollLayout"; + private static final String TAG = "StackScroller"; private static final boolean DEBUG = false; private static final float RUBBER_BAND_FACTOR_NORMAL = 0.35f; private static final float RUBBER_BAND_FACTOR_AFTER_EXPAND = 0.15f; @@ -136,7 +136,7 @@ public class NotificationStackScrollLayout extends ViewGroup private StackScrollState mCurrentStackScrollState = new StackScrollState(this); private AmbientState mAmbientState = new AmbientState(); private NotificationGroupManager mGroupManager; - private ArrayList<View> mChildrenToAddAnimated = new ArrayList<>(); + private HashSet<View> mChildrenToAddAnimated = new HashSet<>(); private ArrayList<View> mAddedHeadsUpChildren = new ArrayList<>(); private ArrayList<View> mChildrenToRemoveAnimated = new ArrayList<>(); private ArrayList<View> mSnappedBackChildren = new ArrayList<>(); @@ -474,6 +474,7 @@ public class NotificationStackScrollLayout extends ViewGroup * modifications to {@link #mOwnScrollY} are performed to reflect it in the view layout. */ private void updateChildren() { + updateScrollStateForAddedChildren(); mAmbientState.setScrollY(mOwnScrollY); mStackScrollAlgorithm.getStackScrollState(mAmbientState, mCurrentStackScrollState); if (!isCurrentlyAnimating() && !mNeedsAnimation) { @@ -483,6 +484,28 @@ public class NotificationStackScrollLayout extends ViewGroup } } + private void updateScrollStateForAddedChildren() { + if (mChildrenToAddAnimated.isEmpty()) { + return; + } + for (int i = 0; i < getChildCount(); i++) { + ExpandableView child = (ExpandableView) getChildAt(i); + if (mChildrenToAddAnimated.contains(child)) { + int startingPosition = getPositionInLinearLayout(child); + int padding = child.needsIncreasedPadding() + ? mIncreasedPaddingBetweenElements : + mPaddingBetweenElements; + int childHeight = getIntrinsicHeight(child) + padding; + if (startingPosition < mOwnScrollY) { + // This child starts off screen, so let's keep it offscreen to keep the others visible + + mOwnScrollY += childHeight; + } + } + } + clampScrollPosition(); + } + private void requestChildrenUpdate() { if (!mChildrenUpdateRequested) { getViewTreeObserver().addOnPreDrawListener(mChildrenUpdater); @@ -1648,12 +1671,17 @@ public class NotificationStackScrollLayout extends ViewGroup bottom = (int) (lastView.getTranslationY() + lastView.getActualHeight()); bottom = Math.min(bottom, getHeight()); } - } else if (mPhoneStatusBar.getBarState() == StatusBarState.KEYGUARD) { - top = mTopPadding; + } else { + top = (int) (mTopPadding + mStackTranslation); bottom = top; } - mBackgroundBounds.top = Math.max(0, top); - mBackgroundBounds.bottom = Math.min(getHeight(), bottom); + if (mPhoneStatusBar.getBarState() != StatusBarState.KEYGUARD) { + mBackgroundBounds.top = (int) Math.max(mTopPadding + mStackTranslation, top); + } else { + // otherwise the animation from the shade to the keyguard will jump as it's maxed + mBackgroundBounds.top = Math.max(0, top); + } + mBackgroundBounds.bottom = Math.min(getHeight(), Math.max(bottom, top)); } private ActivatableNotificationView getFirstPinnedHeadsUp() { @@ -3206,6 +3234,10 @@ public class NotificationStackScrollLayout extends ViewGroup } } + public boolean isExpanded() { + return mIsExpanded; + } + /** * A listener that is notified when some child locations might have changed. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index f6959f0dfcbb..e87b36397c7a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -39,17 +39,14 @@ public class StackScrollAlgorithm { private static final String LOG_TAG = "StackScrollAlgorithm"; private static final int MAX_ITEMS_IN_BOTTOM_STACK = 3; - private static final int MAX_ITEMS_IN_TOP_STACK = 3; private int mPaddingBetweenElements; private int mIncreasedPaddingBetweenElements; private int mCollapsedSize; - private int mTopStackPeekSize; private int mBottomStackPeekSize; private int mZDistanceBetweenElements; private int mZBasicHeight; - private StackIndentationFunctor mTopStackIndentationFunctor; private StackIndentationFunctor mBottomStackIndentationFunctor; private StackScrollAlgorithmState mTempAlgorithmState = new StackScrollAlgorithmState(); @@ -58,12 +55,8 @@ public class StackScrollAlgorithm { private boolean mIsExpanded; private ExpandableView mFirstChildWhileExpanding; private boolean mExpandedOnStart; - private int mTopStackTotalSize; private int mBottomStackSlowDownLength; - private int mTopStackSlowDownLength; private int mCollapseSecondCardPadding; - private ExpandableView mFirstChild; - private int mFirstChildMinHeight; public StackScrollAlgorithm(Context context) { initView(context); @@ -71,22 +64,6 @@ public class StackScrollAlgorithm { public void initView(Context context) { initConstants(context); - updatePadding(); - } - - private void updatePadding() { - mTopStackTotalSize = mTopStackSlowDownLength + mPaddingBetweenElements - + mTopStackPeekSize; - mTopStackIndentationFunctor = new PiecewiseLinearIndentationFunctor( - MAX_ITEMS_IN_TOP_STACK, - mTopStackPeekSize, - mTopStackTotalSize - mTopStackPeekSize, - 0.5f); - mBottomStackIndentationFunctor = new PiecewiseLinearIndentationFunctor( - MAX_ITEMS_IN_BOTTOM_STACK, - mBottomStackPeekSize, - getBottomStackSlowDownLength(), - 0.5f); } public int getBottomStackSlowDownLength() { @@ -100,8 +77,6 @@ public class StackScrollAlgorithm { .getDimensionPixelSize(R.dimen.notification_divider_height_increased); mCollapsedSize = context.getResources() .getDimensionPixelSize(R.dimen.notification_min_height); - mTopStackPeekSize = context.getResources() - .getDimensionPixelSize(R.dimen.top_stack_peek_amount); mBottomStackPeekSize = context.getResources() .getDimensionPixelSize(R.dimen.bottom_stack_peek_amount); mZDistanceBetweenElements = Math.max(1, context.getResources() @@ -109,10 +84,13 @@ public class StackScrollAlgorithm { mZBasicHeight = (MAX_ITEMS_IN_BOTTOM_STACK + 1) * mZDistanceBetweenElements; mBottomStackSlowDownLength = context.getResources() .getDimensionPixelSize(R.dimen.bottom_stack_slow_down_length); - mTopStackSlowDownLength = context.getResources() - .getDimensionPixelSize(R.dimen.top_stack_slow_down_length); mCollapseSecondCardPadding = context.getResources().getDimensionPixelSize( R.dimen.notification_collapse_second_card_padding); + mBottomStackIndentationFunctor = new PiecewiseLinearIndentationFunctor( + MAX_ITEMS_IN_BOTTOM_STACK, + mBottomStackPeekSize, + getBottomStackSlowDownLength(), + 0.5f); } public void getStackScrollState(AmbientState ambientState, StackScrollState resultState) { @@ -123,32 +101,13 @@ public class StackScrollAlgorithm { // First we reset the view states to their default values. resultState.resetViewStates(); - algorithmState.itemsInTopStack = 0.0f; - algorithmState.partialInTop = 0.0f; - algorithmState.lastTopStackIndex = 0; - algorithmState.scrolledPixelsTop = 0; - algorithmState.itemsInBottomStack = 0.0f; - algorithmState.partialInBottom = 0.0f; - mFirstChildMinHeight = mFirstChild == null ? 0 : mFirstChild.getMinHeight(); - float bottomOverScroll = ambientState.getOverScrollAmount(false /* onTop */); - - int scrollY = ambientState.getScrollY(); - - // Due to the overScroller, the stackscroller can have negative scroll state. This is - // already accounted for by the top padding and doesn't need an additional adaption - scrollY = Math.max(0, scrollY); - algorithmState.scrollY = (int) (scrollY + mFirstChildMinHeight + bottomOverScroll); - - initAlgorithmState(resultState, algorithmState); - - // Phase 1: - findNumberOfItemsInTopStackAndUpdateState(resultState, algorithmState, ambientState); + initAlgorithmState(resultState, algorithmState, ambientState); - // Phase 2: updatePositionsForState(resultState, algorithmState, ambientState); - // Phase 3: - updateZValuesForState(resultState, algorithmState); + updateZValuesForState(resultState, algorithmState, ambientState); + + updateHeadsUpStates(resultState, algorithmState, ambientState); handleDraggedViews(ambientState, resultState, algorithmState); updateDimmedActivatedHideSensitive(ambientState, resultState, algorithmState); @@ -185,6 +144,7 @@ public class StackScrollAlgorithm { private void updateClipping(StackScrollState resultState, StackScrollAlgorithmState algorithmState, AmbientState ambientState) { boolean dismissAllInProgress = ambientState.isDismissAllInProgress(); + float drawStart = ambientState.getTopPadding() + ambientState.getStackTranslation(); float previousNotificationEnd = 0; float previousNotificationStart = 0; boolean previousNotificationIsSwiped = false; @@ -192,6 +152,10 @@ public class StackScrollAlgorithm { for (int i = 0; i < childCount; i++) { ExpandableView child = algorithmState.visibleChildren.get(i); StackViewState state = resultState.getViewStateForView(child); + if (!child.mustStayOnScreen()) { + previousNotificationEnd = Math.max(drawStart, previousNotificationEnd); + previousNotificationStart = Math.max(drawStart, previousNotificationStart); + } float newYTranslation = state.yTranslation; float newHeight = state.height; // apply clipping and shadow @@ -222,7 +186,7 @@ public class StackScrollAlgorithm { } else { previousNotificationIsSwiped = ambientState.getDraggedViews().contains(child); previousNotificationEnd = newNotificationEnd; - previousNotificationStart = newYTranslation + state.clipTopAmount; + previousNotificationStart =newYTranslation + state.clipTopAmount; } } } @@ -314,8 +278,20 @@ public class StackScrollAlgorithm { /** * Initialize the algorithm state like updating the visible children. */ - private void initAlgorithmState(StackScrollState resultState, - StackScrollAlgorithmState state) { + private void initAlgorithmState(StackScrollState resultState, StackScrollAlgorithmState state, + AmbientState ambientState) { + state.itemsInBottomStack = 0.0f; + state.partialInBottom = 0.0f; + float bottomOverScroll = ambientState.getOverScrollAmount(false /* onTop */); + + int scrollY = ambientState.getScrollY(); + + // Due to the overScroller, the stackscroller can have negative scroll state. This is + // already accounted for by the top padding and doesn't need an additional adaption + scrollY = Math.max(0, scrollY); + state.scrollY = (int) (scrollY + bottomOverScroll); + + //now init the visible children and update paddings ViewGroup hostView = resultState.getHostView(); int childCount = hostView.getChildCount(); state.visibleChildren.clear(); @@ -383,15 +359,9 @@ public class StackScrollAlgorithm { float bottomStackStart = bottomPeekStart - mBottomStackSlowDownLength; // The y coordinate of the current child. - float currentYPosition = 0.0f; - - // How far in is the element currently transitioning into the bottom stack. - float yPositionInScrollView = 0.0f; + float currentYPosition = -algorithmState.scrollY; int childCount = algorithmState.visibleChildren.size(); - int numberOfElementsCompletelyIn = algorithmState.partialInTop == 1.0f - ? algorithmState.lastTopStackIndex - : (int) algorithmState.itemsInTopStack; int paddingAfterChild; for (int i = 0; i < childCount; i++) { ExpandableView child = algorithmState.visibleChildren.get(i); @@ -400,47 +370,16 @@ public class StackScrollAlgorithm { paddingAfterChild = getPaddingAfterChild(algorithmState, child); int childHeight = getMaxAllowedChildHeight(child); int minHeight = child.getMinHeight(); - float yPositionInScrollViewAfterElement = yPositionInScrollView - + childHeight - + paddingAfterChild; - float scrollOffset = yPositionInScrollView - algorithmState.scrollY + - mFirstChildMinHeight; - - if (i == algorithmState.lastTopStackIndex + 1) { - // Normally the position of this child is the position in the regular scrollview, - // but if the two stacks are very close to each other, - // then have have to push it even more upwards to the position of the bottom - // stack start. - currentYPosition = Math.min(scrollOffset, bottomStackStart); - } childViewState.yTranslation = currentYPosition; + if (i == 0) { + updateFirstChildHeight(child, childViewState, childHeight, ambientState); + } // The y position after this element float nextYPosition = currentYPosition + childHeight + paddingAfterChild; - - if (i <= algorithmState.lastTopStackIndex) { + if (nextYPosition >= bottomStackStart) { // Case 1: - // We are in the top Stack - updateStateForTopStackChild(algorithmState, child, - numberOfElementsCompletelyIn, i, childHeight, childViewState, scrollOffset); - clampPositionToTopStackEnd(childViewState, childHeight); - - // check if we are overlapping with the bottom stack - if (childViewState.yTranslation + childHeight + paddingAfterChild - >= bottomStackStart && !mIsExpansionChanging && i != 0) { - // we just collapse this element slightly - int newSize = (int) Math.max(bottomStackStart - paddingAfterChild - - childViewState.yTranslation, minHeight); - childViewState.height = newSize; - updateStateForChildTransitioningInBottom(algorithmState, bottomStackStart, - child, childViewState.yTranslation, childViewState, - childHeight); - } - clampPositionToBottomStackStart(childViewState, childViewState.height, - minHeight, ambientState); - } else if (nextYPosition >= bottomStackStart) { - // Case 2: // We are in the bottom stack. if (currentYPosition >= bottomStackStart) { // According to the regular scroll view we are fully translated out of the @@ -455,36 +394,30 @@ public class StackScrollAlgorithm { childViewState, childHeight); } } else { - // Case 3: + // Case 2: // We are in the regular scroll area. childViewState.location = StackViewState.LOCATION_MAIN_AREA; - clampYTranslation(childViewState, childHeight, ambientState); + clampPositionToBottomStackStart(childViewState, childViewState.height, childHeight, + ambientState); } - // The first card is always rendered. - if (i == 0) { - childViewState.hidden = false; - childViewState.shadowAlpha = 1.0f; - childViewState.yTranslation = Math.max( - mFirstChildMinHeight - algorithmState.scrollY, 0); - if (childViewState.yTranslation + childViewState.height - > bottomPeekStart - mCollapseSecondCardPadding) { - childViewState.height = (int) Math.max( - bottomPeekStart - mCollapseSecondCardPadding - - childViewState.yTranslation, mFirstChildMinHeight); - } - childViewState.location = StackViewState.LOCATION_FIRST_CARD; + if (i == 0 && ambientState.getScrollY() <= 0) { + // The first card can get into the bottom stack if it's the only one + // on the lockscreen which pushes it up. Let's make sure that doesn't happen and + // it stays at the top + childViewState.yTranslation = Math.max(0, childViewState.yTranslation); + } + currentYPosition = childViewState.yTranslation + childHeight + paddingAfterChild; + if (currentYPosition <= 0) { + childViewState.location = StackViewState.LOCATION_HIDDEN_TOP; } if (childViewState.location == StackViewState.LOCATION_UNKNOWN) { Log.wtf(LOG_TAG, "Failed to assign location for child " + i); } - currentYPosition = childViewState.yTranslation + childHeight + paddingAfterChild; - yPositionInScrollView = yPositionInScrollViewAfterElement; childViewState.yTranslation += ambientState.getTopPadding() + ambientState.getStackTranslation(); } - updateHeadsUpStates(resultState, algorithmState, ambientState); } private int getPaddingAfterChild(StackScrollAlgorithmState algorithmState, @@ -506,24 +439,27 @@ public class StackScrollAlgorithm { ExpandableNotificationRow row = (ExpandableNotificationRow) child; if (!row.isHeadsUp()) { break; - } else if (topHeadsUpEntry == null) { - topHeadsUpEntry = row; } StackViewState childState = resultState.getViewStateForView(row); + if (topHeadsUpEntry == null) { + topHeadsUpEntry = row; + childState.location = StackViewState.LOCATION_FIRST_HUN; + } boolean isTopEntry = topHeadsUpEntry == row; + float unmodifiedEndLocation = childState.yTranslation + childState.height; if (mIsExpanded) { - // Ensure that the heads up is always visible even when scrolled off from the bottom - float bottomPosition = ambientState.getMaxHeadsUpTranslation() - childState.height; - childState.yTranslation = Math.min(childState.yTranslation, - bottomPosition); + // Ensure that the heads up is always visible even when scrolled off + clampHunToTop(ambientState, row, childState); + clampHunToMaxTranslation(ambientState, row, childState); } if (row.isPinned()) { childState.yTranslation = Math.max(childState.yTranslation, 0); childState.height = Math.max(row.getIntrinsicHeight(), childState.height); - if (!isTopEntry) { + StackViewState topState = resultState.getViewStateForView(topHeadsUpEntry); + if (!isTopEntry && (!mIsExpanded + || unmodifiedEndLocation < topState.yTranslation + topState.height)) { // Ensure that a headsUp doesn't vertically extend further than the heads-up at // the top most z-position - StackViewState topState = resultState.getViewStateForView(topHeadsUpEntry); childState.height = row.getIntrinsicHeight(); childState.yTranslation = topState.yTranslation + topState.height - childState.height; @@ -532,17 +468,23 @@ public class StackScrollAlgorithm { } } - /** - * Clamp the yTranslation both up and down to valid positions. - * - * @param childViewState the view state of the child - * @param minHeight the minimum height of this child - */ - private void clampYTranslation(StackViewState childViewState, int minHeight, - AmbientState ambientState) { - clampPositionToBottomStackStart(childViewState, childViewState.height, minHeight, - ambientState); - clampPositionToTopStackEnd(childViewState, childViewState.height); + private void clampHunToTop(AmbientState ambientState, ExpandableNotificationRow row, + StackViewState childState) { + float newTranslation = Math.max(ambientState.getTopPadding() + + ambientState.getStackTranslation(), childState.yTranslation); + childState.height = (int) Math.max(childState.height - (newTranslation + - childState.yTranslation), row.getMinHeight()); + childState.yTranslation = newTranslation; + } + + private void clampHunToMaxTranslation(AmbientState ambientState, ExpandableNotificationRow row, + StackViewState childState) { + float newTranslation; + float bottomPosition = ambientState.getMaxHeadsUpTranslation() - row.getMinHeight(); + newTranslation = Math.min(childState.yTranslation, bottomPosition); + childState.height = (int) Math.max(childState.height + - (childState.yTranslation - newTranslation), row.getMinHeight()); + childState.yTranslation = newTranslation; } /** @@ -569,19 +511,6 @@ public class StackScrollAlgorithm { } } - /** - * Clamp the yTranslation of the child up such that its end is at lest on the end of the top - * stack. - * - * @param childViewState the view state of the child - * @param childHeight the height of this child - */ - private void clampPositionToTopStackEnd(StackViewState childViewState, - int childHeight) { - childViewState.yTranslation = Math.max(childViewState.yTranslation, - mFirstChildMinHeight - childHeight); - } - private int getMaxAllowedChildHeight(View child) { if (child instanceof ExpandableView) { ExpandableView expandableView = (ExpandableView) child; @@ -611,9 +540,6 @@ public class StackScrollAlgorithm { } childViewState.yTranslation = transitioningPositionStart + offset - newHeight - getPaddingAfterChild(algorithmState, child); - - // We want at least to be at the end of the top stack when collapsing - clampPositionToTopStackEnd(childViewState, newHeight); childViewState.location = StackViewState.LOCATION_MAIN_AREA; } @@ -642,177 +568,59 @@ public class StackScrollAlgorithm { } childViewState.height = minHeight; childViewState.yTranslation = currentYPosition - minHeight; - clampPositionToTopStackEnd(childViewState, minHeight); } - private void updateStateForTopStackChild(StackScrollAlgorithmState algorithmState, - ExpandableView child, int numberOfElementsCompletelyIn, int i, int childHeight, - StackViewState childViewState, float scrollOffset) { - - - // First we calculate the index relative to the current stack window of size at most - // {@link #MAX_ITEMS_IN_TOP_STACK} - int paddedIndex = i - 1 - - Math.max(numberOfElementsCompletelyIn - MAX_ITEMS_IN_TOP_STACK, 0); - if (paddedIndex >= 0) { - - // We are currently visually entering the top stack - float distanceToStack = (childHeight + getPaddingAfterChild(algorithmState, child)) - - algorithmState.scrolledPixelsTop; - if (i == algorithmState.lastTopStackIndex - && distanceToStack > (mTopStackTotalSize - + getPaddingAfterChild(algorithmState, child))) { - - // Child is currently translating into stack but not yet inside slow down zone. - // Handle it like the regular scrollview. - childViewState.yTranslation = scrollOffset; - } else { - // Apply stacking logic. - float numItemsBefore; - if (i == algorithmState.lastTopStackIndex) { - numItemsBefore = 1.0f - - (distanceToStack / (mTopStackTotalSize - + getPaddingAfterChild(algorithmState, child))); - } else { - numItemsBefore = algorithmState.itemsInTopStack - i; - } - // The end position of the current child - float currentChildEndY = mFirstChildMinHeight + mTopStackTotalSize - - mTopStackIndentationFunctor.getValue(numItemsBefore); - childViewState.yTranslation = currentChildEndY - childHeight; - } - childViewState.location = StackViewState.LOCATION_TOP_STACK_PEEKING; - } else { - if (paddedIndex == -1) { - childViewState.shadowAlpha = 1.0f - algorithmState.partialInTop; - } else { - // We are hidden behind the top card and faded out, so we can hide ourselves. - childViewState.hidden = true; - childViewState.shadowAlpha = 0.0f; - } - childViewState.yTranslation = mFirstChildMinHeight - childHeight; - childViewState.location = StackViewState.LOCATION_TOP_STACK_HIDDEN; - } - - - } /** - * Find the number of items in the top stack and update the result state if needed. + * Update the height of the first child i.e clamp it to the bottom stack + * * - * @param resultState The result state to update if a height change of an child occurs - * @param algorithmState The state in which the current pass of the algorithm is currently in - */ - private void findNumberOfItemsInTopStackAndUpdateState(StackScrollState resultState, - StackScrollAlgorithmState algorithmState, AmbientState ambientState) { - // The y Position if the element would be in a regular scrollView - float yPositionInScrollView = 0.0f; - int childCount = algorithmState.visibleChildren.size(); - // find the number of elements in the top stack. - for (int i = 0; i < childCount; i++) { - ExpandableView child = algorithmState.visibleChildren.get(i); - StackViewState childViewState = resultState.getViewStateForView(child); - int childHeight = getMaxAllowedChildHeight(child); - int paddingAfterChild = getPaddingAfterChild(algorithmState, child); - float yPositionInScrollViewAfterElement = yPositionInScrollView - + childHeight - + paddingAfterChild; - if (yPositionInScrollView < algorithmState.scrollY) { - if (i == 0 && algorithmState.scrollY <= mFirstChildMinHeight) { - - // The starting position of the bottom stack peek - int bottomPeekStart = ambientState.getInnerHeight() - mBottomStackPeekSize - - mCollapseSecondCardPadding; - // Collapse and expand the first child while the shade is being expanded - float maxHeight = mIsExpansionChanging && child == mFirstChildWhileExpanding - ? mFirstChildMaxHeight - : childHeight; - childViewState.height = (int) Math.max(Math.min(bottomPeekStart, maxHeight), - mFirstChildMinHeight); - algorithmState.itemsInTopStack = 1.0f; - - } else if (yPositionInScrollViewAfterElement < algorithmState.scrollY) { - // According to the regular scroll view we are fully off screen - algorithmState.itemsInTopStack += 1.0f; - if (i == 0) { - childViewState.height = child.getMinHeight(); - } - } else { - // According to the regular scroll view we are partially off screen - - // How much did we scroll into this child - algorithmState.scrolledPixelsTop = algorithmState.scrollY - - yPositionInScrollView; - algorithmState.partialInTop = (algorithmState.scrolledPixelsTop) / (childHeight - + paddingAfterChild); - - // Our element can be expanded, so this can get negative - algorithmState.partialInTop = Math.max(0.0f, algorithmState.partialInTop); - algorithmState.itemsInTopStack += algorithmState.partialInTop; - - if (i == 0) { - // If it is expanded we have to collapse it to a new size - float newSize = yPositionInScrollViewAfterElement - - paddingAfterChild - - algorithmState.scrollY + mFirstChildMinHeight; - newSize = Math.max(mFirstChildMinHeight, newSize); - algorithmState.itemsInTopStack = 1.0f; - childViewState.height = (int) newSize; - } - algorithmState.lastTopStackIndex = i; - break; - } - } else { - algorithmState.lastTopStackIndex = i - 1; - // We are already past the stack so we can end the loop - break; - } - yPositionInScrollView = yPositionInScrollViewAfterElement; - } + * @param child the child to update + * @param childViewState the viewstate of the child + * @param childHeight the height of the child + * @param ambientState The ambient state of the algorithm + */ + private void updateFirstChildHeight(ExpandableView child, StackViewState childViewState, + int childHeight, AmbientState ambientState) { + + // The starting position of the bottom stack peek + int bottomPeekStart = ambientState.getInnerHeight() - mBottomStackPeekSize - + mCollapseSecondCardPadding + ambientState.getScrollY(); + // Collapse and expand the first child while the shade is being expanded + float maxHeight = mIsExpansionChanging && child == mFirstChildWhileExpanding + ? mFirstChildMaxHeight + : childHeight; + childViewState.height = (int) Math.max(Math.min(bottomPeekStart, maxHeight), + child.getMinHeight()); } /** * Calculate the Z positions for all children based on the number of items in both stacks and * save it in the resultState - * - * @param resultState The result state to update the zTranslation values + * @param resultState The result state to update the zTranslation values * @param algorithmState The state in which the current pass of the algorithm is currently in + * @param ambientState The ambient state of the algorithm */ private void updateZValuesForState(StackScrollState resultState, - StackScrollAlgorithmState algorithmState) { + StackScrollAlgorithmState algorithmState, AmbientState ambientState) { int childCount = algorithmState.visibleChildren.size(); - for (int i = 0; i < childCount; i++) { - View child = algorithmState.visibleChildren.get(i); + int childrenOnTop = 0; + for (int i = childCount - 1; i >= 0; i--) { + ExpandableView child = algorithmState.visibleChildren.get(i); StackViewState childViewState = resultState.getViewStateForView(child); - if (i < algorithmState.itemsInTopStack) { - float stackIndex = algorithmState.itemsInTopStack - i; - - // Ensure that the topmost item is a little bit higher than the rest when fully - // scrolled, to avoid drawing errors when swiping it out - float max = MAX_ITEMS_IN_TOP_STACK + (i == 0 ? 2.5f : 2); - stackIndex = Math.min(stackIndex, max); - if (i == 0 && algorithmState.itemsInTopStack < 2.0f) { - - // We only have the top item and an additional item in the top stack, - // Interpolate the index from 0 to 2 while the second item is - // translating in. - stackIndex -= 1.0f; - if (algorithmState.scrollY > mFirstChildMinHeight) { - - // Since there is a shadow treshhold, we cant just interpolate from 0 to - // 2 but we interpolate from 0.1f to 2.0f when scrolled in. The jump in - // height will not be noticable since we have padding in between. - stackIndex = 0.1f + stackIndex * 1.9f; - } - } - childViewState.zTranslation = mZBasicHeight - + stackIndex * mZDistanceBetweenElements; - } else if (i > (childCount - 1 - algorithmState.itemsInBottomStack)) { + if (i > (childCount - 1 - algorithmState.itemsInBottomStack)) { + // We are in the bottom stack float numItemsAbove = i - (childCount - 1 - algorithmState.itemsInBottomStack); - float translationZ = mZBasicHeight + childViewState.zTranslation = mZBasicHeight - numItemsAbove * mZDistanceBetweenElements; - childViewState.zTranslation = translationZ; + } else if (child.mustStayOnScreen() + && childViewState.yTranslation < ambientState.getTopPadding() + + ambientState.getStackTranslation()) { + // TODO; do this more cleanly + childrenOnTop++; + childViewState.zTranslation = mZBasicHeight + + childrenOnTop * mZDistanceBetweenElements; } else { childViewState.zTranslation = mZBasicHeight; } @@ -897,7 +705,6 @@ public class StackScrollAlgorithm { } public void notifyChildrenChanged(final NotificationStackScrollLayout hostView) { - mFirstChild = hostView.getFirstChildNotGone(); if (mIsExpansionChanging) { hostView.post(new Runnable() { @Override @@ -922,26 +729,6 @@ public class StackScrollAlgorithm { public int scrollY; /** - * The quantity of items which are in the top stack. - */ - public float itemsInTopStack; - - /** - * how far in is the element currently transitioning into the top stack - */ - public float partialInTop; - - /** - * The number of pixels the last child in the top stack has scrolled in to the stack - */ - public float scrolledPixelsTop; - - /** - * The last item index which is in the top stack. - */ - public int lastTopStackIndex; - - /** * The quantity of items which are in the bottom stack. */ public float itemsInBottomStack; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java index 05fa27d04e4e..fa151950c1cc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java @@ -24,12 +24,11 @@ public class StackViewState extends ViewState { // These are flags such that we can create masks for filtering. public static final int LOCATION_UNKNOWN = 0x00; - public static final int LOCATION_FIRST_CARD = 0x01; - public static final int LOCATION_TOP_STACK_HIDDEN = 0x02; - public static final int LOCATION_TOP_STACK_PEEKING = 0x04; - public static final int LOCATION_MAIN_AREA = 0x08; - public static final int LOCATION_BOTTOM_STACK_PEEKING = 0x10; - public static final int LOCATION_BOTTOM_STACK_HIDDEN = 0x20; + public static final int LOCATION_FIRST_HUN = 0x01; + public static final int LOCATION_HIDDEN_TOP = 0x02; + public static final int LOCATION_MAIN_AREA = 0x04; + public static final int LOCATION_BOTTOM_STACK_PEEKING = 0x08; + public static final int LOCATION_BOTTOM_STACK_HIDDEN = 0x10; /** The view isn't layouted at all. */ public static final int LOCATION_GONE = 0x40; diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java index 3e47d8571fad..3c3041016710 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java @@ -28,6 +28,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; import android.graphics.Rect; +import android.os.Debug; import android.os.Handler; import android.os.RemoteException; import android.util.Log; @@ -53,13 +54,17 @@ public class PipManager { private static final int MAX_RUNNING_TASKS_COUNT = 10; - private static final int STATE_NO_PIP = 0; - private static final int STATE_PIP_OVERLAY = 1; - private static final int STATE_PIP_MENU = 2; + public static final int STATE_NO_PIP = 0; + public static final int STATE_PIP_OVERLAY = 1; + public static final int STATE_PIP_MENU = 2; private static final int TASK_ID_NO_PIP = -1; private static final int INVALID_RESOURCE_TYPE = -1; + public static final int SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_MENU_ACTIVITY_FINISH = 0x1; + public static final int SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_OVERLAY_ACTIVITY_FINISH = 0x2; + private int mSuspendPipResizingReason; + private Context mContext; private IActivityManager mActivityManager; private int mState = STATE_NO_PIP; @@ -87,7 +92,8 @@ public class PipManager { } if (DEBUG) Log.d(TAG, "PINNED_STACK:" + stackInfo); mPipTaskId = stackInfo.taskIds[stackInfo.taskIds.length - 1]; - showPipOverlay(false); + // Set state to overlay so we show it when the pinned stack animation ends. + mState = STATE_PIP_OVERLAY; launchPipOnboardingActivityIfNeeded(); } }; @@ -105,6 +111,23 @@ public class PipManager { movePipToFullscreen(); } }; + private final Runnable mOnPinnedStackAnimationEnded = new Runnable() { + @Override + public void run() { + if (mState == STATE_PIP_OVERLAY) { + showPipOverlay(); + } else if (mState == STATE_PIP_MENU) { + showPipMenu(); + } + } + }; + + private final Runnable mResizePinnedStackRunnable = new Runnable() { + @Override + public void run() { + resizePinnedStack(mState); + } + }; private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override @@ -164,7 +187,7 @@ public class PipManager { if (!hasPipTasks()) { startPip(); } else if (mState == STATE_PIP_OVERLAY) { - showPipMenu(); + resizePinnedStack(STATE_PIP_MENU); } } @@ -210,11 +233,7 @@ public class PipManager { for (int i = mListeners.size() - 1; i >= 0; --i) { mListeners.get(i).onMoveToFullscreen(); } - try { - mActivityManager.moveTasksToFullscreenStack(PINNED_STACK_ID, true); - } catch (RemoteException e) { - Log.e(TAG, "moveTasksToFullscreenStack failed", e); - } + resizePinnedStack(mState); } /** @@ -222,25 +241,83 @@ public class PipManager { * stack to the default PIP bound {@link com.android.internal.R.string * .config_defaultPictureInPictureBounds}. */ - public void showPipOverlay(boolean resizeStack) { + private void showPipOverlay() { if (DEBUG) Log.d(TAG, "showPipOverlay()"); mState = STATE_PIP_OVERLAY; Intent intent = new Intent(mContext, PipOverlayActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); final ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchStackId(PINNED_STACK_ID); - if (resizeStack) { - options.setLaunchBounds(mPipBound); - } mContext.startActivity(intent, options.toBundle()); } /** + * Suspends resizing operation on the Pip until {@link #resumePipResizing} is called + * @param reason The reason for suspending resizing operations on the Pip. + */ + public void suspendPipResizing(int reason) { + if (DEBUG) Log.d(TAG, + "suspendPipResizing() reason=" + reason + " callers=" + Debug.getCallers(2)); + mSuspendPipResizingReason |= reason; + } + + /** + * Resumes resizing operation on the Pip that was previously suspended. + * @param reason The reason resizing operations on the Pip was suspended. + */ + public void resumePipResizing(int reason) { + if ((mSuspendPipResizingReason & reason) == 0) { + return; + } + if (DEBUG) Log.d(TAG, + "resumePipResizing() reason=" + reason + " callers=" + Debug.getCallers(2)); + mSuspendPipResizingReason &= ~reason; + mHandler.post(mResizePinnedStackRunnable); + } + + /** + * Resize the Pip to the appropriate size for the input state. + * @param state In Pip state also used to determine the new size for the Pip. + */ + public void resizePinnedStack(int state) { + if (DEBUG) Log.d(TAG, "resizePinnedStack() state=" + state); + mState = state; + Rect bounds; + for (int i = mListeners.size() - 1; i >= 0; --i) { + mListeners.get(i).onPipResizeAboutToStart(); + } + switch (mState) { + case STATE_PIP_MENU: + bounds = mMenuModePipBound; + break; + case STATE_NO_PIP: + bounds = null; + break; + default: + bounds = mPipBound; + break; + } + + if (mSuspendPipResizingReason != 0) { + if (DEBUG) Log.d(TAG, + "resizePinnedStack() deferring mSuspendPipResizingReason=" + + mSuspendPipResizingReason); + return; + } + + try { + mActivityManager.resizeStack(PINNED_STACK_ID, bounds, true, true, true); + } catch (RemoteException e) { + Log.e(TAG, "showPipMenu failed", e); + } + } + + /** * Shows PIP menu UI by launching {@link PipMenuActivity}. It also locates the pinned * stack to the centered PIP bound {@link com.android.internal.R.string * .config_centeredPictureInPictureBounds}. */ - public void showPipMenu() { + private void showPipMenu() { if (DEBUG) Log.d(TAG, "showPipMenu()"); mState = STATE_PIP_MENU; for (int i = mListeners.size() - 1; i >= 0; --i) { @@ -250,20 +327,13 @@ public class PipManager { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); final ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchStackId(PINNED_STACK_ID); - options.setLaunchBounds(mMenuModePipBound); mContext.startActivity(intent, options.toBundle()); } - /** - * Adds {@link Listener}. - */ public void addListener(Listener listener) { mListeners.add(listener); } - /** - * Removes {@link Listener}. - */ public void removeListener(Listener listener) { mListeners.remove(listener); } @@ -338,32 +408,36 @@ public class PipManager { @Override public void onActivityPinned() throws RemoteException { // Post the message back to the UI thread. + if (DEBUG) Log.d(TAG, "onActivityPinned()"); mHandler.post(mOnActivityPinnedRunnable); } @Override public void onPinnedActivityRestartAttempt() { // Post the message back to the UI thread. + if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()"); mHandler.post(mOnPinnedActivityRestartAttempt); } + + @Override + public void onPinnedStackAnimationEnded() { + if (DEBUG) Log.d(TAG, "onPinnedStackAnimationEnded()"); + mHandler.post(mOnPinnedStackAnimationEnded); + } } /** * A listener interface to receive notification on changes in PIP. */ public interface Listener { - /** - * Invoked when a PIPed activity is closed. - */ + /** Invoked when a PIPed activity is closed. */ void onPipActivityClosed(); - /** - * Invoked when the PIP menu gets shown. - */ + /** Invoked when the PIP menu gets shown. */ void onShowPipMenu(); - /** - * Invoked when the PIPed activity is returned back to the fullscreen. - */ + /** Invoked when the PIPed activity is returned back to the fullscreen. */ void onMoveToFullscreen(); + /** Invoked when we are above to start resizing the Pip. */ + void onPipResizeAboutToStart(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipMenuActivity.java index 15c55f5b26ff..7e229d4b90f4 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipMenuActivity.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipMenuActivity.java @@ -54,7 +54,7 @@ public class PipMenuActivity extends Activity implements PipManager.Listener { findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mPipManager.showPipOverlay(true); + mPipManager.resizePinnedStack(PipManager.STATE_PIP_OVERLAY); finish(); } }); @@ -62,13 +62,15 @@ public class PipMenuActivity extends Activity implements PipManager.Listener { @Override protected void onDestroy() { - mPipManager.removeListener(this); super.onDestroy(); + mPipManager.removeListener(this); + mPipManager.resumePipResizing( + PipManager.SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_MENU_ACTIVITY_FINISH); } @Override public void onBackPressed() { - mPipManager.showPipOverlay(true); + mPipManager.resizePinnedStack(PipManager.STATE_PIP_OVERLAY); finish(); } @@ -84,4 +86,11 @@ public class PipMenuActivity extends Activity implements PipManager.Listener { public void onMoveToFullscreen() { finish(); } + + @Override + public void onPipResizeAboutToStart() { + finish(); + mPipManager.suspendPipResizing( + PipManager.SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_MENU_ACTIVITY_FINISH); + } } diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipOnboardingActivity.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipOnboardingActivity.java index a0b913ab9b2c..6f71c92f89db 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipOnboardingActivity.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipOnboardingActivity.java @@ -62,4 +62,8 @@ public class PipOnboardingActivity extends Activity implements PipManager.Listen public void onMoveToFullscreen() { finish(); } + + @Override + public void onPipResizeAboutToStart() { + } } diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipOverlayActivity.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipOverlayActivity.java index bc59a8cb4995..b40793563b37 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipOverlayActivity.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipOverlayActivity.java @@ -19,8 +19,8 @@ package com.android.systemui.tv.pip; import android.app.Activity; import android.os.Bundle; import android.os.Handler; -import android.view.View; +import android.view.View; import com.android.systemui.R; /** @@ -30,25 +30,37 @@ public class PipOverlayActivity extends Activity implements PipManager.Listener private static final String TAG = "PipOverlayActivity"; private static final boolean DEBUG = false; - private static final long SHOW_GUIDE_OVERLAY_VIEW_DURATION_MS = 2000; + private static final long SHOW_GUIDE_OVERLAY_VIEW_DURATION_MS = 4000; private final PipManager mPipManager = PipManager.getInstance(); private final Handler mHandler = new Handler(); + private View mGuideOverlayView; + private final Runnable mHideGuideOverlayRunnable = new Runnable() { + public void run() { + mGuideOverlayView.setVisibility(View.INVISIBLE); + } + }; @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.tv_pip_overlay); + mGuideOverlayView = findViewById(R.id.guide_overlay); mPipManager.addListener(this); - final View overlayView = findViewById(R.id.guide_overlay); - // TODO: apply animation - overlayView.setVisibility(View.VISIBLE); - mHandler.postDelayed(new Runnable() { - @Override - public void run() { - overlayView.setVisibility(View.INVISIBLE); - } - }, SHOW_GUIDE_OVERLAY_VIEW_DURATION_MS); + } + + @Override + protected void onStart() { + super.onStart(); + mHandler.removeCallbacks(mHideGuideOverlayRunnable); + mHandler.postDelayed(mHideGuideOverlayRunnable, SHOW_GUIDE_OVERLAY_VIEW_DURATION_MS); + } + + @Override + protected void onStop() { + super.onStop(); + mHandler.removeCallbacks(mHideGuideOverlayRunnable); + finish(); } @Override @@ -56,6 +68,8 @@ public class PipOverlayActivity extends Activity implements PipManager.Listener super.onDestroy(); mHandler.removeCallbacksAndMessages(null); mPipManager.removeListener(this); + mPipManager.resumePipResizing( + PipManager.SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_OVERLAY_ACTIVITY_FINISH); } @Override @@ -72,4 +86,11 @@ public class PipOverlayActivity extends Activity implements PipManager.Listener public void onMoveToFullscreen() { finish(); } + + @Override + public void onPipResizeAboutToStart() { + finish(); + mPipManager.suspendPipResizing( + PipManager.SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_OVERLAY_ACTIVITY_FINISH); + } } diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 3327ec4f712f..3f3f851acfb5 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -318,10 +318,10 @@ message MetricsEvent { OVERVIEW_HISTORY = 275; // Logged when the user pages through overview. - ACTION_OVERVIEW_PAGE = 276; + OVERVIEW_PAGE = 276; // Logged when the user launches a task from overview. - ACTION_OVERVIEW_SELECT = 277; + OVERVIEW_SELECT = 277; // Logged when the user views the emergency info. ACTION_VIEW_EMERGENCY_INFO = 278; @@ -353,5 +353,21 @@ message MetricsEvent { // Logged when the user undocks a previously docked window by long pressing recents while in // docked mode. ACTION_WINDOW_UNDOCK_LONGPRESS = 286; + + // Logged when the user scrolls through overview manually + OVERVIEW_SCROLL = 287; + + // Logged when the overview times out automatically selecting an app + OVERVIEW_SELECT_TIMEOUT = 288; + + // Logged when a user dismisses a task in overview + OVERVIEW_DISMISS = 289; + + // Logged when the user modifying the notification importance slider. + ACTION_MODIFY_IMPORTANCE_SLIDER = 290; + + // Logged when the user saves a modification to notification importance. Negative numbers + // indicate the user lowered the importance; positive means they increased it. + ACTION_SAVE_IMPORTANCE = 291; } } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index c35a73a4c1a1..4be6833d17b5 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -52,7 +52,6 @@ import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; -import android.os.Debug; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -654,7 +653,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { userState.mUiAutomationFlags = flags; userState.mIsAccessibilityEnabled = true; userState.mInstalledServices.add(accessibilityServiceInfo); - if (userState.isUiAutomationSuppressingOtherServices()) { + if ((flags & UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES) == 0) { // Set the temporary state. userState.mIsTouchExplorationEnabled = false; userState.mIsEnhancedWebAccessibilityEnabled = false; diff --git a/services/core/java/com/android/server/ServiceWatcher.java b/services/core/java/com/android/server/ServiceWatcher.java index 60621374baad..383e25a6d293 100644 --- a/services/core/java/com/android/server/ServiceWatcher.java +++ b/services/core/java/com/android/server/ServiceWatcher.java @@ -16,6 +16,7 @@ package com.android.server; +import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -32,13 +33,16 @@ import android.os.Handler; import android.os.IBinder; import android.os.UserHandle; import android.util.Log; +import android.util.Slog; +import com.android.internal.annotations.GuardedBy; import com.android.internal.content.PackageMonitor; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Objects; /** * Find the best Service, and bind to it. @@ -64,17 +68,21 @@ public class ServiceWatcher implements ServiceConnection { private final Runnable mNewServiceWork; private final Handler mHandler; - private Object mLock = new Object(); + private final Object mLock = new Object(); - // all fields below synchronized on mLock - private IBinder mBinder; // connected service - private String mPackageName; // current best package - private int mVersion = Integer.MIN_VALUE; // current best version - /** - * Whether the currently-connected service is multiuser-aware. This can change at run-time - * when switching from one version of a service to another. - */ - private boolean mIsMultiuser = false; + @GuardedBy("mLock") + private int mCurrentUserId = UserHandle.USER_SYSTEM; + + @GuardedBy("mLock") + private IBinder mBoundService; + @GuardedBy("mLock") + private ComponentName mBoundComponent; + @GuardedBy("mLock") + private String mBoundPackageName; + @GuardedBy("mLock") + private int mBoundVersion = Integer.MIN_VALUE; + @GuardedBy("mLock") + private int mBoundUserId = UserHandle.USER_NULL; public static ArrayList<HashSet<Signature>> getSignatureSets(Context context, List<String> initialPackageNames) { @@ -84,7 +92,8 @@ public class ServiceWatcher implements ServiceConnection { String pkg = initialPackageNames.get(i); try { HashSet<Signature> set = new HashSet<Signature>(); - Signature[] sigs = pm.getPackageInfo(pkg, PackageManager.GET_SIGNATURES).signatures; + Signature[] sigs = pm.getPackageInfo(pkg, PackageManager.MATCH_SYSTEM_ONLY + | PackageManager.GET_SIGNATURES).signatures; set.addAll(Arrays.asList(sigs)); sigSets.add(set); } catch (NameNotFoundException e) { @@ -108,7 +117,7 @@ public class ServiceWatcher implements ServiceConnection { // Whether to enable service overlay. boolean enableOverlay = resources.getBoolean(overlaySwitchResId); - ArrayList<String> initialPackageNames = new ArrayList<String>(); + ArrayList<String> initialPackageNames = new ArrayList<String>(); if (enableOverlay) { // A list of package names used to create the signatures. String[] pkgs = resources.getStringArray(initialPackageNamesResId); @@ -126,20 +135,32 @@ public class ServiceWatcher implements ServiceConnection { mSignatureSets = getSignatureSets(context, initialPackageNames); } + /** + * Start this watcher, including binding to the current best match and + * re-binding to any better matches down the road. + * <p> + * Note that if there are no matching encryption-aware services, we may not + * bind to a real service until after the current user is unlocked. + */ public boolean start() { synchronized (mLock) { - if (!bindBestPackageLocked(mServicePackageName)) return false; + bindBestPackageLocked(mServicePackageName, false); } // listen for user change IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_USER_SWITCHED); + intentFilter.addAction(Intent.ACTION_USER_UNLOCKED); mContext.registerReceiverAsUser(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); + final String action = intent.getAction(); + final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, + UserHandle.USER_NULL); if (Intent.ACTION_USER_SWITCHED.equals(action)) { - switchUser(); + switchUser(userId); + } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) { + unlockUser(userId); } } }, UserHandle.ALL, intentFilter, null, mHandler); @@ -153,30 +174,36 @@ public class ServiceWatcher implements ServiceConnection { } /** - * Searches and binds to the best package, or do nothing - * if the best package is already bound. - * Only checks the named package, or checks all packages if it - * is null. - * Return true if a new package was found to bind to. + * Searches and binds to the best package, or do nothing if the best package + * is already bound, unless force rebinding is requested. + * + * @param justCheckThisPackage Only consider this package, or consider all + * packages if it is {@code null}. + * @param forceRebind Force a rebinding to the best package if it's already + * bound. + * @return {@code true} if a valid package was found to bind to. */ - private boolean bindBestPackageLocked(String justCheckThisPackage) { + private boolean bindBestPackageLocked(String justCheckThisPackage, boolean forceRebind) { Intent intent = new Intent(mAction); if (justCheckThisPackage != null) { intent.setPackage(justCheckThisPackage); } - List<ResolveInfo> rInfos = mPm.queryIntentServicesAsUser(intent, - PackageManager.GET_META_DATA, UserHandle.USER_SYSTEM); + final List<ResolveInfo> rInfos = mPm.queryIntentServicesAsUser(intent, + PackageManager.GET_META_DATA | PackageManager.MATCH_DEBUG_TRIAGED_MISSING, + mCurrentUserId); int bestVersion = Integer.MIN_VALUE; - String bestPackage = null; + ComponentName bestComponent = null; boolean bestIsMultiuser = false; if (rInfos != null) { for (ResolveInfo rInfo : rInfos) { - String packageName = rInfo.serviceInfo.packageName; + final ComponentName component = rInfo.serviceInfo.getComponentName(); + final String packageName = component.getPackageName(); // check signature try { PackageInfo pInfo; - pInfo = mPm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); + pInfo = mPm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES + | PackageManager.MATCH_DEBUG_TRIAGED_MISSING); if (!isSignatureMatch(pInfo.signatures)) { Log.w(mTag, packageName + " resolves service " + mAction + ", but has wrong signature, ignoring"); @@ -196,9 +223,9 @@ public class ServiceWatcher implements ServiceConnection { isMultiuser = rInfo.serviceInfo.metaData.getBoolean(EXTRA_SERVICE_IS_MULTIUSER); } - if (version > mVersion) { + if (version > bestVersion) { bestVersion = version; - bestPackage = packageName; + bestComponent = component; bestIsMultiuser = isMultiuser; } } @@ -207,42 +234,53 @@ public class ServiceWatcher implements ServiceConnection { Log.d(mTag, String.format("bindBestPackage for %s : %s found %d, %s", mAction, (justCheckThisPackage == null ? "" : "(" + justCheckThisPackage + ") "), rInfos.size(), - (bestPackage == null ? "no new best package" - : "new best package: " + bestPackage))); + (bestComponent == null ? "no new best component" + : "new best component: " + bestComponent))); } } else { if (D) Log.d(mTag, "Unable to query intent services for action: " + mAction); } - if (bestPackage != null) { - bindToPackageLocked(bestPackage, bestVersion, bestIsMultiuser); - return true; + + if (bestComponent == null) { + Slog.w(mTag, "Odd, no component found for service " + mAction); + unbindLocked(); + return false; } - return false; + + final int userId = bestIsMultiuser ? UserHandle.USER_SYSTEM : mCurrentUserId; + final boolean alreadyBound = Objects.equals(bestComponent, mBoundComponent) + && bestVersion == mBoundVersion && userId == mBoundUserId; + if (forceRebind || !alreadyBound) { + unbindLocked(); + bindToPackageLocked(bestComponent, bestVersion, userId); + } + return true; } private void unbindLocked() { - String pkg; - pkg = mPackageName; - mPackageName = null; - mVersion = Integer.MIN_VALUE; - mIsMultiuser = false; - if (pkg != null) { - if (D) Log.d(mTag, "unbinding " + pkg); + ComponentName component; + component = mBoundComponent; + mBoundComponent = null; + mBoundPackageName = null; + mBoundVersion = Integer.MIN_VALUE; + mBoundUserId = UserHandle.USER_NULL; + if (component != null) { + if (D) Log.d(mTag, "unbinding " + component); mContext.unbindService(this); } } - private void bindToPackageLocked(String packageName, int version, boolean isMultiuser) { - unbindLocked(); + private void bindToPackageLocked(ComponentName component, int version, int userId) { Intent intent = new Intent(mAction); - intent.setPackage(packageName); - mPackageName = packageName; - mVersion = version; - mIsMultiuser = isMultiuser; - if (D) Log.d(mTag, "binding " + packageName + " (version " + version + ") (" - + (isMultiuser ? "multi" : "single") + "-user)"); - mContext.bindServiceAsUser(intent, this, Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND - | Context.BIND_NOT_VISIBLE, mIsMultiuser ? UserHandle.SYSTEM : UserHandle.CURRENT); + intent.setComponent(component); + mBoundComponent = component; + mBoundPackageName = component.getPackageName(); + mBoundVersion = version; + mBoundUserId = userId; + if (D) Log.d(mTag, "binding " + component + " (v" + version + ") (u" + userId + ")"); + mContext.bindServiceAsUser(intent, this, + Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND | Context.BIND_NOT_VISIBLE, + new UserHandle(userId)); } public static boolean isSignatureMatch(Signature[] signatures, @@ -275,106 +313,92 @@ public class ServiceWatcher implements ServiceConnection { @Override public void onPackageUpdateFinished(String packageName, int uid) { synchronized (mLock) { - if (packageName.equals(mPackageName)) { - // package updated, make sure to rebind - unbindLocked(); - } - // Need to check all packages because this method is also called when a - // system app is uninstalled and the stock version in reinstalled. - bindBestPackageLocked(null); + final boolean forceRebind = Objects.equals(packageName, mBoundPackageName); + bindBestPackageLocked(null, forceRebind); } } @Override public void onPackageAdded(String packageName, int uid) { synchronized (mLock) { - if (packageName.equals(mPackageName)) { - // package updated, make sure to rebind - unbindLocked(); - } - // check the new package is case it is better - bindBestPackageLocked(null); + final boolean forceRebind = Objects.equals(packageName, mBoundPackageName); + bindBestPackageLocked(null, forceRebind); } } @Override public void onPackageRemoved(String packageName, int uid) { synchronized (mLock) { - if (packageName.equals(mPackageName)) { - unbindLocked(); - // the currently bound package was removed, - // need to search for a new package - bindBestPackageLocked(null); - } + final boolean forceRebind = Objects.equals(packageName, mBoundPackageName); + bindBestPackageLocked(null, forceRebind); } } @Override public boolean onPackageChanged(String packageName, int uid, String[] components) { synchronized (mLock) { - if (packageName.equals(mPackageName)) { - // service enabled or disabled, make sure to rebind - unbindLocked(); - } - // the service might be disabled, need to search for a new - // package - bindBestPackageLocked(null); + final boolean forceRebind = Objects.equals(packageName, mBoundPackageName); + bindBestPackageLocked(null, forceRebind); } return super.onPackageChanged(packageName, uid, components); } }; @Override - public void onServiceConnected(ComponentName name, IBinder binder) { + public void onServiceConnected(ComponentName component, IBinder binder) { synchronized (mLock) { - String packageName = name.getPackageName(); - if (packageName.equals(mPackageName)) { - if (D) Log.d(mTag, packageName + " connected"); - mBinder = binder; + if (component.equals(mBoundComponent)) { + if (D) Log.d(mTag, component + " connected"); + mBoundService = binder; if (mHandler !=null && mNewServiceWork != null) { mHandler.post(mNewServiceWork); } } else { - Log.w(mTag, "unexpected onServiceConnected: " + packageName); + Log.w(mTag, "unexpected onServiceConnected: " + component); } } } @Override - public void onServiceDisconnected(ComponentName name) { + public void onServiceDisconnected(ComponentName component) { synchronized (mLock) { - String packageName = name.getPackageName(); - if (D) Log.d(mTag, packageName + " disconnected"); + if (D) Log.d(mTag, component + " disconnected"); - if (packageName.equals(mPackageName)) { - mBinder = null; + if (component.equals(mBoundComponent)) { + mBoundService = null; } } } - public String getBestPackageName() { + public @Nullable String getBestPackageName() { synchronized (mLock) { - return mPackageName; + return mBoundPackageName; } } public int getBestVersion() { synchronized (mLock) { - return mVersion; + return mBoundVersion; + } + } + + public @Nullable IBinder getBinder() { + synchronized (mLock) { + return mBoundService; } } - public IBinder getBinder() { + public void switchUser(int userId) { synchronized (mLock) { - return mBinder; + mCurrentUserId = userId; + bindBestPackageLocked(mServicePackageName, false); } } - public void switchUser() { + public void unlockUser(int userId) { synchronized (mLock) { - if (!mIsMultiuser) { - unbindLocked(); - bindBestPackageLocked(mServicePackageName); + if (userId == mCurrentUserId) { + bindBestPackageLocked(mServicePackageName, false); } } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 9dae74050812..104217a63104 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1451,6 +1451,7 @@ public final class ActivityManagerService extends ActivityManagerNative static final int VR_MODE_CHANGE_MSG = 63; static final int NOTIFY_ACTIVITY_PINNED_LISTENERS_MSG = 64; static final int NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG = 65; + static final int NOTIFY_PINNED_STACK_ANIMATION_ENDED_LISTENERS_MSG = 66; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; @@ -1979,6 +1980,20 @@ public final class ActivityManagerService extends ActivityManagerNative } break; } + case NOTIFY_PINNED_STACK_ANIMATION_ENDED_LISTENERS_MSG: { + synchronized (ActivityManagerService.this) { + for (int i = mTaskStackListeners.beginBroadcast() - 1; i >= 0; i--) { + try { + // Make a one-way callback to the listener + mTaskStackListeners.getBroadcastItem(i).onPinnedStackAnimationEnded(); + } catch (RemoteException e){ + // Handled by the RemoteCallbackList + } + } + mTaskStackListeners.finishBroadcast(); + } + break; + } case NOTIFY_CLEARTEXT_NETWORK_MSG: { final int uid = msg.arg1; final byte[] firstPacket = (byte[]) msg.obj; @@ -7161,8 +7176,8 @@ public final class ActivityManagerService extends ActivityManagerNative final Rect bounds = (mStackSupervisor.getStack(PINNED_STACK_ID) == null) ? mDefaultPinnedStackBounds : null; - mStackSupervisor.moveActivityToStackLocked( - r, PINNED_STACK_ID, "enterPictureInPicture", bounds); + mStackSupervisor.moveActivityToPinnedStackLocked( + r, "enterPictureInPicture", bounds); } } finally { Binder.restoreCallingIdentity(origId); @@ -10722,6 +10737,12 @@ public final class ActivityManagerService extends ActivityManagerNative return; } + // We're only interested in providers that are encryption unaware, and + // we don't care about uninstalled apps, since there's no way they're + // running at this point. + final int matchFlags = GET_PROVIDERS | MATCH_ENCRYPTION_UNAWARE + | MATCH_DEBUG_TRIAGED_MISSING; + synchronized (this) { final int NP = mProcessNames.getMap().size(); for (int ip = 0; ip < NP; ip++) { @@ -10736,8 +10757,7 @@ public final class ActivityManagerService extends ActivityManagerNative try { final String pkgName = app.pkgList.keyAt(ig); final PackageInfo pkgInfo = AppGlobals.getPackageManager() - .getPackageInfo(pkgName, - GET_PROVIDERS | MATCH_ENCRYPTION_UNAWARE, userId); + .getPackageInfo(pkgName, matchFlags, userId); if (pkgInfo != null && !ArrayUtils.isEmpty(pkgInfo.providers)) { for (ProviderInfo provInfo : pkgInfo.providers) { Log.v(TAG, "Installing " + provInfo); @@ -11052,6 +11072,16 @@ public final class ActivityManagerService extends ActivityManagerNative mHandler.obtainMessage(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG).sendToTarget(); } + /** Notifies all listeners when the pinned stack animation ends. */ + @Override + public void notifyPinnedStackAnimationEnded() { + synchronized (this) { + mHandler.removeMessages(NOTIFY_PINNED_STACK_ANIMATION_ENDED_LISTENERS_MSG); + mHandler.obtainMessage( + NOTIFY_PINNED_STACK_ANIMATION_ENDED_LISTENERS_MSG).sendToTarget(); + } + } + @Override public void notifyCleartextNetwork(int uid, byte[] firstPacket) { mHandler.obtainMessage(NOTIFY_CLEARTEXT_NETWORK_MSG, uid, 0, firstPacket).sendToTarget(); @@ -14894,7 +14924,7 @@ public final class ActivityManagerService extends ActivityManagerNative pw.println(mi.hasActivities ? ",a" : ",e"); } else { pw.print(tag); pw.print(","); pw.print(mi.shortLabel); pw.print(","); - pw.println(mi.pss); pw.print(dumpSwapPss ? mi.swapPss : "N/A"); + pw.print(mi.pss); pw.print(","); pw.println(dumpSwapPss ? mi.swapPss : "N/A"); } if (mi.subitems != null) { dumpMemItems(pw, prefix + " ", mi.shortLabel, mi.subitems, @@ -14959,6 +14989,9 @@ public final class ActivityManagerService extends ActivityManagerNative private final void dumpApplicationMemoryUsageHeader(PrintWriter pw, long uptime, long realtime, boolean isCheckinRequest, boolean isCompact) { + if (isCompact) { + pw.print("version,"); pw.println(MEMINFO_COMPACT_VERSION); + } if (isCheckinRequest || isCompact) { // short checkin version pw.print("time,"); pw.print(uptime); pw.print(","); pw.println(realtime); @@ -15017,6 +15050,9 @@ public final class ActivityManagerService extends ActivityManagerNative return stringifySize(size * 1024, 1024); } + // Update this version number in case you change the 'compact' format + private static final int MEMINFO_COMPACT_VERSION = 1; + final void dumpApplicationMemoryUsage(FileDescriptor fd, PrintWriter pw, String prefix, String[] args, boolean brief, PrintWriter categoryPw) { boolean dumpDetails = false; diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 0bccffa5b505..8560a9eeb494 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1587,6 +1587,33 @@ final class ActivityStack { // determined individually unlike other stacks where the visibility or fullscreen // status of an activity in a previous task affects other. behindFullscreenActivity = stackVisibility == STACK_INVISIBLE; + } else if (mStackId == HOME_STACK_ID) { + if (task.isHomeTask()) { + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Home task: at " + task + + " stackInvisible=" + stackInvisible + + " behindFullscreenActivity=" + behindFullscreenActivity); + // No other task in the home stack should be visible behind the home activity. + // Home activities is usually a translucent activity with the wallpaper behind + // them. However, when they don't have the wallpaper behind them, we want to + // show activities in the next application stack behind them vs. another + // task in the home stack like recents. + behindFullscreenActivity = true; + } else if (task.isRecentsTask() + && task.getTaskToReturnTo() == APPLICATION_ACTIVITY_TYPE) { + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, + "Recents task returning to app: at " + task + + " stackInvisible=" + stackInvisible + + " behindFullscreenActivity=" + behindFullscreenActivity); + // We don't want any other tasks in the home stack visible if the recents + // activity is going to be returning to an application activity type. + // We do this to preserve the visible order the user used to get into the + // recents activity. The recents activity is normally translucent and if it + // doesn't have the wallpaper behind it the next activity in the home stack + // shouldn't be visible when the home stack is brought to the front to display + // the recents activity from an app. + behindFullscreenActivity = true; + } + } } @@ -1687,33 +1714,7 @@ final class ActivityStack { + " behindFullscreenActivity=" + behindFullscreenActivity); // At this point, nothing else needs to be shown in this task. behindFullscreenActivity = true; - } else if (isHomeStack()) { - if (r.isHomeActivity()) { - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Home activity: at " + r - + " stackInvisible=" + stackInvisible - + " behindFullscreenActivity=" + behindFullscreenActivity); - // No other activity in the home stack should be visible behind the home activity. - // Home activities is usually a translucent activity with the wallpaper behind them. - // However, when they don't have the wallpaper behind them, we want to show - // activities in the next application stack behind them vs. another activity in the - // home stack like recents. - behindFullscreenActivity = true; - } else if (r.isRecentsActivity() - && task.getTaskToReturnTo() == APPLICATION_ACTIVITY_TYPE) { - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "Recents activity returning to app: at " + r - + " stackInvisible=" + stackInvisible - + " behindFullscreenActivity=" + behindFullscreenActivity); - // We don't want any other activities in the home stack visible if the recents - // activity is going to be returning to an application activity type. - // We do this to preserve the visible order the user used to get into the recents - // activity. The recents activity is normally translucent and if it doesn't have - // the wallpaper behind it the next activity in the home stack shouldn't be visible - // when the home stack is brought to the front to display the recents activity from - // an app. - behindFullscreenActivity = true; - } - } else if (r.frontOfTask && task.isOverHomeStack()) { + } else if (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Showing home: at " + r + " stackInvisible=" + stackInvisible + " behindFullscreenActivity=" + behindFullscreenActivity); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 0beef53cbb70..26108a362273 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -148,6 +148,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TASKS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBLE_BEHIND; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityManagerService.ANIMATE; import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG; import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; @@ -2321,36 +2322,44 @@ public final class ActivityStackSupervisor implements DisplayListener { return false; } - moveActivityToStackLocked(r, PINNED_STACK_ID, "moveTopActivityToPinnedStack", null); - mWindowManager.animateResizePinnedStack(bounds); + moveActivityToPinnedStackLocked(r, "moveTopActivityToPinnedStack", bounds); return true; } - void moveActivityToStackLocked(ActivityRecord r, int stackId, String reason, Rect bounds) { - final TaskRecord task = r.task; - if (task.mActivities.size() == 1) { - // There is only one activity in the task. So, we can just move the task over to the - // stack without re-parenting the activity in a different task. - moveTaskToStackLocked( - task.taskId, stackId, ON_TOP, FORCE_FOCUS, reason, true /* animate */); - } else { - final ActivityStack stack = getStack(stackId, CREATE_IF_NEEDED, ON_TOP); - stack.moveActivityToStack(r); - } - - if (bounds != null) { - resizeStackLocked(stackId, bounds, null /* tempTaskBounds */, - null /* tempTaskInsetBounds */, !PRESERVE_WINDOWS, true); + void moveActivityToPinnedStackLocked(ActivityRecord r, String reason, Rect bounds) { + mWindowManager.deferSurfaceLayout(); + try { + final TaskRecord task = r.task; + + // Need to make sure the pinned stack exist so we can resize it below... + final ActivityStack stack = getStack(PINNED_STACK_ID, CREATE_IF_NEEDED, ON_TOP); + + // Resize the pinned stack to match the current size of the task the activity we are + // going to be moving is currently contained in. We do this to have the right starting + // animation bounds for the pinned stack to the desired bounds the caller wants. + resizeStackLocked(PINNED_STACK_ID, task.mBounds, null /* tempTaskBounds */, + null /* tempTaskInsetBounds */, !PRESERVE_WINDOWS, + true /* allowResizeInDockedMode */); + + if (task.mActivities.size() == 1) { + // There is only one activity in the task. So, we can just move the task over to + // the stack without re-parenting the activity in a different task. + moveTaskToStackLocked( + task.taskId, PINNED_STACK_ID, ON_TOP, FORCE_FOCUS, reason, !ANIMATE); + } else { + stack.moveActivityToStack(r); + } + } finally { + mWindowManager.continueSurfaceLayout(); } - // The task might have already been running and its visibility needs to be synchronized with - // the visibility of the stack / windows. + // The task might have already been running and its visibility needs to be synchronized + // with the visibility of the stack / windows. ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); resumeFocusedStackTopActivityLocked(); - if (stackId == PINNED_STACK_ID) { - mService.notifyActivityPinnedLocked(); - } + mWindowManager.animateResizePinnedStack(bounds); + mService.notifyActivityPinnedLocked(); } void positionTaskInStackLocked(int taskId, int stackId, int position) { diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index b360b897d1ee..28be456628ae 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1001,7 +1001,7 @@ class ActivityStarter { // If the activity is not focusable, we can't resume it, but still would like to // make sure it becomes visible as it starts (this will also trigger entry // animation). An example of this are PIP activities. - mTargetStack.ensureActivitiesVisibleLocked(mStartActivity, 0, !PRESERVE_WINDOWS); + mTargetStack.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); } } else { mTargetStack.addRecentActivityLocked(mStartActivity); diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 10f09775608b..98a7ead339df 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -933,10 +933,15 @@ final class TaskRecord { } return false; } + boolean isHomeTask() { return taskType == HOME_ACTIVITY_TYPE; } + boolean isRecentsTask() { + return taskType == RECENTS_ACTIVITY_TYPE; + } + boolean isApplicationTask() { return taskType == APPLICATION_ACTIVITY_TYPE; } diff --git a/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java b/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java index 5fd39c02a10a..dc6260921a67 100644 --- a/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java +++ b/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java @@ -49,7 +49,9 @@ import java.nio.charset.StandardCharsets; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.Arrays; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Random; @@ -107,27 +109,33 @@ public class NetworkDiagnostics { // so callers can wait for completion. private final CountDownLatch mCountDownLatch; - private class Measurement { + public class Measurement { private static final String SUCCEEDED = "SUCCEEDED"; private static final String FAILED = "FAILED"; - // TODO: Refactor to make these private for better encapsulation. - public String description = ""; - public long startTime; - public long finishTime; - public String result = ""; - public Thread thread; + private boolean succeeded; - public void recordSuccess(String msg) { + // Package private. TODO: investigate better encapsulation. + String description = ""; + long startTime; + long finishTime; + String result = ""; + Thread thread; + + public boolean checkSucceeded() { return succeeded; } + + void recordSuccess(String msg) { maybeFixupTimes(); + succeeded = true; result = SUCCEEDED + ": " + msg; if (mCountDownLatch != null) { mCountDownLatch.countDown(); } } - public void recordFailure(String msg) { + void recordFailure(String msg) { maybeFixupTimes(); + succeeded = false; result = FAILED + ": " + msg; if (mCountDownLatch != null) { mCountDownLatch.countDown(); @@ -265,41 +273,69 @@ public class NetworkDiagnostics { } catch (InterruptedException ignored) {} } - public void dump(IndentingPrintWriter pw) { - pw.println(TAG + ":" + mDescription); - final long unfinished = mCountDownLatch.getCount(); - if (unfinished > 0) { - // This can't happen unless a caller forgets to call waitForMeasurements() - // or a measurement isn't implemented to correctly honor the timeout. - pw.println("WARNING: countdown wait incomplete: " - + unfinished + " unfinished measurements"); - } + public List<Measurement> getMeasurements() { + // TODO: Consider moving waitForMeasurements() in here to minimize the + // chance of caller errors. - pw.increaseIndent(); + ArrayList<Measurement> measurements = new ArrayList(totalMeasurementCount()); + + // Sort measurements IPv4 first. for (Map.Entry<InetAddress, Measurement> entry : mIcmpChecks.entrySet()) { if (entry.getKey() instanceof Inet4Address) { - pw.println(entry.getValue().toString()); + measurements.add(entry.getValue()); + } + } + for (Map.Entry<Pair<InetAddress, InetAddress>, Measurement> entry : + mExplicitSourceIcmpChecks.entrySet()) { + if (entry.getKey().first instanceof Inet4Address) { + measurements.add(entry.getValue()); + } + } + for (Map.Entry<InetAddress, Measurement> entry : mDnsUdpChecks.entrySet()) { + if (entry.getKey() instanceof Inet4Address) { + measurements.add(entry.getValue()); } } + + // IPv6 measurements second. for (Map.Entry<InetAddress, Measurement> entry : mIcmpChecks.entrySet()) { if (entry.getKey() instanceof Inet6Address) { - pw.println(entry.getValue().toString()); + measurements.add(entry.getValue()); } } for (Map.Entry<Pair<InetAddress, InetAddress>, Measurement> entry : mExplicitSourceIcmpChecks.entrySet()) { - pw.println(entry.getValue().toString()); - } - for (Map.Entry<InetAddress, Measurement> entry : mDnsUdpChecks.entrySet()) { - if (entry.getKey() instanceof Inet4Address) { - pw.println(entry.getValue().toString()); + if (entry.getKey().first instanceof Inet6Address) { + measurements.add(entry.getValue()); } } for (Map.Entry<InetAddress, Measurement> entry : mDnsUdpChecks.entrySet()) { if (entry.getKey() instanceof Inet6Address) { - pw.println(entry.getValue().toString()); + measurements.add(entry.getValue()); } } + + return measurements; + } + + public void dump(IndentingPrintWriter pw) { + pw.println(TAG + ":" + mDescription); + final long unfinished = mCountDownLatch.getCount(); + if (unfinished > 0) { + // This can't happen unless a caller forgets to call waitForMeasurements() + // or a measurement isn't implemented to correctly honor the timeout. + pw.println("WARNING: countdown wait incomplete: " + + unfinished + " unfinished measurements"); + } + + pw.increaseIndent(); + + String prefix; + for (Measurement m : getMeasurements()) { + prefix = m.checkSucceeded() ? "." : "F"; + pw.println(prefix + " " + m.toString()); + } + pw.decreaseIndent(); } diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index 4c2699891893..e5e86ac44a26 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -1024,7 +1024,8 @@ public class JobSchedulerService extends com.android.server.SystemService final IPackageManager pm = AppGlobals.getPackageManager(); final ComponentName service = job.getService(); try { - ServiceInfo si = pm.getServiceInfo(service, 0, UserHandle.getUserId(uid)); + ServiceInfo si = pm.getServiceInfo(service, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getUserId(uid)); if (si == null) { throw new IllegalArgumentException("No such service " + service); } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index bf8e8fb4eb47..36ddbcf50f07 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -39,6 +39,7 @@ import static android.service.notification.NotificationListenerService.SUPPRESSE import static android.service.notification.NotificationListenerService.TRIM_FULL; import static android.service.notification.NotificationListenerService.TRIM_LIGHT; import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_HIGH; +import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_NONE; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.END_TAG; import static org.xmlpull.v1.XmlPullParser.START_TAG; @@ -1264,8 +1265,16 @@ public class NotificationManagerService extends SystemService { * Use this when you just want to know if notifications are OK for this package. */ @Override + public boolean areNotificationsEnabled(String pkg) { + return areNotificationsEnabledForPackage(pkg, Binder.getCallingUid()); + } + + /** + * Use this when you just want to know if notifications are OK for this package. + */ + @Override public boolean areNotificationsEnabledForPackage(String pkg, int uid) { - checkCallerIsSystem(); + checkCallerIsSystemOrSameApp(pkg); return (mAppOps.checkOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg) == AppOpsManager.MODE_ALLOWED) && !isApplicationSuspended(pkg, uid); } @@ -1329,6 +1338,12 @@ public class NotificationManagerService extends SystemService { } @Override + public int getTopicImportance(String pkg, String topicId) { + checkCallerIsSystemOrSameApp(pkg); + return mRankingHelper.getImportance(pkg, Binder.getCallingUid(), topicId); + } + + @Override public int getImportance(String pkg, int uid, Notification.Topic topic) { checkCallerIsSystem(); return mRankingHelper.getImportance(pkg, uid, topic); @@ -2001,6 +2016,9 @@ public class NotificationManagerService extends SystemService { @Override public void setImportanceFromAssistant(INotificationListener token, String key, int importance, CharSequence explanation) throws RemoteException { + if (importance == IMPORTANCE_NONE) { + throw new IllegalArgumentException("blocking not allowed: key=" + key); + } final long identity = Binder.clearCallingIdentity(); try { synchronized (mNotificationList) { @@ -3480,7 +3498,8 @@ public class NotificationManagerService extends SystemService { try { // TODO: it might be faster to return a boolean from package manager rather than the // whole application info. Revisit and make the API change. - ai = AppGlobals.getPackageManager().getApplicationInfo(pkg, 0, userId); + ai = AppGlobals.getPackageManager().getApplicationInfo(pkg, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId); if (ai == null) { Slog.w(TAG, "No application info for package " + pkg + " and user " + userId); return false; diff --git a/services/core/java/com/android/server/notification/RankingConfig.java b/services/core/java/com/android/server/notification/RankingConfig.java index 1a7e3550d8e3..17bb9075b0eb 100644 --- a/services/core/java/com/android/server/notification/RankingConfig.java +++ b/services/core/java/com/android/server/notification/RankingConfig.java @@ -39,4 +39,6 @@ public interface RankingConfig { boolean doesAppUseTopics(String packageName, int uid); boolean hasBannedTopics(String packageName, int uid); + + int getImportance(String packageName, int uid, String topicId); } diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index aa36e298bb45..6554bf91cf18 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.UserHandle; +import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService.Ranking; import android.text.TextUtils; import android.util.ArrayMap; @@ -467,6 +468,24 @@ public class RankingHelper implements RankingConfig { } /** + * Gets the importance of a topic. Unlike {@link #getImportance(String, int, String)}, does not + * create package or topic records if they don't exist. + */ + @Override + public int getImportance(String packageName, int uid, String topicId) { + final String key = recordKey(packageName, uid); + Record r = mRecords.get(key); + if (r == null) { + return Ranking.IMPORTANCE_UNSPECIFIED; + } + Topic t = r.topics.get(topicId); + if (t == null) { + return Ranking.IMPORTANCE_UNSPECIFIED; + } + return t.importance; + } + + /** * Gets importance. If a topic is given, returns the importance of that topic. Otherwise, the * importance of the app. */ diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index bba0d402c90e..383c1ab5ebef 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -578,7 +578,8 @@ public class ZenModeHelper { ZenRule rule = newConfig.automaticRules.get(newConfig.automaticRules.keyAt(i)); if (RULE_INSTANCE_GRACE_PERIOD < (currentTime - rule.creationTime)) { try { - mPm.getPackageInfo(rule.component.getPackageName(), 0); + mPm.getPackageInfo(rule.component.getPackageName(), + PackageManager.MATCH_UNINSTALLED_PACKAGES); } catch (PackageManager.NameNotFoundException e) { newConfig.automaticRules.removeAt(i); } diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java index 6c338c184e4a..9b5fde00bce0 100644 --- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java @@ -262,6 +262,7 @@ final class DefaultPermissionGrantPolicy { grantRuntimePermissionsLPw(setupPackage, PHONE_PERMISSIONS, userId); grantRuntimePermissionsLPw(setupPackage, CONTACTS_PERMISSIONS, userId); grantRuntimePermissionsLPw(setupPackage, LOCATION_PERMISSIONS, userId); + grantRuntimePermissionsLPw(setupPackage, CAMERA_PERMISSIONS, userId); } // Camera diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c8645b467ca2..e47d5144cce0 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3427,6 +3427,18 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override + public @Nullable String getServicesSystemSharedLibraryPackageName() { + synchronized (mPackages) { + SharedLibraryEntry libraryEntry = mSharedLibraries.get( + PackageManager.SYSTEM_SHARED_LIBRARY_SERVICES); + if (libraryEntry != null) { + return libraryEntry.apk; + } + } + return null; + } + + @Override public FeatureInfo[] getSystemAvailableFeatures() { Collection<FeatureInfo> featSet; synchronized (mPackages) { @@ -8220,7 +8232,7 @@ public class PackageManagerService extends IPackageManager.Stub { * * If {@code extractLibs} is true, native libraries are extracted from the app if required. */ - public void derivePackageAbi(PackageParser.Package pkg, File scanFile, + private void derivePackageAbi(PackageParser.Package pkg, File scanFile, String cpuAbiOverride, boolean extractLibs) throws PackageManagerException { // TODO: We can probably be smarter about this stuff. For installed apps, @@ -8301,16 +8313,17 @@ public class PackageManagerService extends IPackageManager.Stub { if (abi32 >= 0) { final String abi = Build.SUPPORTED_32_BIT_ABIS[abi32]; if (abi64 >= 0) { - pkg.applicationInfo.secondaryCpuAbi = abi; + if (cpuAbiOverride == null && pkg.use32bitAbi) { + pkg.applicationInfo.secondaryCpuAbi = pkg.applicationInfo.primaryCpuAbi; + pkg.applicationInfo.primaryCpuAbi = abi; + } else { + pkg.applicationInfo.secondaryCpuAbi = abi; + } } else { pkg.applicationInfo.primaryCpuAbi = abi; } } - if (cpuAbiOverride != null && - cpuAbiOverride.equals(pkg.applicationInfo.secondaryCpuAbi)) { - pkg.applicationInfo.secondaryCpuAbi = pkg.applicationInfo.primaryCpuAbi; - pkg.applicationInfo.primaryCpuAbi = cpuAbiOverride; - } + } else { String[] abiList = (cpuAbiOverride != null) ? new String[] { cpuAbiOverride } : Build.SUPPORTED_ABIS; @@ -14396,7 +14409,6 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageLI: " + packageName + " user " + user); PackageSetting ps; - int removeUser = -1; synchronized (mPackages) { ps = mSettings.mPackages.get(packageName); @@ -14411,7 +14423,9 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.d(TAG, "Uninstalled child package:" + packageName + " for user:" + ((user == null) ? UserHandle.USER_ALL : user)); } - if (!clearPackageStateForUser(ps, removeUser, outInfo)) { + final int removedUserId = (user != null) ? user.getIdentifier() + : UserHandle.USER_ALL; + if (!clearPackageStateForUser(ps, removedUserId, outInfo)) { return false; } markPackageUninstalledForUserLPw(ps, user); @@ -14435,9 +14449,9 @@ public class PackageManagerService extends IPackageManager.Stub { if (ps.isAnyInstalled(sUserManager.getUserIds()) || keepUninstalledPackage) { // Other user still have this package installed, so all // we need to do is clear this user's data and save that - // it is uninstalled. - if (DEBUG_REMOVE) Slog.d(TAG, "Still installed by other users"); - if (!clearPackageStateForUser(ps, removeUser, outInfo)) { + // it is uninstalled. + if (DEBUG_REMOVE) Slog.d(TAG, "Still installed by other users"); + if (!clearPackageStateForUser(ps, user.getIdentifier(), outInfo)) { return false; } scheduleWritePackageRestrictionsLocked(user); @@ -14454,7 +14468,7 @@ public class PackageManagerService extends IPackageManager.Stub { // we need to do is clear this user's data and save that // it is uninstalled. if (DEBUG_REMOVE) Slog.d(TAG, "Deleting system app"); - if (!clearPackageStateForUser(ps, removeUser, outInfo)) { + if (!clearPackageStateForUser(ps, user.getIdentifier(), outInfo)) { return false; } scheduleWritePackageRestrictionsLocked(user); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a92cc31659e6..c046ba610b3a 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2645,11 +2645,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } else if (win.getAttrs().type == TYPE_DOCK_DIVIDER) { - if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { - return R.anim.fade_in; - } else if (transit == TRANSIT_EXIT) { - return R.anim.fade_out; - } + return selectDockedDividerAnimationLw(win, transit); } if (transit == TRANSIT_PREVIEW_DONE) { @@ -2669,6 +2665,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { return 0; } + private int selectDockedDividerAnimationLw(WindowState win, int transit) { + int insets = mWindowManagerFuncs.getDockedDividerInsetsLw(); + + // If the divider is behind the navigation bar, don't animate. + if (mNavigationBar != null + && (win.getFrameLw().top + insets >= mNavigationBar.getFrameLw().top + || win.getFrameLw().left + insets >= mNavigationBar.getFrameLw().left)) { + return 0; + } + if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { + return R.anim.fade_in; + } else if (transit == TRANSIT_EXIT) { + return R.anim.fade_out; + } else { + return 0; + } + } + @Override public void selectRotationAnimationLw(int anim[]) { if (PRINT_ANIM) Slog.i(TAG, "selectRotationAnimation mTopFullscreen=" diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 3e99a4cfe01e..0f51c82eba37 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -19,6 +19,7 @@ package com.android.server.tv; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED_STANDBY; +import android.annotation.Nullable; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -1582,7 +1583,7 @@ public final class TvInputManagerService extends SystemService { } @Override - public void startRecording(IBinder sessionToken, int userId) { + public void startRecording(IBinder sessionToken, @Nullable Uri programHint, int userId) { final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, userId, "startRecording"); @@ -1590,7 +1591,8 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { try { - getSessionLocked(sessionToken, callingUid, resolvedUserId).startRecording(); + getSessionLocked(sessionToken, callingUid, resolvedUserId).startRecording( + programHint); } catch (RemoteException | SessionNotFoundException e) { Slog.e(TAG, "error in startRecording", e); } @@ -2474,7 +2476,8 @@ public final class TvInputManagerService extends SystemService { public void onSessionEvent(String eventType, Bundle eventArgs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onEvent(what=" + eventType + ", data=" + eventArgs + ")"); + Slog.d(TAG, "onEvent(eventType=" + eventType + ", eventArgs=" + eventArgs + + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2491,7 +2494,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftStatusChanged(int status) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftStatusChanged()"); + Slog.d(TAG, "onTimeShiftStatusChanged(status=" + status + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2508,7 +2511,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftStartPositionChanged(long timeMs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftStartPositionChanged()"); + Slog.d(TAG, "onTimeShiftStartPositionChanged(timeMs=" + timeMs + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2525,7 +2528,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftCurrentPositionChanged(long timeMs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftCurrentPositionChanged()"); + Slog.d(TAG, "onTimeShiftCurrentPositionChanged(timeMs=" + timeMs + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2580,7 +2583,8 @@ public final class TvInputManagerService extends SystemService { public void onRecordingStopped(Uri recordedProgramUri) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onRecordingStopped()"); + Slog.d(TAG, "onRecordingStopped(recordedProgramUri=" + recordedProgramUri + + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2598,7 +2602,7 @@ public final class TvInputManagerService extends SystemService { public void onError(int error) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onError()"); + Slog.d(TAG, "onError(error=" + error + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 72953183a173..412a45500157 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -72,6 +72,10 @@ public class DockedStackDividerController implements DimLayerUser { return mDividerWindowWidth - 2 * mDividerInsets; } + int getContentInsets() { + return mDividerInsets; + } + void setResizing(boolean resizing) { mResizing = resizing; } diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index a8b728923265..7244676c8abd 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -38,6 +38,7 @@ import java.util.ArrayList; import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; +import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.WindowManager.DOCKED_BOTTOM; import static android.view.WindowManager.DOCKED_INVALID; @@ -945,6 +946,13 @@ public class TaskStack implements DimLayer.DimLayerUser, mDragResizing = false; mService.requestTraversal(); } + if (mStackId == PINNED_STACK_ID) { + try { + mService.mActivityManager.notifyPinnedStackAnimationEnded(); + } catch (RemoteException e) { + // I don't believe you... + } + } } @Override diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1b041cb751f1..d1ffaa07ed13 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -9619,6 +9619,11 @@ public class WindowManagerService extends IWindowManager.Stub && !appWindow.mTask.inFreeformWorkspace(); } + @Override + public int getDockedDividerInsetsLw() { + return getDefaultDisplayContentLocked().getDockedDividerController().getContentInsets(); + } + void dumpPolicyLocked(PrintWriter pw, String[] args, boolean dumpAll) { pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)"); mPolicy.dump(" ", pw, args); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 3fb5a0d39b84..eacf11f47415 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -32,6 +32,7 @@ import android.Manifest.permission; import android.accessibilityservice.AccessibilityServiceInfo; import android.accounts.AccountManager; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManagerNative; @@ -2841,16 +2842,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - private boolean isAdminApiLevelMOrBelow(@NonNull ComponentName who, int userHandle) { - DeviceAdminInfo adminInfo = findAdmin(who, userHandle, false); - return adminInfo.getActivityInfo().applicationInfo.targetSdkVersion - <= Build.VERSION_CODES.M; - } - @Override public boolean isSeparateProfileChallengeAllowed(int userHandle) { ComponentName profileOwner = getProfileOwner(userHandle); - return profileOwner != null && !isAdminApiLevelMOrBelow(profileOwner, userHandle); + try { + // Profile challenge is supported on N or newer release. + return profileOwner != null && + getTargetSdk(profileOwner.getPackageName(), userHandle) > Build.VERSION_CODES.M; + } catch (RemoteException e) { + return false; + } } @Override @@ -4195,6 +4196,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int userHandle = UserHandle.getCallingUserId(); synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); + try { + if (getTargetSdk(who.getPackageName(), userHandle) >= Build.VERSION_CODES.N) { + if (installerPackage != null && + !isPackageInstalledForUser(installerPackage, userHandle)) { + throw new IllegalArgumentException("Package " + installerPackage + + " is not installed on the current user"); + } + } + } catch (RemoteException e) { + } DevicePolicyData policy = getUserData(userHandle); policy.mDelegatedCertInstallerPackage = installerPackage; saveSettingsLocked(userHandle); @@ -6093,9 +6104,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public void setApplicationRestrictionsManagingPackage(ComponentName admin, String packageName) { + Preconditions.checkNotNull(admin, "ComponentName is null"); + final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (this) { getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); + if (packageName != null && !isPackageInstalledForUser(packageName, userHandle)) { + throw new IllegalArgumentException("Package " + packageName + " is not installed " + + "on the current user"); + } DevicePolicyData policy = getUserData(userHandle); policy.mApplicationRestrictionsManagingPackage = packageName; saveSettingsLocked(userHandle); @@ -6104,6 +6121,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public String getApplicationRestrictionsManagingPackage(ComponentName admin) { + Preconditions.checkNotNull(admin, "ComponentName is null"); + final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (this) { getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index c122c5a365fc..f1cbb9ab73d3 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -774,9 +774,9 @@ public class TelecomManager { } /** - * Register a {@link PhoneAccount} for use by the system. When registering - * {@link PhoneAccount}s, existing registrations will be overwritten if the - * {@link PhoneAccountHandle} matches that of a {@link PhoneAccount} which is already + * Register a {@link PhoneAccount} for use by the system that will be stored in Device Encrypted + * storage. When registering {@link PhoneAccount}s, existing registrations will be overwritten + * if the {@link PhoneAccountHandle} matches that of a {@link PhoneAccount} which is already * registered. Once registered, the {@link PhoneAccount} is listed to the user as an option * when placing calls. The user may still need to enable the {@link PhoneAccount} within * the phone app settings before the account is usable. @@ -1166,11 +1166,16 @@ public class TelecomManager { /** * Registers a new incoming call. A {@link ConnectionService} should invoke this method when it * has an incoming call. The specified {@link PhoneAccountHandle} must have been registered - * with {@link #registerPhoneAccount}. Once invoked, this method will cause the system to bind - * to the {@link ConnectionService} associated with the {@link PhoneAccountHandle} and request - * additional information about the call (See - * {@link ConnectionService#onCreateIncomingConnection}) before starting the incoming call UI. - * + * with {@link #registerPhoneAccount} and the user must have enabled the corresponding + * {@link PhoneAccount}. This can be checked using {@link #getPhoneAccount}. Once invoked, this + * method will cause the system to bind to the {@link ConnectionService} associated with the + * {@link PhoneAccountHandle} and request additional information about the call + * (See {@link ConnectionService#onCreateIncomingConnection}) before starting the incoming + * call UI. + * <p> + * A {@link SecurityException} will be thrown if either the {@link PhoneAccountHandle} does not + * correspond to a registered {@link PhoneAccount} or the associated {@link PhoneAccount} is not + * currently enabled by the user. * @param phoneAccount A {@link PhoneAccountHandle} registered with * {@link #registerPhoneAccount}. * @param extras A bundle that will be passed through to diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index ffb73f63230c..4e6d638d4739 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -17,6 +17,7 @@ package android.test.mock; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.PackageInstallObserver; import android.content.ComponentName; import android.content.Intent; @@ -806,6 +807,12 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public @Nullable String getServicesSystemSharedLibraryPackageName() { + throw new UnsupportedOperationException(); + } + @Override public FeatureInfo[] getSystemAvailableFeatures() { throw new UnsupportedOperationException(); diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java index 3a30230833ed..46de2016e4e4 100644 --- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java +++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java @@ -37,6 +37,7 @@ import android.os.PowerManager; // private NM API import android.app.INotificationManager; +import android.widget.Toast; public class NotificationTestList extends TestActivity { @@ -233,6 +234,30 @@ public class NotificationTestList extends TestActivity } }, + new Test("Is blocked?") { + public void run() { + Toast.makeText(NotificationTestList.this, + "package enabled? " + mNM.areNotificationsEnabled(), + Toast.LENGTH_LONG).show(); + } + }, + + new Test("Topic banana importance?") { + public void run() { + Toast.makeText(NotificationTestList.this, + "bananas importance? " + mNM.getImportance("bananas"), + Toast.LENGTH_LONG).show(); + } + }, + + new Test("Topic garbage importance?") { + public void run() { + Toast.makeText(NotificationTestList.this, + "garbage importance? " + mNM.getImportance("garbage"), + Toast.LENGTH_LONG).show(); + } + }, + new Test("Whens") { public void run() { diff --git a/tools/aapt2/Android.mk b/tools/aapt2/Android.mk index f74b93abd796..88b6270fad60 100644 --- a/tools/aapt2/Android.mk +++ b/tools/aapt2/Android.mk @@ -43,6 +43,9 @@ sources := \ link/TableMerger.cpp \ link/XmlReferenceLinker.cpp \ process/SymbolTable.cpp \ + proto/ProtoHelpers.cpp \ + proto/TableProtoDeserializer.cpp \ + proto/TableProtoSerializer.cpp \ unflatten/BinaryResourceParser.cpp \ unflatten/ResChunkPullParser.cpp \ util/BigBuffer.cpp \ @@ -67,13 +70,14 @@ sources := \ xml/XmlPullParser.cpp \ xml/XmlUtil.cpp +sources += Format.proto + testSources := \ compile/IdAssigner_test.cpp \ compile/PseudolocaleGenerator_test.cpp \ compile/Pseudolocalizer_test.cpp \ compile/XmlIdCollector_test.cpp \ filter/ConfigFilter_test.cpp \ - flatten/FileExportWriter_test.cpp \ flatten/TableFlattener_test.cpp \ flatten/XmlFlattener_test.cpp \ link/AutoVersioner_test.cpp \ @@ -83,7 +87,7 @@ testSources := \ link/TableMerger_test.cpp \ link/XmlReferenceLinker_test.cpp \ process/SymbolTable_test.cpp \ - unflatten/FileExportHeaderReader_test.cpp \ + proto/TableProtoSerializer_test.cpp \ util/BigBuffer_test.cpp \ util/Maybe_test.cpp \ util/StringPiece_test.cpp \ @@ -105,6 +109,7 @@ testSources := \ toolSources := \ compile/Compile.cpp \ + dump/Dump.cpp \ link/Link.cpp hostLdLibs := @@ -119,6 +124,9 @@ hostStaticLibs := \ libpng \ libbase +hostSharedLibs := \ + libprotobuf-cpp-lite + ifneq ($(strip $(USE_MINGW)),) hostStaticLibs += libz else @@ -127,21 +135,23 @@ endif cFlags := -Wall -Werror -Wno-unused-parameter -UNDEBUG cppFlags := -std=c++11 -Wno-missing-field-initializers -fno-exceptions -fno-rtti +protoIncludes := $(call generated-sources-dir-for,STATIC_LIBRARIES,libaapt2,HOST) # ========================================================== # Build the host static library: libaapt2 # ========================================================== include $(CLEAR_VARS) +LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := libaapt2 LOCAL_SRC_FILES := $(sources) LOCAL_STATIC_LIBRARIES += $(hostStaticLibs) LOCAL_CFLAGS += $(cFlags) LOCAL_CPPFLAGS += $(cppFlags) +LOCAL_C_INCLUDES += $(protoIncludes) include $(BUILD_HOST_STATIC_LIBRARY) - # ========================================================== # Build the host tests: libaapt2_tests # ========================================================== @@ -152,9 +162,11 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(testSources) LOCAL_STATIC_LIBRARIES += libaapt2 $(hostStaticLibs) +LOCAL_SHARED_LIBRARIES += $(hostSharedLibs) LOCAL_LDLIBS += $(hostLdLibs) LOCAL_CFLAGS += $(cFlags) LOCAL_CPPFLAGS += $(cppFlags) +LOCAL_C_INCLUDES += $(protoIncludes) include $(BUILD_HOST_NATIVE_TEST) @@ -167,9 +179,11 @@ LOCAL_MODULE := aapt2 LOCAL_SRC_FILES := $(main) $(toolSources) LOCAL_STATIC_LIBRARIES += libaapt2 $(hostStaticLibs) +LOCAL_SHARED_LIBRARIES += $(hostSharedLibs) LOCAL_LDLIBS += $(hostLdLibs) LOCAL_CFLAGS += $(cFlags) LOCAL_CPPFLAGS += $(cppFlags) +LOCAL_C_INCLUDES += $(protoIncludes) include $(BUILD_HOST_EXECUTABLE) diff --git a/tools/aapt2/Format.proto b/tools/aapt2/Format.proto new file mode 100644 index 000000000000..d05425c5c64d --- /dev/null +++ b/tools/aapt2/Format.proto @@ -0,0 +1,210 @@ +/* + * 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. + */ + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package aapt.pb; + +message ConfigDescription { + optional bytes data = 1; + optional string product = 2; +} + +message StringPool { + optional bytes data = 1; +} + +message CompiledFile { + message Symbol { + optional string resource_name = 1; + optional uint32 line_no = 2; + } + + optional string resource_name = 1; + optional ConfigDescription config = 2; + optional string source_path = 3; + repeated Symbol exported_symbols = 4; +} + +message ResourceTable { + optional StringPool string_pool = 1; + optional StringPool source_pool = 2; + optional StringPool symbol_pool = 3; + repeated Package packages = 4; +} + +message Package { + optional uint32 package_id = 1; + optional string package_name = 2; + repeated Type types = 3; +} + +message Type { + optional uint32 id = 1; + optional string name = 2; + repeated Entry entries = 3; +} + +message SymbolStatus { + enum Visibility { + Unknown = 0; + Private = 1; + Public = 2; + } + optional Visibility visibility = 1; + optional Source source = 2; + optional string comment = 3; +} + +message Entry { + optional uint32 id = 1; + optional string name = 2; + optional SymbolStatus symbol_status = 3; + repeated ConfigValue config_values = 4; +} + +message ConfigValue { + optional ConfigDescription config = 1; + optional Value value = 2; +} + +message Source { + optional uint32 path_idx = 1; + optional uint32 line_no = 2; + optional uint32 col_no = 3; +} + +message Reference { + enum Type { + Ref = 0; + Attr = 1; + } + optional Type type = 1; + optional uint32 id = 2; + optional uint32 symbol_idx = 3; + optional bool private = 4; +} + +message Id { +} + +message String { + optional uint32 idx = 1; +} + +message RawString { + optional uint32 idx = 1; +} + +message FileReference { + optional uint32 path_idx = 1; +} + +message Primitive { + optional uint32 type = 1; + optional uint32 data = 2; +} + +message Attribute { + message Symbol { + optional Source source = 1; + optional string comment = 2; + optional Reference name = 3; + optional uint32 value = 4; + } + optional uint32 format_flags = 1; + optional int32 min_int = 2; + optional int32 max_int = 3; + repeated Symbol symbols = 4; +} + +message Style { + message Entry { + optional Source source = 1; + optional string comment = 2; + optional Reference key = 3; + optional Item item = 4; + } + + optional Reference parent = 1; + optional Source parent_source = 2; + repeated Entry entries = 3; +} + +message Styleable { + message Entry { + optional Source source = 1; + optional string comment = 2; + optional Reference attr = 3; + } + repeated Entry entries = 1; +} + +message Array { + message Entry { + optional Source source = 1; + optional string comment = 2; + optional Item item = 3; + } + repeated Entry entries = 1; +} + +message Plural { + enum Arity { + Zero = 0; + One = 1; + Two = 2; + Few = 3; + Many = 4; + Other = 5; + } + + message Entry { + optional Source source = 1; + optional string comment = 2; + optional Arity arity = 3; + optional Item item = 4; + } + repeated Entry entries = 1; +} + +message Item { + optional Reference ref = 1; + optional String str = 2; + optional RawString raw_str = 3; + optional FileReference file = 4; + optional Id id = 5; + optional Primitive prim = 6; +} + +message CompoundValue { + optional Attribute attr = 1; + optional Style style = 2; + optional Styleable styleable = 3; + optional Array array = 4; + optional Plural plural = 5; +} + +message Value { + optional Source source = 1; + optional string comment = 2; + optional bool weak = 3; + + optional Item item = 4; + optional CompoundValue compound_value = 5; +} diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp index 248e7ad73a82..a2fadd95db3f 100644 --- a/tools/aapt2/Main.cpp +++ b/tools/aapt2/Main.cpp @@ -23,6 +23,7 @@ namespace aapt { extern int compile(const std::vector<StringPiece>& args); extern int link(const std::vector<StringPiece>& args); +extern int dump(const std::vector<StringPiece>& args); } // namespace aapt @@ -41,12 +42,14 @@ int main(int argc, char** argv) { return aapt::compile(args); } else if (command == "link" || command == "l") { return aapt::link(args); + } else if (command == "dump" || command == "d") { + return aapt::dump(args); } std::cerr << "unknown command '" << command << "'\n"; } else { std::cerr << "no command specified\n"; } - std::cerr << "\nusage: aapt2 [compile|link] ..." << std::endl; + std::cerr << "\nusage: aapt2 [compile|link|dump] ..." << std::endl; return 1; } diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp index 07f62afe05b9..74c48b0f8426 100644 --- a/tools/aapt2/ResourceUtils.cpp +++ b/tools/aapt2/ResourceUtils.cpp @@ -51,6 +51,10 @@ bool extractResourceName(const StringPiece16& str, StringPiece16* outPackage, } bool parseResourceName(const StringPiece16& str, ResourceNameRef* outRef, bool* outPrivate) { + if (str.empty()) { + return false; + } + size_t offset = 0; bool priv = false; if (str.data()[0] == u'*') { diff --git a/tools/aapt2/ResourceUtils.h b/tools/aapt2/ResourceUtils.h index 64ca97185153..a0fbcc6e700b 100644 --- a/tools/aapt2/ResourceUtils.h +++ b/tools/aapt2/ResourceUtils.h @@ -45,7 +45,8 @@ bool extractResourceName(const StringPiece16& str, StringPiece16* outPackage, * `outResource` set to the parsed resource name and `outPrivate` set to true if a '*' prefix * was present. */ -bool parseResourceName(const StringPiece16& str, ResourceNameRef* outResource, bool* outPrivate); +bool parseResourceName(const StringPiece16& str, ResourceNameRef* outResource, + bool* outPrivate = nullptr); /* * Returns true if the string was parsed as a reference (@[+][package:]type/name), with diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp index c9f93e1dd7c2..7425f97ef8de 100644 --- a/tools/aapt2/ResourceUtils_test.cpp +++ b/tools/aapt2/ResourceUtils_test.cpp @@ -58,6 +58,8 @@ TEST(ResourceUtilsTest, ParseResourceName) { EXPECT_TRUE(ResourceUtils::parseResourceName(u"*android:color/foo", &actual, &actualPriv)); EXPECT_EQ(ResourceNameRef(u"android", ResourceType::kColor, u"foo"), actual); EXPECT_TRUE(actualPriv); + + EXPECT_FALSE(ResourceUtils::parseResourceName(StringPiece16(), &actual, &actualPriv)); } TEST(ResourceUtilsTest, ParseReferenceWithNoPackage) { diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp index b93e6d889ad0..ab9c792876b3 100644 --- a/tools/aapt2/ResourceValues.cpp +++ b/tools/aapt2/ResourceValues.cpp @@ -19,7 +19,6 @@ #include "ResourceValues.h" #include "ValueVisitor.h" #include "util/Util.h" -#include "flatten/ResourceTypeExtensions.h" #include <androidfw/ResourceTypes.h> #include <limits> @@ -47,7 +46,7 @@ RawString* RawString::clone(StringPool* newPool) const { } bool RawString::flatten(android::Res_value* outValue) const { - outValue->dataType = ExtendedTypes::TYPE_RAW_STRING; + outValue->dataType = android::Res_value::TYPE_STRING; outValue->data = util::hostToDevice32(static_cast<uint32_t>(value.getIndex())); return true; } diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h index 8e317dbcd1b1..dc2e28ee3abd 100644 --- a/tools/aapt2/ResourceValues.h +++ b/tools/aapt2/ResourceValues.h @@ -154,8 +154,8 @@ struct Reference : public BaseItem<Reference> { bool privateReference = false; Reference(); - Reference(const ResourceNameRef& n, Type type = Type::kResource); - Reference(const ResourceId& i, Type type = Type::kResource); + explicit Reference(const ResourceNameRef& n, Type type = Type::kResource); + explicit Reference(const ResourceId& i, Type type = Type::kResource); bool flatten(android::Res_value* outValue) const override; Reference* clone(StringPool* newPool) const override; diff --git a/tools/aapt2/ValueVisitor.h b/tools/aapt2/ValueVisitor.h index 94042e3c2618..549303939351 100644 --- a/tools/aapt2/ValueVisitor.h +++ b/tools/aapt2/ValueVisitor.h @@ -18,6 +18,7 @@ #define AAPT_VALUE_VISITOR_H #include "ResourceValues.h" +#include "ResourceTable.h" namespace aapt { @@ -140,6 +141,23 @@ T* valueCast(Value* value) { return visitor.value; } + +inline void visitAllValuesInPackage(ResourceTablePackage* pkg, RawValueVisitor* visitor) { + for (auto& type : pkg->types) { + for (auto& entry : type->entries) { + for (auto& configValue : entry->values) { + configValue.value->accept(visitor); + } + } + } +} + +inline void visitAllValuesInTable(ResourceTable* table, RawValueVisitor* visitor) { + for (auto& pkg : table->packages) { + visitAllValuesInPackage(pkg.get(), visitor); + } +} + } // namespace aapt #endif // AAPT_VALUE_VISITOR_H diff --git a/tools/aapt2/compile/Compile.cpp b/tools/aapt2/compile/Compile.cpp index 689ace6e6aa1..1eefb821768e 100644 --- a/tools/aapt2/compile/Compile.cpp +++ b/tools/aapt2/compile/Compile.cpp @@ -24,15 +24,17 @@ #include "compile/PseudolocaleGenerator.h" #include "compile/XmlIdCollector.h" #include "flatten/Archive.h" -#include "flatten/FileExportWriter.h" -#include "flatten/TableFlattener.h" #include "flatten/XmlFlattener.h" +#include "proto/ProtoSerialize.h" #include "util/Files.h" #include "util/Maybe.h" #include "util/Util.h" #include "xml/XmlDom.h" #include "xml/XmlPullParser.h" +#include <google/protobuf/io/zero_copy_stream_impl_lite.h> +#include <google/protobuf/io/coded_stream.h> + #include <dirent.h> #include <fstream> #include <string> @@ -232,34 +234,95 @@ static bool compileTable(IAaptContext* context, const CompileOptions& options, } } - // Assign IDs to prepare the table for flattening. - IdAssigner idAssigner; - if (!idAssigner.consume(context, &table)) { + // Create the file/zip entry. + if (!writer->startEntry(outputPath, 0)) { + context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open"); return false; } - // Flatten the table. - BigBuffer buffer(1024); - TableFlattenerOptions tableFlattenerOptions; - tableFlattenerOptions.useExtendedChunks = true; - TableFlattener flattener(&buffer, tableFlattenerOptions); - if (!flattener.consume(context, &table)) { + std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(&table); + + // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream interface. + { + google::protobuf::io::CopyingOutputStreamAdaptor adaptor(writer); + + if (!pbTable->SerializeToZeroCopyStream(&adaptor)) { + context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write"); + return false; + } + } + + if (!writer->finishEntry()) { + context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to finish entry"); return false; } + return true; +} +static bool writeHeaderAndBufferToWriter(const StringPiece& outputPath, const ResourceFile& file, + const BigBuffer& buffer, IArchiveWriter* writer, + IDiagnostics* diag) { + // Start the entry so we can write the header. if (!writer->startEntry(outputPath, 0)) { - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open"); + diag->error(DiagMessage(outputPath) << "failed to open file"); + return false; + } + + // Create the header. + std::unique_ptr<pb::CompiledFile> pbCompiledFile = serializeCompiledFileToPb(file); + + { + // The stream must be destroyed before we finish the entry, or else + // some data won't be flushed. + // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream + // interface. + google::protobuf::io::CopyingOutputStreamAdaptor adaptor(writer); + CompiledFileOutputStream outputStream(&adaptor, pbCompiledFile.get()); + for (const BigBuffer::Block& block : buffer) { + if (!outputStream.Write(block.buffer.get(), block.size)) { + diag->error(DiagMessage(outputPath) << "failed to write data"); + return false; + } + } + } + + if (!writer->finishEntry()) { + diag->error(DiagMessage(outputPath) << "failed to finish writing data"); return false; } + return true; +} - if (writer->writeEntry(buffer)) { - if (writer->finishEntry()) { - return true; +static bool writeHeaderAndMmapToWriter(const StringPiece& outputPath, const ResourceFile& file, + const android::FileMap& map, IArchiveWriter* writer, + IDiagnostics* diag) { + // Start the entry so we can write the header. + if (!writer->startEntry(outputPath, 0)) { + diag->error(DiagMessage(outputPath) << "failed to open file"); + return false; + } + + // Create the header. + std::unique_ptr<pb::CompiledFile> pbCompiledFile = serializeCompiledFileToPb(file); + + { + // The stream must be destroyed before we finish the entry, or else + // some data won't be flushed. + // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream + // interface. + google::protobuf::io::CopyingOutputStreamAdaptor adaptor(writer); + CompiledFileOutputStream outputStream(&adaptor, pbCompiledFile.get()); + if (!outputStream.Write(map.getDataPtr(), map.getDataLength())) { + diag->error(DiagMessage(outputPath) << "failed to write data"); + return false; } } - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write"); - return false; + if (!writer->finishEntry()) { + diag->error(DiagMessage(outputPath) << "failed to finish writing data"); + return false; + } + return true; } static bool compileXml(IAaptContext* context, const CompileOptions& options, @@ -267,7 +330,6 @@ static bool compileXml(IAaptContext* context, const CompileOptions& options, const std::string& outputPath) { std::unique_ptr<xml::XmlResource> xmlRes; - { std::ifstream fin(pathData.source.path, std::ifstream::binary); if (!fin) { @@ -295,30 +357,18 @@ static bool compileXml(IAaptContext* context, const CompileOptions& options, xmlRes->file.source = pathData.source; BigBuffer buffer(1024); - ChunkWriter fileExportWriter = wrapBufferWithFileExportHeader(&buffer, &xmlRes->file); - XmlFlattenerOptions xmlFlattenerOptions; xmlFlattenerOptions.keepRawValues = true; - XmlFlattener flattener(fileExportWriter.getBuffer(), xmlFlattenerOptions); + XmlFlattener flattener(&buffer, xmlFlattenerOptions); if (!flattener.consume(context, xmlRes.get())) { return false; } - fileExportWriter.finish(); - - if (!writer->startEntry(outputPath, 0)) { - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open"); + if (!writeHeaderAndBufferToWriter(outputPath, xmlRes->file, buffer, writer, + context->getDiagnostics())) { return false; } - - if (writer->writeEntry(buffer)) { - if (writer->finishEntry()) { - return true; - } - } - - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write"); - return false; + return true; } static bool compilePng(IAaptContext* context, const CompileOptions& options, @@ -330,8 +380,6 @@ static bool compilePng(IAaptContext* context, const CompileOptions& options, resFile.config = pathData.config; resFile.source = pathData.source; - ChunkWriter fileExportWriter = wrapBufferWithFileExportHeader(&buffer, &resFile); - { std::ifstream fin(pathData.source.path, std::ifstream::binary); if (!fin) { @@ -340,26 +388,16 @@ static bool compilePng(IAaptContext* context, const CompileOptions& options, } Png png(context->getDiagnostics()); - if (!png.process(pathData.source, &fin, fileExportWriter.getBuffer(), {})) { + if (!png.process(pathData.source, &fin, &buffer, {})) { return false; } } - fileExportWriter.finish(); - - if (!writer->startEntry(outputPath, 0)) { - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open"); + if (!writeHeaderAndBufferToWriter(outputPath, resFile, buffer, writer, + context->getDiagnostics())) { return false; } - - if (writer->writeEntry(buffer)) { - if (writer->finishEntry()) { - return true; - } - } - - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write"); - return false; + return true; } static bool compileFile(IAaptContext* context, const CompileOptions& options, @@ -371,8 +409,6 @@ static bool compileFile(IAaptContext* context, const CompileOptions& options, resFile.config = pathData.config; resFile.source = pathData.source; - ChunkWriter fileExportWriter = wrapBufferWithFileExportHeader(&buffer, &resFile); - std::string errorStr; Maybe<android::FileMap> f = file::mmapPath(pathData.source.path, &errorStr); if (!f) { @@ -380,35 +416,10 @@ static bool compileFile(IAaptContext* context, const CompileOptions& options, return false; } - if (!writer->startEntry(outputPath, 0)) { - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open"); - return false; - } - - // Manually set the size and don't call finish(). This is because we are not copying from - // the buffer the entire file. - fileExportWriter.getChunkHeader()->size = - util::hostToDevice32(buffer.size() + f.value().getDataLength()); - - if (!writer->writeEntry(buffer)) { - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write"); + if (!writeHeaderAndMmapToWriter(outputPath, resFile, f.value(), writer, + context->getDiagnostics())) { return false; } - - // Only write if we have something to write. This is because mmap fails with length of 0, - // but we still want to compile the file to get the resource ID. - if (f.value().getDataPtr() && f.value().getDataLength() > 0) { - if (!writer->writeEntry(f.value().getDataPtr(), f.value().getDataLength())) { - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write"); - return false; - } - } - - if (!writer->finishEntry()) { - context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write"); - return false; - } - return true; } diff --git a/tools/aapt2/compile/IdAssigner.cpp b/tools/aapt2/compile/IdAssigner.cpp index 80c6bbc1abca..aa4a5803b8df 100644 --- a/tools/aapt2/compile/IdAssigner.cpp +++ b/tools/aapt2/compile/IdAssigner.cpp @@ -64,14 +64,12 @@ bool IdAssigner::consume(IAaptContext* context, ResourceTable* table) { // Mark entry ID as taken. if (!usedEntryIds.insert(entry->id.value()).second) { // This ID existed before! - ResourceNameRef nameRef = - { package->name, type->type, entry->name }; - ResourceId takenId(package->id.value(), type->id.value(), - entry->id.value()); + ResourceNameRef nameRef(package->name, type->type, entry->name); context->getDiagnostics()->error(DiagMessage() << "resource '" << nameRef << "' " - << "has duplicate ID '" - << takenId << "'"); + << "has duplicate entry ID " + << std::hex << (int) entry->id.value() + << std::dec); return false; } } diff --git a/tools/aapt2/dump/Dump.cpp b/tools/aapt2/dump/Dump.cpp new file mode 100644 index 000000000000..915fae80fcbb --- /dev/null +++ b/tools/aapt2/dump/Dump.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Debug.h" +#include "Diagnostics.h" +#include "Flags.h" +#include "process/IResourceTableConsumer.h" +#include "proto/ProtoSerialize.h" +#include "util/Files.h" +#include "util/StringPiece.h" + +#include <vector> + +namespace aapt { + +//struct DumpOptions { +// +//}; + +void dumpCompiledFile(const pb::CompiledFile& pbFile, const void* data, size_t len, + const Source& source, IAaptContext* context) { + std::unique_ptr<ResourceFile> file = deserializeCompiledFileFromPb(pbFile, source, + context->getDiagnostics()); + if (!file) { + return; + } + + std::cout << "Resource: " << file->name << "\n" + << "Config: " << file->config << "\n" + << "Source: " << file->source << "\n"; +} + +void dumpCompiledTable(const pb::ResourceTable& pbTable, const Source& source, + IAaptContext* context) { + std::unique_ptr<ResourceTable> table = deserializeTableFromPb(pbTable, source, + context->getDiagnostics()); + if (!table) { + return; + } + + Debug::printTable(table.get()); +} + +void tryDumpFile(IAaptContext* context, const std::string& filePath) { + std::string err; + Maybe<android::FileMap> file = file::mmapPath(filePath, &err); + if (!file) { + context->getDiagnostics()->error(DiagMessage(filePath) << err); + return; + } + + android::FileMap* fileMap = &file.value(); + + // Try as a compiled table. + pb::ResourceTable pbTable; + if (pbTable.ParseFromArray(fileMap->getDataPtr(), fileMap->getDataLength())) { + dumpCompiledTable(pbTable, Source(filePath), context); + return; + } + + // Try as a compiled file. + CompiledFileInputStream input(fileMap->getDataPtr(), fileMap->getDataLength()); + if (const pb::CompiledFile* pbFile = input.CompiledFile()) { + dumpCompiledFile(*pbFile, input.data(), input.size(), Source(filePath), context); + return; + } +} + +class DumpContext : public IAaptContext { +public: + IDiagnostics* getDiagnostics() override { + return &mDiagnostics; + } + + NameMangler* getNameMangler() override { + abort(); + return nullptr; + } + + StringPiece16 getCompilationPackage() override { + return {}; + } + + uint8_t getPackageId() override { + return 0; + } + + ISymbolTable* getExternalSymbols() override { + abort(); + return nullptr; + } + +private: + StdErrDiagnostics mDiagnostics; +}; + +/** + * Entry point for dump command. + */ +int dump(const std::vector<StringPiece>& args) { + //DumpOptions options; + Flags flags = Flags(); + if (!flags.parse("aapt2 dump", args, &std::cerr)) { + return 1; + } + + DumpContext context; + + for (const std::string& arg : flags.getArgs()) { + tryDumpFile(&context, arg); + } + return 0; +} + +} // namespace aapt diff --git a/tools/aapt2/flatten/Archive.h b/tools/aapt2/flatten/Archive.h index 6da1d2ac5620..34c10ad40365 100644 --- a/tools/aapt2/flatten/Archive.h +++ b/tools/aapt2/flatten/Archive.h @@ -22,6 +22,7 @@ #include "util/Files.h" #include "util/StringPiece.h" +#include <google/protobuf/io/zero_copy_stream_impl_lite.h> #include <fstream> #include <memory> #include <string> @@ -40,13 +41,18 @@ struct ArchiveEntry { size_t uncompressedSize; }; -struct IArchiveWriter { +struct IArchiveWriter : public google::protobuf::io::CopyingOutputStream { virtual ~IArchiveWriter() = default; virtual bool startEntry(const StringPiece& path, uint32_t flags) = 0; virtual bool writeEntry(const BigBuffer& buffer) = 0; virtual bool writeEntry(const void* data, size_t len) = 0; virtual bool finishEntry() = 0; + + // CopyingOutputStream implementations. + bool Write(const void* buffer, int size) override { + return writeEntry(buffer, size); + } }; std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(IDiagnostics* diag, diff --git a/tools/aapt2/flatten/FileExportWriter.h b/tools/aapt2/flatten/FileExportWriter.h deleted file mode 100644 index 7688fa71246e..000000000000 --- a/tools/aapt2/flatten/FileExportWriter.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef AAPT_FLATTEN_FILEEXPORTWRITER_H -#define AAPT_FLATTEN_FILEEXPORTWRITER_H - -#include "StringPool.h" - -#include "flatten/ResourceTypeExtensions.h" -#include "flatten/ChunkWriter.h" -#include "process/IResourceTableConsumer.h" -#include "util/BigBuffer.h" -#include "util/Util.h" - -#include <androidfw/ResourceTypes.h> -#include <utils/misc.h> - -namespace aapt { - -static ChunkWriter wrapBufferWithFileExportHeader(BigBuffer* buffer, ResourceFile* res) { - ChunkWriter fileExportWriter(buffer); - FileExport_header* fileExport = fileExportWriter.startChunk<FileExport_header>( - RES_FILE_EXPORT_TYPE); - - ExportedSymbol* symbolRefs = nullptr; - if (!res->exportedSymbols.empty()) { - symbolRefs = fileExportWriter.nextBlock<ExportedSymbol>( - res->exportedSymbols.size()); - } - fileExport->exportedSymbolCount = util::hostToDevice32(res->exportedSymbols.size()); - - StringPool symbolExportPool; - memcpy(fileExport->magic, "AAPT", NELEM(fileExport->magic)); - fileExport->config = res->config; - fileExport->config.swapHtoD(); - fileExport->name.index = util::hostToDevice32(symbolExportPool.makeRef(res->name.toString()) - .getIndex()); - fileExport->source.index = util::hostToDevice32(symbolExportPool.makeRef(util::utf8ToUtf16( - res->source.path)).getIndex()); - - for (const SourcedResourceName& name : res->exportedSymbols) { - symbolRefs->name.index = util::hostToDevice32(symbolExportPool.makeRef(name.name.toString()) - .getIndex()); - symbolRefs->line = util::hostToDevice32(name.line); - symbolRefs++; - } - - StringPool::flattenUtf16(fileExportWriter.getBuffer(), symbolExportPool); - return fileExportWriter; -} - -} // namespace aapt - -#endif /* AAPT_FLATTEN_FILEEXPORTWRITER_H */ diff --git a/tools/aapt2/flatten/FileExportWriter_test.cpp b/tools/aapt2/flatten/FileExportWriter_test.cpp deleted file mode 100644 index 32fc203c4dee..000000000000 --- a/tools/aapt2/flatten/FileExportWriter_test.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Resource.h" - -#include "flatten/FileExportWriter.h" -#include "util/BigBuffer.h" -#include "util/Util.h" - -#include "test/Common.h" - -#include <gtest/gtest.h> - -namespace aapt { - -TEST(FileExportWriterTest, FlattenResourceFileDataWithNoExports) { - ResourceFile resFile = { - test::parseNameOrDie(u"@android:layout/main.xml"), - test::parseConfigOrDie("sw600dp-v4"), - Source{ "res/layout/main.xml" }, - }; - - BigBuffer buffer(1024); - ChunkWriter writer = wrapBufferWithFileExportHeader(&buffer, &resFile); - *writer.getBuffer()->nextBlock<uint32_t>() = 42u; - writer.finish(); - - std::unique_ptr<uint8_t[]> data = util::copy(buffer); - - // There should be more data (string pool) besides the header and our data. - ASSERT_GT(buffer.size(), sizeof(FileExport_header) + sizeof(uint32_t)); - - // Write at the end of this chunk is our data. - uint32_t* val = (uint32_t*)(data.get() + buffer.size()) - 1; - EXPECT_EQ(*val, 42u); -} - -} // namespace aapt diff --git a/tools/aapt2/flatten/ResourceTypeExtensions.h b/tools/aapt2/flatten/ResourceTypeExtensions.h index 02bff2c69362..3e20ad643eb6 100644 --- a/tools/aapt2/flatten/ResourceTypeExtensions.h +++ b/tools/aapt2/flatten/ResourceTypeExtensions.h @@ -22,208 +22,6 @@ namespace aapt { /** - * New android::ResChunk_header types defined - * for AAPT to use. - * - * TODO(adamlesinski): Consider reserving these - * enums in androidfw/ResourceTypes.h to avoid - * future collisions. - */ -enum { - /** - * A chunk that contains an entire file that - * has been compiled. - */ - RES_FILE_EXPORT_TYPE = 0x000c, - - RES_TABLE_PUBLIC_TYPE = 0x000d, - - /** - * A chunk that holds the string pool - * for source entries (path/to/source:line). - */ - RES_TABLE_SOURCE_POOL_TYPE = 0x000e, - - /** - * A chunk holding names of externally - * defined symbols and offsets to where - * they are referenced in the table. - */ - RES_TABLE_SYMBOL_TABLE_TYPE = 0x000f, -}; - -/** - * New resource types that are meant to only be used - * by AAPT and will not end up on the device. - */ -struct ExtendedTypes { - enum { - /** - * A raw string value that hasn't had its escape sequences - * processed nor whitespace removed. - */ - TYPE_RAW_STRING = 0xfe, - }; -}; - -/** - * New types for a ResTable_map. - */ -struct ExtendedResTableMapTypes { - enum { - /** - * Type that contains the source path of the next item in the map. - */ - ATTR_SOURCE_PATH = Res_MAKEINTERNAL(0xffff), - - /** - * Type that contains the source line of the next item in the map. - */ - ATTR_SOURCE_LINE = Res_MAKEINTERNAL(0xfffe), - - /** - * Type that contains the comment of the next item in the map. - */ - ATTR_COMMENT = Res_MAKEINTERNAL(0xfffd) - }; -}; - -/** - * Followed by exportedSymbolCount ExportedSymbol structs, followed by the string pool. - */ -struct FileExport_header { - android::ResChunk_header header; - - /** - * MAGIC value. Must be 'AAPT' (0x41415054) - */ - uint8_t magic[4]; - - /** - * Version of AAPT that built this file. - */ - uint32_t version; - - /** - * The resource name. - */ - android::ResStringPool_ref name; - - /** - * Configuration of this file. - */ - android::ResTable_config config; - - /** - * Original source path of this file. - */ - android::ResStringPool_ref source; - - /** - * Number of symbols exported by this file. - */ - uint32_t exportedSymbolCount; -}; - -struct ExportedSymbol { - android::ResStringPool_ref name; - uint32_t line; -}; - -struct Public_header { - android::ResChunk_header header; - - /** - * The ID of the type this structure refers to. - */ - uint8_t typeId; - - /** - * Reserved. Must be 0. - */ - uint8_t res0; - - /** - * Reserved. Must be 0. - */ - uint16_t res1; - - /** - * Number of public entries. - */ - uint32_t count; -}; - -/** - * A structure representing source data for a resource entry. - * Appears after an android::ResTable_entry or android::ResTable_map_entry. - * - * TODO(adamlesinski): This causes some issues when runtime code checks - * the size of an android::ResTable_entry. It assumes it is an - * android::ResTable_map_entry if the size is bigger than an android::ResTable_entry - * which may not be true if this structure is present. - */ -struct ResTable_entry_source { - /** - * File path reference. - */ - android::ResStringPool_ref path; - - /** - * Line number this resource was defined on. - */ - uint32_t line; - - /** - * Comment string reference. - */ - android::ResStringPool_ref comment; -}; - -struct Public_entry { - uint16_t entryId; - - enum : uint16_t { - kUndefined = 0, - kPublic = 1, - kPrivate = 2, - }; - - uint16_t state; - android::ResStringPool_ref key; - ResTable_entry_source source; -}; - -/** - * A chunk with type RES_TABLE_SYMBOL_TABLE_TYPE. - * Following the header are count number of SymbolTable_entry - * structures, followed by an android::ResStringPool_header. - */ -struct SymbolTable_header { - android::ResChunk_header header; - - /** - * Number of SymbolTable_entry structures following - * this header. - */ - uint32_t count; -}; - -struct SymbolTable_entry { - /** - * Offset from the beginning of the resource table - * where the symbol entry is referenced. - */ - uint32_t offset; - - /** - * The index into the string pool where the name of this - * symbol exists. - */ - android::ResStringPool_ref name; -}; - -/** * An alternative struct to use instead of ResTable_map_entry. This one is a standard_layout * struct. */ diff --git a/tools/aapt2/flatten/TableFlattener.cpp b/tools/aapt2/flatten/TableFlattener.cpp index 26d7c2ca055c..71ab3dbf52ca 100644 --- a/tools/aapt2/flatten/TableFlattener.cpp +++ b/tools/aapt2/flatten/TableFlattener.cpp @@ -51,157 +51,49 @@ static void strcpy16_htod(uint16_t* dst, size_t len, const StringPiece16& src) { dst[i] = 0; } +static bool cmpStyleEntries(const Style::Entry& a, const Style::Entry& b) { + if (a.key.id) { + if (b.key.id) { + return a.key.id.value() < b.key.id.value(); + } + return true; + } else if (!b.key.id) { + return a.key.name.value() < b.key.name.value(); + } + return false; +} + struct FlatEntry { ResourceEntry* entry; Value* value; // The entry string pool index to the entry's name. uint32_t entryKey; - - // The source string pool index to the source file path. - uint32_t sourcePathKey; - uint32_t sourceLine; - - // The source string pool index to the comment. - uint32_t commentKey; }; -class SymbolWriter { +class MapFlattenVisitor : public RawValueVisitor { public: - struct Entry { - StringPool::Ref name; - size_t offset; - }; - - std::vector<Entry> symbols; - - explicit SymbolWriter(StringPool* pool) : mPool(pool) { - } - - void addSymbol(const Reference& ref, size_t offset) { - const ResourceName& name = ref.name.value(); - std::u16string fullName; - if (ref.privateReference) { - fullName += u"*"; - } - - if (!name.package.empty()) { - fullName += name.package + u":"; - } - fullName += toString(name.type).toString() + u"/" + name.entry; - symbols.push_back(Entry{ mPool->makeRef(fullName), offset }); - } - - void shiftAllOffsets(size_t offset) { - for (Entry& entry : symbols) { - entry.offset += offset; - } - } - -private: - StringPool* mPool; -}; - -struct MapFlattenVisitor : public RawValueVisitor { using RawValueVisitor::visit; - SymbolWriter* mSymbols; - FlatEntry* mEntry; - BigBuffer* mBuffer; - StringPool* mSourcePool; - StringPool* mCommentPool; - bool mUseExtendedChunks; - - size_t mEntryCount = 0; - const Reference* mParent = nullptr; - - MapFlattenVisitor(SymbolWriter* symbols, FlatEntry* entry, BigBuffer* buffer, - StringPool* sourcePool, StringPool* commentPool, - bool useExtendedChunks) : - mSymbols(symbols), mEntry(entry), mBuffer(buffer), mSourcePool(sourcePool), - mCommentPool(commentPool), mUseExtendedChunks(useExtendedChunks) { - } - - void flattenKey(Reference* key, ResTable_map* outEntry) { - if (!key->id || (key->privateReference && mUseExtendedChunks)) { - assert(key->name && "reference must have a name"); - - outEntry->name.ident = util::hostToDevice32(0); - mSymbols->addSymbol(*key, (mBuffer->size() - sizeof(ResTable_map)) + - offsetof(ResTable_map, name)); - } else { - outEntry->name.ident = util::hostToDevice32(key->id.value().id); - } - } - - void flattenValue(Item* value, ResTable_map* outEntry) { - bool privateRef = false; - if (Reference* ref = valueCast<Reference>(value)) { - privateRef = ref->privateReference && mUseExtendedChunks; - if (!ref->id || privateRef) { - assert(ref->name && "reference must have a name"); - - mSymbols->addSymbol(*ref, (mBuffer->size() - sizeof(ResTable_map)) + - offsetof(ResTable_map, value) + offsetof(Res_value, data)); - } - } - - bool result = value->flatten(&outEntry->value); - if (privateRef) { - outEntry->value.data = 0; - } - assert(result && "flatten failed"); - } - - void flattenEntry(Reference* key, Item* value) { - ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>(); - flattenKey(key, outEntry); - flattenValue(value, outEntry); - outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value)); - mEntryCount++; - } - - void flattenMetaData(Value* value) { - if (!mUseExtendedChunks) { - return; - } - - Reference key(ResourceId{ ExtendedResTableMapTypes::ATTR_SOURCE_PATH }); - StringPool::Ref sourcePathRef = mSourcePool->makeRef( - util::utf8ToUtf16(value->getSource().path)); - BinaryPrimitive val(Res_value::TYPE_INT_DEC, - static_cast<uint32_t>(sourcePathRef.getIndex())); - flattenEntry(&key, &val); - - if (value->getSource().line) { - key.id = ResourceId(ExtendedResTableMapTypes::ATTR_SOURCE_LINE); - val.value.data = static_cast<uint32_t>(value->getSource().line.value()); - flattenEntry(&key, &val); - } - - if (!value->getComment().empty()) { - key.id = ResourceId(ExtendedResTableMapTypes::ATTR_COMMENT); - StringPool::Ref commentRef = mCommentPool->makeRef(value->getComment()); - val.value.data = static_cast<uint32_t>(commentRef.getIndex()); - flattenEntry(&key, &val); - } + MapFlattenVisitor(ResTable_entry_ext* outEntry, BigBuffer* buffer) : + mOutEntry(outEntry), mBuffer(buffer) { } void visit(Attribute* attr) override { { - Reference key(ResourceId{ ResTable_map::ATTR_TYPE }); + Reference key = Reference(ResTable_map::ATTR_TYPE); BinaryPrimitive val(Res_value::TYPE_INT_DEC, attr->typeMask); flattenEntry(&key, &val); } if (attr->minInt != std::numeric_limits<int32_t>::min()) { - Reference key(ResourceId{ ResTable_map::ATTR_MIN }); + Reference key = Reference(ResTable_map::ATTR_MIN); BinaryPrimitive val(Res_value::TYPE_INT_DEC, static_cast<uint32_t>(attr->minInt)); flattenEntry(&key, &val); } if (attr->maxInt != std::numeric_limits<int32_t>::max()) { - Reference key(ResourceId{ ResTable_map::ATTR_MAX }); + Reference key = Reference(ResTable_map::ATTR_MAX); BinaryPrimitive val(Res_value::TYPE_INT_DEC, static_cast<uint32_t>(attr->maxInt)); flattenEntry(&key, &val); } @@ -212,22 +104,11 @@ struct MapFlattenVisitor : public RawValueVisitor { } } - static bool cmpStyleEntries(const Style::Entry& a, const Style::Entry& b) { - if (a.key.id) { - if (b.key.id) { - return a.key.id.value() < b.key.id.value(); - } - return true; - } else if (!b.key.id) { - return a.key.name.value() < b.key.name.value(); - } - return false; - } - void visit(Style* style) override { if (style->parent) { - // Parents are treated a bit differently, so record the existence and move on. - mParent = &style->parent.value(); + const Reference& parentRef = style->parent.value(); + assert(parentRef.id && "parent has no ID"); + mOutEntry->parent.ident = util::hostToDevice32(parentRef.id.value().id); } // Sort the style. @@ -235,7 +116,6 @@ struct MapFlattenVisitor : public RawValueVisitor { for (Style::Entry& entry : style->entries) { flattenEntry(&entry.key, entry.value.get()); - flattenMetaData(&entry.key); } } @@ -243,8 +123,8 @@ struct MapFlattenVisitor : public RawValueVisitor { for (auto& attrRef : styleable->entries) { BinaryPrimitive val(Res_value{}); flattenEntry(&attrRef, &val); - flattenMetaData(&attrRef); } + } void visit(Array* array) override { @@ -253,7 +133,6 @@ struct MapFlattenVisitor : public RawValueVisitor { flattenValue(item.get(), outEntry); outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value)); mEntryCount++; - flattenMetaData(item.get()); } } @@ -297,18 +176,45 @@ struct MapFlattenVisitor : public RawValueVisitor { Reference key(q); flattenEntry(&key, plural->values[i].get()); - flattenMetaData(plural->values[i].get()); } } + + /** + * Call this after visiting a Value. This will finish any work that + * needs to be done to prepare the entry. + */ + void finish() { + mOutEntry->count = util::hostToDevice32(mEntryCount); + } + +private: + void flattenKey(Reference* key, ResTable_map* outEntry) { + assert(key->id && "key has no ID"); + outEntry->name.ident = util::hostToDevice32(key->id.value().id); + } + + void flattenValue(Item* value, ResTable_map* outEntry) { + bool result = value->flatten(&outEntry->value); + assert(result && "flatten failed"); + } + + void flattenEntry(Reference* key, Item* value) { + ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>(); + flattenKey(key, outEntry); + flattenValue(value, outEntry); + outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value)); + mEntryCount++; + } + + ResTable_entry_ext* mOutEntry; + BigBuffer* mBuffer; + size_t mEntryCount = 0; }; class PackageFlattener { public: - PackageFlattener(IDiagnostics* diag, TableFlattenerOptions options, - ResourceTablePackage* package, SymbolWriter* symbolWriter, - StringPool* sourcePool) : - mDiag(diag), mOptions(options), mPackage(package), mSymbols(symbolWriter), - mSourcePool(sourcePool) { + PackageFlattener(IDiagnostics* diag, ResourceTablePackage* package) : + mDiag(diag), mPackage(package) { } bool flattenPackage(BigBuffer* buffer) { @@ -337,9 +243,6 @@ public: pkgHeader->keyStrings = util::hostToDevice32(pkgWriter.size()); StringPool::flattenUtf16(pkgWriter.getBuffer(), mKeyPool); - // Add the ResTable_package header/type/key strings to the offset. - mSymbols->shiftAllOffsets(pkgWriter.size()); - // Append the types. buffer->appendBuffer(std::move(typeBuffer)); @@ -349,12 +252,9 @@ public: private: IDiagnostics* mDiag; - TableFlattenerOptions mOptions; ResourceTablePackage* mPackage; StringPool mTypePool; StringPool mKeyPool; - SymbolWriter* mSymbols; - StringPool* mSourcePool; template <typename T, bool IsItem> T* writeEntry(FlatEntry* entry, BigBuffer* buffer) { @@ -376,62 +276,24 @@ private: outEntry->flags |= ResTable_entry::FLAG_COMPLEX; } - outEntry->key.index = util::hostToDevice32(entry->entryKey); - outEntry->size = sizeof(T); - - if (mOptions.useExtendedChunks) { - // Write the extra source block. This will be ignored by the Android runtime. - ResTable_entry_source* sourceBlock = buffer->nextBlock<ResTable_entry_source>(); - sourceBlock->path.index = util::hostToDevice32(entry->sourcePathKey); - sourceBlock->line = util::hostToDevice32(entry->sourceLine); - sourceBlock->comment.index = util::hostToDevice32(entry->commentKey); - outEntry->size += sizeof(*sourceBlock); - } - outEntry->flags = util::hostToDevice16(outEntry->flags); - outEntry->size = util::hostToDevice16(outEntry->size); + outEntry->key.index = util::hostToDevice32(entry->entryKey); + outEntry->size = util::hostToDevice16(sizeof(T)); return result; } bool flattenValue(FlatEntry* entry, BigBuffer* buffer) { if (Item* item = valueCast<Item>(entry->value)) { writeEntry<ResTable_entry, true>(entry, buffer); - bool privateRef = false; - if (Reference* ref = valueCast<Reference>(entry->value)) { - // If there is no ID or the reference is private and we allow extended chunks, - // write out a 0 and mark the symbol table with the name of the reference. - privateRef = (ref->privateReference && mOptions.useExtendedChunks); - if (!ref->id || privateRef) { - assert(ref->name && "reference must have at least a name"); - mSymbols->addSymbol(*ref, buffer->size() + offsetof(Res_value, data)); - } - } Res_value* outValue = buffer->nextBlock<Res_value>(); bool result = item->flatten(outValue); assert(result && "flatten failed"); - if (privateRef) { - // Force the value of 0 so we look up the symbol at unflatten time. - outValue->data = 0; - } outValue->size = util::hostToDevice16(sizeof(*outValue)); } else { - const size_t beforeEntry = buffer->size(); ResTable_entry_ext* outEntry = writeEntry<ResTable_entry_ext, false>(entry, buffer); - MapFlattenVisitor visitor(mSymbols, entry, buffer, mSourcePool, mSourcePool, - mOptions.useExtendedChunks); + MapFlattenVisitor visitor(outEntry, buffer); entry->value->accept(&visitor); - outEntry->count = util::hostToDevice32(visitor.mEntryCount); - if (visitor.mParent) { - const bool forceSymbol = visitor.mParent->privateReference && - mOptions.useExtendedChunks; - if (!visitor.mParent->id || forceSymbol) { - assert(visitor.mParent->name && "reference must have a name"); - mSymbols->addSymbol(*visitor.mParent, - beforeEntry + offsetof(ResTable_entry_ext, parent)); - } else { - outEntry->parent.ident = util::hostToDevice32(visitor.mParent->id.value().id); - } - } + visitor.finish(); } return true; } @@ -480,7 +342,7 @@ private: std::vector<ResourceTableType*> collectAndSortTypes() { std::vector<ResourceTableType*> sortedTypes; for (auto& type : mPackage->types) { - if (type->type == ResourceType::kStyleable && !mOptions.useExtendedChunks) { + if (type->type == ResourceType::kStyleable) { // Styleables aren't real Resource Types, they are represented in the R.java // file. continue; @@ -551,52 +413,6 @@ private: return true; } - bool flattenPublic(ResourceTableType* type, std::vector<ResourceEntry*>* sortedEntries, - BigBuffer* buffer) { - ChunkWriter publicWriter(buffer); - Public_header* publicHeader = publicWriter.startChunk<Public_header>(RES_TABLE_PUBLIC_TYPE); - publicHeader->typeId = type->id.value(); - - for (ResourceEntry* entry : *sortedEntries) { - if (entry->symbolStatus.state != SymbolState::kUndefined) { - // Write the public status of this entry. - Public_entry* publicEntry = publicWriter.nextBlock<Public_entry>(); - publicEntry->entryId = util::hostToDevice32(entry->id.value()); - publicEntry->key.index = util::hostToDevice32(mKeyPool.makeRef( - entry->name).getIndex()); - publicEntry->source.path.index = util::hostToDevice32(mSourcePool->makeRef( - util::utf8ToUtf16(entry->symbolStatus.source.path)).getIndex()); - if (entry->symbolStatus.source.line) { - publicEntry->source.line = util::hostToDevice32( - entry->symbolStatus.source.line.value()); - } - publicEntry->source.comment.index = util::hostToDevice32(mSourcePool->makeRef( - entry->symbolStatus.comment).getIndex()); - - switch (entry->symbolStatus.state) { - case SymbolState::kPrivate: - publicEntry->state = Public_entry::kPrivate; - break; - - case SymbolState::kPublic: - publicEntry->state = Public_entry::kPublic; - break; - - case SymbolState::kUndefined: - publicEntry->state = Public_entry::kUndefined; - break; - } - - // Don't hostToDevice until the last step. - publicHeader->count += 1; - } - } - - publicHeader->count = util::hostToDevice32(publicHeader->count); - publicWriter.finish(); - return true; - } - bool flattenTypes(BigBuffer* buffer) { // Sort the types by their IDs. They will be inserted into the StringPool in this order. std::vector<ResourceTableType*> sortedTypes = collectAndSortTypes(); @@ -620,12 +436,6 @@ private: return false; } - if (mOptions.useExtendedChunks) { - if (!flattenPublic(type, &sortedEntries, buffer)) { - return false; - } - } - // The binary resource table lists resource entries for each configuration. // We store them inverted, where a resource entry lists the values for each // configuration available. Here we reverse this to match the binary table. @@ -635,26 +445,8 @@ private: // Group values by configuration. for (auto& configValue : entry->values) { - Value* value = configValue.value.get(); - - const StringPool::Ref sourceRef = mSourcePool->makeRef( - util::utf8ToUtf16(value->getSource().path)); - - uint32_t lineNumber = 0; - if (value->getSource().line) { - lineNumber = value->getSource().line.value(); - } - - const StringPool::Ref commentRef = mSourcePool->makeRef(value->getComment()); - - configToEntryListMap[configValue.config] - .push_back(FlatEntry{ - entry, - value, - keyIndex, - (uint32_t) sourceRef.getIndex(), - lineNumber, - (uint32_t) commentRef.getIndex() }); + configToEntryListMap[configValue.config].push_back(FlatEntry{ + entry, configValue.value.get(), keyIndex }); } } @@ -692,86 +484,18 @@ bool TableFlattener::consume(IAaptContext* context, ResourceTable* table) { // Flatten the values string pool. StringPool::flattenUtf8(tableWriter.getBuffer(), table->stringPool); - // If we have a reference to a symbol that doesn't exist, we don't know its resource ID. - // We encode the name of the symbol along with the offset of where to include the resource ID - // once it is found. - StringPool symbolPool; - std::vector<SymbolWriter::Entry> symbolOffsets; - - // String pool holding the source paths of each value. - StringPool sourcePool; - BigBuffer packageBuffer(1024); // Flatten each package. for (auto& package : table->packages) { - const size_t beforePackageSize = packageBuffer.size(); - - // All packages will share a single global symbol pool. - SymbolWriter packageSymbolWriter(&symbolPool); - - PackageFlattener flattener(context->getDiagnostics(), mOptions, package.get(), - &packageSymbolWriter, &sourcePool); + PackageFlattener flattener(context->getDiagnostics(), package.get()); if (!flattener.flattenPackage(&packageBuffer)) { return false; } - - // The symbols are offset only from their own Package start. Offset them from the - // start of the packageBuffer. - packageSymbolWriter.shiftAllOffsets(beforePackageSize); - - // Extract all the symbols to offset - symbolOffsets.insert(symbolOffsets.end(), - std::make_move_iterator(packageSymbolWriter.symbols.begin()), - std::make_move_iterator(packageSymbolWriter.symbols.end())); } - SymbolTable_entry* symbolEntryData = nullptr; - if (mOptions.useExtendedChunks) { - if (!symbolOffsets.empty()) { - // Sort the offsets so we can scan them linearly. - std::sort(symbolOffsets.begin(), symbolOffsets.end(), - [](const SymbolWriter::Entry& a, const SymbolWriter::Entry& b) -> bool { - return a.offset < b.offset; - }); - - // Write the Symbol header. - ChunkWriter symbolWriter(tableWriter.getBuffer()); - SymbolTable_header* symbolHeader = symbolWriter.startChunk<SymbolTable_header>( - RES_TABLE_SYMBOL_TABLE_TYPE); - symbolHeader->count = util::hostToDevice32(symbolOffsets.size()); - - symbolEntryData = symbolWriter.nextBlock<SymbolTable_entry>(symbolOffsets.size()); - StringPool::flattenUtf8(symbolWriter.getBuffer(), symbolPool); - symbolWriter.finish(); - } - - if (sourcePool.size() > 0) { - // Write out source pool. - ChunkWriter srcWriter(tableWriter.getBuffer()); - srcWriter.startChunk<ResChunk_header>(RES_TABLE_SOURCE_POOL_TYPE); - StringPool::flattenUtf8(srcWriter.getBuffer(), sourcePool); - srcWriter.finish(); - } - } - - const size_t beforePackagesSize = tableWriter.size(); - // Finally merge all the packages into the main buffer. tableWriter.getBuffer()->appendBuffer(std::move(packageBuffer)); - - // Update the offsets to their final values. - if (symbolEntryData) { - for (SymbolWriter::Entry& entry : symbolOffsets) { - symbolEntryData->name.index = util::hostToDevice32(entry.name.getIndex()); - - // The symbols were all calculated with the packageBuffer offset. We need to - // add the beginning of the output buffer. - symbolEntryData->offset = util::hostToDevice32(entry.offset + beforePackagesSize); - symbolEntryData++; - } - } - tableWriter.finish(); return true; } diff --git a/tools/aapt2/flatten/TableFlattener.h b/tools/aapt2/flatten/TableFlattener.h index 901b129725ea..0ab01974044b 100644 --- a/tools/aapt2/flatten/TableFlattener.h +++ b/tools/aapt2/flatten/TableFlattener.h @@ -24,28 +24,15 @@ namespace aapt { class BigBuffer; class ResourceTable; -struct TableFlattenerOptions { - /** - * Specifies whether to output extended chunks, like - * source information and missing symbol entries. Default - * is false. - * - * Set this to true when emitting intermediate resource table. - */ - bool useExtendedChunks = false; -}; - class TableFlattener : public IResourceTableConsumer { public: - TableFlattener(BigBuffer* buffer, TableFlattenerOptions options) : - mBuffer(buffer), mOptions(options) { + TableFlattener(BigBuffer* buffer) : mBuffer(buffer) { } bool consume(IAaptContext* context, ResourceTable* table) override; private: BigBuffer* mBuffer; - TableFlattenerOptions mOptions; }; } // namespace aapt diff --git a/tools/aapt2/flatten/TableFlattener_test.cpp b/tools/aapt2/flatten/TableFlattener_test.cpp index 7030603e5bbd..39c4fd318508 100644 --- a/tools/aapt2/flatten/TableFlattener_test.cpp +++ b/tools/aapt2/flatten/TableFlattener_test.cpp @@ -38,9 +38,7 @@ public: ::testing::AssertionResult flatten(ResourceTable* table, ResTable* outTable) { BigBuffer buffer(1024); - TableFlattenerOptions options = {}; - options.useExtendedChunks = true; - TableFlattener flattener(&buffer, options); + TableFlattener flattener(&buffer); if (!flattener.consume(mContext.get(), table)) { return ::testing::AssertionFailure() << "failed to flatten ResourceTable"; } @@ -54,9 +52,7 @@ public: ::testing::AssertionResult flatten(ResourceTable* table, ResourceTable* outTable) { BigBuffer buffer(1024); - TableFlattenerOptions options = {}; - options.useExtendedChunks = true; - TableFlattener flattener(&buffer, options); + TableFlattener flattener(&buffer); if (!flattener.consume(mContext.get(), table)) { return ::testing::AssertionFailure() << "failed to flatten ResourceTable"; } @@ -210,58 +206,6 @@ TEST_F(TableFlattenerTest, FlattenEntriesWithGapsInIds) { Res_value::TYPE_INT_BOOLEAN, 0u, 0u)); } -TEST_F(TableFlattenerTest, FlattenUnlinkedTable) { - std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() - .setPackageId(u"com.app.test", 0x7f) - .addValue(u"@com.app.test:integer/one", ResourceId(0x7f020000), - test::buildReference(u"@android:integer/foo")) - .addValue(u"@com.app.test:style/Theme", ResourceId(0x7f030000), test::StyleBuilder() - .setParent(u"@android:style/Theme.Material") - .addItem(u"@android:attr/background", {}) - .addItem(u"@android:attr/colorAccent", - test::buildReference(u"@com.app.test:color/green")) - .build()) - .build(); - - { - // Need access to stringPool to make RawString. - Style* style = test::getValue<Style>(table.get(), u"@com.app.test:style/Theme"); - style->entries[0].value = util::make_unique<RawString>(table->stringPool.makeRef(u"foo")); - } - - ResourceTable finalTable; - ASSERT_TRUE(flatten(table.get(), &finalTable)); - - Reference* ref = test::getValue<Reference>(&finalTable, u"@com.app.test:integer/one"); - ASSERT_NE(ref, nullptr); - AAPT_ASSERT_TRUE(ref->name); - EXPECT_EQ(ref->name.value(), test::parseNameOrDie(u"@android:integer/foo")); - - Style* style = test::getValue<Style>(&finalTable, u"@com.app.test:style/Theme"); - ASSERT_NE(style, nullptr); - AAPT_ASSERT_TRUE(style->parent); - AAPT_ASSERT_TRUE(style->parent.value().name); - EXPECT_EQ(style->parent.value().name.value(), - test::parseNameOrDie(u"@android:style/Theme.Material")); - - ASSERT_EQ(2u, style->entries.size()); - - AAPT_ASSERT_TRUE(style->entries[0].key.name); - EXPECT_EQ(style->entries[0].key.name.value(), - test::parseNameOrDie(u"@android:attr/background")); - RawString* raw = valueCast<RawString>(style->entries[0].value.get()); - ASSERT_NE(raw, nullptr); - EXPECT_EQ(*raw->value, u"foo"); - - AAPT_ASSERT_TRUE(style->entries[1].key.name); - EXPECT_EQ(style->entries[1].key.name.value(), - test::parseNameOrDie(u"@android:attr/colorAccent")); - ref = valueCast<Reference>(style->entries[1].value.get()); - ASSERT_NE(ref, nullptr); - AAPT_ASSERT_TRUE(ref->name); - EXPECT_EQ(ref->name.value(), test::parseNameOrDie(u"@com.app.test:color/green")); -} - TEST_F(TableFlattenerTest, FlattenMinMaxAttributes) { Attribute attr(false); attr.typeMask = android::ResTable_map::TYPE_INTEGER; @@ -284,33 +228,4 @@ TEST_F(TableFlattenerTest, FlattenMinMaxAttributes) { EXPECT_EQ(attr.maxInt, actualAttr->maxInt); } -TEST_F(TableFlattenerTest, FlattenSourceAndCommentsForChildrenOfCompoundValues) { - Style style; - Reference key(test::parseNameOrDie(u"@android:attr/foo")); - key.id = ResourceId(0x01010000); - key.setSource(Source("test").withLine(2)); - key.setComment(StringPiece16(u"comment")); - style.entries.push_back(Style::Entry{ key, util::make_unique<Id>() }); - - test::ResourceTableBuilder builder = test::ResourceTableBuilder(); - std::unique_ptr<ResourceTable> table = builder - .setPackageId(u"android", 0x01) - .addValue(u"@android:attr/foo", ResourceId(0x01010000), - test::AttributeBuilder().build()) - .addValue(u"@android:style/foo", ResourceId(0x01020000), - std::unique_ptr<Style>(style.clone(builder.getStringPool()))) - .build(); - - ResourceTable result; - ASSERT_TRUE(flatten(table.get(), &result)); - - Style* actualStyle = test::getValue<Style>(&result, u"@android:style/foo"); - ASSERT_NE(nullptr, actualStyle); - ASSERT_EQ(1u, actualStyle->entries.size()); - - Reference* actualKey = &actualStyle->entries[0].key; - EXPECT_EQ(key.getSource(), actualKey->getSource()); - EXPECT_EQ(key.getComment(), actualKey->getComment()); -} - } // namespace aapt diff --git a/tools/aapt2/link/Link.cpp b/tools/aapt2/link/Link.cpp index fd76e887ab2a..8e321798787a 100644 --- a/tools/aapt2/link/Link.cpp +++ b/tools/aapt2/link/Link.cpp @@ -19,6 +19,7 @@ #include "Flags.h" #include "Locale.h" #include "NameMangler.h" +#include "ResourceUtils.h" #include "compile/IdAssigner.h" #include "filter/ConfigFilter.h" #include "flatten/Archive.h" @@ -35,12 +36,14 @@ #include "link/TableMerger.h" #include "process/IResourceTableConsumer.h" #include "process/SymbolTable.h" +#include "proto/ProtoSerialize.h" #include "unflatten/BinaryResourceParser.h" -#include "unflatten/FileExportHeaderReader.h" #include "util/Files.h" #include "util/StringPiece.h" #include "xml/XmlDom.h" +#include <google/protobuf/io/coded_stream.h> + #include <fstream> #include <sys/stat.h> #include <vector> @@ -144,6 +147,22 @@ public: return table; } + std::unique_ptr<ResourceTable> loadTableFromPb(const Source& source, + const void* data, size_t len) { + pb::ResourceTable pbTable; + if (!pbTable.ParseFromArray(data, len)) { + mContext->getDiagnostics()->error(DiagMessage(source) << "invalid compiled table"); + return {}; + } + + std::unique_ptr<ResourceTable> table = deserializeTableFromPb(pbTable, source, + mContext->getDiagnostics()); + if (!table) { + return {}; + } + return table; + } + /** * Inflates an XML file from the source path. */ @@ -161,18 +180,16 @@ public: const Source& source, const void* data, size_t len, IDiagnostics* diag) { - std::string errorStr; - ssize_t offset = getWrappedDataOffset(data, len, &errorStr); - if (offset < 0) { - diag->error(DiagMessage(source) << errorStr); + CompiledFileInputStream inputStream(data, len); + if (!inputStream.CompiledFile()) { + diag->error(DiagMessage(source) << "invalid compiled file header"); return {}; } - std::unique_ptr<xml::XmlResource> xmlRes = xml::inflate( - reinterpret_cast<const uint8_t*>(data) + static_cast<size_t>(offset), - len - static_cast<size_t>(offset), - diag, - source); + const uint8_t* xmlData = reinterpret_cast<const uint8_t*>(inputStream.data()); + const size_t xmlDataLen = inputStream.size(); + + std::unique_ptr<xml::XmlResource> xmlRes = xml::inflate(xmlData, xmlDataLen, diag, source); if (!xmlRes) { return {}; } @@ -182,11 +199,16 @@ public: static std::unique_ptr<ResourceFile> loadFileExportHeader(const Source& source, const void* data, size_t len, IDiagnostics* diag) { - std::unique_ptr<ResourceFile> resFile = util::make_unique<ResourceFile>(); - std::string errorStr; - ssize_t offset = unwrapFileExportHeader(data, len, resFile.get(), &errorStr); - if (offset < 0) { - diag->error(DiagMessage(source) << errorStr); + CompiledFileInputStream inputStream(data, len); + const pb::CompiledFile* pbFile = inputStream.CompiledFile(); + if (!pbFile) { + diag->error(DiagMessage(source) << "invalid compiled file header"); + return {}; + } + + std::unique_ptr<ResourceFile> resFile = deserializeCompiledFileFromPb(*pbFile, source, + diag); + if (!resFile) { return {}; } return resFile; @@ -214,16 +236,16 @@ public: return false; } - std::string errorStr; - ssize_t offset = getWrappedDataOffset(data->data(), data->size(), &errorStr); - if (offset < 0) { - mContext->getDiagnostics()->error(DiagMessage(file->getSource()) << errorStr); + CompiledFileInputStream inputStream(data->data(), data->size()); + if (!inputStream.CompiledFile()) { + mContext->getDiagnostics()->error(DiagMessage(file->getSource()) + << "invalid compiled file header"); return false; } if (writer->startEntry(outPath, getCompressionFlags(outPath))) { - if (writer->writeEntry(reinterpret_cast<const uint8_t*>(data->data()) + offset, - data->size() - static_cast<size_t>(offset))) { + if (writer->writeEntry(reinterpret_cast<const uint8_t*>(inputStream.data()), + inputStream.size())) { if (writer->finishEntry()) { return true; } @@ -307,9 +329,7 @@ public: bool flattenTable(ResourceTable* table, IArchiveWriter* writer) { BigBuffer buffer(1024); - TableFlattenerOptions options = {}; - options.useExtendedChunks = mOptions.staticLib; - TableFlattener flattener(&buffer, options); + TableFlattener flattener(&buffer); if (!flattener.consume(mContext, table)) { return false; } @@ -445,8 +465,8 @@ public: return false; } - std::unique_ptr<ResourceTable> table = loadTable(file->getSource(), data->data(), - data->size()); + std::unique_ptr<ResourceTable> table = loadTableFromPb(file->getSource(), data->data(), + data->size()); if (!table) { return false; } diff --git a/tools/aapt2/proto/ProtoHelpers.cpp b/tools/aapt2/proto/ProtoHelpers.cpp new file mode 100644 index 000000000000..99981c52e26f --- /dev/null +++ b/tools/aapt2/proto/ProtoHelpers.cpp @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "proto/ProtoHelpers.h" + +namespace aapt { + +void serializeStringPoolToPb(const StringPool& pool, pb::StringPool* outPbPool) { + BigBuffer buffer(1024); + StringPool::flattenUtf8(&buffer, pool); + + std::string* data = outPbPool->mutable_data(); + data->reserve(buffer.size()); + + size_t offset = 0; + for (const BigBuffer::Block& block : buffer) { + data->insert(data->begin() + offset, block.buffer.get(), block.buffer.get() + block.size); + offset += block.size; + } +} + +void serializeSourceToPb(const Source& source, StringPool* srcPool, pb::Source* outPbSource) { + StringPool::Ref ref = srcPool->makeRef(util::utf8ToUtf16(source.path)); + outPbSource->set_path_idx(static_cast<uint32_t>(ref.getIndex())); + if (source.line) { + outPbSource->set_line_no(static_cast<uint32_t>(source.line.value())); + } +} + +void deserializeSourceFromPb(const pb::Source& pbSource, const android::ResStringPool& srcPool, + Source* outSource) { + if (pbSource.has_path_idx()) { + outSource->path = util::getString8(srcPool, pbSource.path_idx()).toString(); + } + + if (pbSource.has_line_no()) { + outSource->line = static_cast<size_t>(pbSource.line_no()); + } +} + +pb::SymbolStatus_Visibility serializeVisibilityToPb(SymbolState state) { + switch (state) { + case SymbolState::kPrivate: return pb::SymbolStatus_Visibility_Private; + case SymbolState::kPublic: return pb::SymbolStatus_Visibility_Public; + default: break; + } + return pb::SymbolStatus_Visibility_Unknown; +} + +SymbolState deserializeVisibilityFromPb(pb::SymbolStatus_Visibility pbVisibility) { + switch (pbVisibility) { + case pb::SymbolStatus_Visibility_Private: return SymbolState::kPrivate; + case pb::SymbolStatus_Visibility_Public: return SymbolState::kPublic; + default: break; + } + return SymbolState::kUndefined; +} + +void serializeConfig(const ConfigDescription& config, pb::ConfigDescription* outPbConfig) { + android::ResTable_config flatConfig = config; + flatConfig.size = sizeof(flatConfig); + flatConfig.swapHtoD(); + outPbConfig->set_data(&flatConfig, sizeof(flatConfig)); +} + +bool deserializeConfigDescriptionFromPb(const pb::ConfigDescription& pbConfig, + ConfigDescription* outConfig) { + if (!pbConfig.has_data()) { + return false; + } + + const android::ResTable_config* config; + if (pbConfig.data().size() > sizeof(*config)) { + return false; + } + + config = reinterpret_cast<const android::ResTable_config*>(pbConfig.data().data()); + outConfig->copyFromDtoH(*config); + return true; +} + +pb::Reference_Type serializeReferenceTypeToPb(Reference::Type type) { + switch (type) { + case Reference::Type::kResource: return pb::Reference_Type_Ref; + case Reference::Type::kAttribute: return pb::Reference_Type_Attr; + default: break; + } + return pb::Reference_Type_Ref; +} + +Reference::Type deserializeReferenceTypeFromPb(pb::Reference_Type pbType) { + switch (pbType) { + case pb::Reference_Type_Ref: return Reference::Type::kResource; + case pb::Reference_Type_Attr: return Reference::Type::kAttribute; + default: break; + } + return Reference::Type::kResource; +} + +pb::Plural_Arity serializePluralEnumToPb(size_t pluralIdx) { + switch (pluralIdx) { + case Plural::Zero: return pb::Plural_Arity_Zero; + case Plural::One: return pb::Plural_Arity_One; + case Plural::Two: return pb::Plural_Arity_Two; + case Plural::Few: return pb::Plural_Arity_Few; + case Plural::Many: return pb::Plural_Arity_Many; + default: break; + } + return pb::Plural_Arity_Other; +} + +size_t deserializePluralEnumFromPb(pb::Plural_Arity arity) { + switch (arity) { + case pb::Plural_Arity_Zero: return Plural::Zero; + case pb::Plural_Arity_One: return Plural::One; + case pb::Plural_Arity_Two: return Plural::Two; + case pb::Plural_Arity_Few: return Plural::Few; + case pb::Plural_Arity_Many: return Plural::Many; + default: break; + } + return Plural::Other; +} + +} // namespace aapt diff --git a/tools/aapt2/proto/ProtoHelpers.h b/tools/aapt2/proto/ProtoHelpers.h new file mode 100644 index 000000000000..02e67f17c80c --- /dev/null +++ b/tools/aapt2/proto/ProtoHelpers.h @@ -0,0 +1,52 @@ +/* + * 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. + */ + +#ifndef AAPT_PROTO_PROTOHELPERS_H +#define AAPT_PROTO_PROTOHELPERS_H + +#include "ConfigDescription.h" +#include "ResourceTable.h" +#include "Source.h" +#include "StringPool.h" + +#include "proto/frameworks/base/tools/aapt2/Format.pb.h" + +#include <androidfw/ResourceTypes.h> + +namespace aapt { + +void serializeStringPoolToPb(const StringPool& pool, pb::StringPool* outPbPool); + +void serializeSourceToPb(const Source& source, StringPool* srcPool, pb::Source* outPbSource); +void deserializeSourceFromPb(const pb::Source& pbSource, const android::ResStringPool& srcPool, + Source* outSource); + +pb::SymbolStatus_Visibility serializeVisibilityToPb(SymbolState state); +SymbolState deserializeVisibilityFromPb(pb::SymbolStatus_Visibility pbVisibility); + +void serializeConfig(const ConfigDescription& config, pb::ConfigDescription* outPbConfig); +bool deserializeConfigDescriptionFromPb(const pb::ConfigDescription& pbConfig, + ConfigDescription* outConfig); + +pb::Reference_Type serializeReferenceTypeToPb(Reference::Type type); +Reference::Type deserializeReferenceTypeFromPb(pb::Reference_Type pbType); + +pb::Plural_Arity serializePluralEnumToPb(size_t pluralIdx); +size_t deserializePluralEnumFromPb(pb::Plural_Arity arity); + +} // namespace aapt + +#endif /* AAPT_PROTO_PROTOHELPERS_H */ diff --git a/tools/aapt2/proto/ProtoSerialize.h b/tools/aapt2/proto/ProtoSerialize.h new file mode 100644 index 000000000000..6e224ab00af4 --- /dev/null +++ b/tools/aapt2/proto/ProtoSerialize.h @@ -0,0 +1,77 @@ +/* + * 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. + */ + +#ifndef AAPT_FLATTEN_TABLEPROTOSERIALIZER_H +#define AAPT_FLATTEN_TABLEPROTOSERIALIZER_H + +#include "Diagnostics.h" +#include "ResourceTable.h" +#include "Source.h" +#include "proto/ProtoHelpers.h" + +#include <android-base/macros.h> +#include <google/protobuf/io/coded_stream.h> +#include <google/protobuf/io/zero_copy_stream_impl_lite.h> + +namespace aapt { + +std::unique_ptr<pb::ResourceTable> serializeTableToPb(ResourceTable* table); +std::unique_ptr<ResourceTable> deserializeTableFromPb(const pb::ResourceTable& pbTable, + const Source& source, + IDiagnostics* diag); + +std::unique_ptr<pb::CompiledFile> serializeCompiledFileToPb(const ResourceFile& file); +std::unique_ptr<ResourceFile> deserializeCompiledFileFromPb(const pb::CompiledFile& pbFile, + const Source& source, + IDiagnostics* diag); + +class CompiledFileOutputStream : public google::protobuf::io::CopyingOutputStream { +public: + CompiledFileOutputStream(google::protobuf::io::ZeroCopyOutputStream* out, + pb::CompiledFile* pbFile); + bool Write(const void* data, int size) override; + bool Finish(); + +private: + bool ensureFileWritten(); + + google::protobuf::io::CodedOutputStream mOut; + pb::CompiledFile* mPbFile; + + DISALLOW_COPY_AND_ASSIGN(CompiledFileOutputStream); +}; + +class CompiledFileInputStream { +public: + CompiledFileInputStream(const void* data, size_t size); + + const pb::CompiledFile* CompiledFile(); + + const void* data(); + size_t size(); + +private: + google::protobuf::io::CodedInputStream mIn; + std::unique_ptr<pb::CompiledFile> mPbFile; + const uint8_t* mData; + size_t mSize; + + DISALLOW_COPY_AND_ASSIGN(CompiledFileInputStream); +}; + +} // namespace aapt + +#endif /* AAPT_FLATTEN_TABLEPROTOSERIALIZER_H */ diff --git a/tools/aapt2/proto/TableProtoDeserializer.cpp b/tools/aapt2/proto/TableProtoDeserializer.cpp new file mode 100644 index 000000000000..1310aa6774bb --- /dev/null +++ b/tools/aapt2/proto/TableProtoDeserializer.cpp @@ -0,0 +1,514 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResourceTable.h" +#include "ResourceUtils.h" +#include "ValueVisitor.h" +#include "proto/ProtoHelpers.h" +#include "proto/ProtoSerialize.h" +#include "util/Comparators.h" + +#include <androidfw/ResourceTypes.h> + +namespace aapt { + +namespace { + +class ReferenceIdToNameVisitor : public ValueVisitor { +public: + using ValueVisitor::visit; + + ReferenceIdToNameVisitor(const std::map<ResourceId, ResourceNameRef>* mapping) : + mMapping(mapping) { + assert(mMapping); + } + + void visit(Reference* reference) override { + if (!reference->id || !reference->id.value().isValid()) { + return; + } + + ResourceId id = reference->id.value(); + auto cacheIter = mMapping->find(id); + if (cacheIter != mMapping->end()) { + reference->name = cacheIter->second.toResourceName(); + } + } + +private: + const std::map<ResourceId, ResourceNameRef>* mMapping; +}; + +class PackagePbDeserializer { +public: + PackagePbDeserializer(const android::ResStringPool* valuePool, + const android::ResStringPool* sourcePool, + const android::ResStringPool* symbolPool, + const Source& source, IDiagnostics* diag) : + mValuePool(valuePool), mSourcePool(sourcePool), mSymbolPool(symbolPool), + mSource(source), mDiag(diag) { + } + +public: + bool deserializeFromPb(const pb::Package& pbPackage, ResourceTable* table) { + Maybe<uint8_t> id; + if (pbPackage.has_package_id()) { + id = static_cast<uint8_t>(pbPackage.package_id()); + } + + std::map<ResourceId, ResourceNameRef> idIndex; + + ResourceTablePackage* pkg = table->createPackage( + util::utf8ToUtf16(pbPackage.package_name()), id); + for (const pb::Type& pbType : pbPackage.types()) { + const ResourceType* resType = parseResourceType(util::utf8ToUtf16(pbType.name())); + if (!resType) { + mDiag->error(DiagMessage(mSource) << "unknown type '" << pbType.name() << "'"); + return {}; + } + + ResourceTableType* type = pkg->findOrCreateType(*resType); + + for (const pb::Entry& pbEntry : pbType.entries()) { + ResourceEntry* entry = type->findOrCreateEntry(util::utf8ToUtf16(pbEntry.name())); + + // Deserialize the symbol status (public/private with source and comments). + if (pbEntry.has_symbol_status()) { + const pb::SymbolStatus& pbStatus = pbEntry.symbol_status(); + if (pbStatus.has_source()) { + deserializeSourceFromPb(pbStatus.source(), *mSourcePool, + &entry->symbolStatus.source); + } + + if (pbStatus.has_comment()) { + entry->symbolStatus.comment = util::utf8ToUtf16(pbStatus.comment()); + } + + SymbolState visibility = deserializeVisibilityFromPb(pbStatus.visibility()); + entry->symbolStatus.state = visibility; + + if (visibility == SymbolState::kPublic) { + // This is a public symbol, we must encode the ID now if there is one. + if (pbEntry.has_id()) { + entry->id = static_cast<uint16_t>(pbEntry.id()); + } + + if (type->symbolStatus.state != SymbolState::kPublic) { + // If the type has not been made public, do so now. + type->symbolStatus.state = SymbolState::kPublic; + if (pbType.has_id()) { + type->id = static_cast<uint8_t>(pbType.id()); + } + } + } else if (visibility == SymbolState::kPrivate) { + if (type->symbolStatus.state == SymbolState::kUndefined) { + type->symbolStatus.state = SymbolState::kPrivate; + } + } + } + + ResourceId resId(pbPackage.package_id(), pbType.id(), pbEntry.id()); + if (resId.isValid()) { + idIndex[resId] = ResourceNameRef(pkg->name, type->type, entry->name); + } + + for (const pb::ConfigValue& pbConfigValue : pbEntry.config_values()) { + const pb::ConfigDescription& pbConfig = pbConfigValue.config(); + + ConfigDescription config; + if (!deserializeConfigDescriptionFromPb(pbConfig, &config)) { + mDiag->error(DiagMessage(mSource) << "invalid configuration"); + return {}; + } + + auto iter = std::lower_bound(entry->values.begin(), entry->values.end(), + config, cmp::lessThanConfig); + if (iter != entry->values.end() && iter->config == config) { + // Duplicate config. + mDiag->error(DiagMessage(mSource) << "duplicate configuration"); + return {}; + } + + std::unique_ptr<Value> value = deserializeValueFromPb(pbConfigValue.value(), + config, + &table->stringPool); + if (!value) { + return {}; + } + entry->values.insert(iter, ResourceConfigValue{ config, std::move(value) }); + } + } + } + + ReferenceIdToNameVisitor visitor(&idIndex); + visitAllValuesInPackage(pkg, &visitor); + return true; + } + +private: + std::unique_ptr<Item> deserializeItemFromPb(const pb::Item& pbItem, + const ConfigDescription& config, + StringPool* pool) { + if (pbItem.has_ref()) { + const pb::Reference& pbRef = pbItem.ref(); + std::unique_ptr<Reference> ref = util::make_unique<Reference>(); + if (!deserializeReferenceFromPb(pbRef, ref.get())) { + return {}; + } + return std::move(ref); + + } else if (pbItem.has_prim()) { + const pb::Primitive& pbPrim = pbItem.prim(); + android::Res_value prim = {}; + prim.dataType = static_cast<uint8_t>(pbPrim.type()); + prim.data = pbPrim.data(); + return util::make_unique<BinaryPrimitive>(prim); + + } else if (pbItem.has_id()) { + return util::make_unique<Id>(); + + } else if (pbItem.has_str()) { + const uint32_t idx = pbItem.str().idx(); + StringPiece16 str = util::getString(*mValuePool, idx); + + const android::ResStringPool_span* spans = mValuePool->styleAt(idx); + if (spans && spans->name.index != android::ResStringPool_span::END) { + StyleString styleStr = { str.toString() }; + while (spans->name.index != android::ResStringPool_span::END) { + styleStr.spans.push_back(Span{ + util::getString(*mValuePool, spans->name.index).toString(), + spans->firstChar, + spans->lastChar + }); + spans++; + } + return util::make_unique<StyledString>( + pool->makeRef(styleStr, StringPool::Context{ 1, config })); + } + return util::make_unique<String>( + pool->makeRef(str, StringPool::Context{ 1, config })); + + } else if (pbItem.has_raw_str()) { + const uint32_t idx = pbItem.raw_str().idx(); + StringPiece16 str = util::getString(*mValuePool, idx); + return util::make_unique<RawString>( + pool->makeRef(str, StringPool::Context{ 1, config })); + + } else if (pbItem.has_file()) { + const uint32_t idx = pbItem.file().path_idx(); + StringPiece16 str = util::getString(*mValuePool, idx); + return util::make_unique<FileReference>( + pool->makeRef(str, StringPool::Context{ 0, config })); + + } else { + mDiag->error(DiagMessage(mSource) << "unknown item"); + } + return {}; + } + + std::unique_ptr<Value> deserializeValueFromPb(const pb::Value& pbValue, + const ConfigDescription& config, + StringPool* pool) { + const bool isWeak = pbValue.has_weak() ? pbValue.weak() : false; + + std::unique_ptr<Value> value; + if (pbValue.has_item()) { + value = deserializeItemFromPb(pbValue.item(), config, pool); + if (!value) { + return {}; + } + + } else if (pbValue.has_compound_value()) { + const pb::CompoundValue pbCompoundValue = pbValue.compound_value(); + if (pbCompoundValue.has_attr()) { + const pb::Attribute& pbAttr = pbCompoundValue.attr(); + std::unique_ptr<Attribute> attr = util::make_unique<Attribute>(isWeak); + attr->typeMask = pbAttr.format_flags(); + for (const pb::Attribute_Symbol& pbSymbol : pbAttr.symbols()) { + Attribute::Symbol symbol; + deserializeItemCommon(pbSymbol, &symbol.symbol); + if (!deserializeReferenceFromPb(pbSymbol.name(), &symbol.symbol)) { + return {}; + } + symbol.value = pbSymbol.value(); + attr->symbols.push_back(std::move(symbol)); + } + value = std::move(attr); + + } else if (pbCompoundValue.has_style()) { + const pb::Style& pbStyle = pbCompoundValue.style(); + std::unique_ptr<Style> style = util::make_unique<Style>(); + if (pbStyle.has_parent()) { + style->parent = Reference(); + if (!deserializeReferenceFromPb(pbStyle.parent(), &style->parent.value())) { + return {}; + } + + if (pbStyle.has_parent_source()) { + Source parentSource; + deserializeSourceFromPb(pbStyle.parent_source(), *mSourcePool, + &parentSource); + style->parent.value().setSource(std::move(parentSource)); + } + } + + for (const pb::Style_Entry& pbEntry : pbStyle.entries()) { + Style::Entry entry; + deserializeItemCommon(pbEntry, &entry.key); + if (!deserializeReferenceFromPb(pbEntry.key(), &entry.key)) { + return {}; + } + + entry.value = deserializeItemFromPb(pbEntry.item(), config, pool); + if (!entry.value) { + return {}; + } + + deserializeItemCommon(pbEntry, entry.value.get()); + style->entries.push_back(std::move(entry)); + } + value = std::move(style); + + } else if (pbCompoundValue.has_styleable()) { + const pb::Styleable& pbStyleable = pbCompoundValue.styleable(); + std::unique_ptr<Styleable> styleable = util::make_unique<Styleable>(); + for (const pb::Styleable_Entry& pbEntry : pbStyleable.entries()) { + Reference attrRef; + deserializeItemCommon(pbEntry, &attrRef); + deserializeReferenceFromPb(pbEntry.attr(), &attrRef); + styleable->entries.push_back(std::move(attrRef)); + } + value = std::move(styleable); + + } else if (pbCompoundValue.has_array()) { + const pb::Array& pbArray = pbCompoundValue.array(); + std::unique_ptr<Array> array = util::make_unique<Array>(); + for (const pb::Array_Entry& pbEntry : pbArray.entries()) { + std::unique_ptr<Item> item = deserializeItemFromPb(pbEntry.item(), config, + pool); + if (!item) { + return {}; + } + + deserializeItemCommon(pbEntry, item.get()); + array->items.push_back(std::move(item)); + } + value = std::move(array); + + } else if (pbCompoundValue.has_plural()) { + const pb::Plural& pbPlural = pbCompoundValue.plural(); + std::unique_ptr<Plural> plural = util::make_unique<Plural>(); + for (const pb::Plural_Entry& pbEntry : pbPlural.entries()) { + size_t pluralIdx = deserializePluralEnumFromPb(pbEntry.arity()); + plural->values[pluralIdx] = deserializeItemFromPb(pbEntry.item(), config, + pool); + if (!plural->values[pluralIdx]) { + return {}; + } + + deserializeItemCommon(pbEntry, plural->values[pluralIdx].get()); + } + value = std::move(plural); + + } else { + mDiag->error(DiagMessage(mSource) << "unknown compound value"); + return {}; + } + } else { + mDiag->error(DiagMessage(mSource) << "unknown value"); + return {}; + } + + assert(value && "forgot to set value"); + + value->setWeak(isWeak); + deserializeItemCommon(pbValue, value.get()); + return value; + } + + bool deserializeReferenceFromPb(const pb::Reference& pbRef, Reference* outRef) { + outRef->referenceType = deserializeReferenceTypeFromPb(pbRef.type()); + outRef->privateReference = pbRef.private_(); + + if (!pbRef.has_id() && !pbRef.has_symbol_idx()) { + return false; + } + + if (pbRef.has_id()) { + outRef->id = ResourceId(pbRef.id()); + } + + if (pbRef.has_symbol_idx()) { + StringPiece16 strSymbol = util::getString(*mSymbolPool, pbRef.symbol_idx()); + ResourceNameRef nameRef; + if (!ResourceUtils::parseResourceName(strSymbol, &nameRef, nullptr)) { + mDiag->error(DiagMessage(mSource) << "invalid reference name '" + << strSymbol << "'"); + return false; + } + + outRef->name = nameRef.toResourceName(); + } + return true; + } + + template <typename T> + void deserializeItemCommon(const T& pbItem, Value* outValue) { + if (pbItem.has_source()) { + Source source; + deserializeSourceFromPb(pbItem.source(), *mSourcePool, &source); + outValue->setSource(std::move(source)); + } + + if (pbItem.has_comment()) { + outValue->setComment(util::utf8ToUtf16(pbItem.comment())); + } + } + +private: + const android::ResStringPool* mValuePool; + const android::ResStringPool* mSourcePool; + const android::ResStringPool* mSymbolPool; + const Source mSource; + IDiagnostics* mDiag; +}; + +} // namespace + +std::unique_ptr<ResourceTable> deserializeTableFromPb(const pb::ResourceTable& pbTable, + const Source& source, + IDiagnostics* diag) { + std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>(); + + if (!pbTable.has_string_pool()) { + diag->error(DiagMessage(source) << "no string pool found"); + return {}; + } + + android::ResStringPool valuePool; + android::status_t result = valuePool.setTo(pbTable.string_pool().data().data(), + pbTable.string_pool().data().size()); + if (result != android::NO_ERROR) { + diag->error(DiagMessage(source) << "invalid string pool"); + return {}; + } + + android::ResStringPool sourcePool; + if (pbTable.has_source_pool()) { + result = sourcePool.setTo(pbTable.source_pool().data().data(), + pbTable.source_pool().data().size()); + if (result != android::NO_ERROR) { + diag->error(DiagMessage(source) << "invalid source pool"); + return {}; + } + } + + android::ResStringPool symbolPool; + if (pbTable.has_symbol_pool()) { + result = symbolPool.setTo(pbTable.symbol_pool().data().data(), + pbTable.symbol_pool().data().size()); + if (result != android::NO_ERROR) { + diag->error(DiagMessage(source) << "invalid symbol pool"); + return {}; + } + } + + PackagePbDeserializer packagePbDeserializer(&valuePool, &sourcePool, &symbolPool, source, diag); + for (const pb::Package& pbPackage : pbTable.packages()) { + if (!packagePbDeserializer.deserializeFromPb(pbPackage, table.get())) { + return {}; + } + } + return table; +} + +std::unique_ptr<ResourceFile> deserializeCompiledFileFromPb(const pb::CompiledFile& pbFile, + const Source& source, + IDiagnostics* diag) { + std::unique_ptr<ResourceFile> file = util::make_unique<ResourceFile>(); + + ResourceNameRef nameRef; + + // Need to create an lvalue here so that nameRef can point to something real. + std::u16string utf16Name = util::utf8ToUtf16(pbFile.resource_name()); + if (!ResourceUtils::parseResourceName(utf16Name, &nameRef)) { + diag->error(DiagMessage(source) << "invalid resource name in compiled file header: " + << pbFile.resource_name()); + return {}; + } + file->name = nameRef.toResourceName(); + file->source.path = pbFile.source_path(); + deserializeConfigDescriptionFromPb(pbFile.config(), &file->config); + + for (const pb::CompiledFile_Symbol& pbSymbol : pbFile.exported_symbols()) { + // Need to create an lvalue here so that nameRef can point to something real. + utf16Name = util::utf8ToUtf16(pbSymbol.resource_name()); + if (!ResourceUtils::parseResourceName(utf16Name, &nameRef)) { + diag->error(DiagMessage(source) << "invalid resource name for exported symbol in " + "compiled file header: " + << pbFile.resource_name()); + return {}; + } + file->exportedSymbols.push_back( + SourcedResourceName{ nameRef.toResourceName(), pbSymbol.line_no() }); + } + return file; +} + +CompiledFileInputStream::CompiledFileInputStream(const void* data, size_t size) : + mIn(static_cast<const uint8_t*>(data), size), mPbFile(), + mData(static_cast<const uint8_t*>(data)), mSize(size) { +} + +const pb::CompiledFile* CompiledFileInputStream::CompiledFile() { + if (!mPbFile) { + std::unique_ptr<pb::CompiledFile> pbFile = util::make_unique<pb::CompiledFile>(); + uint64_t pbSize = 0u; + if (!mIn.ReadLittleEndian64(&pbSize)) { + return nullptr; + } + mIn.PushLimit(static_cast<int>(pbSize)); + if (!pbFile->ParsePartialFromCodedStream(&mIn)) { + return nullptr; + } + + const size_t padding = 4 - (pbSize & 0x03); + mData += sizeof(uint64_t) + pbSize + padding; + mSize -= sizeof(uint64_t) + pbSize + padding; + mPbFile = std::move(pbFile); + } + return mPbFile.get(); +} + +const void* CompiledFileInputStream::data() { + if (!mPbFile) { + if (!CompiledFile()) { + return nullptr; + } + } + return mData; +} + +size_t CompiledFileInputStream::size() { + if (!mPbFile) { + if (!CompiledFile()) { + return 0; + } + } + return mSize; +} + +} // namespace aapt diff --git a/tools/aapt2/proto/TableProtoSerializer.cpp b/tools/aapt2/proto/TableProtoSerializer.cpp new file mode 100644 index 000000000000..4a2176d20db9 --- /dev/null +++ b/tools/aapt2/proto/TableProtoSerializer.cpp @@ -0,0 +1,316 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Resource.h" +#include "ResourceTable.h" +#include "StringPool.h" +#include "ValueVisitor.h" +#include "proto/ProtoHelpers.h" +#include "proto/ProtoSerialize.h" +#include "util/BigBuffer.h" + +namespace aapt { + +namespace { + +class PbSerializerVisitor : public RawValueVisitor { +public: + using RawValueVisitor::visit; + + /** + * Constructor to use when expecting to serialize any value. + */ + PbSerializerVisitor(StringPool* sourcePool, StringPool* symbolPool, pb::Value* outPbValue) : + mSourcePool(sourcePool), mSymbolPool(symbolPool), mOutPbValue(outPbValue), + mOutPbItem(nullptr) { + } + + /** + * Constructor to use when expecting to serialize an Item. + */ + PbSerializerVisitor(StringPool* sourcePool, StringPool* symbolPool, pb::Item* outPbItem) : + mSourcePool(sourcePool), mSymbolPool(symbolPool), mOutPbValue(nullptr), + mOutPbItem(outPbItem) { + } + + void visit(Reference* ref) override { + serializeReferenceToPb(*ref, getPbItem()->mutable_ref()); + } + + void visit(String* str) override { + getPbItem()->mutable_str()->set_idx(str->value.getIndex()); + } + + void visit(StyledString* str) override { + getPbItem()->mutable_str()->set_idx(str->value.getIndex()); + } + + void visit(FileReference* file) override { + getPbItem()->mutable_file()->set_path_idx(file->path.getIndex()); + } + + void visit(Id* id) override { + getPbItem()->mutable_id(); + } + + void visit(RawString* rawStr) override { + getPbItem()->mutable_raw_str()->set_idx(rawStr->value.getIndex()); + } + + void visit(BinaryPrimitive* prim) override { + android::Res_value val = {}; + prim->flatten(&val); + + pb::Primitive* pbPrim = getPbItem()->mutable_prim(); + pbPrim->set_type(val.dataType); + pbPrim->set_data(val.data); + } + + void visitItem(Item* item) override { + assert(false && "unimplemented item"); + } + + void visit(Attribute* attr) override { + pb::Attribute* pbAttr = getPbCompoundValue()->mutable_attr(); + pbAttr->set_format_flags(attr->typeMask); + pbAttr->set_min_int(attr->minInt); + pbAttr->set_max_int(attr->maxInt); + + for (auto& symbol : attr->symbols) { + pb::Attribute_Symbol* pbSymbol = pbAttr->add_symbols(); + serializeItemCommonToPb(symbol.symbol, pbSymbol); + serializeReferenceToPb(symbol.symbol, pbSymbol->mutable_name()); + pbSymbol->set_value(symbol.value); + } + } + + void visit(Style* style) override { + pb::Style* pbStyle = getPbCompoundValue()->mutable_style(); + if (style->parent) { + serializeReferenceToPb(style->parent.value(), pbStyle->mutable_parent()); + serializeSourceToPb(style->parent.value().getSource(), + mSourcePool, + pbStyle->mutable_parent_source()); + } + + for (Style::Entry& entry : style->entries) { + pb::Style_Entry* pbEntry = pbStyle->add_entries(); + serializeReferenceToPb(entry.key, pbEntry->mutable_key()); + + pb::Item* pbItem = pbEntry->mutable_item(); + serializeItemCommonToPb(*entry.value, pbEntry); + PbSerializerVisitor subVisitor(mSourcePool, mSymbolPool, pbItem); + entry.value->accept(&subVisitor); + } + } + + void visit(Styleable* styleable) override { + pb::Styleable* pbStyleable = getPbCompoundValue()->mutable_styleable(); + for (Reference& entry : styleable->entries) { + pb::Styleable_Entry* pbEntry = pbStyleable->add_entries(); + serializeItemCommonToPb(entry, pbEntry); + serializeReferenceToPb(entry, pbEntry->mutable_attr()); + } + } + + void visit(Array* array) override { + pb::Array* pbArray = getPbCompoundValue()->mutable_array(); + for (auto& value : array->items) { + pb::Array_Entry* pbEntry = pbArray->add_entries(); + serializeItemCommonToPb(*value, pbEntry); + PbSerializerVisitor subVisitor(mSourcePool, mSymbolPool, pbEntry->mutable_item()); + value->accept(&subVisitor); + } + } + + void visit(Plural* plural) override { + pb::Plural* pbPlural = getPbCompoundValue()->mutable_plural(); + const size_t count = plural->values.size(); + for (size_t i = 0; i < count; i++) { + if (!plural->values[i]) { + // No plural value set here. + continue; + } + + pb::Plural_Entry* pbEntry = pbPlural->add_entries(); + pbEntry->set_arity(serializePluralEnumToPb(i)); + pb::Item* pbElement = pbEntry->mutable_item(); + serializeItemCommonToPb(*plural->values[i], pbEntry); + PbSerializerVisitor subVisitor(mSourcePool, mSymbolPool, pbElement); + plural->values[i]->accept(&subVisitor); + } + } + +private: + pb::Item* getPbItem() { + if (mOutPbValue) { + return mOutPbValue->mutable_item(); + } + return mOutPbItem; + } + + pb::CompoundValue* getPbCompoundValue() { + assert(mOutPbValue); + return mOutPbValue->mutable_compound_value(); + } + + template <typename T> + void serializeItemCommonToPb(const Item& item, T* pbItem) { + serializeSourceToPb(item.getSource(), mSourcePool, pbItem->mutable_source()); + if (!item.getComment().empty()) { + pbItem->set_comment(util::utf16ToUtf8(item.getComment())); + } + } + + void serializeReferenceToPb(const Reference& ref, pb::Reference* pbRef) { + if (ref.id) { + pbRef->set_id(ref.id.value().id); + } else if (ref.name) { + StringPool::Ref symbolRef = mSymbolPool->makeRef(ref.name.value().toString()); + pbRef->set_symbol_idx(static_cast<uint32_t>(symbolRef.getIndex())); + } + pbRef->set_private_(ref.privateReference); + pbRef->set_type(serializeReferenceTypeToPb(ref.referenceType)); + } + + StringPool* mSourcePool; + StringPool* mSymbolPool; + pb::Value* mOutPbValue; + pb::Item* mOutPbItem; +}; + +} // namespace + +std::unique_ptr<pb::ResourceTable> serializeTableToPb(ResourceTable* table) { + // We must do this before writing the resources, since the string pool IDs may change. + table->stringPool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool { + int diff = a.context.priority - b.context.priority; + if (diff < 0) return true; + if (diff > 0) return false; + diff = a.context.config.compare(b.context.config); + if (diff < 0) return true; + if (diff > 0) return false; + return a.value < b.value; + }); + table->stringPool.prune(); + + std::unique_ptr<pb::ResourceTable> pbTable = util::make_unique<pb::ResourceTable>(); + serializeStringPoolToPb(table->stringPool, pbTable->mutable_string_pool()); + + StringPool sourcePool, symbolPool; + + for (auto& package : table->packages) { + pb::Package* pbPackage = pbTable->add_packages(); + if (package->id) { + pbPackage->set_package_id(package->id.value()); + } + pbPackage->set_package_name(util::utf16ToUtf8(package->name)); + + for (auto& type : package->types) { + pb::Type* pbType = pbPackage->add_types(); + if (type->id) { + pbType->set_id(type->id.value()); + } + pbType->set_name(util::utf16ToUtf8(toString(type->type))); + + for (auto& entry : type->entries) { + pb::Entry* pbEntry = pbType->add_entries(); + if (entry->id) { + pbEntry->set_id(entry->id.value()); + } + pbEntry->set_name(util::utf16ToUtf8(entry->name)); + + // Write the SymbolStatus struct. + pb::SymbolStatus* pbStatus = pbEntry->mutable_symbol_status(); + pbStatus->set_visibility(serializeVisibilityToPb(entry->symbolStatus.state)); + serializeSourceToPb(entry->symbolStatus.source, &sourcePool, + pbStatus->mutable_source()); + pbStatus->set_comment(util::utf16ToUtf8(entry->symbolStatus.comment)); + + for (auto& configValue : entry->values) { + pb::ConfigValue* pbConfigValue = pbEntry->add_config_values(); + serializeConfig(configValue.config, pbConfigValue->mutable_config()); + + pb::Value* pbValue = pbConfigValue->mutable_value(); + serializeSourceToPb(configValue.value->getSource(), &sourcePool, + pbValue->mutable_source()); + if (!configValue.value->getComment().empty()) { + pbValue->set_comment(util::utf16ToUtf8(configValue.value->getComment())); + } + + if (configValue.value->isWeak()) { + pbValue->set_weak(true); + } + + PbSerializerVisitor visitor(&sourcePool, &symbolPool, pbValue); + configValue.value->accept(&visitor); + } + } + } + } + + serializeStringPoolToPb(sourcePool, pbTable->mutable_source_pool()); + serializeStringPoolToPb(symbolPool, pbTable->mutable_symbol_pool()); + return pbTable; +} + +std::unique_ptr<pb::CompiledFile> serializeCompiledFileToPb(const ResourceFile& file) { + std::unique_ptr<pb::CompiledFile> pbFile = util::make_unique<pb::CompiledFile>(); + pbFile->set_resource_name(util::utf16ToUtf8(file.name.toString())); + pbFile->set_source_path(file.source.path); + serializeConfig(file.config, pbFile->mutable_config()); + + for (const SourcedResourceName& exported : file.exportedSymbols) { + pb::CompiledFile_Symbol* pbSymbol = pbFile->add_exported_symbols(); + pbSymbol->set_resource_name(util::utf16ToUtf8(exported.name.toString())); + pbSymbol->set_line_no(exported.line); + } + return pbFile; +} + +CompiledFileOutputStream::CompiledFileOutputStream(google::protobuf::io::ZeroCopyOutputStream* out, + pb::CompiledFile* pbFile) : + mOut(out), mPbFile(pbFile) { +} + +bool CompiledFileOutputStream::ensureFileWritten() { + if (mPbFile) { + const uint64_t pbSize = mPbFile->ByteSize(); + mOut.WriteLittleEndian64(pbSize); + mPbFile->SerializeWithCachedSizes(&mOut); + const size_t padding = 4 - (pbSize & 0x03); + if (padding > 0) { + uint32_t zero = 0u; + mOut.WriteRaw(&zero, padding); + } + mPbFile = nullptr; + } + return !mOut.HadError(); +} + +bool CompiledFileOutputStream::Write(const void* data, int size) { + if (!ensureFileWritten()) { + return false; + } + mOut.WriteRaw(data, size); + return !mOut.HadError(); +} + +bool CompiledFileOutputStream::Finish() { + return ensureFileWritten(); +} + +} // namespace aapt diff --git a/tools/aapt2/proto/TableProtoSerializer_test.cpp b/tools/aapt2/proto/TableProtoSerializer_test.cpp new file mode 100644 index 000000000000..1061b8f76f57 --- /dev/null +++ b/tools/aapt2/proto/TableProtoSerializer_test.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResourceTable.h" +#include "proto/ProtoSerialize.h" +#include "test/Builders.h" +#include "test/Common.h" +#include "test/Context.h" + +#include <gtest/gtest.h> + +namespace aapt { + +TEST(TableProtoSerializer, SerializeSinglePackage) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().build(); + std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() + .setPackageId(u"com.app.a", 0x7f) + .addFileReference(u"@com.app.a:layout/main", ResourceId(0x7f020000), + u"res/layout/main.xml") + .addReference(u"@com.app.a:layout/other", ResourceId(0x7f020001), + u"@com.app.a:layout/main") + .addString(u"@com.app.a:string/text", {}, u"hi") + .addValue(u"@com.app.a:id/foo", {}, util::make_unique<Id>()) + .build(); + + Symbol publicSymbol; + publicSymbol.state = SymbolState::kPublic; + ASSERT_TRUE(table->setSymbolState(test::parseNameOrDie(u"@com.app.a:layout/main"), + ResourceId(0x7f020000), + publicSymbol, context->getDiagnostics())); + + Id* id = test::getValue<Id>(table.get(), u"@com.app.a:id/foo"); + ASSERT_NE(nullptr, id); + + // Make a plural. + std::unique_ptr<Plural> plural = util::make_unique<Plural>(); + plural->values[Plural::One] = util::make_unique<String>(table->stringPool.makeRef(u"one")); + ASSERT_TRUE(table->addResource(test::parseNameOrDie(u"@com.app.a:plurals/hey"), + ConfigDescription{}, std::move(plural), + context->getDiagnostics())); + + std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(table.get()); + ASSERT_NE(nullptr, pbTable); + + std::unique_ptr<ResourceTable> newTable = deserializeTableFromPb(*pbTable, + Source{ "test" }, + context->getDiagnostics()); + ASSERT_NE(nullptr, newTable); + + Id* newId = test::getValue<Id>(newTable.get(), u"@com.app.a:id/foo"); + ASSERT_NE(nullptr, newId); + EXPECT_EQ(id->isWeak(), newId->isWeak()); + + Maybe<ResourceTable::SearchResult> result = newTable->findResource( + test::parseNameOrDie(u"@com.app.a:layout/main")); + AAPT_ASSERT_TRUE(result); + EXPECT_EQ(SymbolState::kPublic, result.value().type->symbolStatus.state); + EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbolStatus.state); +} + +TEST(TableProtoSerializer, SerializeFileHeader) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().build(); + + ResourceFile f; + f.config = test::parseConfigOrDie("hdpi-v9"); + f.name = test::parseNameOrDie(u"@com.app.a:layout/main"); + f.source.path = "res/layout-hdpi-v9/main.xml"; + f.exportedSymbols.push_back(SourcedResourceName{ test::parseNameOrDie(u"@+id/unchecked"), 23u }); + + const std::string expectedData = "1234"; + + std::unique_ptr<pb::CompiledFile> pbFile = serializeCompiledFileToPb(f); + + std::string outputStr; + { + google::protobuf::io::StringOutputStream outStream(&outputStr); + CompiledFileOutputStream outFileStream(&outStream, pbFile.get()); + + ASSERT_TRUE(outFileStream.Write(expectedData.data(), expectedData.size())); + ASSERT_TRUE(outFileStream.Finish()); + } + + CompiledFileInputStream inFileStream(outputStr.data(), outputStr.size()); + const pb::CompiledFile* newPbFile = inFileStream.CompiledFile(); + ASSERT_NE(nullptr, newPbFile); + + std::unique_ptr<ResourceFile> file = deserializeCompiledFileFromPb(*newPbFile, Source{ "test" }, + context->getDiagnostics()); + ASSERT_NE(nullptr, file); + + std::string actualData((const char*)inFileStream.data(), inFileStream.size()); + EXPECT_EQ(expectedData, actualData); + EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(inFileStream.data()) & 0x03); + + ASSERT_EQ(1u, file->exportedSymbols.size()); + EXPECT_EQ(test::parseNameOrDie(u"@+id/unchecked"), file->exportedSymbols[0].name); +} + +} // namespace aapt diff --git a/tools/aapt2/unflatten/BinaryResourceParser.cpp b/tools/aapt2/unflatten/BinaryResourceParser.cpp index 6b7a63cf7bf2..341770360068 100644 --- a/tools/aapt2/unflatten/BinaryResourceParser.cpp +++ b/tools/aapt2/unflatten/BinaryResourceParser.cpp @@ -19,8 +19,6 @@ #include "ResourceValues.h" #include "Source.h" #include "ValueVisitor.h" - -#include "flatten/ResourceTypeExtensions.h" #include "unflatten/BinaryResourceParser.h" #include "unflatten/ResChunkPullParser.h" #include "util/Util.h" @@ -36,6 +34,8 @@ namespace aapt { using namespace android; +namespace { + /* * Visitor that converts a reference's resource ID to a resource name, * given a mapping from resource ID to resource name. @@ -66,6 +66,8 @@ public: } }; +} // namespace + BinaryResourceParser::BinaryResourceParser(IAaptContext* context, ResourceTable* table, const Source& source, const void* data, size_t len) : mContext(context), mTable(table), mSource(source), mData(data), mDataLen(len) { @@ -97,106 +99,6 @@ bool BinaryResourceParser::parse() { return !error; } -Maybe<Reference> BinaryResourceParser::getSymbol(const void* data) { - if (!mSymbolEntries || mSymbolEntryCount == 0) { - return {}; - } - - if ((uintptr_t) data < (uintptr_t) mData) { - return {}; - } - - // We only support 32 bit offsets right now. - const uintptr_t offset = (uintptr_t) data - (uintptr_t) mData; - if (offset > std::numeric_limits<uint32_t>::max()) { - return {}; - } - - for (size_t i = 0; i < mSymbolEntryCount; i++) { - if (util::deviceToHost32(mSymbolEntries[i].offset) == offset) { - // This offset is a symbol! - const StringPiece16 str = util::getString( - mSymbolPool, util::deviceToHost32(mSymbolEntries[i].name.index)); - - ResourceNameRef nameRef; - bool privateRef = false; - if (!ResourceUtils::parseResourceName(str, &nameRef, &privateRef)) { - return {}; - } - - // Since we scan the symbol table in order, we can start looking for the - // next symbol from this point. - mSymbolEntryCount -= i + 1; - mSymbolEntries += i + 1; - - Reference ref(nameRef); - ref.privateReference = privateRef; - return Maybe<Reference>(std::move(ref)); - } - } - return {}; -} - -/** - * Parses the SymbolTable_header, which is present on non-final resource tables - * after the compile phase. - * - * | SymbolTable_header | - * |--------------------| - * |SymbolTable_entry 0 | - * |SymbolTable_entry 1 | - * | ... | - * |SymbolTable_entry n | - * |--------------------| - * - */ -bool BinaryResourceParser::parseSymbolTable(const ResChunk_header* chunk) { - const SymbolTable_header* header = convertTo<SymbolTable_header>(chunk); - if (!header) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "corrupt SymbolTable_header"); - return false; - } - - const uint32_t entrySizeBytes = - util::deviceToHost32(header->count) * sizeof(SymbolTable_entry); - if (entrySizeBytes > getChunkDataLen(&header->header)) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "SymbolTable_header data section too long"); - return false; - } - - mSymbolEntries = (const SymbolTable_entry*) getChunkData(&header->header); - mSymbolEntryCount = util::deviceToHost32(header->count); - - // Skip over the symbol entries and parse the StringPool chunk that should be next. - ResChunkPullParser parser(getChunkData(&header->header) + entrySizeBytes, - getChunkDataLen(&header->header) - entrySizeBytes); - if (!ResChunkPullParser::isGoodEvent(parser.next())) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "failed to parse chunk in SymbolTable: " - << parser.getLastError()); - return false; - } - - const ResChunk_header* nextChunk = parser.getChunk(); - if (util::deviceToHost16(nextChunk->type) != android::RES_STRING_POOL_TYPE) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "expected string pool in SymbolTable but got " - << "chunk of type " - << (int) util::deviceToHost16(nextChunk->type)); - return false; - } - - if (mSymbolPool.setTo(nextChunk, util::deviceToHost32(nextChunk->size)) != NO_ERROR) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "corrupt string pool in SymbolTable: " - << mSymbolPool.getError()); - return false; - } - return true; -} - /** * Parses the resource table, which contains all the packages, types, and entries. */ @@ -230,24 +132,6 @@ bool BinaryResourceParser::parseTable(const ResChunk_header* chunk) { } break; - case RES_TABLE_SYMBOL_TABLE_TYPE: - if (!parseSymbolTable(parser.getChunk())) { - return false; - } - break; - - case RES_TABLE_SOURCE_POOL_TYPE: { - status_t err = mSourcePool.setTo(getChunkData(parser.getChunk()), - getChunkDataLen(parser.getChunk())); - if (err != NO_ERROR) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "corrupt source string pool in ResTable: " - << mSourcePool.getError()); - return false; - } - break; - } - case android::RES_TABLE_PACKAGE_TYPE: if (!parsePackage(parser.getChunk())) { return false; @@ -350,12 +234,6 @@ bool BinaryResourceParser::parsePackage(const ResChunk_header* chunk) { } break; - case RES_TABLE_PUBLIC_TYPE: - if (!parsePublic(package, parser.getChunk())) { - return false; - } - break; - default: mContext->getDiagnostics() ->warn(DiagMessage(mSource) @@ -375,97 +253,7 @@ bool BinaryResourceParser::parsePackage(const ResChunk_header* chunk) { // Now go through the table and change local resource ID references to // symbolic references. ReferenceIdToNameVisitor visitor(&mIdIndex); - for (auto& package : mTable->packages) { - for (auto& type : package->types) { - for (auto& entry : type->entries) { - for (auto& configValue : entry->values) { - configValue.value->accept(&visitor); - } - } - } - } - return true; -} - -bool BinaryResourceParser::parsePublic(const ResourceTablePackage* package, - const ResChunk_header* chunk) { - const Public_header* header = convertTo<Public_header>(chunk); - if (!header) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "corrupt Public_header chunk"); - return false; - } - - if (header->typeId == 0) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "invalid type ID " - << (int) header->typeId); - return false; - } - - StringPiece16 typeStr16 = util::getString(mTypePool, header->typeId - 1); - const ResourceType* parsedType = parseResourceType(typeStr16); - if (!parsedType) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "invalid type '" << typeStr16 << "'"); - return false; - } - - const uintptr_t chunkEnd = (uintptr_t) chunk + util::deviceToHost32(chunk->size); - const Public_entry* entry = (const Public_entry*) getChunkData(&header->header); - for (uint32_t i = 0; i < util::deviceToHost32(header->count); i++) { - if ((uintptr_t) entry + sizeof(*entry) > chunkEnd) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "Public_entry data section is too long"); - return false; - } - - const ResourceId resId(package->id.value(), header->typeId, - util::deviceToHost16(entry->entryId)); - - const ResourceName name(package->name, *parsedType, - util::getString(mKeyPool, entry->key.index).toString()); - - Symbol symbol; - if (mSourcePool.getError() == NO_ERROR) { - symbol.source.path = util::utf16ToUtf8(util::getString( - mSourcePool, util::deviceToHost32(entry->source.path.index))); - symbol.source.line = util::deviceToHost32(entry->source.line); - } - - StringPiece16 comment = util::getString(mSourcePool, - util::deviceToHost32(entry->source.comment.index)); - if (!comment.empty()) { - symbol.comment = comment.toString(); - } - - switch (util::deviceToHost16(entry->state)) { - case Public_entry::kPrivate: - symbol.state = SymbolState::kPrivate; - break; - - case Public_entry::kPublic: - symbol.state = SymbolState::kPublic; - break; - - case Public_entry::kUndefined: - symbol.state = SymbolState::kUndefined; - break; - } - - if (!mTable->setSymbolStateAllowMangled(name, resId, symbol, mContext->getDiagnostics())) { - return false; - } - - // Add this resource name->id mapping to the index so - // that we can resolve all ID references to name references. - auto cacheIter = mIdIndex.find(resId); - if (cacheIter == mIdIndex.end()) { - mIdIndex.insert({ resId, name }); - } - - entry++; - } + visitAllValuesInTable(mTable, &visitor); return true; } @@ -545,25 +333,12 @@ bool BinaryResourceParser::parseType(const ResourceTablePackage* package, const ResourceId resId(package->id.value(), type->id, static_cast<uint16_t>(it.index())); std::unique_ptr<Value> resourceValue; - const ResTable_entry_source* sourceBlock = nullptr; - if (entry->flags & ResTable_entry::FLAG_COMPLEX) { const ResTable_map_entry* mapEntry = static_cast<const ResTable_map_entry*>(entry); - if (util::deviceToHost32(mapEntry->size) - sizeof(*mapEntry) == sizeof(*sourceBlock)) { - const uint8_t* data = (const uint8_t*) mapEntry; - data += util::deviceToHost32(mapEntry->size) - sizeof(*sourceBlock); - sourceBlock = (const ResTable_entry_source*) data; - } // TODO(adamlesinski): Check that the entry count is valid. resourceValue = parseMapEntry(name, config, mapEntry); } else { - if (util::deviceToHost32(entry->size) - sizeof(*entry) == sizeof(*sourceBlock)) { - const uint8_t* data = (const uint8_t*) entry; - data += util::deviceToHost32(entry->size) - sizeof(*sourceBlock); - sourceBlock = (const ResTable_entry_source*) data; - } - const Res_value* value = (const Res_value*)( (const uint8_t*) entry + util::deviceToHost32(entry->size)); resourceValue = parseValue(name, config, value, entry->flags); @@ -577,30 +352,6 @@ bool BinaryResourceParser::parseType(const ResourceTablePackage* package, return false; } - Source source = mSource; - if (sourceBlock) { - StringPiece path = util::getString8(mSourcePool, - util::deviceToHost32(sourceBlock->path.index)); - if (!path.empty()) { - source.path = path.toString(); - } - source.line = util::deviceToHost32(sourceBlock->line); - - if (Style* style = valueCast<Style>(resourceValue.get())) { - // The parent's source is the same as the resource itself, set it here. - if (style->parent) { - style->parent.value().setSource(source); - } - } - } - - StringPiece16 comment = util::getString(mSourcePool, - util::deviceToHost32(sourceBlock->comment.index)); - if (!comment.empty()) { - resourceValue->setComment(comment); - } - - resourceValue->setSource(source); if (!mTable->addResourceAllowMangled(name, config, std::move(resourceValue), mContext->getDiagnostics())) { return false; @@ -674,26 +425,15 @@ std::unique_ptr<Item> BinaryResourceParser::parseValue(const ResourceNameRef& na const Reference::Type type = (value->dataType == Res_value::TYPE_REFERENCE) ? Reference::Type::kResource : Reference::Type::kAttribute; - if (data != 0) { - // This is a normal reference. - return util::make_unique<Reference>(data, type); - } - - // This reference has an invalid ID. Check if it is an unresolved symbol. - if (Maybe<Reference> ref = getSymbol(&value->data)) { - ref.value().referenceType = type; - return util::make_unique<Reference>(std::move(ref.value())); + if (data == 0) { + // A reference of 0, must be the magic @null reference. + Res_value nullType = {}; + nullType.dataType = Res_value::TYPE_REFERENCE; + return util::make_unique<BinaryPrimitive>(nullType); } - // This is not an unresolved symbol, so it must be the magic @null reference. - Res_value nullType = {}; - nullType.dataType = Res_value::TYPE_REFERENCE; - return util::make_unique<BinaryPrimitive>(nullType); - } - - if (value->dataType == ExtendedTypes::TYPE_RAW_STRING) { - return util::make_unique<RawString>(mTable->stringPool.makeRef( - util::getString(mValuePool, data), StringPool::Context{ 1, config })); + // This is a normal reference. + return util::make_unique<Reference>(data, type); } // Treat this as a raw binary primitive. @@ -712,8 +452,6 @@ std::unique_ptr<Value> BinaryResourceParser::parseMapEntry(const ResourceNameRef return parseAttr(name, config, map); case ResourceType::kArray: return parseArray(name, config, map); - case ResourceType::kStyleable: - return parseStyleable(name, config, map); case ResourceType::kPlurals: return parsePlural(name, config, map); default: @@ -727,51 +465,23 @@ std::unique_ptr<Style> BinaryResourceParser::parseStyle(const ResourceNameRef& n const ConfigDescription& config, const ResTable_map_entry* map) { std::unique_ptr<Style> style = util::make_unique<Style>(); - if (util::deviceToHost32(map->parent.ident) == 0) { - // The parent is either not set or it is an unresolved symbol. - // Check to see if it is a symbol. - style->parent = getSymbol(&map->parent.ident); - - } else { - // The parent is a regular reference to a resource. + if (util::deviceToHost32(map->parent.ident) != 0) { + // The parent is a regular reference to a resource. style->parent = Reference(util::deviceToHost32(map->parent.ident)); } for (const ResTable_map& mapEntry : map) { if (Res_INTERNALID(util::deviceToHost32(mapEntry.name.ident))) { - if (style->entries.empty()) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "out-of-sequence meta data in style"); - return {}; - } - collectMetaData(mapEntry, &style->entries.back().key); continue; } - style->entries.emplace_back(); - Style::Entry& styleEntry = style->entries.back(); - - if (util::deviceToHost32(mapEntry.name.ident) == 0) { - // The map entry's key (attribute) is not set. This must be - // a symbol reference, so resolve it. - Maybe<Reference> symbol = getSymbol(&mapEntry.name.ident); - if (!symbol) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "unresolved style attribute"); - return {}; - } - styleEntry.key = std::move(symbol.value()); - - } else { - // The map entry's key (attribute) is a regular reference. - styleEntry.key.id = ResourceId(util::deviceToHost32(mapEntry.name.ident)); - } - - // Parse the attribute's value. + Style::Entry styleEntry; + styleEntry.key = Reference(util::deviceToHost32(mapEntry.name.ident)); styleEntry.value = parseValue(name, config, &mapEntry.value, 0); if (!styleEntry.value) { return {}; } + style->entries.push_back(std::move(styleEntry)); } return style; } @@ -807,22 +517,7 @@ std::unique_ptr<Attribute> BinaryResourceParser::parseAttr(const ResourceNameRef if (attr->typeMask & (ResTable_map::TYPE_ENUM | ResTable_map::TYPE_FLAGS)) { Attribute::Symbol symbol; symbol.value = util::deviceToHost32(mapEntry.value.data); - if (util::deviceToHost32(mapEntry.name.ident) == 0) { - // The map entry's key (id) is not set. This must be - // a symbol reference, so resolve it. - Maybe<Reference> ref = getSymbol(&mapEntry.name.ident); - if (!ref) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "unresolved attribute symbol"); - return {}; - } - symbol.symbol = std::move(ref.value()); - - } else { - // The map entry's key (id) is a regular reference. - symbol.symbol.id = ResourceId(util::deviceToHost32(mapEntry.name.ident)); - } - + symbol.symbol = Reference(util::deviceToHost32(mapEntry.name.ident)); attr->symbols.push_back(std::move(symbol)); } } @@ -831,115 +526,26 @@ std::unique_ptr<Attribute> BinaryResourceParser::parseAttr(const ResourceNameRef return attr; } -static bool isMetaDataEntry(const ResTable_map& mapEntry) { - switch (util::deviceToHost32(mapEntry.name.ident)) { - case ExtendedResTableMapTypes::ATTR_SOURCE_PATH: - case ExtendedResTableMapTypes::ATTR_SOURCE_LINE: - case ExtendedResTableMapTypes::ATTR_COMMENT: - return true; - } - return false; -} - -bool BinaryResourceParser::collectMetaData(const ResTable_map& mapEntry, Value* value) { - switch (util::deviceToHost32(mapEntry.name.ident)) { - case ExtendedResTableMapTypes::ATTR_SOURCE_PATH: - value->setSource(Source(util::getString8(mSourcePool, - util::deviceToHost32(mapEntry.value.data)))); - return true; - break; - - case ExtendedResTableMapTypes::ATTR_SOURCE_LINE: - value->setSource(value->getSource().withLine(util::deviceToHost32(mapEntry.value.data))); - return true; - break; - - case ExtendedResTableMapTypes::ATTR_COMMENT: - value->setComment(util::getString(mSourcePool, util::deviceToHost32(mapEntry.value.data))); - return true; - break; - } - return false; -} - std::unique_ptr<Array> BinaryResourceParser::parseArray(const ResourceNameRef& name, const ConfigDescription& config, const ResTable_map_entry* map) { std::unique_ptr<Array> array = util::make_unique<Array>(); - Source source; for (const ResTable_map& mapEntry : map) { - if (isMetaDataEntry(mapEntry)) { - if (array->items.empty()) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "out-of-sequence meta data in array"); - return {}; - } - collectMetaData(mapEntry, array->items.back().get()); - continue; - } - array->items.push_back(parseValue(name, config, &mapEntry.value, 0)); } return array; } -std::unique_ptr<Styleable> BinaryResourceParser::parseStyleable(const ResourceNameRef& name, - const ConfigDescription& config, - const ResTable_map_entry* map) { - std::unique_ptr<Styleable> styleable = util::make_unique<Styleable>(); - for (const ResTable_map& mapEntry : map) { - if (isMetaDataEntry(mapEntry)) { - if (styleable->entries.empty()) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "out-of-sequence meta data in styleable"); - return {}; - } - collectMetaData(mapEntry, &styleable->entries.back()); - continue; - } - - if (util::deviceToHost32(mapEntry.name.ident) == 0) { - // The map entry's key (attribute) is not set. This must be - // a symbol reference, so resolve it. - Maybe<Reference> ref = getSymbol(&mapEntry.name.ident); - if (!ref) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "unresolved styleable symbol"); - return {}; - } - styleable->entries.emplace_back(std::move(ref.value())); - - } else { - // The map entry's key (attribute) is a regular reference. - styleable->entries.emplace_back(util::deviceToHost32(mapEntry.name.ident)); - } - } - return styleable; -} - std::unique_ptr<Plural> BinaryResourceParser::parsePlural(const ResourceNameRef& name, const ConfigDescription& config, const ResTable_map_entry* map) { std::unique_ptr<Plural> plural = util::make_unique<Plural>(); - Item* lastEntry = nullptr; for (const ResTable_map& mapEntry : map) { - if (isMetaDataEntry(mapEntry)) { - if (!lastEntry) { - mContext->getDiagnostics()->error(DiagMessage(mSource) - << "out-of-sequence meta data in plural"); - return {}; - } - collectMetaData(mapEntry, lastEntry); - continue; - } - std::unique_ptr<Item> item = parseValue(name, config, &mapEntry.value, 0); if (!item) { return {}; } - lastEntry = item.get(); - switch (util::deviceToHost32(mapEntry.name.ident)) { case ResTable_map::ATTR_ZERO: plural->values[Plural::Zero] = std::move(item); diff --git a/tools/aapt2/unflatten/BinaryResourceParser.h b/tools/aapt2/unflatten/BinaryResourceParser.h index 0745a592c296..12bc13db38f2 100644 --- a/tools/aapt2/unflatten/BinaryResourceParser.h +++ b/tools/aapt2/unflatten/BinaryResourceParser.h @@ -55,14 +55,8 @@ public: bool parse(); private: - // Helper method to retrieve the symbol name for a given table offset specified - // as a pointer. - Maybe<Reference> getSymbol(const void* data); - bool parseTable(const android::ResChunk_header* chunk); - bool parseSymbolTable(const android::ResChunk_header* chunk); bool parsePackage(const android::ResChunk_header* chunk); - bool parsePublic(const ResourceTablePackage* package, const android::ResChunk_header* chunk); bool parseTypeSpec(const android::ResChunk_header* chunk); bool parseType(const ResourceTablePackage* package, const android::ResChunk_header* chunk); @@ -87,10 +81,6 @@ private: const ConfigDescription& config, const android::ResTable_map_entry* map); - std::unique_ptr<Styleable> parseStyleable(const ResourceNameRef& name, - const ConfigDescription& config, - const android::ResTable_map_entry* map); - /** * If the mapEntry is a special type that denotes meta data (source, comment), then it is * read and added to the Value. @@ -106,23 +96,6 @@ private: const void* mData; const size_t mDataLen; - // The array of symbol entries. Each element points to an offset - // in the table and an index into the symbol table string pool. - const SymbolTable_entry* mSymbolEntries = nullptr; - - // Number of symbol entries. - size_t mSymbolEntryCount = 0; - - // The symbol table string pool. Holds the names of symbols - // referenced in this table but not defined nor resolved to an - // ID. - android::ResStringPool mSymbolPool; - - // The source string pool. Resource entries may have an extra - // field that points into this string pool, which denotes where - // the resource was parsed from originally. - android::ResStringPool mSourcePool; - // The standard value string pool for resource values. android::ResStringPool mValuePool; diff --git a/tools/aapt2/unflatten/FileExportHeaderReader.h b/tools/aapt2/unflatten/FileExportHeaderReader.h deleted file mode 100644 index e552ea176417..000000000000 --- a/tools/aapt2/unflatten/FileExportHeaderReader.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef AAPT_UNFLATTEN_FILEEXPORTHEADERREADER_H -#define AAPT_UNFLATTEN_FILEEXPORTHEADERREADER_H - -#include "ResChunkPullParser.h" -#include "Resource.h" -#include "ResourceUtils.h" - -#include "flatten/ResourceTypeExtensions.h" -#include "util/StringPiece.h" -#include "util/Util.h" - -#include <androidfw/ResourceTypes.h> -#include <sstream> -#include <string> - -namespace aapt { - -static ssize_t parseFileExportHeaderImpl(const void* data, const size_t len, - const FileExport_header** outFileExport, - const ExportedSymbol** outExportedSymbolIndices, - android::ResStringPool* outStringPool, - std::string* outError) { - ResChunkPullParser parser(data, len); - if (!ResChunkPullParser::isGoodEvent(parser.next())) { - if (outError) *outError = parser.getLastError(); - return -1; - } - - if (util::deviceToHost16(parser.getChunk()->type) != RES_FILE_EXPORT_TYPE) { - if (outError) *outError = "no FileExport_header found"; - return -1; - } - - const FileExport_header* fileExport = convertTo<FileExport_header>(parser.getChunk()); - if (!fileExport) { - if (outError) *outError = "corrupt FileExport_header"; - return -1; - } - - if (memcmp(fileExport->magic, "AAPT", sizeof(fileExport->magic)) != 0) { - if (outError) *outError = "invalid magic value"; - return -1; - } - - const size_t exportedSymbolCount = util::deviceToHost32(fileExport->exportedSymbolCount); - - // Verify that we have enough space for all those symbols. - size_t dataLen = getChunkDataLen(&fileExport->header); - if (exportedSymbolCount > dataLen / sizeof(ExportedSymbol)) { - if (outError) *outError = "too many symbols"; - return -1; - } - - const size_t symbolIndicesSize = exportedSymbolCount * sizeof(ExportedSymbol); - - const void* strPoolData = getChunkData(&fileExport->header) + symbolIndicesSize; - const size_t strPoolDataLen = dataLen - symbolIndicesSize; - if (outStringPool->setTo(strPoolData, strPoolDataLen, false) != android::NO_ERROR) { - if (outError) *outError = "corrupt string pool"; - return -1; - } - - *outFileExport = fileExport; - *outExportedSymbolIndices = (const ExportedSymbol*) getChunkData( - &fileExport->header); - return util::deviceToHost16(fileExport->header.headerSize) + symbolIndicesSize + - outStringPool->bytes(); -} - -static ssize_t getWrappedDataOffset(const void* data, size_t len, std::string* outError) { - const FileExport_header* header = nullptr; - const ExportedSymbol* entries = nullptr; - android::ResStringPool pool; - return parseFileExportHeaderImpl(data, len, &header, &entries, &pool, outError); -} - -/** - * Reads the FileExport_header and populates outRes with the values in that header. - */ -static ssize_t unwrapFileExportHeader(const void* data, size_t len, ResourceFile* outRes, - std::string* outError) { - - const FileExport_header* fileExport = nullptr; - const ExportedSymbol* entries = nullptr; - android::ResStringPool symbolPool; - const ssize_t offset = parseFileExportHeaderImpl(data, len, &fileExport, &entries, &symbolPool, - outError); - if (offset < 0) { - return offset; - } - - const size_t exportedSymbolCount = util::deviceToHost32(fileExport->exportedSymbolCount); - outRes->exportedSymbols.clear(); - outRes->exportedSymbols.reserve(exportedSymbolCount); - - for (size_t i = 0; i < exportedSymbolCount; i++) { - const StringPiece16 str = util::getString(symbolPool, - util::deviceToHost32(entries[i].name.index)); - StringPiece16 packageStr, typeStr, entryStr; - ResourceUtils::extractResourceName(str, &packageStr, &typeStr, &entryStr); - const ResourceType* resType = parseResourceType(typeStr); - if (!resType || entryStr.empty()) { - if (outError) { - std::stringstream errorStr; - errorStr << "invalid exported symbol at index=" - << util::deviceToHost32(entries[i].name.index) - << " (" << str << ")"; - *outError = errorStr.str(); - } - return -1; - } - - outRes->exportedSymbols.push_back(SourcedResourceName{ - ResourceName{ packageStr.toString(), *resType, entryStr.toString() }, - util::deviceToHost32(entries[i].line) }); - } - - const StringPiece16 str = util::getString(symbolPool, - util::deviceToHost32(fileExport->name.index)); - StringPiece16 packageStr, typeStr, entryStr; - ResourceUtils::extractResourceName(str, &packageStr, &typeStr, &entryStr); - const ResourceType* resType = parseResourceType(typeStr); - if (!resType || entryStr.empty()) { - if (outError) { - std::stringstream errorStr; - errorStr << "invalid resource name at index=" - << util::deviceToHost32(fileExport->name.index) - << " (" << str << ")"; - *outError = errorStr.str(); - } - return -1; - } - - outRes->name = ResourceName{ packageStr.toString(), *resType, entryStr.toString() }; - outRes->source.path = util::utf16ToUtf8( - util::getString(symbolPool, util::deviceToHost32(fileExport->source.index))); - outRes->config.copyFromDtoH(fileExport->config); - return offset; -} - -} // namespace aapt - -#endif /* AAPT_UNFLATTEN_FILEEXPORTHEADERREADER_H */ diff --git a/tools/aapt2/unflatten/FileExportHeaderReader_test.cpp b/tools/aapt2/unflatten/FileExportHeaderReader_test.cpp deleted file mode 100644 index a76c83bdbd9a..000000000000 --- a/tools/aapt2/unflatten/FileExportHeaderReader_test.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Resource.h" - -#include "flatten/FileExportWriter.h" -#include "unflatten/FileExportHeaderReader.h" -#include "util/BigBuffer.h" -#include "util/Util.h" - -#include "test/Common.h" - -#include <gtest/gtest.h> - -namespace aapt { - -TEST(FileExportHeaderReaderTest, ReadHeaderWithNoSymbolExports) { - ResourceFile resFile = { - test::parseNameOrDie(u"@android:layout/main.xml"), - test::parseConfigOrDie("sw600dp-v4"), - Source{ "res/layout/main.xml" }, - }; - - BigBuffer buffer(1024); - ChunkWriter writer = wrapBufferWithFileExportHeader(&buffer, &resFile); - *writer.getBuffer()->nextBlock<uint32_t>() = 42u; - writer.finish(); - - std::unique_ptr<uint8_t[]> data = util::copy(buffer); - - ResourceFile actualResFile; - - ssize_t offset = unwrapFileExportHeader(data.get(), buffer.size(), &actualResFile, nullptr); - ASSERT_GT(offset, 0); - - EXPECT_EQ(offset, getWrappedDataOffset(data.get(), buffer.size(), nullptr)); - - EXPECT_EQ(actualResFile.config, test::parseConfigOrDie("sw600dp-v4")); - EXPECT_EQ(actualResFile.name, test::parseNameOrDie(u"@android:layout/main.xml")); - EXPECT_EQ(actualResFile.source.path, "res/layout/main.xml"); - - EXPECT_EQ(*(uint32_t*)(data.get() + offset), 42u); -} - -} // namespace aapt diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index 037ce57ced1b..5c20dfa8e627 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -308,6 +308,11 @@ public class BridgePackageManager extends PackageManager { } @Override + public String getServicesSystemSharedLibraryPackageName() { + return null; + } + + @Override public FeatureInfo[] getSystemAvailableFeatures() { return new FeatureInfo[0]; } diff --git a/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java b/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java index 611ed15c76b5..9fc1706ceb03 100644 --- a/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java +++ b/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java @@ -36,15 +36,15 @@ public class PasspointManagementObjectDefinition implements Parcelable { mMoTree = moTree; } - public String getmBaseUri() { + public String getBaseUri() { return mBaseUri; } - public String getmUrn() { + public String getUrn() { return mUrn; } - public String getmMoTree() { + public String getMoTree() { return mMoTree; } diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java index 4a86c59542ab..31da6701e338 100644 --- a/wifi/java/android/net/wifi/ScanResult.java +++ b/wifi/java/android/net/wifi/ScanResult.java @@ -332,6 +332,7 @@ public class ScanResult implements Parcelable { public static class InformationElement { public static final int EID_SSID = 0; public static final int EID_BSS_LOAD = 11; + public static final int EID_RSN = 48; public static final int EID_HT_OPERATION = 61; public static final int EID_INTERWORKING = 107; public static final int EID_ROAMING_CONSORTIUM = 111; diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java index a0dbd85049b2..362738edec46 100644 --- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java +++ b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java @@ -101,6 +101,8 @@ public class WifiEnterpriseConfig implements Parcelable { /** @hide */ public static final String CA_CERT_KEY = "ca_cert"; /** @hide */ + public static final String CA_PATH_KEY = "ca_path"; + /** @hide */ public static final String ENGINE_KEY = "engine"; /** @hide */ public static final String ENGINE_ID_KEY = "engine_id"; @@ -625,6 +627,33 @@ public class WifiEnterpriseConfig implements Parcelable { mCaCerts = null; } + /** + * Set the ca_path directive on wpa_supplicant. + * + * From wpa_supplicant documentation: + * + * Directory path for CA certificate files (PEM). This path may contain + * multiple CA certificates in OpenSSL format. Common use for this is to + * point to system trusted CA list which is often installed into directory + * like /etc/ssl/certs. If configured, these certificates are added to the + * list of trusted CAs. ca_cert may also be included in that case, but it is + * not required. + * @param domain The path for CA certificate files + * @hide + */ + public void setCaPath(String path) { + setFieldValue(CA_PATH_KEY, path); + } + + /** + * Get the domain_suffix_match value. See setDomSuffixMatch. + * @return The path for CA certificate files. + * @hide + */ + public String getCaPath() { + return getFieldValue(CA_PATH_KEY, ""); + } + /** Set Client certificate alias. * * <p> See the {@link android.security.KeyChain} for details on installing or choosing |